From fb51d98562a26b6dcde7d3597938a0b707b6b881 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Fri, 30 Oct 2009 13:10:56 -0400 Subject: [PATCH] Switch to using libarchive from libtar for cpack and cmake -E tar This allows for a built in bzip and zip capability, so external tools will not be needed for these packagers. The cmake -E tar xf should be able to handle all compression types now as well. --- CMakeLists.txt | 35 +- Source/CMakeLists.txt | 5 +- Source/CPack/cmCPackArchiveGenerator.cxx | 230 + Source/CPack/cmCPackArchiveGenerator.h | 47 + Source/CPack/cmCPackTGZGenerator.cxx | 272 +- Source/CPack/cmCPackTGZGenerator.h | 18 +- Source/CPack/cmCPackTarBZip2Generator.cxx | 156 +- Source/CPack/cmCPackTarBZip2Generator.h | 14 +- Source/CPack/cmCPackTarCompressGenerator.cxx | 231 +- Source/CPack/cmCPackTarCompressGenerator.h | 12 +- Source/CPack/cmCPackZIPGenerator.cxx | 76 +- Source/CPack/cmCPackZIPGenerator.h | 14 +- Source/cmSystemTools.cxx | 579 +- Tests/Complex/Executable/CMakeLists.txt | 7 +- .../Executable/CMakeLists.txt | 7 +- .../Executable/CMakeLists.txt | 7 +- Utilities/cmbzip2/CHANGES | 319 + Utilities/cmbzip2/CMakeLists.txt | 4 + Utilities/cmbzip2/LICENSE | 42 + Utilities/cmbzip2/Makefile | 217 + Utilities/cmbzip2/Makefile-libbz2_so | 59 + Utilities/cmbzip2/README | 210 + Utilities/cmbzip2/README.COMPILATION.PROBLEMS | 58 + Utilities/cmbzip2/README.XML.STUFF | 45 + Utilities/cmbzip2/blocksort.c | 1094 + Utilities/cmbzip2/bz-common.xsl | 39 + Utilities/cmbzip2/bz-fo.xsl | 276 + Utilities/cmbzip2/bz-html.xsl | 20 + Utilities/cmbzip2/bzdiff | 76 + Utilities/cmbzip2/bzdiff.1 | 47 + Utilities/cmbzip2/bzgrep | 75 + Utilities/cmbzip2/bzgrep.1 | 56 + Utilities/cmbzip2/bzip.css | 74 + Utilities/cmbzip2/bzip2.1 | 454 + Utilities/cmbzip2/bzip2.1.preformatted | 399 + Utilities/cmbzip2/bzip2.c | 2034 + Utilities/cmbzip2/bzip2.txt | 391 + Utilities/cmbzip2/bzip2recover.c | 514 + Utilities/cmbzip2/bzlib.c | 1572 + Utilities/cmbzip2/bzlib.h | 282 + Utilities/cmbzip2/bzlib_private.h | 509 + Utilities/cmbzip2/bzmore | 61 + Utilities/cmbzip2/bzmore.1 | 152 + Utilities/cmbzip2/compress.c | 672 + Utilities/cmbzip2/crctable.c | 104 + Utilities/cmbzip2/decompress.c | 626 + Utilities/cmbzip2/dlltest.c | 175 + Utilities/cmbzip2/dlltest.dsp | 93 + Utilities/cmbzip2/entities.xml | 9 + Utilities/cmbzip2/format.pl | 68 + Utilities/cmbzip2/huffman.c | 205 + Utilities/cmbzip2/libbz2.def | 27 + Utilities/cmbzip2/libbz2.dsp | 130 + Utilities/cmbzip2/libbz2.lib | Bin 0 -> 60774 bytes Utilities/cmbzip2/makefile.msc | 63 + Utilities/cmbzip2/manual.html | 2540 + Utilities/cmbzip2/manual.pdf | Bin 0 -> 289422 bytes Utilities/cmbzip2/manual.ps | 82900 ++++++++++++++++ Utilities/cmbzip2/manual.xml | 2964 + Utilities/cmbzip2/mk251.c | 31 + Utilities/cmbzip2/randtable.c | 84 + Utilities/cmbzip2/sample1.bz2 | Bin 0 -> 32558 bytes Utilities/cmbzip2/sample1.rb2 | Bin 0 -> 32558 bytes Utilities/cmbzip2/sample1.ref | Bin 0 -> 98869 bytes Utilities/cmbzip2/sample1.tst | Bin 0 -> 98869 bytes Utilities/cmbzip2/sample2.bz2 | Bin 0 -> 74143 bytes Utilities/cmbzip2/sample2.rb2 | Bin 0 -> 74143 bytes Utilities/cmbzip2/sample2.ref | Bin 0 -> 212610 bytes Utilities/cmbzip2/sample2.tst | Bin 0 -> 212610 bytes Utilities/cmbzip2/sample3.bz2 | Bin 0 -> 238 bytes Utilities/cmbzip2/sample3.rb2 | Bin 0 -> 237 bytes Utilities/cmbzip2/sample3.ref | 30007 ++++++ Utilities/cmbzip2/sample3.tst | 30007 ++++++ Utilities/cmbzip2/spewG.c | 54 + Utilities/cmbzip2/unzcrash.c | 141 + Utilities/cmbzip2/words0 | 9 + Utilities/cmbzip2/words1 | 4 + Utilities/cmbzip2/words2 | 5 + Utilities/cmbzip2/words3 | 30 + Utilities/cmbzip2/xmlproc.sh | 114 + Utilities/cmlibarchive/CMakeLists.txt | 724 + Utilities/cmlibarchive/COPYING | 60 + Utilities/cmlibarchive/INSTALL | 30 + Utilities/cmlibarchive/Makefile.am | 595 + Utilities/cmlibarchive/NEWS | 499 + Utilities/cmlibarchive/README | 137 + .../build/autoconf/check_stdcall_func.m4 | 51 + .../cmlibarchive/build/autoconf/la_uid_t.m4 | 20 + Utilities/cmlibarchive/build/autogen.sh | 25 + .../build/cmake/CheckFileOffsetBits.c | 14 + .../build/cmake/CheckFileOffsetBits.cmake | 43 + .../cmlibarchive/build/cmake/CheckFuncs.cmake | 47 + .../build/cmake/CheckFuncs_stub.c.in | 16 + .../build/cmake/CheckHeaderDirent.cmake | 32 + .../build/cmake/CheckHeaderSTDC.c | 20 + .../build/cmake/CheckHeaderSTDC.cmake | 65 + .../build/cmake/CheckStructMember.cmake | 43 + .../build/cmake/CheckTypeExists.cmake | 42 + .../cmlibarchive/build/cmake/FindLZMA.cmake | 52 + .../cmlibarchive/build/cmake/config.h.in | 700 + Utilities/cmlibarchive/build/release.sh | 63 + Utilities/cmlibarchive/build/version | 1 + Utilities/cmlibarchive/build/windows/mvcpp.nt | 117 + .../build/windows/vc71/libarchive.sln | 23 + .../build/windows/vc71/libarchive.vcproj | 327 + .../build/windows/vc80/libarchive.sln | 25 + .../build/windows/vc80/libarchive.vcproj | 455 + .../libarchive_test/libarchive_test.vcproj | 495 + .../build/windows/vc90/libarchive.sln | 25 + .../build/windows/vc90/libarchive.vcproj | 456 + .../libarchive_test/libarchive_test.vcproj | 494 + Utilities/cmlibarchive/build/windows/wccpp.nt | 107 + Utilities/cmlibarchive/configure.ac | 448 + Utilities/cmlibarchive/contrib/README | 32 + .../contrib/libarchive.1aix53.spec | 160 + .../cmlibarchive/contrib/libarchive.spec | 147 + .../libarchive_autodetect-st_lib_archive.m4 | 154 + .../contrib/psota-benchmark/results.txt | 122 + .../contrib/psota-benchmark/tcp.sh | 104 + Utilities/cmlibarchive/contrib/shar/Makefile | 14 + Utilities/cmlibarchive/contrib/shar/shar.1 | 128 + Utilities/cmlibarchive/contrib/shar/shar.c | 314 + Utilities/cmlibarchive/contrib/shar/tree.c | 542 + Utilities/cmlibarchive/contrib/shar/tree.h | 115 + .../cmlibarchive/contrib/shar/tree_config.h | 78 + Utilities/cmlibarchive/contrib/untar.c | 225 + Utilities/cmlibarchive/cpio/CMakeLists.txt | 54 + Utilities/cmlibarchive/cpio/Makefile | 26 + Utilities/cmlibarchive/cpio/bsdcpio.1 | 405 + Utilities/cmlibarchive/cpio/cmdline.c | 369 + Utilities/cmlibarchive/cpio/config_freebsd.h | 54 + Utilities/cmlibarchive/cpio/cpio.c | 1233 + Utilities/cmlibarchive/cpio/cpio.h | 109 + Utilities/cmlibarchive/cpio/cpio_platform.h | 95 + Utilities/cmlibarchive/cpio/cpio_windows.c | 336 + Utilities/cmlibarchive/cpio/cpio_windows.h | 72 + .../cmlibarchive/cpio/test/CMakeLists.txt | 75 + Utilities/cmlibarchive/cpio/test/Makefile | 75 + Utilities/cmlibarchive/cpio/test/main.c | 2059 + Utilities/cmlibarchive/cpio/test/test.h | 277 + Utilities/cmlibarchive/cpio/test/test_0.c | 67 + Utilities/cmlibarchive/cpio/test/test_basic.c | 173 + .../cmlibarchive/cpio/test/test_cmdline.c | 107 + .../cmlibarchive/cpio/test/test_format_newc.c | 294 + .../cpio/test/test_gcpio_compat.c | 108 + .../cpio/test/test_gcpio_compat_ref.bin.uu | 16 + .../cpio/test/test_gcpio_compat_ref.crc.uu | 27 + .../cpio/test/test_gcpio_compat_ref.newc.uu | 27 + .../cpio/test/test_gcpio_compat_ref.ustar.uu | 84 + .../test/test_gcpio_compat_ref_nosym.bin.uu | 15 + .../test/test_gcpio_compat_ref_nosym.crc.uu | 15 + .../test/test_gcpio_compat_ref_nosym.newc.uu | 15 + .../test/test_gcpio_compat_ref_nosym.ustar.uu | 72 + .../cpio/test/test_option_B_upper.c | 52 + .../cpio/test/test_option_C_upper.c | 62 + .../cpio/test/test_option_J_upper.c | 56 + .../cpio/test/test_option_L_upper.c | 96 + .../cpio/test/test_option_Z_upper.c | 56 + .../cmlibarchive/cpio/test/test_option_a.c | 154 + .../cmlibarchive/cpio/test/test_option_c.c | 221 + .../cmlibarchive/cpio/test/test_option_d.c | 64 + .../cmlibarchive/cpio/test/test_option_f.c | 76 + .../cpio/test/test_option_f.cpio.uu | 16 + .../cmlibarchive/cpio/test/test_option_help.c | 81 + .../cmlibarchive/cpio/test/test_option_l.c | 50 + .../cmlibarchive/cpio/test/test_option_lzma.c | 56 + .../cmlibarchive/cpio/test/test_option_m.c | 63 + .../cpio/test/test_option_m.cpio.uu | 16 + .../cmlibarchive/cpio/test/test_option_t.c | 95 + .../cpio/test/test_option_t.cpio.uu | 16 + .../cpio/test/test_option_t.stdout.uu | 5 + .../cpio/test/test_option_tv.stdout.uu | 6 + .../cmlibarchive/cpio/test/test_option_u.c | 81 + .../cpio/test/test_option_version.c | 109 + .../cmlibarchive/cpio/test/test_option_y.c | 57 + .../cmlibarchive/cpio/test/test_option_z.c | 56 + .../cmlibarchive/cpio/test/test_owner_parse.c | 121 + .../cpio/test/test_passthrough_dotdot.c | 76 + .../cpio/test/test_passthrough_reverse.c | 85 + .../cmlibarchive/cpio/test/test_pathmatch.c | 243 + Utilities/cmlibarchive/doc/mdoc2man.awk | 391 + Utilities/cmlibarchive/doc/mdoc2wiki.awk | 448 + Utilities/cmlibarchive/doc/update.sh | 112 + .../cmlibarchive/examples/minitar/Makefile | 34 + .../cmlibarchive/examples/minitar/README | 12 + .../cmlibarchive/examples/minitar/minitar.c | 421 + Utilities/cmlibarchive/examples/minitar/notes | 50 + .../cmlibarchive/examples/minitar/tree.c | 423 + .../cmlibarchive/examples/minitar/tree.h | 78 + Utilities/cmlibarchive/examples/tarfilter.c | 113 + Utilities/cmlibarchive/examples/untar.c | 262 + .../cmlibarchive/libarchive/CMakeLists.txt | 145 + Utilities/cmlibarchive/libarchive/Makefile | 267 + Utilities/cmlibarchive/libarchive/archive.h | 724 + .../libarchive/archive_check_magic.c | 135 + .../cmlibarchive/libarchive/archive_crc32.h | 64 + .../cmlibarchive/libarchive/archive_endian.h | 162 + .../cmlibarchive/libarchive/archive_entry.3 | 433 + .../cmlibarchive/libarchive/archive_entry.c | 2117 + .../cmlibarchive/libarchive/archive_entry.h | 515 + .../libarchive/archive_entry_copy_bhfi.c | 73 + .../libarchive/archive_entry_copy_stat.c | 77 + .../libarchive/archive_entry_link_resolver.c | 403 + .../libarchive/archive_entry_private.h | 184 + .../libarchive/archive_entry_stat.c | 118 + .../libarchive/archive_entry_strmode.c | 87 + .../libarchive/archive_entry_xattr.c | 165 + .../cmlibarchive/libarchive/archive_hash.h | 164 + .../libarchive/archive_platform.h | 143 + .../cmlibarchive/libarchive/archive_private.h | 116 + .../cmlibarchive/libarchive/archive_read.3 | 714 + .../cmlibarchive/libarchive/archive_read.c | 1241 + .../libarchive/archive_read_data_into_fd.c | 93 + .../libarchive/archive_read_disk.3 | 308 + .../libarchive/archive_read_disk.c | 198 + .../archive_read_disk_entry_from_file.c | 554 + .../libarchive/archive_read_disk_private.h | 62 + .../archive_read_disk_set_standard_lookup.c | 270 + .../libarchive/archive_read_extract.c | 182 + .../libarchive/archive_read_open_fd.c | 188 + .../libarchive/archive_read_open_file.c | 167 + .../libarchive/archive_read_open_filename.c | 270 + .../libarchive/archive_read_open_memory.c | 156 + .../libarchive/archive_read_private.h | 199 + .../archive_read_support_compression_all.c | 56 + .../archive_read_support_compression_bzip2.c | 354 + ...rchive_read_support_compression_compress.c | 444 + .../archive_read_support_compression_gzip.c | 463 + .../archive_read_support_compression_none.c | 40 + ...archive_read_support_compression_program.c | 457 + .../archive_read_support_compression_xz.c | 644 + .../archive_read_support_format_all.c | 42 + .../archive_read_support_format_ar.c | 584 + .../archive_read_support_format_cpio.c | 774 + .../archive_read_support_format_empty.c | 93 + .../archive_read_support_format_iso9660.c | 2075 + .../archive_read_support_format_mtree.c | 1309 + .../archive_read_support_format_raw.c | 187 + .../archive_read_support_format_tar.c | 2418 + .../archive_read_support_format_zip.c | 903 + .../cmlibarchive/libarchive/archive_string.c | 455 + .../cmlibarchive/libarchive/archive_string.h | 148 + .../libarchive/archive_string_sprintf.c | 164 + .../cmlibarchive/libarchive/archive_util.3 | 160 + .../cmlibarchive/libarchive/archive_util.c | 389 + .../cmlibarchive/libarchive/archive_virtual.c | 94 + .../cmlibarchive/libarchive/archive_windows.c | 1229 + .../cmlibarchive/libarchive/archive_windows.h | 404 + .../cmlibarchive/libarchive/archive_write.3 | 626 + .../cmlibarchive/libarchive/archive_write.c | 467 + .../libarchive/archive_write_disk.3 | 375 + .../libarchive/archive_write_disk.c | 2600 + .../libarchive/archive_write_disk_private.h | 38 + .../archive_write_disk_set_standard_lookup.c | 240 + .../libarchive/archive_write_open_fd.c | 143 + .../libarchive/archive_write_open_file.c | 105 + .../libarchive/archive_write_open_filename.c | 162 + .../libarchive/archive_write_open_memory.c | 126 + .../libarchive/archive_write_private.h | 122 + .../archive_write_set_compression_bzip2.c | 409 + .../archive_write_set_compression_compress.c | 494 + .../archive_write_set_compression_gzip.c | 478 + .../archive_write_set_compression_none.c | 259 + .../archive_write_set_compression_program.c | 349 + .../archive_write_set_compression_xz.c | 439 + .../libarchive/archive_write_set_format.c | 72 + .../libarchive/archive_write_set_format_ar.c | 551 + .../archive_write_set_format_by_name.c | 76 + .../archive_write_set_format_cpio.c | 271 + .../archive_write_set_format_cpio_newc.c | 289 + .../archive_write_set_format_mtree.c | 1050 + .../libarchive/archive_write_set_format_pax.c | 1393 + .../archive_write_set_format_shar.c | 626 + .../archive_write_set_format_ustar.c | 587 + .../libarchive/archive_write_set_format_zip.c | 667 + .../cmlibarchive/libarchive/config_freebsd.h | 150 + .../cmlibarchive/libarchive/config_windows.h | 578 + Utilities/cmlibarchive/libarchive/cpio.5 | 325 + .../cmlibarchive/libarchive/filter_fork.c | 161 + .../cmlibarchive/libarchive/filter_fork.h | 41 + .../libarchive/filter_fork_windows.c | 111 + .../libarchive/libarchive-formats.5 | 346 + .../cmlibarchive/libarchive/libarchive.3 | 331 + .../libarchive/libarchive_internals.3 | 366 + Utilities/cmlibarchive/libarchive/mtree.5 | 269 + Utilities/cmlibarchive/libarchive/o2 | 483 + Utilities/cmlibarchive/libarchive/out | 185 + Utilities/cmlibarchive/libarchive/tar.5 | 817 + .../cmlibarchive/libarchive/test/.cvsignore | 10 + .../libarchive/test/CMakeLists.txt | 145 + .../cmlibarchive/libarchive/test/Makefile | 153 + Utilities/cmlibarchive/libarchive/test/README | 63 + Utilities/cmlibarchive/libarchive/test/main.c | 2043 + .../libarchive/test/read_open_memory.c | 172 + Utilities/cmlibarchive/libarchive/test/test.h | 285 + .../libarchive/test/test_acl_basic.c | 229 + .../libarchive/test/test_acl_freebsd.c | 255 + .../libarchive/test/test_acl_pax.c | 517 + .../test/test_archive_api_feature.c | 76 + .../libarchive/test/test_bad_fd.c | 41 + .../libarchive/test/test_compat_bzip2.c | 85 + .../test/test_compat_bzip2_1.tbz.uu | 24 + .../test/test_compat_bzip2_2.tbz.uu | 11 + .../libarchive/test/test_compat_gtar.c | 119 + .../libarchive/test/test_compat_gtar_1.tar.uu | 231 + .../libarchive/test/test_compat_gzip.c | 97 + .../libarchive/test/test_compat_gzip_1.tgz.uu | 24 + .../libarchive/test/test_compat_gzip_2.tgz.uu | 11 + .../test/test_compat_solaris_tar_acl.c | 128 + .../test/test_compat_solaris_tar_acl.tar.uu | 61 + .../test/test_compat_tar_hardlink.c | 108 + .../test/test_compat_tar_hardlink_1.tar.uu | 39 + .../libarchive/test/test_compat_xz.c | 84 + .../libarchive/test/test_compat_xz_1.txz.uu | 12 + .../libarchive/test/test_compat_zip.c | 80 + .../libarchive/test/test_compat_zip_1.zip.uu | 15 + .../libarchive/test/test_empty_write.c | 120 + .../cmlibarchive/libarchive/test/test_entry.c | 890 + .../libarchive/test/test_entry_strmode.c | 71 + .../libarchive/test/test_extattr_freebsd.c | 174 + .../cmlibarchive/libarchive/test/test_fuzz.c | 129 + .../libarchive/test/test_fuzz_1.iso.uu | 26993 +++++ .../libarchive/test/test_link_resolver.c | 205 + .../libarchive/test/test_open_fd.c | 122 + .../libarchive/test/test_open_file.c | 108 + .../libarchive/test/test_open_filename.c | 109 + .../test/test_pax_filename_encoding.c | 337 + .../test/test_pax_filename_encoding.tar.uu | 117 + .../test/test_read_compress_program.c | 84 + .../libarchive/test/test_read_data_large.c | 121 + .../libarchive/test/test_read_disk.c | 170 + .../test/test_read_disk_entry_from_file.c | 80 + .../libarchive/test/test_read_extract.c | 168 + .../test/test_read_file_nonexistent.c | 37 + .../libarchive/test/test_read_format_ar.c | 119 + .../test/test_read_format_cpio_bin.c | 64 + .../test/test_read_format_cpio_bin_Z.c | 61 + .../test/test_read_format_cpio_bin_be.c | 55 + .../test/test_read_format_cpio_bin_be.cpio.uu | 8 + .../test/test_read_format_cpio_bin_bz2.c | 58 + .../test/test_read_format_cpio_bin_gz.c | 61 + .../test/test_read_format_cpio_bin_xz.c | 70 + .../test/test_read_format_cpio_odc.c | 68 + .../test/test_read_format_cpio_svr4_gzip.c | 61 + .../test/test_read_format_cpio_svr4c_Z.c | 62 + .../libarchive/test/test_read_format_empty.c | 47 + .../test/test_read_format_gtar_gz.c | 60 + .../test/test_read_format_gtar_lzma.c | 78 + .../test/test_read_format_gtar_sparse.c | 318 + .../test_read_format_gtar_sparse_1_13.tar.uu | 1369 + .../test_read_format_gtar_sparse_1_17.tar.uu | 1369 + ...ead_format_gtar_sparse_1_17_posix00.tar.uu | 1596 + ...ead_format_gtar_sparse_1_17_posix01.tar.uu | 1369 + ...ead_format_gtar_sparse_1_17_posix10.tar.uu | 1369 + ...t_gtar_sparse_1_17_posix10_modified.tar.uu | 1370 + .../libarchive/test/test_read_format_iso_gz.c | 59 + .../test/test_read_format_iso_gz.iso.gz.uu | 15 + .../test/test_read_format_isojoliet_bz2.c | 139 + .../test_read_format_isojoliet_bz2.iso.bz2.uu | 29 + .../test/test_read_format_isojoliet_long.c | 146 + ...test_read_format_isojoliet_long.iso.bz2.uu | 29 + .../test/test_read_format_isojoliet_rr.c | 164 + .../test_read_format_isojoliet_rr.iso.bz2.uu | 31 + .../test/test_read_format_isorr_bz2.c | 210 + .../test_read_format_isorr_bz2.iso.bz2.uu | 26 + .../test/test_read_format_isorr_new_bz2.c | 209 + .../test_read_format_isorr_new_bz2.iso.bz2.uu | 27 + .../test/test_read_format_isozisofs_bz2.c | 189 + .../test_read_format_isozisofs_bz2.iso.bz2.uu | 27 + .../libarchive/test/test_read_format_mtree.c | 135 + .../test/test_read_format_pax_bz2.c | 66 + .../libarchive/test/test_read_format_raw.c | 89 + .../test/test_read_format_raw.data.Z.uu | 4 + .../test/test_read_format_raw.data.uu | 4 + .../libarchive/test/test_read_format_tar.c | 480 + .../test_read_format_tar_empty_filename.c | 66 + ...test_read_format_tar_empty_filename.tar.uu | 39 + .../libarchive/test/test_read_format_tbz.c | 59 + .../libarchive/test/test_read_format_tgz.c | 60 + .../libarchive/test/test_read_format_txz.c | 63 + .../libarchive/test/test_read_format_tz.c | 61 + .../libarchive/test/test_read_format_zip.c | 92 + .../test/test_read_format_zip.zip.uu | 14 + .../libarchive/test/test_read_large.c | 89 + .../libarchive/test/test_read_pax_truncated.c | 288 + .../libarchive/test/test_read_position.c | 94 + .../libarchive/test/test_read_truncated.c | 149 + .../libarchive/test/test_tar_filenames.c | 186 + .../libarchive/test/test_tar_large.c | 312 + .../libarchive/test/test_ustar_filenames.c | 191 + .../libarchive/test/test_write_compress.c | 102 + .../test/test_write_compress_bzip2.c | 228 + .../test/test_write_compress_gzip.c | 252 + .../test/test_write_compress_lzma.c | 245 + .../test/test_write_compress_program.c | 118 + .../libarchive/test/test_write_compress_xz.c | 253 + .../libarchive/test/test_write_disk.c | 323 + .../test/test_write_disk_failures.c | 72 + .../test/test_write_disk_hardlink.c | 223 + .../libarchive/test/test_write_disk_perms.c | 457 + .../libarchive/test/test_write_disk_secure.c | 215 + .../libarchive/test/test_write_disk_sparse.c | 280 + .../libarchive/test/test_write_disk_symlink.c | 117 + .../libarchive/test/test_write_disk_times.c | 167 + .../libarchive/test/test_write_format_ar.c | 209 + .../libarchive/test/test_write_format_cpio.c | 206 + .../test/test_write_format_cpio_empty.c | 75 + .../test/test_write_format_cpio_newc.c | 212 + .../test/test_write_format_cpio_odc.c | 225 + .../libarchive/test/test_write_format_mtree.c | 154 + .../libarchive/test/test_write_format_pax.c | 146 + .../test/test_write_format_shar_empty.c | 58 + .../libarchive/test/test_write_format_tar.c | 114 + .../test/test_write_format_tar_empty.c | 92 + .../test/test_write_format_tar_ustar.c | 347 + .../libarchive/test/test_write_format_zip.c | 180 + .../test/test_write_format_zip_empty.c | 56 + .../test_write_format_zip_no_compression.c | 304 + .../libarchive/test/test_write_open_memory.c | 76 + Utilities/cmlibarchive/libarchive_fe/err.c | 74 + Utilities/cmlibarchive/libarchive_fe/err.h | 34 + .../libarchive_fe/lafe_platform.h | 53 + .../cmlibarchive/libarchive_fe/line_reader.c | 171 + .../cmlibarchive/libarchive_fe/line_reader.h | 35 + .../cmlibarchive/libarchive_fe/matching.c | 284 + .../cmlibarchive/libarchive_fe/matching.h | 46 + .../cmlibarchive/libarchive_fe/pathmatch.c | 257 + .../cmlibarchive/libarchive_fe/pathmatch.h | 42 + Utilities/cmlibarchive/tar/CMakeLists.txt | 58 + Utilities/cmlibarchive/tar/Makefile | 23 + Utilities/cmlibarchive/tar/bsdtar.1 | 921 + Utilities/cmlibarchive/tar/bsdtar.c | 730 + Utilities/cmlibarchive/tar/bsdtar.h | 157 + Utilities/cmlibarchive/tar/bsdtar_platform.h | 149 + Utilities/cmlibarchive/tar/bsdtar_windows.c | 296 + Utilities/cmlibarchive/tar/bsdtar_windows.h | 57 + Utilities/cmlibarchive/tar/cmdline.c | 381 + Utilities/cmlibarchive/tar/config_freebsd.h | 84 + Utilities/cmlibarchive/tar/getdate.c | 1037 + Utilities/cmlibarchive/tar/read.c | 440 + Utilities/cmlibarchive/tar/subst.c | 289 + .../cmlibarchive/tar/test/CMakeLists.txt | 62 + Utilities/cmlibarchive/tar/test/Makefile | 68 + Utilities/cmlibarchive/tar/test/main.c | 2057 + Utilities/cmlibarchive/tar/test/test.h | 277 + Utilities/cmlibarchive/tar/test/test_0.c | 67 + Utilities/cmlibarchive/tar/test/test_basic.c | 115 + Utilities/cmlibarchive/tar/test/test_copy.c | 373 + .../cmlibarchive/tar/test/test_getdate.c | 80 + Utilities/cmlibarchive/tar/test/test_help.c | 81 + .../tar/test/test_option_T_upper.c | 188 + .../cmlibarchive/tar/test/test_option_q.c | 129 + .../cmlibarchive/tar/test/test_option_r.c | 117 + .../cmlibarchive/tar/test/test_option_s.c | 107 + .../cmlibarchive/tar/test/test_patterns.c | 184 + .../tar/test/test_patterns_2.tar.uu | 231 + .../tar/test/test_patterns_3.tar.uu | 231 + .../tar/test/test_patterns_4.tar.uu | 641 + Utilities/cmlibarchive/tar/test/test_stdio.c | 128 + .../tar/test/test_strip_components.c | 109 + .../cmlibarchive/tar/test/test_symlink_dir.c | 160 + .../cmlibarchive/tar/test/test_version.c | 97 + .../cmlibarchive/tar/test/test_windows.c | 324 + Utilities/cmlibarchive/tar/tree.c | 795 + Utilities/cmlibarchive/tar/tree.h | 141 + Utilities/cmlibarchive/tar/util.c | 530 + Utilities/cmlibarchive/tar/write.c | 1129 + 467 files changed, 289783 insertions(+), 1054 deletions(-) create mode 100644 Source/CPack/cmCPackArchiveGenerator.cxx create mode 100644 Source/CPack/cmCPackArchiveGenerator.h create mode 100644 Utilities/cmbzip2/CHANGES create mode 100644 Utilities/cmbzip2/CMakeLists.txt create mode 100644 Utilities/cmbzip2/LICENSE create mode 100644 Utilities/cmbzip2/Makefile create mode 100644 Utilities/cmbzip2/Makefile-libbz2_so create mode 100644 Utilities/cmbzip2/README create mode 100644 Utilities/cmbzip2/README.COMPILATION.PROBLEMS create mode 100644 Utilities/cmbzip2/README.XML.STUFF create mode 100644 Utilities/cmbzip2/blocksort.c create mode 100644 Utilities/cmbzip2/bz-common.xsl create mode 100644 Utilities/cmbzip2/bz-fo.xsl create mode 100644 Utilities/cmbzip2/bz-html.xsl create mode 100644 Utilities/cmbzip2/bzdiff create mode 100644 Utilities/cmbzip2/bzdiff.1 create mode 100644 Utilities/cmbzip2/bzgrep create mode 100644 Utilities/cmbzip2/bzgrep.1 create mode 100644 Utilities/cmbzip2/bzip.css create mode 100644 Utilities/cmbzip2/bzip2.1 create mode 100644 Utilities/cmbzip2/bzip2.1.preformatted create mode 100644 Utilities/cmbzip2/bzip2.c create mode 100644 Utilities/cmbzip2/bzip2.txt create mode 100644 Utilities/cmbzip2/bzip2recover.c create mode 100644 Utilities/cmbzip2/bzlib.c create mode 100644 Utilities/cmbzip2/bzlib.h create mode 100644 Utilities/cmbzip2/bzlib_private.h create mode 100644 Utilities/cmbzip2/bzmore create mode 100644 Utilities/cmbzip2/bzmore.1 create mode 100644 Utilities/cmbzip2/compress.c create mode 100644 Utilities/cmbzip2/crctable.c create mode 100644 Utilities/cmbzip2/decompress.c create mode 100644 Utilities/cmbzip2/dlltest.c create mode 100644 Utilities/cmbzip2/dlltest.dsp create mode 100644 Utilities/cmbzip2/entities.xml create mode 100755 Utilities/cmbzip2/format.pl create mode 100644 Utilities/cmbzip2/huffman.c create mode 100644 Utilities/cmbzip2/libbz2.def create mode 100644 Utilities/cmbzip2/libbz2.dsp create mode 100644 Utilities/cmbzip2/libbz2.lib create mode 100644 Utilities/cmbzip2/makefile.msc create mode 100644 Utilities/cmbzip2/manual.html create mode 100644 Utilities/cmbzip2/manual.pdf create mode 100644 Utilities/cmbzip2/manual.ps create mode 100644 Utilities/cmbzip2/manual.xml create mode 100644 Utilities/cmbzip2/mk251.c create mode 100644 Utilities/cmbzip2/randtable.c create mode 100644 Utilities/cmbzip2/sample1.bz2 create mode 100644 Utilities/cmbzip2/sample1.rb2 create mode 100644 Utilities/cmbzip2/sample1.ref create mode 100644 Utilities/cmbzip2/sample1.tst create mode 100644 Utilities/cmbzip2/sample2.bz2 create mode 100644 Utilities/cmbzip2/sample2.rb2 create mode 100644 Utilities/cmbzip2/sample2.ref create mode 100644 Utilities/cmbzip2/sample2.tst create mode 100644 Utilities/cmbzip2/sample3.bz2 create mode 100644 Utilities/cmbzip2/sample3.rb2 create mode 100644 Utilities/cmbzip2/sample3.ref create mode 100644 Utilities/cmbzip2/sample3.tst create mode 100644 Utilities/cmbzip2/spewG.c create mode 100644 Utilities/cmbzip2/unzcrash.c create mode 100644 Utilities/cmbzip2/words0 create mode 100644 Utilities/cmbzip2/words1 create mode 100644 Utilities/cmbzip2/words2 create mode 100644 Utilities/cmbzip2/words3 create mode 100755 Utilities/cmbzip2/xmlproc.sh create mode 100644 Utilities/cmlibarchive/CMakeLists.txt create mode 100644 Utilities/cmlibarchive/COPYING create mode 100644 Utilities/cmlibarchive/INSTALL create mode 100644 Utilities/cmlibarchive/Makefile.am create mode 100644 Utilities/cmlibarchive/NEWS create mode 100644 Utilities/cmlibarchive/README create mode 100644 Utilities/cmlibarchive/build/autoconf/check_stdcall_func.m4 create mode 100644 Utilities/cmlibarchive/build/autoconf/la_uid_t.m4 create mode 100755 Utilities/cmlibarchive/build/autogen.sh create mode 100644 Utilities/cmlibarchive/build/cmake/CheckFileOffsetBits.c create mode 100644 Utilities/cmlibarchive/build/cmake/CheckFileOffsetBits.cmake create mode 100644 Utilities/cmlibarchive/build/cmake/CheckFuncs.cmake create mode 100644 Utilities/cmlibarchive/build/cmake/CheckFuncs_stub.c.in create mode 100644 Utilities/cmlibarchive/build/cmake/CheckHeaderDirent.cmake create mode 100644 Utilities/cmlibarchive/build/cmake/CheckHeaderSTDC.c create mode 100644 Utilities/cmlibarchive/build/cmake/CheckHeaderSTDC.cmake create mode 100644 Utilities/cmlibarchive/build/cmake/CheckStructMember.cmake create mode 100644 Utilities/cmlibarchive/build/cmake/CheckTypeExists.cmake create mode 100644 Utilities/cmlibarchive/build/cmake/FindLZMA.cmake create mode 100644 Utilities/cmlibarchive/build/cmake/config.h.in create mode 100755 Utilities/cmlibarchive/build/release.sh create mode 100644 Utilities/cmlibarchive/build/version create mode 100644 Utilities/cmlibarchive/build/windows/mvcpp.nt create mode 100644 Utilities/cmlibarchive/build/windows/vc71/libarchive.sln create mode 100644 Utilities/cmlibarchive/build/windows/vc71/libarchive.vcproj create mode 100644 Utilities/cmlibarchive/build/windows/vc80/libarchive.sln create mode 100644 Utilities/cmlibarchive/build/windows/vc80/libarchive.vcproj create mode 100644 Utilities/cmlibarchive/build/windows/vc80/libarchive_test/libarchive_test.vcproj create mode 100644 Utilities/cmlibarchive/build/windows/vc90/libarchive.sln create mode 100644 Utilities/cmlibarchive/build/windows/vc90/libarchive.vcproj create mode 100644 Utilities/cmlibarchive/build/windows/vc90/libarchive_test/libarchive_test.vcproj create mode 100644 Utilities/cmlibarchive/build/windows/wccpp.nt create mode 100644 Utilities/cmlibarchive/configure.ac create mode 100644 Utilities/cmlibarchive/contrib/README create mode 100644 Utilities/cmlibarchive/contrib/libarchive.1aix53.spec create mode 100644 Utilities/cmlibarchive/contrib/libarchive.spec create mode 100644 Utilities/cmlibarchive/contrib/libarchive_autodetect-st_lib_archive.m4 create mode 100644 Utilities/cmlibarchive/contrib/psota-benchmark/results.txt create mode 100755 Utilities/cmlibarchive/contrib/psota-benchmark/tcp.sh create mode 100644 Utilities/cmlibarchive/contrib/shar/Makefile create mode 100644 Utilities/cmlibarchive/contrib/shar/shar.1 create mode 100644 Utilities/cmlibarchive/contrib/shar/shar.c create mode 100644 Utilities/cmlibarchive/contrib/shar/tree.c create mode 100644 Utilities/cmlibarchive/contrib/shar/tree.h create mode 100644 Utilities/cmlibarchive/contrib/shar/tree_config.h create mode 100644 Utilities/cmlibarchive/contrib/untar.c create mode 100644 Utilities/cmlibarchive/cpio/CMakeLists.txt create mode 100644 Utilities/cmlibarchive/cpio/Makefile create mode 100644 Utilities/cmlibarchive/cpio/bsdcpio.1 create mode 100644 Utilities/cmlibarchive/cpio/cmdline.c create mode 100644 Utilities/cmlibarchive/cpio/config_freebsd.h create mode 100644 Utilities/cmlibarchive/cpio/cpio.c create mode 100644 Utilities/cmlibarchive/cpio/cpio.h create mode 100644 Utilities/cmlibarchive/cpio/cpio_platform.h create mode 100644 Utilities/cmlibarchive/cpio/cpio_windows.c create mode 100644 Utilities/cmlibarchive/cpio/cpio_windows.h create mode 100644 Utilities/cmlibarchive/cpio/test/CMakeLists.txt create mode 100644 Utilities/cmlibarchive/cpio/test/Makefile create mode 100644 Utilities/cmlibarchive/cpio/test/main.c create mode 100644 Utilities/cmlibarchive/cpio/test/test.h create mode 100644 Utilities/cmlibarchive/cpio/test/test_0.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_basic.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_cmdline.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_format_newc.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref.bin.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref.crc.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref.newc.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref.ustar.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref_nosym.bin.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref_nosym.crc.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref_nosym.newc.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_B_upper.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_C_upper.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_J_upper.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_L_upper.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_Z_upper.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_a.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_c.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_d.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_f.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_f.cpio.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_help.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_l.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_lzma.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_m.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_m.cpio.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_t.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_t.cpio.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_t.stdout.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_tv.stdout.uu create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_u.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_version.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_y.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_option_z.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_owner_parse.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_passthrough_dotdot.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_passthrough_reverse.c create mode 100644 Utilities/cmlibarchive/cpio/test/test_pathmatch.c create mode 100755 Utilities/cmlibarchive/doc/mdoc2man.awk create mode 100755 Utilities/cmlibarchive/doc/mdoc2wiki.awk create mode 100755 Utilities/cmlibarchive/doc/update.sh create mode 100644 Utilities/cmlibarchive/examples/minitar/Makefile create mode 100644 Utilities/cmlibarchive/examples/minitar/README create mode 100644 Utilities/cmlibarchive/examples/minitar/minitar.c create mode 100644 Utilities/cmlibarchive/examples/minitar/notes create mode 100644 Utilities/cmlibarchive/examples/minitar/tree.c create mode 100644 Utilities/cmlibarchive/examples/minitar/tree.h create mode 100644 Utilities/cmlibarchive/examples/tarfilter.c create mode 100644 Utilities/cmlibarchive/examples/untar.c create mode 100644 Utilities/cmlibarchive/libarchive/CMakeLists.txt create mode 100644 Utilities/cmlibarchive/libarchive/Makefile create mode 100644 Utilities/cmlibarchive/libarchive/archive.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_check_magic.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_crc32.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_endian.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry.3 create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry_copy_bhfi.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry_copy_stat.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry_link_resolver.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry_private.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry_stat.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry_strmode.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_entry_xattr.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_hash.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_platform.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_private.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_read.3 create mode 100644 Utilities/cmlibarchive/libarchive/archive_read.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_data_into_fd.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_disk.3 create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_disk.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_disk_entry_from_file.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_disk_private.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_disk_set_standard_lookup.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_extract.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_open_fd.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_open_file.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_open_filename.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_open_memory.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_private.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_compression_all.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_compression_bzip2.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_compression_compress.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_compression_gzip.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_compression_none.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_compression_program.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_compression_xz.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_all.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_ar.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_cpio.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_empty.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_iso9660.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_mtree.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_raw.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_string.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_string.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_string_sprintf.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_util.3 create mode 100644 Utilities/cmlibarchive/libarchive/archive_util.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_virtual.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_windows.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_windows.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_write.3 create mode 100644 Utilities/cmlibarchive/libarchive/archive_write.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_disk.3 create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_disk.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_disk_private.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_disk_set_standard_lookup.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_open_fd.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_open_file.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_open_filename.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_open_memory.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_private.h create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_compression_bzip2.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_compression_compress.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_compression_gzip.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_compression_none.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_compression_program.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_compression_xz.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_ar.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_by_name.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio_newc.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_shar.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c create mode 100644 Utilities/cmlibarchive/libarchive/archive_write_set_format_zip.c create mode 100644 Utilities/cmlibarchive/libarchive/config_freebsd.h create mode 100644 Utilities/cmlibarchive/libarchive/config_windows.h create mode 100644 Utilities/cmlibarchive/libarchive/cpio.5 create mode 100644 Utilities/cmlibarchive/libarchive/filter_fork.c create mode 100644 Utilities/cmlibarchive/libarchive/filter_fork.h create mode 100644 Utilities/cmlibarchive/libarchive/filter_fork_windows.c create mode 100644 Utilities/cmlibarchive/libarchive/libarchive-formats.5 create mode 100644 Utilities/cmlibarchive/libarchive/libarchive.3 create mode 100644 Utilities/cmlibarchive/libarchive/libarchive_internals.3 create mode 100644 Utilities/cmlibarchive/libarchive/mtree.5 create mode 100644 Utilities/cmlibarchive/libarchive/o2 create mode 100644 Utilities/cmlibarchive/libarchive/out create mode 100644 Utilities/cmlibarchive/libarchive/tar.5 create mode 100644 Utilities/cmlibarchive/libarchive/test/.cvsignore create mode 100644 Utilities/cmlibarchive/libarchive/test/CMakeLists.txt create mode 100644 Utilities/cmlibarchive/libarchive/test/Makefile create mode 100644 Utilities/cmlibarchive/libarchive/test/README create mode 100644 Utilities/cmlibarchive/libarchive/test/main.c create mode 100644 Utilities/cmlibarchive/libarchive/test/read_open_memory.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test.h create mode 100644 Utilities/cmlibarchive/libarchive/test/test_acl_basic.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_acl_freebsd.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_acl_pax.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_archive_api_feature.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_bad_fd.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_bzip2.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_bzip2_1.tbz.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_bzip2_2.tbz.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_gtar.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_gtar_1.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_gzip.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_gzip_1.tgz.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_gzip_2.tgz.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_solaris_tar_acl.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_solaris_tar_acl.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_tar_hardlink.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_tar_hardlink_1.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_xz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_xz_1.txz.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_zip.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_compat_zip_1.zip.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_empty_write.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_entry.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_entry_strmode.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_extattr_freebsd.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_fuzz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_fuzz_1.iso.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_link_resolver.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_open_fd.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_open_file.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_open_filename.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_pax_filename_encoding.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_pax_filename_encoding.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_compress_program.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_data_large.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_disk.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_disk_entry_from_file.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_extract.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_file_nonexistent.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_ar.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_Z.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_be.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_be.cpio.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_bz2.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_gz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_xz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_odc.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_svr4_gzip.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_svr4c_Z.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_empty.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_gz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_lzma.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_17.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_17_posix00.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_17_posix01.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_17_posix10.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_iso_gz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_iso_gz.iso.gz.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_bz2.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_bz2.iso.bz2.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_long.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_long.iso.bz2.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_rr.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_rr.iso.bz2.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_bz2.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_new_bz2.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_new_bz2.iso.bz2.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isozisofs_bz2.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_isozisofs_bz2.iso.bz2.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_mtree.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_pax_bz2.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_raw.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_raw.data.Z.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_raw.data.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_tar.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_tar_empty_filename.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_tar_empty_filename.tar.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_tbz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_tgz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_txz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_tz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_zip.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_format_zip.zip.uu create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_large.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_pax_truncated.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_position.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_read_truncated.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_tar_filenames.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_tar_large.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_ustar_filenames.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_compress.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_compress_bzip2.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_compress_gzip.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_compress_lzma.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_compress_program.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_compress_xz.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_disk.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_disk_failures.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_disk_hardlink.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_disk_perms.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_disk_secure.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_disk_sparse.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_disk_symlink.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_disk_times.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_ar.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_cpio.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_empty.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_newc.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_odc.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_mtree.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_pax.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_shar_empty.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_tar.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_tar_empty.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_tar_ustar.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_zip.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_zip_empty.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_format_zip_no_compression.c create mode 100644 Utilities/cmlibarchive/libarchive/test/test_write_open_memory.c create mode 100644 Utilities/cmlibarchive/libarchive_fe/err.c create mode 100644 Utilities/cmlibarchive/libarchive_fe/err.h create mode 100644 Utilities/cmlibarchive/libarchive_fe/lafe_platform.h create mode 100644 Utilities/cmlibarchive/libarchive_fe/line_reader.c create mode 100644 Utilities/cmlibarchive/libarchive_fe/line_reader.h create mode 100644 Utilities/cmlibarchive/libarchive_fe/matching.c create mode 100644 Utilities/cmlibarchive/libarchive_fe/matching.h create mode 100644 Utilities/cmlibarchive/libarchive_fe/pathmatch.c create mode 100644 Utilities/cmlibarchive/libarchive_fe/pathmatch.h create mode 100644 Utilities/cmlibarchive/tar/CMakeLists.txt create mode 100644 Utilities/cmlibarchive/tar/Makefile create mode 100644 Utilities/cmlibarchive/tar/bsdtar.1 create mode 100644 Utilities/cmlibarchive/tar/bsdtar.c create mode 100644 Utilities/cmlibarchive/tar/bsdtar.h create mode 100644 Utilities/cmlibarchive/tar/bsdtar_platform.h create mode 100644 Utilities/cmlibarchive/tar/bsdtar_windows.c create mode 100644 Utilities/cmlibarchive/tar/bsdtar_windows.h create mode 100644 Utilities/cmlibarchive/tar/cmdline.c create mode 100644 Utilities/cmlibarchive/tar/config_freebsd.h create mode 100644 Utilities/cmlibarchive/tar/getdate.c create mode 100644 Utilities/cmlibarchive/tar/read.c create mode 100644 Utilities/cmlibarchive/tar/subst.c create mode 100644 Utilities/cmlibarchive/tar/test/CMakeLists.txt create mode 100644 Utilities/cmlibarchive/tar/test/Makefile create mode 100644 Utilities/cmlibarchive/tar/test/main.c create mode 100644 Utilities/cmlibarchive/tar/test/test.h create mode 100644 Utilities/cmlibarchive/tar/test/test_0.c create mode 100644 Utilities/cmlibarchive/tar/test/test_basic.c create mode 100644 Utilities/cmlibarchive/tar/test/test_copy.c create mode 100644 Utilities/cmlibarchive/tar/test/test_getdate.c create mode 100644 Utilities/cmlibarchive/tar/test/test_help.c create mode 100644 Utilities/cmlibarchive/tar/test/test_option_T_upper.c create mode 100644 Utilities/cmlibarchive/tar/test/test_option_q.c create mode 100644 Utilities/cmlibarchive/tar/test/test_option_r.c create mode 100644 Utilities/cmlibarchive/tar/test/test_option_s.c create mode 100644 Utilities/cmlibarchive/tar/test/test_patterns.c create mode 100644 Utilities/cmlibarchive/tar/test/test_patterns_2.tar.uu create mode 100644 Utilities/cmlibarchive/tar/test/test_patterns_3.tar.uu create mode 100644 Utilities/cmlibarchive/tar/test/test_patterns_4.tar.uu create mode 100644 Utilities/cmlibarchive/tar/test/test_stdio.c create mode 100644 Utilities/cmlibarchive/tar/test/test_strip_components.c create mode 100644 Utilities/cmlibarchive/tar/test/test_symlink_dir.c create mode 100644 Utilities/cmlibarchive/tar/test/test_version.c create mode 100644 Utilities/cmlibarchive/tar/test/test_windows.c create mode 100644 Utilities/cmlibarchive/tar/tree.c create mode 100644 Utilities/cmlibarchive/tar/tree.h create mode 100644 Utilities/cmlibarchive/tar/util.c create mode 100644 Utilities/cmlibarchive/tar/write.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 7223c90bc..3306011c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,11 +66,6 @@ MACRO(CMAKE_HANDLE_SYSTEM_LIBRARIES) CMAKE_DEPENDENT_OPTION(CMAKE_USE_SYSTEM_ZLIB "Use system-installed zlib" ${CMAKE_USE_SYSTEM_LIBRARIES} "NOT CMAKE_USE_SYSTEM_CURL" ON) - # There is currently no option for system tar because the upstream - # libtar does not have our modifications to allow reentrant - # object-oriented use of the library. - # OPTION(CMAKE_USE_SYSTEM_TAR "Use system-installed tar" OFF) - # Mention to the user what system libraries are being used. FOREACH(util CURL EXPAT XMLRPC ZLIB) IF(CMAKE_USE_SYSTEM_${util}) @@ -238,22 +233,32 @@ MACRO (CMAKE_BUILD_UTILITIES) SUBDIRS(Utilities/cmcurl) ENDIF(CMAKE_USE_SYSTEM_CURL) - #--------------------------------------------------------------------- - # Build Tar library for CTest. - SET(CMTAR_ZLIB_HEADER ${CMAKE_ZLIB_HEADER}) - SET(CMTAR_ZLIB_LIBRARIES ${CMAKE_ZLIB_LIBRARIES}) - SET(CMTAR_ZLIB_INCLUDE_DIRS ${CMAKE_ZLIB_INCLUDES}) - SET(CMAKE_TAR_INCLUDES ${CMAKE_CURRENT_BINARY_DIR}/Utilities/cmtar) - SET(CMAKE_TAR_LIBRARIES cmtar) - SUBDIRS(Utilities/cmtar) - #--------------------------------------------------------------------- # Build Compress library for CTest. SET(CMAKE_COMPRESS_INCLUDES "${CMAKE_CURRENT_BINARY_DIR}/Utilities/cmcompress") SET(CMAKE_COMPRESS_LIBRARIES "cmcompress") SUBDIRS(Utilities/cmcompress) - + IF(CMAKE_USE_SYSTEM_BZIP2) + FIND_PACKAGE(BZip2) + ELSE() + SET(BZIP2_INCLUDE_DIR + "${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmbzip2") + SET(BZIP2_LIBRARIES cmbzip2) + SUBDIRS(Utilities/cmbzip2) + ENDIF() + IF(CMAKE_USE_SYSTEM_LIBARCHIVE) + FIND_PACKAGE(libarchive) + SET(CMAKE_TAR_LIBRARIES libarchive) + ELSE(CMAKE_USE_SYSTEM_LIBARCHIVE) + SET(HAVE_LIBZ 1) + SET(HAVE_ZLIB_H 1) + SET(BUILD_ARCHIVE_WITHIN_CMAKE TRUE) + ADD_DEFINITIONS(-DLIBARCHIVE_STATIC) + SUBDIRS(Utilities/cmlibarchive) + SET(CMAKE_TAR_LIBRARIES cmlibarchive ${BZIP2_LIBRARIES}) + ENDIF(CMAKE_USE_SYSTEM_LIBARCHIVE) + #--------------------------------------------------------------------- # Build expat library for CMake and CTest. IF(CMAKE_USE_SYSTEM_EXPAT) diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 909969139..96b0e4e5c 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -325,10 +325,10 @@ ENDIF (WIN32) # create a library used by the command line and the GUI ADD_LIBRARY(CMakeLib ${SRCS}) -TARGET_LINK_LIBRARIES(CMakeLib cmsys +TARGET_LINK_LIBRARIES(CMakeLib cmsys ${CMAKE_EXPAT_LIBRARIES} ${CMAKE_ZLIB_LIBRARIES} ${CMAKE_TAR_LIBRARIES} ${CMAKE_COMPRESS_LIBRARIES} - ${CMAKE_CURL_LIBRARIES}) + ${CMAKE_CURL_LIBRARIES} ) # On Apple we need Carbon IF(APPLE) @@ -405,6 +405,7 @@ TARGET_LINK_LIBRARIES(CTestLib CMakeLib ${CMAKE_CURL_LIBRARIES} ${CMAKE_XMLRPC_L # Sources for CPack # SET(CPACK_SRCS + CPack/cmCPackArchiveGenerator.cxx CPack/cmCPackComponentGroup.cxx CPack/cmCPackGeneratorFactory.cxx CPack/cmCPackGenerator.cxx diff --git a/Source/CPack/cmCPackArchiveGenerator.cxx b/Source/CPack/cmCPackArchiveGenerator.cxx new file mode 100644 index 000000000..b11670c46 --- /dev/null +++ b/Source/CPack/cmCPackArchiveGenerator.cxx @@ -0,0 +1,230 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ + +#include "cmCPackArchiveGenerator.h" + +#include "cmake.h" +#include "cmGlobalGenerator.h" +#include "cmLocalGenerator.h" +#include "cmSystemTools.h" +#include "cmMakefile.h" +#include "cmGeneratedFileStream.h" +#include "cmCPackLog.h" +#include + +#include +#include +#include + + +//---------------------------------------------------------------------- +cmCPackArchiveGenerator::cmCPackArchiveGenerator(CompressType t, + ArchiveType at) +{ + this->Compress = t; + this->Archive = at; +} + +//---------------------------------------------------------------------- +cmCPackArchiveGenerator::~cmCPackArchiveGenerator() +{ +} + +static const size_t cmCPackTGZ_Data_BlockSize = 16384; + +// make this an anonymous namespace so that archive.h does not +// have to be included in the .h file for this class +namespace +{ +bool SetArchiveType(struct archive* a, + cmCPackArchiveGenerator::CompressType ct, + cmCPackArchiveGenerator::ArchiveType at) +{ + // pick a compression type + int res; + switch(ct) + { + case cmCPackArchiveGenerator::GZIP: + res = archive_write_set_compression_gzip(a); + break; + case cmCPackArchiveGenerator::BZIP2: + res = archive_write_set_compression_bzip2(a); + break; + case cmCPackArchiveGenerator::COMPRESS: + res = archive_write_set_compression_compress(a); + break; + case cmCPackArchiveGenerator::LZMA: + res = archive_write_set_compression_lzma(a); + break; + case cmCPackArchiveGenerator::NONE: + default: + res = archive_write_set_compression_none(a); + } + if(res != ARCHIVE_OK) + { + return false; + } + // pick the archive type + switch(at) + { + case cmCPackArchiveGenerator::TAR: + // maybe this: + // archive_write_set_format_pax(a); + res = archive_write_set_format_ustar(a); // is this what we want? + break; + case cmCPackArchiveGenerator::ZIP: + res = archive_write_set_format_zip(a); + break; + } + if(res != ARCHIVE_OK) + { + return false; + } + return true; +} + +struct StreamData +{ + StreamData(cmGeneratedFileStream* gfs, + cmCPackArchiveGenerator* ag) + { + this->GeneratedFileStream = gfs; + this->Generator = ag; + } + cmGeneratedFileStream* GeneratedFileStream; + cmCPackArchiveGenerator* Generator; +}; + + +extern "C" +{ +int OpenArchive(struct archive *a, void *client_data) +{ + struct StreamData *data = (StreamData*)client_data; + if(data->GeneratedFileStream && + data->GeneratedFileStream->is_open()) + { + if(data->Generator-> + GenerateHeader(data->GeneratedFileStream)) + { + return ARCHIVE_OK; + } + } + return (ARCHIVE_FATAL); +} + +__LA_SSIZE_T WriteArchive(struct archive *a, + void *client_data, + const void *buff, + size_t n) +{ + struct StreamData *data = (StreamData*)client_data; + data->GeneratedFileStream-> + write(reinterpret_cast(buff),n); + if(!data->GeneratedFileStream->bad()) + { + return n; + } + return 0; +} + + +int CloseArchive(struct archive *a, void *client_data) +{ + struct StreamData *data = (StreamData*)client_data; + if(data->GeneratedFileStream->Close()) + { + delete data->GeneratedFileStream; + return ARCHIVE_OK; + } + return ARCHIVE_FATAL; +} +} //extern C +} // anon name space + + +//---------------------------------------------------------------------- +int cmCPackArchiveGenerator::InitializeInternal() +{ + this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "1"); + return this->Superclass::InitializeInternal(); +} + +int cmCPackArchiveGenerator::CompressFiles(const char* outFileName, + const char* toplevel, const std::vector& files) +{ + cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " + << (toplevel ? toplevel : "(NULL)") << std::endl); + // create a new archive + struct archive* a = archive_write_new(); + // Set the compress and archive types for the archive + SetArchiveType(a, this->Compress, this->Archive); + // Open binary stream + cmGeneratedFileStream* gf = new cmGeneratedFileStream; + gf->Open(outFileName, false, true); + StreamData data(gf, this); + // pass callbacks to archive_write_open to handle stream + archive_write_open(a, + &data, + OpenArchive, + WriteArchive, + CloseArchive); + // create a new disk struct + struct archive* disk = archive_read_disk_new(); + archive_read_disk_set_standard_lookup(disk); + std::vector::const_iterator fileIt; + for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt ) + { + // create a new entry for each file + struct archive_entry *entry = archive_entry_new(); + // Get the relative path to the file + std::string rp = cmSystemTools::RelativePath(toplevel, fileIt->c_str()); + // Set the name of the entry to the file name + archive_entry_set_pathname(entry, rp.c_str()); + // get the information about the file from stat + struct stat s; + stat(fileIt->c_str(), &s); + archive_read_disk_entry_from_file(disk, entry, -1, &s); + // write entry header + archive_write_header(a, entry); + // now copy contents of file into archive a + FILE* file = fopen(fileIt->c_str(), "rb"); + if(!file) + { + cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem with fopen(): " + << file + << strerror(errno) + << std::endl); + return 0; + } + char buff[cmCPackTGZ_Data_BlockSize]; + int len = fread(buff, 1, sizeof(buff), file); + while (len > 0) + { + archive_write_data(a, buff, len); + len = fread(buff, 1, sizeof(buff), file); + } + // close the file and free the entry + fclose(file); + archive_entry_free(entry); + } + // close the archive and finish the write + archive_write_close(a); + archive_write_finish(a); + return 1; +} + +//---------------------------------------------------------------------- +int cmCPackArchiveGenerator::GenerateHeader(std::ostream*) +{ + return 1; +} diff --git a/Source/CPack/cmCPackArchiveGenerator.h b/Source/CPack/cmCPackArchiveGenerator.h new file mode 100644 index 000000000..486db8e5d --- /dev/null +++ b/Source/CPack/cmCPackArchiveGenerator.h @@ -0,0 +1,47 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc. + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ + +#ifndef cmCPackArchiveGenerator_h +#define cmCPackArchiveGenerator_h + +#include "cmCPackGenerator.h" + + +/** \class cmCPackArchiveGenerator + * \brief A generator base for libarchive generation + * + */ +class cmCPackArchiveGenerator : public cmCPackGenerator +{ +public: + enum CompressType{ GZIP, BZIP2, COMPRESS, LZMA, NONE}; + enum ArchiveType{ TAR, ZIP}; + cmTypeMacro(cmCPackArchiveGenerator, cmCPackGenerator); + + /** + * Construct generator + */ + cmCPackArchiveGenerator(CompressType, ArchiveType); + virtual ~cmCPackArchiveGenerator(); + // Used to add a header to the archive + virtual int GenerateHeader(std::ostream* os); + +protected: + virtual int InitializeInternal(); + int CompressFiles(const char* outFileName, const char* toplevel, + const std::vector& files); + virtual const char* GetOutputExtension() = 0; + CompressType Compress; + ArchiveType Archive; +}; + +#endif diff --git a/Source/CPack/cmCPackTGZGenerator.cxx b/Source/CPack/cmCPackTGZGenerator.cxx index 99574b09f..c6ef8ae1e 100644 --- a/Source/CPack/cmCPackTGZGenerator.cxx +++ b/Source/CPack/cmCPackTGZGenerator.cxx @@ -12,34 +12,11 @@ #include "cmCPackTGZGenerator.h" -#include "cmake.h" -#include "cmGlobalGenerator.h" -#include "cmLocalGenerator.h" -#include "cmSystemTools.h" -#include "cmMakefile.h" -#include "cmGeneratedFileStream.h" -#include "cmCPackLog.h" - -#include -#include -#include -#include -#include - -//---------------------------------------------------------------------- -class cmCPackTGZGeneratorForward -{ - public: - static int GenerateHeader(cmCPackTGZGenerator* gg, std::ostream* os) - { - return gg->GenerateHeader(os); - } -}; - //---------------------------------------------------------------------- cmCPackTGZGenerator::cmCPackTGZGenerator() + :cmCPackArchiveGenerator(cmCPackArchiveGenerator::GZIP, + cmCPackArchiveGenerator::TAR) { - this->Compress = true; } //---------------------------------------------------------------------- @@ -47,248 +24,3 @@ cmCPackTGZGenerator::~cmCPackTGZGenerator() { } -static const size_t cmCPackTGZ_Data_BlockSize = 16384; - -//---------------------------------------------------------------------- -class cmCPackTGZ_Data -{ -public: - cmCPackTGZ_Data(cmCPackTGZGenerator* gen, bool compress) : - OutputStream(0), Generator(gen), - CompressionLevel(Z_DEFAULT_COMPRESSION), - Compress(compress) {} - std::ostream* OutputStream; - cmCPackTGZGenerator* Generator; - char CompressedBuffer[cmCPackTGZ_Data_BlockSize]; - int CompressionLevel; - z_stream ZLibStream; - uLong CRC; - bool Compress; -}; - -//---------------------------------------------------------------------- -extern "C" { - int cmCPackTGZ_Data_Open(void *client_data, const char* name, int oflags, - mode_t mode); - ssize_t cmCPackTGZ_Data_Write(void *client_data, void *buff, size_t n); - int cmCPackTGZ_Data_Close(void *client_data); -} - - -//---------------------------------------------------------------------- -int cmCPackTGZ_Data_Open(void *client_data, const char* pathname, - int, mode_t) -{ - cmCPackTGZ_Data *mydata = (cmCPackTGZ_Data*)client_data; - - if ( mydata->Compress ) - { - mydata->ZLibStream.zalloc = Z_NULL; - mydata->ZLibStream.zfree = Z_NULL; - mydata->ZLibStream.opaque = Z_NULL; - int strategy = Z_DEFAULT_STRATEGY; - if ( deflateInit2(&mydata->ZLibStream, mydata->CompressionLevel, - Z_DEFLATED, -MAX_WBITS, 8, strategy) != Z_OK ) - { - return -1; - } - } - - cmGeneratedFileStream* gf = new cmGeneratedFileStream; - // Open binary - gf->Open(pathname, false, true); - mydata->OutputStream = gf; - if ( !*mydata->OutputStream ) - { - return -1; - } - - if ( !cmCPackTGZGeneratorForward::GenerateHeader(mydata->Generator,gf)) - { - return -1; - } - - if ( mydata->Compress ) - { - mydata->CRC = crc32(0L, Z_NULL, 0); - } - - return 0; -} - -//---------------------------------------------------------------------- -ssize_t cmCPackTGZ_Data_Write(void *client_data, void *buff, size_t n) -{ - cmCPackTGZ_Data *mydata = (cmCPackTGZ_Data*)client_data; - - if ( mydata->Compress ) - { - mydata->ZLibStream.avail_in = static_cast(n); - mydata->ZLibStream.next_in = reinterpret_cast(buff); - - do { - mydata->ZLibStream.avail_out = cmCPackTGZ_Data_BlockSize; - mydata->ZLibStream.next_out - = reinterpret_cast(mydata->CompressedBuffer); - // no bad return value - int ret = deflate(&mydata->ZLibStream, (n?Z_NO_FLUSH:Z_FINISH)); - if(ret == Z_STREAM_ERROR) - { - return 0; - } - - size_t compressedSize - = cmCPackTGZ_Data_BlockSize - mydata->ZLibStream.avail_out; - - mydata->OutputStream->write( - reinterpret_cast(mydata->CompressedBuffer), - compressedSize); - } while ( mydata->ZLibStream.avail_out == 0 ); - - if ( !*mydata->OutputStream ) - { - return 0; - } - if ( n ) - { - mydata->CRC = crc32(mydata->CRC, reinterpret_cast(buff), - static_cast(n)); - } - } - else - { - mydata->OutputStream->write(reinterpret_cast(buff), n); - } - return n; -} - -//---------------------------------------------------------------------- -int cmCPackTGZ_Data_Close(void *client_data) -{ - cmCPackTGZ_Data *mydata = (cmCPackTGZ_Data*)client_data; - - if ( mydata->Compress ) - { - cmCPackTGZ_Data_Write(client_data, 0, 0); - - char buffer[8]; - int n; - uLong x = mydata->CRC; - for (n = 0; n < 4; n++) { - buffer[n] = static_cast(x & 0xff); - x >>= 8; - } - x = mydata->ZLibStream.total_in; - for (n = 0; n < 4; n++) { - buffer[n+4] = static_cast(x & 0xff); - x >>= 8; - } - - mydata->OutputStream->write(buffer, 8); - (void)deflateEnd(&mydata->ZLibStream); - } - delete mydata->OutputStream; - mydata->OutputStream = 0; - return (0); -} - -//---------------------------------------------------------------------- -int cmCPackTGZGenerator::InitializeInternal() -{ - this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "1"); - return this->Superclass::InitializeInternal(); -} - -//---------------------------------------------------------------------- -int cmCPackTGZGenerator::CompressFiles(const char* outFileName, - const char* toplevel, const std::vector& files) -{ - cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " - << (toplevel ? toplevel : "(NULL)") << std::endl); - cmCPackTGZ_Data mydata(this, this->Compress); - TAR *t; - char buf[TAR_MAXPATHLEN]; - char pathname[TAR_MAXPATHLEN]; - - tartype_t gztype = { - (openfunc_t)cmCPackTGZ_Data_Open, - (closefunc_t)cmCPackTGZ_Data_Close, - (readfunc_t)0, - (writefunc_t)cmCPackTGZ_Data_Write, - &mydata - }; - - // This libtar is not const safe. Make a non-const copy of outFileName - char* realName = new char[ strlen(outFileName) + 1 ]; - strcpy(realName, outFileName); - int flags = O_WRONLY | O_CREAT; - int options = 0; - if(this->GeneratorVerbose) - { - options |= TAR_VERBOSE; - } -#ifdef __CYGWIN__ - options |= TAR_GNU; -#endif - if (tar_open(&t, realName, - &gztype, - flags, 0644, - options) == -1) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem with tar_open(): " - << strerror(errno) << std::endl); - delete [] realName; - return 0; - } - - delete [] realName; - - std::vector::const_iterator fileIt; - for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt ) - { - std::string rp = cmSystemTools::RelativePath(toplevel, fileIt->c_str()); - strncpy(pathname, fileIt->c_str(), sizeof(pathname)); - pathname[sizeof(pathname)-1] = 0; - strncpy(buf, rp.c_str(), sizeof(buf)); - buf[sizeof(buf)-1] = 0; - if (tar_append_tree(t, pathname, buf) != 0) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Problem with tar_append_tree(\"" << buf << "\", \"" - << pathname << "\"): " - << strerror(errno) << std::endl); - tar_close(t); - return 0; - } - } - if (tar_append_eof(t) != 0) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem with tar_append_eof(): " - << strerror(errno) << std::endl); - tar_close(t); - return 0; - } - - if (tar_close(t) != 0) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem with tar_close(): " - << strerror(errno) << std::endl); - return 0; - } - return 1; -} - -//---------------------------------------------------------------------- -int cmCPackTGZGenerator::GenerateHeader(std::ostream* os) -{ - if ( this->Compress ) - { - const int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ - char header[11]; - sprintf(header, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], - Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, - 3 /* zlib os code for UNIX, not really used anyway */); - os->write(header, 10); - } - return 1; -} diff --git a/Source/CPack/cmCPackTGZGenerator.h b/Source/CPack/cmCPackTGZGenerator.h index 099775dd8..3a9fc6b41 100644 --- a/Source/CPack/cmCPackTGZGenerator.h +++ b/Source/CPack/cmCPackTGZGenerator.h @@ -13,35 +13,23 @@ #ifndef cmCPackTGZGenerator_h #define cmCPackTGZGenerator_h -#include "cmCPackGenerator.h" - -class cmCPackTGZGeneratorForward; +#include "cmCPackArchiveGenerator.h" /** \class cmCPackTGZGenerator * \brief A generator for TGZ files * - * http://people.freebsd.org/~kientzle/libarchive/ */ -class cmCPackTGZGenerator : public cmCPackGenerator +class cmCPackTGZGenerator : public cmCPackArchiveGenerator { public: - friend class cmCPackTGZGeneratorForward; - cmCPackTypeMacro(cmCPackTGZGenerator, cmCPackGenerator); - + cmCPackTypeMacro(cmCPackTGZGenerator, cmCPackArchiveGenerator); /** * Construct generator */ cmCPackTGZGenerator(); virtual ~cmCPackTGZGenerator(); - protected: - virtual int InitializeInternal(); - virtual int GenerateHeader(std::ostream* os); - int CompressFiles(const char* outFileName, const char* toplevel, - const std::vector& files); virtual const char* GetOutputExtension() { return ".tar.gz"; } - - bool Compress; }; #endif diff --git a/Source/CPack/cmCPackTarBZip2Generator.cxx b/Source/CPack/cmCPackTarBZip2Generator.cxx index de7f16c18..52826dc18 100644 --- a/Source/CPack/cmCPackTarBZip2Generator.cxx +++ b/Source/CPack/cmCPackTarBZip2Generator.cxx @@ -11,29 +11,11 @@ ============================================================================*/ #include "cmCPackTarBZip2Generator.h" - -#include "cmake.h" -#include "cmGlobalGenerator.h" -#include "cmLocalGenerator.h" -#include "cmSystemTools.h" -#include "cmMakefile.h" -#include "cmGeneratedFileStream.h" -#include "cmCPackLog.h" - -#include - -// Includes needed for implementation of RenameFile. This is not in -// system tools because it is not implemented robustly enough to move -// files across directories. -#ifdef _WIN32 -# include -# include -#endif - //---------------------------------------------------------------------- -cmCPackTarBZip2Generator::cmCPackTarBZip2Generator() +cmCPackTarBZip2Generator::cmCPackTarBZip2Generator() + :cmCPackArchiveGenerator(cmCPackArchiveGenerator::BZIP2, + cmCPackArchiveGenerator::TAR) { - this->Compress = false; } //---------------------------------------------------------------------- @@ -41,135 +23,3 @@ cmCPackTarBZip2Generator::~cmCPackTarBZip2Generator() { } -//---------------------------------------------------------------------- -int cmCPackTarBZip2Generator::InitializeInternal() -{ - this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "1"); - std::vector path; - std::string pkgPath = cmSystemTools::FindProgram("bzip2", path, false); - if ( pkgPath.empty() ) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find BZip2" << std::endl); - return 0; - } - this->SetOptionIfNotSet("CPACK_INSTALLER_PROGRAM", pkgPath.c_str()); - cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Found Compress program: " - << pkgPath.c_str() - << std::endl); - - return this->Superclass::InitializeInternal(); -} - -//---------------------------------------------------------------------- -int cmCPackTarBZip2Generator::BZip2File(const char* packageDirFileName) -{ - int retVal = 0; - cmOStringStream dmgCmd1; - dmgCmd1 << "\"" << this->GetOption("CPACK_INSTALLER_PROGRAM") - << "\" \"" << packageDirFileName - << "\""; - retVal = -1; - std::string output; - int res = cmSystemTools::RunSingleCommand(dmgCmd1.str().c_str(), &output, - &retVal, 0, this->GeneratorVerbose, 0); - if ( !res || retVal ) - { - std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY"); - tmpFile += "/CompressBZip2.log"; - cmGeneratedFileStream ofs(tmpFile.c_str()); - ofs << "# Run command: " << dmgCmd1.str().c_str() << std::endl - << "# Output:" << std::endl - << output.c_str() << std::endl; - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running BZip2 command: " - << dmgCmd1.str().c_str() << std::endl - << "Please check " << tmpFile.c_str() << " for errors" << std::endl); - return 0; - } - return 1; -} - -//---------------------------------------------------------------------- -int cmCPackTarBZip2Generator::CompressFiles(const char* outFileName, - const char* toplevel, const std::vector& files) -{ - std::string packageDirFileName - = this->GetOption("CPACK_TEMPORARY_DIRECTORY"); - packageDirFileName += ".tar"; - std::string output; - if ( !this->Superclass::CompressFiles(packageDirFileName.c_str(), - toplevel, files) ) - { - return 0; - } - - if(!this->BZip2File(packageDirFileName.c_str())) - { - return 0; - } - - std::string compressOutFile = packageDirFileName + ".bz2"; - if ( !cmSystemTools::SameFile(compressOutFile.c_str(), outFileName ) ) - { - if ( !this->RenameFile(compressOutFile.c_str(), outFileName) ) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem renaming: \"" - << compressOutFile.c_str() << "\" to \"" - << (outFileName ? outFileName : "(NULL)") << std::endl); - return 0; - } - } - - return 1; -} - -//---------------------------------------------------------------------------- -int cmCPackTarBZip2Generator::RenameFile(const char* oldname, - const char* newname) -{ -#ifdef _WIN32 - /* On Windows the move functions will not replace existing files. - Check if the destination exists. */ - struct stat newFile; - if(stat(newname, &newFile) == 0) - { - /* The destination exists. We have to replace it carefully. The - MoveFileEx function does what we need but is not available on - Win9x. */ - OSVERSIONINFO osv; - DWORD attrs; - - /* Make sure the destination is not read only. */ - attrs = GetFileAttributes(newname); - if(attrs & FILE_ATTRIBUTE_READONLY) - { - SetFileAttributes(newname, attrs & ~FILE_ATTRIBUTE_READONLY); - } - - /* Check the windows version number. */ - osv.dwOSVersionInfoSize = sizeof(osv); - GetVersionEx(&osv); - if(osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) - { - /* This is Win9x. There is no MoveFileEx implementation. We - cannot quite rename the file atomically. Just delete the - destination and then move the file. */ - DeleteFile(newname); - return MoveFile(oldname, newname); - } - else - { - /* This is not Win9x. Use the MoveFileEx implementation. */ - return MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING); - } - } - else - { - /* The destination does not exist. Just move the file. */ - return MoveFile(oldname, newname); - } -#else - /* On UNIX we have an OS-provided call to do this atomically. */ - return rename(oldname, newname) == 0; -#endif -} - diff --git a/Source/CPack/cmCPackTarBZip2Generator.h b/Source/CPack/cmCPackTarBZip2Generator.h index 7b4ed650e..74c244e5a 100644 --- a/Source/CPack/cmCPackTarBZip2Generator.h +++ b/Source/CPack/cmCPackTarBZip2Generator.h @@ -13,30 +13,22 @@ #ifndef cmCPackTarBZip2Generator_h #define cmCPackTarBZip2Generator_h -#include "cmCPackTGZGenerator.h" +#include "cmCPackArchiveGenerator.h" /** \class cmCPackTarBZip2Generator * \brief A generator for TarBZip2 files */ -class cmCPackTarBZip2Generator : public cmCPackTGZGenerator +class cmCPackTarBZip2Generator : public cmCPackArchiveGenerator { public: - friend class cmCPackTarBZip2GeneratorForward; - cmCPackTypeMacro(cmCPackTarBZip2Generator, cmCPackTGZGenerator); - + cmCPackTypeMacro(cmCPackTarBZip2Generator, cmCPackArchiveGenerator); /** * Construct generator */ cmCPackTarBZip2Generator(); virtual ~cmCPackTarBZip2Generator(); - protected: - virtual int InitializeInternal(); - int CompressFiles(const char* outFileName, const char* toplevel, - const std::vector& files); virtual const char* GetOutputExtension() { return ".tar.bz2"; } - int BZip2File(const char* filename); - int RenameFile(const char* oldname, const char* newname); }; #endif diff --git a/Source/CPack/cmCPackTarCompressGenerator.cxx b/Source/CPack/cmCPackTarCompressGenerator.cxx index 165c18122..e9b5e2e87 100644 --- a/Source/CPack/cmCPackTarCompressGenerator.cxx +++ b/Source/CPack/cmCPackTarCompressGenerator.cxx @@ -12,32 +12,10 @@ #include "cmCPackTarCompressGenerator.h" -#include "cmake.h" -#include "cmGlobalGenerator.h" -#include "cmLocalGenerator.h" -#include "cmSystemTools.h" -#include "cmMakefile.h" -#include "cmGeneratedFileStream.h" -#include "cmCPackLog.h" - -#include -#include -#include -#include -#include - //---------------------------------------------------------------------- -class cmCPackTarCompressGeneratorForward -{ -public: - static int GenerateHeader(cmCPackTarCompressGenerator* gg, std::ostream* os) - { - return gg->GenerateHeader(os); - } -}; - -//---------------------------------------------------------------------- -cmCPackTarCompressGenerator::cmCPackTarCompressGenerator() +cmCPackTarCompressGenerator::cmCPackTarCompressGenerator() + :cmCPackArchiveGenerator(cmCPackArchiveGenerator::COMPRESS, + cmCPackArchiveGenerator::TAR) { } @@ -46,206 +24,3 @@ cmCPackTarCompressGenerator::~cmCPackTarCompressGenerator() { } -//---------------------------------------------------------------------- -class cmCPackTarCompress_Data -{ -public: - cmCPackTarCompress_Data(cmCPackTarCompressGenerator* gen) : - OutputStream(0), Generator(gen) {} - std::ostream* OutputStream; - cmCPackTarCompressGenerator* Generator; - cmcompress_stream CMCompressStream; -}; - -//---------------------------------------------------------------------- -extern "C" { - // For cmTar - int cmCPackTarCompress_Data_Open(void *client_data, const char* name, - int oflags, mode_t mode); - ssize_t cmCPackTarCompress_Data_Write(void *client_data, void *buff, - size_t n); - int cmCPackTarCompress_Data_Close(void *client_data); - - // For cmCompress - int cmCPackTarCompress_Compress_Output(void* cdata, const char* data, - int len); -} - - -//---------------------------------------------------------------------- -int cmCPackTarCompress_Data_Open(void *client_data, const char* pathname, - int, mode_t) -{ - cmCPackTarCompress_Data *mydata = (cmCPackTarCompress_Data*)client_data; - - if ( !cmcompress_compress_initialize(&mydata->CMCompressStream) ) - { - return -1; - } - - mydata->CMCompressStream.client_data = mydata; - mydata->CMCompressStream.output_stream = cmCPackTarCompress_Compress_Output; - - cmGeneratedFileStream* gf = new cmGeneratedFileStream; - // Open binary - gf->Open(pathname, false, true); - mydata->OutputStream = gf; - if ( !*mydata->OutputStream ) - { - return -1; - } - - if ( !cmcompress_compress_start(&mydata->CMCompressStream) ) - { - return -1; - } - - - if ( !cmCPackTarCompressGeneratorForward::GenerateHeader( - mydata->Generator,gf)) - { - return -1; - } - - return 0; -} - -//---------------------------------------------------------------------- -ssize_t cmCPackTarCompress_Data_Write(void *client_data, void *buff, size_t n) -{ - cmCPackTarCompress_Data *mydata = (cmCPackTarCompress_Data*)client_data; - - if ( !cmcompress_compress(&mydata->CMCompressStream, buff, n) ) - { - return 0; - } - return n; -} - -//---------------------------------------------------------------------- -int cmCPackTarCompress_Data_Close(void *client_data) -{ - cmCPackTarCompress_Data *mydata = (cmCPackTarCompress_Data*)client_data; - - if ( !cmcompress_compress_finalize(&mydata->CMCompressStream) ) - { - delete mydata->OutputStream; - return -1; - } - - delete mydata->OutputStream; - mydata->OutputStream = 0; - return (0); -} - -//---------------------------------------------------------------------- -int cmCPackTarCompressGenerator::InitializeInternal() -{ - this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "1"); - return this->Superclass::InitializeInternal(); -} - -//---------------------------------------------------------------------- -int cmCPackTarCompressGenerator::CompressFiles(const char* outFileName, - const char* toplevel, const std::vector& files) -{ - cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " - << (toplevel ? toplevel : "(NULL)") << std::endl); - cmCPackTarCompress_Data mydata(this); - TAR *t; - char buf[TAR_MAXPATHLEN]; - char pathname[TAR_MAXPATHLEN]; - - tartype_t compressType = { - (openfunc_t)cmCPackTarCompress_Data_Open, - (closefunc_t)cmCPackTarCompress_Data_Close, - (readfunc_t)0, - (writefunc_t)cmCPackTarCompress_Data_Write, - &mydata - }; - - // This libtar is not const safe. Make a non-const copy of outFileName - char* realName = new char[ strlen(outFileName) + 1 ]; - strcpy(realName, outFileName); - int flags = O_WRONLY | O_CREAT; - int options = 0; - if(this->GeneratorVerbose) - { - options |= TAR_VERBOSE; - } -#ifdef __CYGWIN__ - options |= TAR_GNU; -#endif - if (tar_open(&t, realName, - &compressType, - flags, 0644, - options) == -1) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem with tar_open(): " - << strerror(errno) << std::endl); - delete [] realName; - return 0; - } - - delete [] realName; - - std::vector::const_iterator fileIt; - for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt ) - { - std::string rp = cmSystemTools::RelativePath(toplevel, fileIt->c_str()); - strncpy(pathname, fileIt->c_str(), sizeof(pathname)); - pathname[sizeof(pathname)-1] = 0; - strncpy(buf, rp.c_str(), sizeof(buf)); - buf[sizeof(buf)-1] = 0; - if (tar_append_tree(t, pathname, buf) != 0) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Problem with tar_append_tree(\"" << buf << "\", \"" - << pathname << "\"): " - << strerror(errno) << std::endl); - tar_close(t); - return 0; - } - } - if (tar_append_eof(t) != 0) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem with tar_append_eof(): " - << strerror(errno) << std::endl); - tar_close(t); - return 0; - } - - if (tar_close(t) != 0) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem with tar_close(): " - << strerror(errno) << std::endl); - return 0; - } - return 1; -} - -//---------------------------------------------------------------------- -int cmCPackTarCompress_Compress_Output(void* client_data, - const char* data, int data_length) -{ - if(!client_data) - { - return 0; - } - cmcompress_stream *cstream = static_cast(client_data); - cmCPackTarCompress_Data *mydata - = static_cast(cstream->client_data); - if ( !mydata->OutputStream ) - { - return 0; - } - mydata->OutputStream->write(data, data_length); - return data_length; -} - -//---------------------------------------------------------------------- -int cmCPackTarCompressGenerator::GenerateHeader(std::ostream* os) -{ - (void)os; - return 1; -} diff --git a/Source/CPack/cmCPackTarCompressGenerator.h b/Source/CPack/cmCPackTarCompressGenerator.h index 3c18056f4..7ff9a0ade 100644 --- a/Source/CPack/cmCPackTarCompressGenerator.h +++ b/Source/CPack/cmCPackTarCompressGenerator.h @@ -18,12 +18,10 @@ /** \class cmCPackTarCompressGenerator * \brief A generator for TarCompress files */ -class cmCPackTarCompressGenerator : public cmCPackTGZGenerator +class cmCPackTarCompressGenerator : public cmCPackArchiveGenerator { public: - friend class cmCPackTarCompressGeneratorForward; - cmCPackTypeMacro(cmCPackTarCompressGenerator, cmCPackTGZGenerator); - + cmCPackTypeMacro(cmCPackTarCompressGenerator, cmCPackArchiveGenerator); /** * Construct generator */ @@ -31,13 +29,7 @@ public: virtual ~cmCPackTarCompressGenerator(); protected: - virtual int InitializeInternal(); - int CompressFiles(const char* outFileName, const char* toplevel, - const std::vector& files); virtual const char* GetOutputExtension() { return ".tar.Z"; } - - int RenameFile(const char* oldname, const char* newname); - int GenerateHeader(std::ostream* os); }; #endif diff --git a/Source/CPack/cmCPackZIPGenerator.cxx b/Source/CPack/cmCPackZIPGenerator.cxx index 992449792..e195f83c7 100644 --- a/Source/CPack/cmCPackZIPGenerator.cxx +++ b/Source/CPack/cmCPackZIPGenerator.cxx @@ -12,14 +12,10 @@ #include "cmCPackZIPGenerator.h" -#include "cmSystemTools.h" -#include "cmGeneratedFileStream.h" -#include "cmCPackLog.h" - -#include - //---------------------------------------------------------------------- cmCPackZIPGenerator::cmCPackZIPGenerator() + :cmCPackArchiveGenerator(cmCPackArchiveGenerator::NONE, + cmCPackArchiveGenerator::ZIP) { } @@ -28,71 +24,3 @@ cmCPackZIPGenerator::~cmCPackZIPGenerator() { } -//---------------------------------------------------------------------- -int cmCPackZIPGenerator::InitializeInternal() -{ - this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "1"); - this->ReadListFile("CPackZIP.cmake"); - if ((!this->IsSet("ZIP_EXECUTABLE")) - || (!this->IsSet("CPACK_ZIP_COMMAND"))) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find a suitable ZIP program" - << std::endl); - return 0; - } - return this->Superclass::InitializeInternal(); -} - -//---------------------------------------------------------------------- -int cmCPackZIPGenerator::CompressFiles(const char* outFileName, - const char* toplevel, const std::vector& files) -{ - std::string tempFileName; - tempFileName = toplevel; - tempFileName += "/winZip.filelist"; - bool needQuotesInFile = cmSystemTools::IsOn( - this->GetOption("CPACK_ZIP_NEED_QUOTES")); - - std::string cmd = this->GetOption("CPACK_ZIP_COMMAND"); - cmsys::SystemTools::ReplaceString(cmd, "", outFileName); - cmsys::SystemTools::ReplaceString(cmd, "", "winZip.filelist"); - - { // the scope is needed for cmGeneratedFileStream - cmGeneratedFileStream out(tempFileName.c_str()); - std::vector::const_iterator fileIt; - for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt ) - { - if ( needQuotesInFile ) - { - out << "\""; - } - out << cmSystemTools::RelativePath(toplevel, fileIt->c_str()); - if ( needQuotesInFile ) - { - out << "\""; - } - out << std::endl; - } - } - - - std::string output; - int retVal = -1; - int res = cmSystemTools::RunSingleCommand(cmd.c_str(), &output, - &retVal, toplevel, this->GeneratorVerbose, 0); - - if ( !res || retVal ) - { - std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY"); - tmpFile += "/CompressZip.log"; - cmGeneratedFileStream ofs(tmpFile.c_str()); - ofs << "# Run command: " << cmd.c_str() << std::endl - << "# Output:" << std::endl - << output.c_str() << std::endl; - cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running zip command: " - << cmd.c_str() << std::endl - << "Please check " << tmpFile.c_str() << " for errors" << std::endl); - return 0; - } - return 1; -} diff --git a/Source/CPack/cmCPackZIPGenerator.h b/Source/CPack/cmCPackZIPGenerator.h index 7ff0dc3b8..70e1a5fa8 100644 --- a/Source/CPack/cmCPackZIPGenerator.h +++ b/Source/CPack/cmCPackZIPGenerator.h @@ -13,18 +13,15 @@ #ifndef cmCPackZIPGenerator_h #define cmCPackZIPGenerator_h -#include "cmCPackGenerator.h" - -class cmCPackZIPGeneratorForward; +#include "cmCPackArchiveGenerator.h" /** \class cmCPackZIPGenerator * \brief A generator for ZIP files */ -class cmCPackZIPGenerator : public cmCPackGenerator +class cmCPackZIPGenerator : public cmCPackArchiveGenerator { public: - friend class cmCPackZIPGeneratorForward; - cmCPackTypeMacro(cmCPackZIPGenerator, cmCPackGenerator); + cmCPackTypeMacro(cmCPackZIPGenerator, cmCPackArchiveGenerator); /** * Construct generator @@ -33,12 +30,7 @@ public: virtual ~cmCPackZIPGenerator(); protected: - virtual int InitializeInternal(); - int CompressFiles(const char* outFileName, const char* toplevel, - const std::vector& files); virtual const char* GetOutputExtension() { return ".zip"; } - - int ZipStyle; }; #endif diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 031bfc32b..d593d7e9a 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -18,11 +18,13 @@ #ifdef __QNX__ # include /* for malloc/free on QNX */ #endif - +#include #include #include #include #if defined(CMAKE_BUILD_WITH_CMAKE) +#include +#include # include #endif #include @@ -45,9 +47,8 @@ #endif #if defined(CMAKE_BUILD_WITH_CMAKE) -# include +# include // auto_ptr # include -# include # include #endif @@ -1701,166 +1702,111 @@ bool cmSystemTools::IsPathToFramework(const char* path) return false; } -#if defined(CMAKE_BUILD_WITH_CMAKE) -struct cmSystemToolsGZStruct -{ - gzFile GZFile; -}; - -extern "C" { - int cmSystemToolsGZStructOpen(void* call_data, const char *pathname, - int oflags, mode_t mode); - int cmSystemToolsGZStructClose(void* call_data); - ssize_t cmSystemToolsGZStructRead(void* call_data, void* buf, size_t count); - ssize_t cmSystemToolsGZStructWrite(void* call_data, const void* buf, - size_t count); -} - -int cmSystemToolsGZStructOpen(void* call_data, const char *pathname, - int oflags, mode_t mode) -{ - const char *gzoflags; - int fd; - - cmSystemToolsGZStruct* gzf = static_cast(call_data); - - switch (oflags & O_ACCMODE) - { - case O_WRONLY: - gzoflags = "wb"; - break; - case O_RDONLY: - gzoflags = "rb"; - break; - default: - case O_RDWR: - errno = EINVAL; - return -1; - } - - fd = open(pathname, oflags, mode); - if (fd == -1) - { - return -1; - } - -// no fchmod on BeOS 5...do pathname instead. -#if defined(__BEOS__) && !defined(__ZETA__) && !defined(__HAIKU__) - if ((oflags & O_CREAT) && chmod(pathname, mode)) - { - return -1; - } -#elif !defined(_WIN32) || defined(__CYGWIN__) - if ((oflags & O_CREAT) && fchmod(fd, mode)) - { - return -1; - } -#endif - - gzf->GZFile = gzdopen(fd, gzoflags); - if (!gzf->GZFile) - { - errno = ENOMEM; - return -1; - } - - return fd; -} - -int cmSystemToolsGZStructClose(void* call_data) -{ - cmSystemToolsGZStruct* gzf = static_cast(call_data); - return gzclose(gzf->GZFile); -} - -ssize_t cmSystemToolsGZStructRead(void* call_data, void* buf, size_t count) -{ - cmSystemToolsGZStruct* gzf = static_cast(call_data); - return gzread(gzf->GZFile, buf, static_cast(count)); -} - -ssize_t cmSystemToolsGZStructWrite(void* call_data, const void* buf, - size_t count) -{ - cmSystemToolsGZStruct* gzf = static_cast(call_data); - return gzwrite(gzf->GZFile, (void*)buf, static_cast(count)); -} - -#endif - bool cmSystemTools::CreateTar(const char* outFileName, const std::vector& files, bool gzip, bool verbose) { -#if defined(CMAKE_BUILD_WITH_CMAKE) - TAR *t; - char buf[TAR_MAXPATHLEN]; - char pathname[TAR_MAXPATHLEN]; - cmSystemToolsGZStruct gzs; - - tartype_t gztype = { - (openfunc_t)cmSystemToolsGZStructOpen, - (closefunc_t)cmSystemToolsGZStructClose, - (readfunc_t)cmSystemToolsGZStructRead, - (writefunc_t)cmSystemToolsGZStructWrite, - &gzs - }; - - // This libtar is not const safe. Make a non-const copy of outFileName - char* realName = new char[ strlen(outFileName) + 1 ]; - strcpy(realName, outFileName); - int options = 0; - if(verbose) +#if defined(CMAKE_BUILD_WITH_CMAKE) + std::string cwd = cmSystemTools::GetCurrentWorkingDirectory(); + // recursively expand all directories in files so that we have a list + // of files + std::vector expandedFiles; + for(std::vector::const_iterator i = files.begin(); + i != files.end(); ++i) { - options |= TAR_VERBOSE; - } -#ifdef __CYGWIN__ - options |= TAR_GNU; -#endif - if (tar_open(&t, realName, - (gzip? &gztype : NULL), - O_WRONLY | O_CREAT, 0644, - options) == -1) - { - cmSystemTools::Error("Problem with tar_open(): ", strerror(errno)); - delete [] realName; - return false; - } - - delete [] realName; - - std::vector::const_iterator it; - for (it = files.begin(); it != files.end(); ++ it ) - { - strncpy(pathname, it->c_str(), sizeof(pathname)); - pathname[sizeof(pathname)-1] = 0; - strncpy(buf, pathname, sizeof(buf)); - buf[sizeof(buf)-1] = 0; - if (tar_append_tree(t, buf, pathname) != 0) + if(cmSystemTools::FileIsDirectory(i->c_str())) { - cmOStringStream ostr; - ostr << "Problem with tar_append_tree(\"" << buf << "\", \"" - << pathname << "\"): " - << strerror(errno); - cmSystemTools::Error(ostr.str().c_str()); - tar_close(t); - return false; + cmsys::Glob gl; + std::string findExpr = *i; + if ( findExpr[findExpr.size()-1] != '/' ) + { + findExpr +="/"; + } + findExpr += "*"; + gl.RecurseOn(); + if ( gl.FindFiles(findExpr) ) + { + std::vector dirfiles = gl.GetFiles(); + std::copy(dirfiles.begin(), dirfiles.end(), + std::back_inserter(expandedFiles)); + } + } + else + { + if(!cmSystemTools::FileIsFullPath(i->c_str())) + { + std::string fullp = cwd + "/" + *i; + expandedFiles.push_back(fullp); + } + else + { + expandedFiles.push_back(*i); + } } } - - if (tar_append_eof(t) != 0) + int res; + // create a new archive + struct archive* a = archive_write_new(); + if(gzip) { - cmSystemTools::Error("Problem with tar_append_eof(): ", strerror(errno)); - tar_close(t); - return false; - } - - if (tar_close(t) != 0) + res = archive_write_set_compression_gzip(a); + if(res != ARCHIVE_OK) + { + cmSystemTools::Error("Unable to use gzip in libarchive"); + } + } + res = archive_write_set_format_ustar(a); + if(res != ARCHIVE_OK) { - cmSystemTools::Error("Problem with tar_close(): ", strerror(errno)); - return false; + cmSystemTools::Error("Unable to use tar libarchive"); } - + archive_write_open_file(a, outFileName); + // create a new disk struct + struct archive* disk = archive_read_disk_new(); + archive_read_disk_set_standard_lookup(disk); + std::vector::const_iterator fileIt; + for ( fileIt = expandedFiles.begin(); + fileIt != expandedFiles.end(); ++ fileIt ) + { + // create a new entry for each file + struct archive_entry *entry = archive_entry_new(); + // Get the relative path to the file + std::string rp = cmSystemTools::RelativePath(cwd.c_str(), + fileIt->c_str()); + if(verbose) + { + std::cout << rp << "\n"; + } + // Set the name of the entry to the file name + archive_entry_set_pathname(entry, rp.c_str()); + // get the information about the file from stat + struct stat s; + stat(fileIt->c_str(), &s); + archive_read_disk_entry_from_file(disk, entry, -1, &s); + // write entry header + archive_write_header(a, entry); + // now copy contents of file into archive a + FILE* file = fopen(fileIt->c_str(), "rb"); + if(!file) + { + cmSystemTools::Error("Problem with fopen(): ", + fileIt->c_str()); + return false; + } + char buff[16384]; + int len = fread(buff, 1, sizeof(buff), file); + while (len > 0) + { + archive_write_data(a, buff, len); + len = fread(buff, 1, sizeof(buff), file); + } + // close the file and free the entry + fclose(file); + archive_entry_free(entry); + } + // close the archive and finish the write + archive_write_close(a); + archive_write_finish(a); return true; #else (void)outFileName; @@ -1871,58 +1817,234 @@ bool cmSystemTools::CreateTar(const char* outFileName, #endif } +#if defined(CMAKE_BUILD_WITH_CMAKE) +namespace{ +#define BSDTAR_FILESIZE_PRINTF "%lu" +#define BSDTAR_FILESIZE_TYPE unsigned long + void +list_item_verbose(FILE *out, struct archive_entry *entry) +{ + char tmp[100]; + size_t w; + const char *p; + const char *fmt; + time_t tim; + static time_t now; + size_t u_width = 6; + size_t gs_width = 13; + + /* + * We avoid collecting the entire list in memory at once by + * listing things as we see them. However, that also means we can't + * just pre-compute the field widths. Instead, we start with guesses + * and just widen them as necessary. These numbers are completely + * arbitrary. + */ + if (!now) + { + time(&now); + } + fprintf(out, "%s %d ", + archive_entry_strmode(entry), + archive_entry_nlink(entry)); + + /* Use uname if it's present, else uid. */ + p = archive_entry_uname(entry); + if ((p == NULL) || (*p == '\0')) + { + sprintf(tmp, "%lu ", + (unsigned long)archive_entry_uid(entry)); + p = tmp; + } + w = strlen(p); + if (w > u_width) + { + u_width = w; + } + fprintf(out, "%-*s ", (int)u_width, p); + + /* Use gname if it's present, else gid. */ + p = archive_entry_gname(entry); + if (p != NULL && p[0] != '\0') + { + fprintf(out, "%s", p); + w = strlen(p); + } + else + { + sprintf(tmp, "%lu", + (unsigned long)archive_entry_gid(entry)); + w = strlen(tmp); + fprintf(out, "%s", tmp); + } + + /* + * Print device number or file size, right-aligned so as to make + * total width of group and devnum/filesize fields be gs_width. + * If gs_width is too small, grow it. + */ + if (archive_entry_filetype(entry) == AE_IFCHR + || archive_entry_filetype(entry) == AE_IFBLK) + { + sprintf(tmp, "%lu,%lu", + (unsigned long)archive_entry_rdevmajor(entry), + (unsigned long)archive_entry_rdevminor(entry)); + } + else + { + /* + * Note the use of platform-dependent macros to format + * the filesize here. We need the format string and the + * corresponding type for the cast. + */ + sprintf(tmp, BSDTAR_FILESIZE_PRINTF, + (BSDTAR_FILESIZE_TYPE)archive_entry_size(entry)); + } + if (w + strlen(tmp) >= gs_width) + { + gs_width = w+strlen(tmp)+1; + } + fprintf(out, "%*s", (int)(gs_width - w), tmp); + + /* Format the time using 'ls -l' conventions. */ + tim = archive_entry_mtime(entry); +#define HALF_YEAR (time_t)365 * 86400 / 2 +#if defined(_WIN32) && !defined(__CYGWIN__) +#define DAY_FMT "%d" /* Windows' strftime function does not support %e format. */ +#else +#define DAY_FMT "%e" /* Day number without leading zeros */ +#endif + if (tim < now - HALF_YEAR || tim > now + HALF_YEAR) + { + fmt = DAY_FMT " %b %Y"; + } + else + { + fmt = DAY_FMT " %b %H:%M"; + } + strftime(tmp, sizeof(tmp), fmt, localtime(&tim)); + fprintf(out, " %s ", tmp); + fprintf(out, "%s", archive_entry_pathname(entry)); + + /* Extra information for links. */ + if (archive_entry_hardlink(entry)) /* Hard link */ + { + fprintf(out, " link to %s", + archive_entry_hardlink(entry)); + } + else if (archive_entry_symlink(entry)) /* Symbolic link */ + { + fprintf(out, " -> %s", archive_entry_symlink(entry)); + } +} + +int copy_data(struct archive *ar, struct archive *aw) +{ + int r; + const void *buff; + size_t size; + off_t offset; + + for (;;) + { + r = archive_read_data_block(ar, &buff, &size, &offset); + if (r == ARCHIVE_EOF) + { + return (ARCHIVE_OK); + } + if (r != ARCHIVE_OK) + { + return (r); + } + r = archive_write_data_block(aw, buff, size, offset); + if (r != ARCHIVE_OK) + { + cmSystemTools::Message("archive_write_data_block()", + archive_error_string(aw)); + return (r); + } + } +} + +bool extract_tar(const char* outFileName, bool verbose, bool extract) +{ + struct archive* a = archive_read_new(); + struct archive *ext = archive_write_disk_new(); + archive_read_support_compression_all(a); + archive_read_support_format_all(a); + struct archive_entry *entry; + int r = archive_read_open_file(a, outFileName, 10240); + if(r) + { + cmSystemTools::Error("Problem with archive_read_open_file(): ", + archive_error_string(a)); + return false; + } + for (;;) + { + r = archive_read_next_header(a, &entry); + if (r == ARCHIVE_EOF) + { + break; + } + if (r != ARCHIVE_OK) + { + cmSystemTools::Error("Problem with archive_read_next_header(): ", + archive_error_string(a)); + } + if (verbose && extract) + { + cmSystemTools::Stdout("x "); + } + if(verbose && !extract) + { + list_item_verbose(stdout, entry); + } + else + { + cmSystemTools::Stdout(archive_entry_pathname(entry)); + } + if(extract) + { + r = archive_write_header(ext, entry); + if (r != ARCHIVE_OK) + { + cmSystemTools::Error("Problem with archive_write_header(): ", + archive_error_string(a)); + } + else + { + copy_data(a, ext); + r = archive_write_finish_entry(ext); + if (r != ARCHIVE_OK) + { + cmSystemTools::Error("Problem with archive_write_finish_entry(): ", + archive_error_string(ext)); + } + } + } + if (verbose || !extract) + { + cmSystemTools::Stdout("\n"); + } + } + archive_read_close(a); + archive_read_finish(a); + return true; + +} +} +#endif + bool cmSystemTools::ExtractTar(const char* outFileName, const std::vector& files, - bool gzip, bool verbose) + bool , bool verbose) { (void)files; #if defined(CMAKE_BUILD_WITH_CMAKE) - TAR *t; - cmSystemToolsGZStruct gzs; - - tartype_t gztype = { - cmSystemToolsGZStructOpen, - cmSystemToolsGZStructClose, - cmSystemToolsGZStructRead, - cmSystemToolsGZStructWrite, - &gzs - }; - - // This libtar is not const safe. Make a non-const copy of outFileName - char* realName = new char[ strlen(outFileName) + 1 ]; - strcpy(realName, outFileName); - if (tar_open(&t, realName, - (gzip? &gztype : NULL), - O_RDONLY -#ifdef _WIN32 - | O_BINARY -#endif - , 0, - (verbose?TAR_VERBOSE:0) - | 0) == -1) - { - cmSystemTools::Error("Problem with tar_open(): ", strerror(errno)); - delete [] realName; - return false; - } - - delete [] realName; - - if (tar_extract_all(t, 0) != 0) - { - cmSystemTools::Error("Problem with tar_extract_all(): ", strerror(errno)); - return false; - } - - if (tar_close(t) != 0) - { - cmSystemTools::Error("Problem with tar_close(): ", strerror(errno)); - return false; - } - return true; + return extract_tar(outFileName, verbose, true); #else (void)outFileName; - (void)gzip; (void)verbose; return false; #endif @@ -1933,68 +2055,7 @@ bool cmSystemTools::ListTar(const char* outFileName, bool verbose) { #if defined(CMAKE_BUILD_WITH_CMAKE) - TAR *t; - cmSystemToolsGZStruct gzs; - - tartype_t gztype = { - cmSystemToolsGZStructOpen, - cmSystemToolsGZStructClose, - cmSystemToolsGZStructRead, - cmSystemToolsGZStructWrite, - &gzs - }; - - // This libtar is not const safe. Make a non-const copy of outFileName - char* realName = new char[ strlen(outFileName) + 1 ]; - strcpy(realName, outFileName); - if (tar_open(&t, realName, - (gzip? &gztype : NULL), - O_RDONLY -#ifdef _WIN32 - | O_BINARY -#endif - , 0, - (verbose?TAR_VERBOSE:0) - | 0) == -1) - { - cmSystemTools::Error("Problem with tar_open(): ", strerror(errno)); - delete [] realName; - return false; - } - - delete [] realName; - - while ((th_read(t)) == 0) - { - const char* filename = th_get_pathname(t); - files.push_back(filename); - - if ( verbose ) - { - th_print_long_ls(t); - } - else - { - std::cout << filename << std::endl; - } - -#ifdef DEBUG - th_print(t); -#endif - if (TH_ISREG(t) && tar_skip_regfile(t) != 0) - { - cmSystemTools::Error("Problem with tar_skip_regfile(): ", - strerror(errno)); - return false; - } - } - - if (tar_close(t) != 0) - { - cmSystemTools::Error("Problem with tar_close(): ", strerror(errno)); - return false; - } - return true; + return extract_tar(outFileName, verbose, false); #else (void)outFileName; (void)files; diff --git a/Tests/Complex/Executable/CMakeLists.txt b/Tests/Complex/Executable/CMakeLists.txt index 9e8632082..98b29bbf2 100644 --- a/Tests/Complex/Executable/CMakeLists.txt +++ b/Tests/Complex/Executable/CMakeLists.txt @@ -18,7 +18,10 @@ IF(COMPLEX_TEST_CMAKELIB) IF(EXISTS ${Complex_BINARY_DIR}/../../Utilities/cmcurl) LINK_DIRECTORIES(${Complex_BINARY_DIR}/../../Utilities/cmcurl) ENDIF(EXISTS ${Complex_BINARY_DIR}/../../Utilities/cmcurl) - LINK_DIRECTORIES(${Complex_BINARY_DIR}/../../Utilities/cmtar) + LINK_DIRECTORIES( + ${Complex_BINARY_DIR}/../../Utilities/cmlibarchive/libarchive + ${Complex_BINARY_DIR}/../../Utilities/cmbzip2 + ) ENDIF(COMPLEX_TEST_CMAKELIB) # Create an imported target for if(TARGET) test below. @@ -51,7 +54,7 @@ ADD_EXECUTABLE(complex complex testcflags.c ) # Sub1/NameConflictTest.c Sub2/NameConflictTest.c) ADD_EXECUTABLE(complex.file complex.file.cxx complex_nobuild.cxx) IF(COMPLEX_TEST_CMAKELIB) - TARGET_LINK_LIBRARIES(complex CMakeLib cmsys cmexpat cmzlib cmtar cmcurl) + TARGET_LINK_LIBRARIES(complex CMakeLib cmsys cmexpat cmzlib cmlibarchive cmbzip2 cmcurl) ENDIF(COMPLEX_TEST_CMAKELIB) IF (UNIX) diff --git a/Tests/ComplexOneConfig/Executable/CMakeLists.txt b/Tests/ComplexOneConfig/Executable/CMakeLists.txt index 9e8632082..98b29bbf2 100644 --- a/Tests/ComplexOneConfig/Executable/CMakeLists.txt +++ b/Tests/ComplexOneConfig/Executable/CMakeLists.txt @@ -18,7 +18,10 @@ IF(COMPLEX_TEST_CMAKELIB) IF(EXISTS ${Complex_BINARY_DIR}/../../Utilities/cmcurl) LINK_DIRECTORIES(${Complex_BINARY_DIR}/../../Utilities/cmcurl) ENDIF(EXISTS ${Complex_BINARY_DIR}/../../Utilities/cmcurl) - LINK_DIRECTORIES(${Complex_BINARY_DIR}/../../Utilities/cmtar) + LINK_DIRECTORIES( + ${Complex_BINARY_DIR}/../../Utilities/cmlibarchive/libarchive + ${Complex_BINARY_DIR}/../../Utilities/cmbzip2 + ) ENDIF(COMPLEX_TEST_CMAKELIB) # Create an imported target for if(TARGET) test below. @@ -51,7 +54,7 @@ ADD_EXECUTABLE(complex complex testcflags.c ) # Sub1/NameConflictTest.c Sub2/NameConflictTest.c) ADD_EXECUTABLE(complex.file complex.file.cxx complex_nobuild.cxx) IF(COMPLEX_TEST_CMAKELIB) - TARGET_LINK_LIBRARIES(complex CMakeLib cmsys cmexpat cmzlib cmtar cmcurl) + TARGET_LINK_LIBRARIES(complex CMakeLib cmsys cmexpat cmzlib cmlibarchive cmbzip2 cmcurl) ENDIF(COMPLEX_TEST_CMAKELIB) IF (UNIX) diff --git a/Tests/ComplexRelativePaths/Executable/CMakeLists.txt b/Tests/ComplexRelativePaths/Executable/CMakeLists.txt index 9e8632082..98b29bbf2 100644 --- a/Tests/ComplexRelativePaths/Executable/CMakeLists.txt +++ b/Tests/ComplexRelativePaths/Executable/CMakeLists.txt @@ -18,7 +18,10 @@ IF(COMPLEX_TEST_CMAKELIB) IF(EXISTS ${Complex_BINARY_DIR}/../../Utilities/cmcurl) LINK_DIRECTORIES(${Complex_BINARY_DIR}/../../Utilities/cmcurl) ENDIF(EXISTS ${Complex_BINARY_DIR}/../../Utilities/cmcurl) - LINK_DIRECTORIES(${Complex_BINARY_DIR}/../../Utilities/cmtar) + LINK_DIRECTORIES( + ${Complex_BINARY_DIR}/../../Utilities/cmlibarchive/libarchive + ${Complex_BINARY_DIR}/../../Utilities/cmbzip2 + ) ENDIF(COMPLEX_TEST_CMAKELIB) # Create an imported target for if(TARGET) test below. @@ -51,7 +54,7 @@ ADD_EXECUTABLE(complex complex testcflags.c ) # Sub1/NameConflictTest.c Sub2/NameConflictTest.c) ADD_EXECUTABLE(complex.file complex.file.cxx complex_nobuild.cxx) IF(COMPLEX_TEST_CMAKELIB) - TARGET_LINK_LIBRARIES(complex CMakeLib cmsys cmexpat cmzlib cmtar cmcurl) + TARGET_LINK_LIBRARIES(complex CMakeLib cmsys cmexpat cmzlib cmlibarchive cmbzip2 cmcurl) ENDIF(COMPLEX_TEST_CMAKELIB) IF (UNIX) diff --git a/Utilities/cmbzip2/CHANGES b/Utilities/cmbzip2/CHANGES new file mode 100644 index 000000000..6e4f65e2e --- /dev/null +++ b/Utilities/cmbzip2/CHANGES @@ -0,0 +1,319 @@ + ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ + + +0.9.0 +~~~~~ +First version. + + +0.9.0a +~~~~~~ +Removed 'ranlib' from Makefile, since most modern Unix-es +don't need it, or even know about it. + + +0.9.0b +~~~~~~ +Fixed a problem with error reporting in bzip2.c. This does not effect +the library in any way. Problem is: versions 0.9.0 and 0.9.0a (of the +program proper) compress and decompress correctly, but give misleading +error messages (internal panics) when an I/O error occurs, instead of +reporting the problem correctly. This shouldn't give any data loss +(as far as I can see), but is confusing. + +Made the inline declarations disappear for non-GCC compilers. + + +0.9.0c +~~~~~~ +Fixed some problems in the library pertaining to some boundary cases. +This makes the library behave more correctly in those situations. The +fixes apply only to features (calls and parameters) not used by +bzip2.c, so the non-fixedness of them in previous versions has no +effect on reliability of bzip2.c. + +In bzlib.c: + * made zero-length BZ_FLUSH work correctly in bzCompress(). + * fixed bzWrite/bzRead to ignore zero-length requests. + * fixed bzread to correctly handle read requests after EOF. + * wrong parameter order in call to bzDecompressInit in + bzBuffToBuffDecompress. Fixed. + +In compress.c: + * changed setting of nGroups in sendMTFValues() so as to + do a bit better on small files. This _does_ effect + bzip2.c. + + +0.9.5a +~~~~~~ +Major change: add a fallback sorting algorithm (blocksort.c) +to give reasonable behaviour even for very repetitive inputs. +Nuked --repetitive-best and --repetitive-fast since they are +no longer useful. + +Minor changes: mostly a whole bunch of small changes/ +bugfixes in the driver (bzip2.c). Changes pertaining to the +user interface are: + + allow decompression of symlink'd files to stdout + decompress/test files even without .bz2 extension + give more accurate error messages for I/O errors + when compressing/decompressing to stdout, don't catch control-C + read flags from BZIP2 and BZIP environment variables + decline to break hard links to a file unless forced with -f + allow -c flag even with no filenames + preserve file ownerships as far as possible + make -s -1 give the expected block size (100k) + add a flag -q --quiet to suppress nonessential warnings + stop decoding flags after --, so files beginning in - can be handled + resolved inconsistent naming: bzcat or bz2cat ? + bzip2 --help now returns 0 + +Programming-level changes are: + + fixed syntax error in GET_LL4 for Borland C++ 5.02 + let bzBuffToBuffDecompress return BZ_DATA_ERROR{_MAGIC} + fix overshoot of mode-string end in bzopen_or_bzdopen + wrapped bzlib.h in #ifdef __cplusplus ... extern "C" { ... } + close file handles under all error conditions + added minor mods so it compiles with DJGPP out of the box + fixed Makefile so it doesn't give problems with BSD make + fix uninitialised memory reads in dlltest.c + +0.9.5b +~~~~~~ +Open stdin/stdout in binary mode for DJGPP. + +0.9.5c +~~~~~~ +Changed BZ_N_OVERSHOOT to be ... + 2 instead of ... + 1. The + 1 +version could cause the sorted order to be wrong in some extremely +obscure cases. Also changed setting of quadrant in blocksort.c. + +0.9.5d +~~~~~~ +The only functional change is to make bzlibVersion() in the library +return the correct string. This has no effect whatsoever on the +functioning of the bzip2 program or library. Added a couple of casts +so the library compiles without warnings at level 3 in MS Visual +Studio 6.0. Included a Y2K statement in the file Y2K_INFO. All other +changes are minor documentation changes. + +1.0 +~~~ +Several minor bugfixes and enhancements: + +* Large file support. The library uses 64-bit counters to + count the volume of data passing through it. bzip2.c + is now compiled with -D_FILE_OFFSET_BITS=64 to get large + file support from the C library. -v correctly prints out + file sizes greater than 4 gigabytes. All these changes have + been made without assuming a 64-bit platform or a C compiler + which supports 64-bit ints, so, except for the C library + aspect, they are fully portable. + +* Decompression robustness. The library/program should be + robust to any corruption of compressed data, detecting and + handling _all_ corruption, instead of merely relying on + the CRCs. What this means is that the program should + never crash, given corrupted data, and the library should + always return BZ_DATA_ERROR. + +* Fixed an obscure race-condition bug only ever observed on + Solaris, in which, if you were very unlucky and issued + control-C at exactly the wrong time, both input and output + files would be deleted. + +* Don't run out of file handles on test/decompression when + large numbers of files have invalid magic numbers. + +* Avoid library namespace pollution. Prefix all exported + symbols with BZ2_. + +* Minor sorting enhancements from my DCC2000 paper. + +* Advance the version number to 1.0, so as to counteract the + (false-in-this-case) impression some people have that programs + with version numbers less than 1.0 are in some way, experimental, + pre-release versions. + +* Create an initial Makefile-libbz2_so to build a shared library. + Yes, I know I should really use libtool et al ... + +* Make the program exit with 2 instead of 0 when decompression + fails due to a bad magic number (ie, an invalid bzip2 header). + Also exit with 1 (as the manual claims :-) whenever a diagnostic + message would have been printed AND the corresponding operation + is aborted, for example + bzip2: Output file xx already exists. + When a diagnostic message is printed but the operation is not + aborted, for example + bzip2: Can't guess original name for wurble -- using wurble.out + then the exit value 0 is returned, unless some other problem is + also detected. + + I think it corresponds more closely to what the manual claims now. + + +1.0.1 +~~~~~ +* Modified dlltest.c so it uses the new BZ2_ naming scheme. +* Modified makefile-msc to fix minor build probs on Win2k. +* Updated README.COMPILATION.PROBLEMS. + +There are no functionality changes or bug fixes relative to version +1.0.0. This is just a documentation update + a fix for minor Win32 +build problems. For almost everyone, upgrading from 1.0.0 to 1.0.1 is +utterly pointless. Don't bother. + + +1.0.2 +~~~~~ +A bug fix release, addressing various minor issues which have appeared +in the 18 or so months since 1.0.1 was released. Most of the fixes +are to do with file-handling or documentation bugs. To the best of my +knowledge, there have been no data-loss-causing bugs reported in the +compression/decompression engine of 1.0.0 or 1.0.1. + +Note that this release does not improve the rather crude build system +for Unix platforms. The general plan here is to autoconfiscate/ +libtoolise 1.0.2 soon after release, and release the result as 1.1.0 +or perhaps 1.2.0. That, however, is still just a plan at this point. + +Here are the changes in 1.0.2. Bug-reporters and/or patch-senders in +parentheses. + +* Fix an infinite segfault loop in 1.0.1 when a directory is + encountered in -f (force) mode. + (Trond Eivind Glomsrod, Nicholas Nethercote, Volker Schmidt) + +* Avoid double fclose() of output file on certain I/O error paths. + (Solar Designer) + +* Don't fail with internal error 1007 when fed a long stream (> 48MB) + of byte 251. Also print useful message suggesting that 1007s may be + caused by bad memory. + (noticed by Juan Pedro Vallejo, fixed by me) + +* Fix uninitialised variable silly bug in demo prog dlltest.c. + (Jorj Bauer) + +* Remove 512-MB limitation on recovered file size for bzip2recover + on selected platforms which support 64-bit ints. At the moment + all GCC supported platforms, and Win32. + (me, Alson van der Meulen) + +* Hard-code header byte values, to give correct operation on platforms + using EBCDIC as their native character set (IBM's OS/390). + (Leland Lucius) + +* Copy file access times correctly. + (Marty Leisner) + +* Add distclean and check targets to Makefile. + (Michael Carmack) + +* Parameterise use of ar and ranlib in Makefile. Also add $(LDFLAGS). + (Rich Ireland, Bo Thorsen) + +* Pass -p (create parent dirs as needed) to mkdir during make install. + (Jeremy Fusco) + +* Dereference symlinks when copying file permissions in -f mode. + (Volker Schmidt) + +* Majorly simplify implementation of uInt64_qrm10. + (Bo Lindbergh) + +* Check the input file still exists before deleting the output one, + when aborting in cleanUpAndFail(). + (Joerg Prante, Robert Linden, Matthias Krings) + +Also a bunch of patches courtesy of Philippe Troin, the Debian maintainer +of bzip2: + +* Wrapper scripts (with manpages): bzdiff, bzgrep, bzmore. + +* Spelling changes and minor enhancements in bzip2.1. + +* Avoid race condition between creating the output file and setting its + interim permissions safely, by using fopen_output_safely(). + No changes to bzip2recover since there is no issue with file + permissions there. + +* do not print senseless report with -v when compressing an empty + file. + +* bzcat -f works on non-bzip2 files. + +* do not try to escape shell meta-characters on unix (the shell takes + care of these). + +* added --fast and --best aliases for -1 -9 for gzip compatibility. + + +1.0.3 (15 Feb 05) +~~~~~~~~~~~~~~~~~ +Fixes some minor bugs since the last version, 1.0.2. + +* Further robustification against corrupted compressed data. + There are currently no known bitstreams which can cause the + decompressor to crash, loop or access memory which does not + belong to it. If you are using bzip2 or the library to + decompress bitstreams from untrusted sources, an upgrade + to 1.0.3 is recommended. This fixes CAN-2005-1260. + +* The documentation has been converted to XML, from which html + and pdf can be derived. + +* Various minor bugs in the documentation have been fixed. + +* Fixes for various compilation warnings with newer versions of + gcc, and on 64-bit platforms. + +* The BZ_NO_STDIO cpp symbol was not properly observed in 1.0.2. + This has been fixed. + + +1.0.4 (20 Dec 06) +~~~~~~~~~~~~~~~~~ +Fixes some minor bugs since the last version, 1.0.3. + +* Fix file permissions race problem (CAN-2005-0953). + +* Avoid possible segfault in BZ2_bzclose. From Coverity's NetBSD + scan. + +* 'const'/prototype cleanups in the C code. + +* Change default install location to /usr/local, and handle multiple + 'make install's without error. + +* Sanitise file names more carefully in bzgrep. Fixes CAN-2005-0758 + to the extent that applies to bzgrep. + +* Use 'mktemp' rather than 'tempfile' in bzdiff. + +* Tighten up a couple of assertions in blocksort.c following automated + analysis. + +* Fix minor doc/comment bugs. + + +1.0.5 (10 Dec 07) +~~~~~~~~~~~~~~~~~ +Security fix only. Fixes CERT-FI 20469 as it applies to bzip2. + diff --git a/Utilities/cmbzip2/CMakeLists.txt b/Utilities/cmbzip2/CMakeLists.txt new file mode 100644 index 000000000..2aff69c08 --- /dev/null +++ b/Utilities/cmbzip2/CMakeLists.txt @@ -0,0 +1,4 @@ +project(bzip2) +add_definitions(-D_FILE_OFFSET_BITS=64) +add_library(cmbzip2 + blocksort.c huffman.c crctable.c randtable.c compress.c decompress.c bzlib.c) diff --git a/Utilities/cmbzip2/LICENSE b/Utilities/cmbzip2/LICENSE new file mode 100644 index 000000000..f420cffb6 --- /dev/null +++ b/Utilities/cmbzip2/LICENSE @@ -0,0 +1,42 @@ + +-------------------------------------------------------------------------- + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2007 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + +Julian Seward, jseward@bzip.org +bzip2/libbzip2 version 1.0.5 of 10 December 2007 + +-------------------------------------------------------------------------- diff --git a/Utilities/cmbzip2/Makefile b/Utilities/cmbzip2/Makefile new file mode 100644 index 000000000..6e8337fbe --- /dev/null +++ b/Utilities/cmbzip2/Makefile @@ -0,0 +1,217 @@ +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.5 of 10 December 2007 +# Copyright (C) 1996-2007 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ------------------------------------------------------------------ + +SHELL=/bin/sh + +# To assist in cross-compiling +CC=gcc +AR=ar +RANLIB=ranlib +LDFLAGS= + +BIGFILES=-D_FILE_OFFSET_BITS=64 +CFLAGS=-Wall -Winline -O2 -g $(BIGFILES) + +# Where you want it installed when you do 'make install' +PREFIX=/usr/local + + +OBJS= blocksort.o \ + huffman.o \ + crctable.o \ + randtable.o \ + compress.o \ + decompress.o \ + bzlib.o + +all: libbz2.a bzip2 bzip2recover test + +bzip2: libbz2.a bzip2.o + $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2 + +bzip2recover: bzip2recover.o + $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o + +libbz2.a: $(OBJS) + rm -f libbz2.a + $(AR) cq libbz2.a $(OBJS) + @if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \ + -f /bin/ranlib -o -f /usr/ccs/bin/ranlib ) ; then \ + echo $(RANLIB) libbz2.a ; \ + $(RANLIB) libbz2.a ; \ + fi + +check: test +test: bzip2 + @cat words1 + ./bzip2 -1 < sample1.ref > sample1.rb2 + ./bzip2 -2 < sample2.ref > sample2.rb2 + ./bzip2 -3 < sample3.ref > sample3.rb2 + ./bzip2 -d < sample1.bz2 > sample1.tst + ./bzip2 -d < sample2.bz2 > sample2.tst + ./bzip2 -ds < sample3.bz2 > sample3.tst + cmp sample1.bz2 sample1.rb2 + cmp sample2.bz2 sample2.rb2 + cmp sample3.bz2 sample3.rb2 + cmp sample1.tst sample1.ref + cmp sample2.tst sample2.ref + cmp sample3.tst sample3.ref + @cat words3 + +install: bzip2 bzip2recover + if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi + if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi + if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi + if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi + if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi + cp -f bzip2 $(PREFIX)/bin/bzip2 + cp -f bzip2 $(PREFIX)/bin/bunzip2 + cp -f bzip2 $(PREFIX)/bin/bzcat + cp -f bzip2recover $(PREFIX)/bin/bzip2recover + chmod a+x $(PREFIX)/bin/bzip2 + chmod a+x $(PREFIX)/bin/bunzip2 + chmod a+x $(PREFIX)/bin/bzcat + chmod a+x $(PREFIX)/bin/bzip2recover + cp -f bzip2.1 $(PREFIX)/man/man1 + chmod a+r $(PREFIX)/man/man1/bzip2.1 + cp -f bzlib.h $(PREFIX)/include + chmod a+r $(PREFIX)/include/bzlib.h + cp -f libbz2.a $(PREFIX)/lib + chmod a+r $(PREFIX)/lib/libbz2.a + cp -f bzgrep $(PREFIX)/bin/bzgrep + ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep + ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep + chmod a+x $(PREFIX)/bin/bzgrep + cp -f bzmore $(PREFIX)/bin/bzmore + ln -s -f $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless + chmod a+x $(PREFIX)/bin/bzmore + cp -f bzdiff $(PREFIX)/bin/bzdiff + ln -s -f $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp + chmod a+x $(PREFIX)/bin/bzdiff + cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1 + chmod a+r $(PREFIX)/man/man1/bzgrep.1 + chmod a+r $(PREFIX)/man/man1/bzmore.1 + chmod a+r $(PREFIX)/man/man1/bzdiff.1 + echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1 + echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1 + echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1 + echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1 + +clean: + rm -f *.o libbz2.a bzip2 bzip2recover \ + sample1.rb2 sample2.rb2 sample3.rb2 \ + sample1.tst sample2.tst sample3.tst + +blocksort.o: blocksort.c + @cat words0 + $(CC) $(CFLAGS) -c blocksort.c +huffman.o: huffman.c + $(CC) $(CFLAGS) -c huffman.c +crctable.o: crctable.c + $(CC) $(CFLAGS) -c crctable.c +randtable.o: randtable.c + $(CC) $(CFLAGS) -c randtable.c +compress.o: compress.c + $(CC) $(CFLAGS) -c compress.c +decompress.o: decompress.c + $(CC) $(CFLAGS) -c decompress.c +bzlib.o: bzlib.c + $(CC) $(CFLAGS) -c bzlib.c +bzip2.o: bzip2.c + $(CC) $(CFLAGS) -c bzip2.c +bzip2recover.o: bzip2recover.c + $(CC) $(CFLAGS) -c bzip2recover.c + + +distclean: clean + rm -f manual.ps manual.html manual.pdf + +DISTNAME=bzip2-1.0.5 +dist: check manual + rm -f $(DISTNAME) + ln -s -f . $(DISTNAME) + tar cvf $(DISTNAME).tar \ + $(DISTNAME)/blocksort.c \ + $(DISTNAME)/huffman.c \ + $(DISTNAME)/crctable.c \ + $(DISTNAME)/randtable.c \ + $(DISTNAME)/compress.c \ + $(DISTNAME)/decompress.c \ + $(DISTNAME)/bzlib.c \ + $(DISTNAME)/bzip2.c \ + $(DISTNAME)/bzip2recover.c \ + $(DISTNAME)/bzlib.h \ + $(DISTNAME)/bzlib_private.h \ + $(DISTNAME)/Makefile \ + $(DISTNAME)/LICENSE \ + $(DISTNAME)/bzip2.1 \ + $(DISTNAME)/bzip2.1.preformatted \ + $(DISTNAME)/bzip2.txt \ + $(DISTNAME)/words0 \ + $(DISTNAME)/words1 \ + $(DISTNAME)/words2 \ + $(DISTNAME)/words3 \ + $(DISTNAME)/sample1.ref \ + $(DISTNAME)/sample2.ref \ + $(DISTNAME)/sample3.ref \ + $(DISTNAME)/sample1.bz2 \ + $(DISTNAME)/sample2.bz2 \ + $(DISTNAME)/sample3.bz2 \ + $(DISTNAME)/dlltest.c \ + $(DISTNAME)/manual.html \ + $(DISTNAME)/manual.pdf \ + $(DISTNAME)/manual.ps \ + $(DISTNAME)/README \ + $(DISTNAME)/README.COMPILATION.PROBLEMS \ + $(DISTNAME)/README.XML.STUFF \ + $(DISTNAME)/CHANGES \ + $(DISTNAME)/libbz2.def \ + $(DISTNAME)/libbz2.dsp \ + $(DISTNAME)/dlltest.dsp \ + $(DISTNAME)/makefile.msc \ + $(DISTNAME)/unzcrash.c \ + $(DISTNAME)/spewG.c \ + $(DISTNAME)/mk251.c \ + $(DISTNAME)/bzdiff \ + $(DISTNAME)/bzdiff.1 \ + $(DISTNAME)/bzmore \ + $(DISTNAME)/bzmore.1 \ + $(DISTNAME)/bzgrep \ + $(DISTNAME)/bzgrep.1 \ + $(DISTNAME)/Makefile-libbz2_so \ + $(DISTNAME)/bz-common.xsl \ + $(DISTNAME)/bz-fo.xsl \ + $(DISTNAME)/bz-html.xsl \ + $(DISTNAME)/bzip.css \ + $(DISTNAME)/entities.xml \ + $(DISTNAME)/manual.xml \ + $(DISTNAME)/format.pl \ + $(DISTNAME)/xmlproc.sh + gzip -v $(DISTNAME).tar + +# For rebuilding the manual from sources on my SuSE 9.1 box + +MANUAL_SRCS= bz-common.xsl bz-fo.xsl bz-html.xsl bzip.css \ + entities.xml manual.xml + +manual: manual.html manual.ps manual.pdf + +manual.ps: $(MANUAL_SRCS) + ./xmlproc.sh -ps manual.xml + +manual.pdf: $(MANUAL_SRCS) + ./xmlproc.sh -pdf manual.xml + +manual.html: $(MANUAL_SRCS) + ./xmlproc.sh -html manual.xml diff --git a/Utilities/cmbzip2/Makefile-libbz2_so b/Utilities/cmbzip2/Makefile-libbz2_so new file mode 100644 index 000000000..83708871c --- /dev/null +++ b/Utilities/cmbzip2/Makefile-libbz2_so @@ -0,0 +1,59 @@ + +# This Makefile builds a shared version of the library, +# libbz2.so.1.0.4, with soname libbz2.so.1.0, +# at least on x86-Linux (RedHat 7.2), +# with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98). +# Please see the README file for some important info +# about building the library like this. + +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.5 of 10 December 2007 +# Copyright (C) 1996-2007 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ------------------------------------------------------------------ + + +SHELL=/bin/sh +CC=gcc +BIGFILES=-D_FILE_OFFSET_BITS=64 +CFLAGS=-fpic -fPIC -Wall -Winline -O2 -g $(BIGFILES) + +OBJS= blocksort.o \ + huffman.o \ + crctable.o \ + randtable.o \ + compress.o \ + decompress.o \ + bzlib.o + +all: $(OBJS) + $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.4 $(OBJS) + $(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.4 + rm -f libbz2.so.1.0 + ln -s libbz2.so.1.0.4 libbz2.so.1.0 + +clean: + rm -f $(OBJS) bzip2.o libbz2.so.1.0.4 libbz2.so.1.0 bzip2-shared + +blocksort.o: blocksort.c + $(CC) $(CFLAGS) -c blocksort.c +huffman.o: huffman.c + $(CC) $(CFLAGS) -c huffman.c +crctable.o: crctable.c + $(CC) $(CFLAGS) -c crctable.c +randtable.o: randtable.c + $(CC) $(CFLAGS) -c randtable.c +compress.o: compress.c + $(CC) $(CFLAGS) -c compress.c +decompress.o: decompress.c + $(CC) $(CFLAGS) -c decompress.c +bzlib.o: bzlib.c + $(CC) $(CFLAGS) -c bzlib.c diff --git a/Utilities/cmbzip2/README b/Utilities/cmbzip2/README new file mode 100644 index 000000000..e17a84e04 --- /dev/null +++ b/Utilities/cmbzip2/README @@ -0,0 +1,210 @@ + +This is the README for bzip2/libzip2. +This version is fully compatible with the previous public releases. + +------------------------------------------------------------------ +This file is part of bzip2/libbzip2, a program and library for +lossless, block-sorting data compression. + +bzip2/libbzip2 version 1.0.5 of 10 December 2007 +Copyright (C) 1996-2007 Julian Seward + +Please read the WARNING, DISCLAIMER and PATENTS sections in this file. + +This program is released under the terms of the license contained +in the file LICENSE. +------------------------------------------------------------------ + +Complete documentation is available in Postscript form (manual.ps), +PDF (manual.pdf) or html (manual.html). A plain-text version of the +manual page is available as bzip2.txt. + + +HOW TO BUILD -- UNIX + +Type 'make'. This builds the library libbz2.a and then the programs +bzip2 and bzip2recover. Six self-tests are run. If the self-tests +complete ok, carry on to installation: + +To install in /usr/local/bin, /usr/local/lib, /usr/local/man and +/usr/local/include, type + + make install + +To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type + + make install PREFIX=/xxx/yyy + +If you are (justifiably) paranoid and want to see what 'make install' +is going to do, you can first do + + make -n install or + make -n install PREFIX=/xxx/yyy respectively. + +The -n instructs make to show the commands it would execute, but not +actually execute them. + + +HOW TO BUILD -- UNIX, shared library libbz2.so. + +Do 'make -f Makefile-libbz2_so'. This Makefile seems to work for +Linux-ELF (RedHat 7.2 on an x86 box), with gcc. I make no claims +that it works for any other platform, though I suspect it probably +will work for most platforms employing both ELF and gcc. + +bzip2-shared, a client of the shared library, is also built, but not +self-tested. So I suggest you also build using the normal Makefile, +since that conducts a self-test. A second reason to prefer the +version statically linked to the library is that, on x86 platforms, +building shared objects makes a valuable register (%ebx) unavailable +to gcc, resulting in a slowdown of 10%-20%, at least for bzip2. + +Important note for people upgrading .so's from 0.9.0/0.9.5 to version +1.0.X. All the functions in the library have been renamed, from (eg) +bzCompress to BZ2_bzCompress, to avoid namespace pollution. +Unfortunately this means that the libbz2.so created by +Makefile-libbz2_so will not work with any program which used an older +version of the library. I do encourage library clients to make the +effort to upgrade to use version 1.0, since it is both faster and more +robust than previous versions. + + +HOW TO BUILD -- Windows 95, NT, DOS, Mac, etc. + +It's difficult for me to support compilation on all these platforms. +My approach is to collect binaries for these platforms, and put them +on the master web site (http://www.bzip.org). Look there. However +(FWIW), bzip2-1.0.X is very standard ANSI C and should compile +unmodified with MS Visual C. If you have difficulties building, you +might want to read README.COMPILATION.PROBLEMS. + +At least using MS Visual C++ 6, you can build from the unmodified +sources by issuing, in a command shell: + + nmake -f makefile.msc + +(you may need to first run the MSVC-provided script VCVARS32.BAT + so as to set up paths to the MSVC tools correctly). + + +VALIDATION + +Correct operation, in the sense that a compressed file can always be +decompressed to reproduce the original, is obviously of paramount +importance. To validate bzip2, I used a modified version of Mark +Nelson's churn program. Churn is an automated test driver which +recursively traverses a directory structure, using bzip2 to compress +and then decompress each file it encounters, and checking that the +decompressed data is the same as the original. + + + +Please read and be aware of the following: + +WARNING: + + This program and library (attempts to) compress data by + performing several non-trivial transformations on it. + Unless you are 100% familiar with *all* the algorithms + contained herein, and with the consequences of modifying them, + you should NOT meddle with the compression or decompression + machinery. Incorrect changes can and very likely *will* + lead to disastrous loss of data. + + +DISCLAIMER: + + I TAKE NO RESPONSIBILITY FOR ANY LOSS OF DATA ARISING FROM THE + USE OF THIS PROGRAM/LIBRARY, HOWSOEVER CAUSED. + + Every compression of a file implies an assumption that the + compressed file can be decompressed to reproduce the original. + Great efforts in design, coding and testing have been made to + ensure that this program works correctly. However, the complexity + of the algorithms, and, in particular, the presence of various + special cases in the code which occur with very low but non-zero + probability make it impossible to rule out the possibility of bugs + remaining in the program. DO NOT COMPRESS ANY DATA WITH THIS + PROGRAM UNLESS YOU ARE PREPARED TO ACCEPT THE POSSIBILITY, HOWEVER + SMALL, THAT THE DATA WILL NOT BE RECOVERABLE. + + That is not to say this program is inherently unreliable. + Indeed, I very much hope the opposite is true. bzip2/libbzip2 + has been carefully constructed and extensively tested. + + +PATENTS: + + To the best of my knowledge, bzip2/libbzip2 does not use any + patented algorithms. However, I do not have the resources + to carry out a patent search. Therefore I cannot give any + guarantee of the above statement. + + + +WHAT'S NEW IN 0.9.0 (as compared to 0.1pl2) ? + + * Approx 10% faster compression, 30% faster decompression + * -t (test mode) is a lot quicker + * Can decompress concatenated compressed files + * Programming interface, so programs can directly read/write .bz2 files + * Less restrictive (BSD-style) licensing + * Flag handling more compatible with GNU gzip + * Much more documentation, i.e., a proper user manual + * Hopefully, improved portability (at least of the library) + +WHAT'S NEW IN 0.9.5 ? + + * Compression speed is much less sensitive to the input + data than in previous versions. Specifically, the very + slow performance caused by repetitive data is fixed. + * Many small improvements in file and flag handling. + * A Y2K statement. + +WHAT'S NEW IN 1.0.0 ? + + See the CHANGES file. + +WHAT'S NEW IN 1.0.2 ? + + See the CHANGES file. + +WHAT'S NEW IN 1.0.3 ? + + See the CHANGES file. + +WHAT'S NEW IN 1.0.4 ? + + See the CHANGES file. + +WHAT'S NEW IN 1.0.5 ? + + See the CHANGES file. + + +I hope you find bzip2 useful. Feel free to contact me at + jseward@bzip.org +if you have any suggestions or queries. Many people mailed me with +comments, suggestions and patches after the releases of bzip-0.15, +bzip-0.21, and bzip2 versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, +1.0.2 and 1.0.3, and the changes in bzip2 are largely a result of this +feedback. I thank you for your comments. + +bzip2's "home" is http://www.bzip.org/ + +Julian Seward +jseward@bzip.org +Cambridge, UK. + +18 July 1996 (version 0.15) +25 August 1996 (version 0.21) + 7 August 1997 (bzip2, version 0.1) +29 August 1997 (bzip2, version 0.1pl2) +23 August 1998 (bzip2, version 0.9.0) + 8 June 1999 (bzip2, version 0.9.5) + 4 Sept 1999 (bzip2, version 0.9.5d) + 5 May 2000 (bzip2, version 1.0pre8) +30 December 2001 (bzip2, version 1.0.2pre1) +15 February 2005 (bzip2, version 1.0.3) +20 December 2006 (bzip2, version 1.0.4) +10 December 2007 (bzip2, version 1.0.5) diff --git a/Utilities/cmbzip2/README.COMPILATION.PROBLEMS b/Utilities/cmbzip2/README.COMPILATION.PROBLEMS new file mode 100644 index 000000000..22b95c6cb --- /dev/null +++ b/Utilities/cmbzip2/README.COMPILATION.PROBLEMS @@ -0,0 +1,58 @@ +------------------------------------------------------------------ +This file is part of bzip2/libbzip2, a program and library for +lossless, block-sorting data compression. + +bzip2/libbzip2 version 1.0.5 of 10 December 2007 +Copyright (C) 1996-2007 Julian Seward + +Please read the WARNING, DISCLAIMER and PATENTS sections in the +README file. + +This program is released under the terms of the license contained +in the file LICENSE. +------------------------------------------------------------------ + +bzip2-1.0.5 should compile without problems on the vast majority of +platforms. Using the supplied Makefile, I've built and tested it +myself for x86-linux and amd64-linux. With makefile.msc, Visual C++ +6.0 and nmake, you can build a native Win32 version too. Large file +support seems to work correctly on at least on amd64-linux. + +When I say "large file" I mean a file of size 2,147,483,648 (2^31) +bytes or above. Many older OSs can't handle files above this size, +but many newer ones can. Large files are pretty huge -- most files +you'll encounter are not Large Files. + +Early versions of bzip2 (0.1, 0.9.0, 0.9.5) compiled on a wide variety +of platforms without difficulty, and I hope this version will continue +in that tradition. However, in order to support large files, I've had +to include the define -D_FILE_OFFSET_BITS=64 in the Makefile. This +can cause problems. + +The technique of adding -D_FILE_OFFSET_BITS=64 to get large file +support is, as far as I know, the Recommended Way to get correct large +file support. For more details, see the Large File Support +Specification, published by the Large File Summit, at + + http://ftp.sas.com/standards/large.file + +As a general comment, if you get compilation errors which you think +are related to large file support, try removing the above define from +the Makefile, ie, delete the line + + BIGFILES=-D_FILE_OFFSET_BITS=64 + +from the Makefile, and do 'make clean ; make'. This will give you a +version of bzip2 without large file support, which, for most +applications, is probably not a problem. + +Alternatively, try some of the platform-specific hints listed below. + +You can use the spewG.c program to generate huge files to test bzip2's +large file support, if you are feeling paranoid. Be aware though that +any compilation problems which affect bzip2 will also affect spewG.c, +alas. + +AIX: I have reports that for large file support, you need to specify +-D_LARGE_FILES rather than -D_FILE_OFFSET_BITS=64. I have not tested +this myself. diff --git a/Utilities/cmbzip2/README.XML.STUFF b/Utilities/cmbzip2/README.XML.STUFF new file mode 100644 index 000000000..1a5b4c55a --- /dev/null +++ b/Utilities/cmbzip2/README.XML.STUFF @@ -0,0 +1,45 @@ + ---------------------------------------------------------------- + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ---------------------------------------------------------------- + +The script xmlproc.sh takes an xml file as input, +and processes it to create .pdf, .html or .ps output. +It uses format.pl, a perl script to format
 blocks nicely,
+ and add CDATA tags so writers do not have to use eg. < 
+
+The file "entities.xml" must be edited to reflect current
+version, year, etc.
+
+
+Usage:
+
+  ./xmlproc.sh -v manual.xml
+  Validates an xml file to ensure no dtd-compliance errors
+
+  ./xmlproc.sh -html manual.xml
+  Output: manual.html
+
+  ./xmlproc.sh -pdf manual.xml
+  Output: manual.pdf
+
+  ./xmlproc.sh -ps manual.xml
+  Output: manual.ps
+
+
+Notum bene: 
+- pdfxmltex barfs if given a filename with an underscore in it
+
+- xmltex won't work yet - there's a bug in passivetex
+    which we are all waiting for Sebastian to fix.
+  So we are going the xml -> pdf -> ps route for the time being,
+    using pdfxmltex.
diff --git a/Utilities/cmbzip2/blocksort.c b/Utilities/cmbzip2/blocksort.c
new file mode 100644
index 000000000..95adb5ef3
--- /dev/null
+++ b/Utilities/cmbzip2/blocksort.c
@@ -0,0 +1,1094 @@
+
+/*-------------------------------------------------------------*/
+/*--- Block sorting machinery                               ---*/
+/*---                                           blocksort.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------*/
+/*--- Fallback O(N log(N)^2) sorting        ---*/
+/*--- algorithm, for repetitive blocks      ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static 
+__inline__
+void fallbackSimpleSort ( UInt32* fmap, 
+                          UInt32* eclass, 
+                          Int32   lo, 
+                          Int32   hi )
+{
+   Int32 i, j, tmp;
+   UInt32 ec_tmp;
+
+   if (lo == hi) return;
+
+   if (hi - lo > 3) {
+      for ( i = hi-4; i >= lo; i-- ) {
+         tmp = fmap[i];
+         ec_tmp = eclass[tmp];
+         for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 )
+            fmap[j-4] = fmap[j];
+         fmap[j-4] = tmp;
+      }
+   }
+
+   for ( i = hi-1; i >= lo; i-- ) {
+      tmp = fmap[i];
+      ec_tmp = eclass[tmp];
+      for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ )
+         fmap[j-1] = fmap[j];
+      fmap[j-1] = tmp;
+   }
+}
+
+
+/*---------------------------------------------*/
+#define fswap(zz1, zz2) \
+   { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define fvswap(zzp1, zzp2, zzn)       \
+{                                     \
+   Int32 yyp1 = (zzp1);               \
+   Int32 yyp2 = (zzp2);               \
+   Int32 yyn  = (zzn);                \
+   while (yyn > 0) {                  \
+      fswap(fmap[yyp1], fmap[yyp2]);  \
+      yyp1++; yyp2++; yyn--;          \
+   }                                  \
+}
+
+
+#define fmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define fpush(lz,hz) { stackLo[sp] = lz; \
+                       stackHi[sp] = hz; \
+                       sp++; }
+
+#define fpop(lz,hz) { sp--;              \
+                      lz = stackLo[sp];  \
+                      hz = stackHi[sp]; }
+
+#define FALLBACK_QSORT_SMALL_THRESH 10
+#define FALLBACK_QSORT_STACK_SIZE   100
+
+
+static
+void fallbackQSort3 ( UInt32* fmap, 
+                      UInt32* eclass,
+                      Int32   loSt, 
+                      Int32   hiSt )
+{
+   Int32 unLo, unHi, ltLo, gtHi, n, m;
+   Int32 sp, lo, hi;
+   UInt32 med, r, r3;
+   Int32 stackLo[FALLBACK_QSORT_STACK_SIZE];
+   Int32 stackHi[FALLBACK_QSORT_STACK_SIZE];
+
+   r = 0;
+
+   sp = 0;
+   fpush ( loSt, hiSt );
+
+   while (sp > 0) {
+
+      AssertH ( sp < FALLBACK_QSORT_STACK_SIZE - 1, 1004 );
+
+      fpop ( lo, hi );
+      if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) {
+         fallbackSimpleSort ( fmap, eclass, lo, hi );
+         continue;
+      }
+
+      /* Random partitioning.  Median of 3 sometimes fails to
+         avoid bad cases.  Median of 9 seems to help but 
+         looks rather expensive.  This too seems to work but
+         is cheaper.  Guidance for the magic constants 
+         7621 and 32768 is taken from Sedgewick's algorithms
+         book, chapter 35.
+      */
+      r = ((r * 7621) + 1) % 32768;
+      r3 = r % 3;
+      if (r3 == 0) med = eclass[fmap[lo]]; else
+      if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else
+                   med = eclass[fmap[hi]];
+
+      unLo = ltLo = lo;
+      unHi = gtHi = hi;
+
+      while (1) {
+         while (1) {
+            if (unLo > unHi) break;
+            n = (Int32)eclass[fmap[unLo]] - (Int32)med;
+            if (n == 0) { 
+               fswap(fmap[unLo], fmap[ltLo]); 
+               ltLo++; unLo++; 
+               continue; 
+            };
+            if (n > 0) break;
+            unLo++;
+         }
+         while (1) {
+            if (unLo > unHi) break;
+            n = (Int32)eclass[fmap[unHi]] - (Int32)med;
+            if (n == 0) { 
+               fswap(fmap[unHi], fmap[gtHi]); 
+               gtHi--; unHi--; 
+               continue; 
+            };
+            if (n < 0) break;
+            unHi--;
+         }
+         if (unLo > unHi) break;
+         fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--;
+      }
+
+      AssertD ( unHi == unLo-1, "fallbackQSort3(2)" );
+
+      if (gtHi < ltLo) continue;
+
+      n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n);
+      m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m);
+
+      n = lo + unLo - ltLo - 1;
+      m = hi - (gtHi - unHi) + 1;
+
+      if (n - lo > hi - m) {
+         fpush ( lo, n );
+         fpush ( m, hi );
+      } else {
+         fpush ( m, hi );
+         fpush ( lo, n );
+      }
+   }
+}
+
+#undef fmin
+#undef fpush
+#undef fpop
+#undef fswap
+#undef fvswap
+#undef FALLBACK_QSORT_SMALL_THRESH
+#undef FALLBACK_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > 0
+      eclass exists for [0 .. nblock-1]
+      ((UChar*)eclass) [0 .. nblock-1] holds block
+      ptr exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)eclass) [0 .. nblock-1] holds block
+      All other areas of eclass destroyed
+      fmap [0 .. nblock-1] holds sorted order
+      bhtab [ 0 .. 2+(nblock/32) ] destroyed
+*/
+
+#define       SET_BH(zz)  bhtab[(zz) >> 5] |= (1 << ((zz) & 31))
+#define     CLEAR_BH(zz)  bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31))
+#define     ISSET_BH(zz)  (bhtab[(zz) >> 5] & (1 << ((zz) & 31)))
+#define      WORD_BH(zz)  bhtab[(zz) >> 5]
+#define UNALIGNED_BH(zz)  ((zz) & 0x01f)
+
+static
+void fallbackSort ( UInt32* fmap, 
+                    UInt32* eclass, 
+                    UInt32* bhtab,
+                    Int32   nblock,
+                    Int32   verb )
+{
+   Int32 ftab[257];
+   Int32 ftabCopy[256];
+   Int32 H, i, j, k, l, r, cc, cc1;
+   Int32 nNotDone;
+   Int32 nBhtab;
+   UChar* eclass8 = (UChar*)eclass;
+
+   /*--
+      Initial 1-char radix sort to generate
+      initial fmap and initial BH bits.
+   --*/
+   if (verb >= 4)
+      VPrintf0 ( "        bucket sorting ...\n" );
+   for (i = 0; i < 257;    i++) ftab[i] = 0;
+   for (i = 0; i < nblock; i++) ftab[eclass8[i]]++;
+   for (i = 0; i < 256;    i++) ftabCopy[i] = ftab[i];
+   for (i = 1; i < 257;    i++) ftab[i] += ftab[i-1];
+
+   for (i = 0; i < nblock; i++) {
+      j = eclass8[i];
+      k = ftab[j] - 1;
+      ftab[j] = k;
+      fmap[k] = i;
+   }
+
+   nBhtab = 2 + (nblock / 32);
+   for (i = 0; i < nBhtab; i++) bhtab[i] = 0;
+   for (i = 0; i < 256; i++) SET_BH(ftab[i]);
+
+   /*--
+      Inductively refine the buckets.  Kind-of an
+      "exponential radix sort" (!), inspired by the
+      Manber-Myers suffix array construction algorithm.
+   --*/
+
+   /*-- set sentinel bits for block-end detection --*/
+   for (i = 0; i < 32; i++) { 
+      SET_BH(nblock + 2*i);
+      CLEAR_BH(nblock + 2*i + 1);
+   }
+
+   /*-- the log(N) loop --*/
+   H = 1;
+   while (1) {
+
+      if (verb >= 4) 
+         VPrintf1 ( "        depth %6d has ", H );
+
+      j = 0;
+      for (i = 0; i < nblock; i++) {
+         if (ISSET_BH(i)) j = i;
+         k = fmap[i] - H; if (k < 0) k += nblock;
+         eclass[k] = j;
+      }
+
+      nNotDone = 0;
+      r = -1;
+      while (1) {
+
+     /*-- find the next non-singleton bucket --*/
+         k = r + 1;
+         while (ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+         if (ISSET_BH(k)) {
+            while (WORD_BH(k) == 0xffffffff) k += 32;
+            while (ISSET_BH(k)) k++;
+         }
+         l = k - 1;
+         if (l >= nblock) break;
+         while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+         if (!ISSET_BH(k)) {
+            while (WORD_BH(k) == 0x00000000) k += 32;
+            while (!ISSET_BH(k)) k++;
+         }
+         r = k - 1;
+         if (r >= nblock) break;
+
+         /*-- now [l, r] bracket current bucket --*/
+         if (r > l) {
+            nNotDone += (r - l + 1);
+            fallbackQSort3 ( fmap, eclass, l, r );
+
+            /*-- scan bucket and generate header bits-- */
+            cc = -1;
+            for (i = l; i <= r; i++) {
+               cc1 = eclass[fmap[i]];
+               if (cc != cc1) { SET_BH(i); cc = cc1; };
+            }
+         }
+      }
+
+      if (verb >= 4) 
+         VPrintf1 ( "%6d unresolved strings\n", nNotDone );
+
+      H *= 2;
+      if (H > nblock || nNotDone == 0) break;
+   }
+
+   /*-- 
+      Reconstruct the original block in
+      eclass8 [0 .. nblock-1], since the
+      previous phase destroyed it.
+   --*/
+   if (verb >= 4)
+      VPrintf0 ( "        reconstructing block ...\n" );
+   j = 0;
+   for (i = 0; i < nblock; i++) {
+      while (ftabCopy[j] == 0) j++;
+      ftabCopy[j]--;
+      eclass8[fmap[i]] = (UChar)j;
+   }
+   AssertH ( j < 256, 1005 );
+}
+
+#undef       SET_BH
+#undef     CLEAR_BH
+#undef     ISSET_BH
+#undef      WORD_BH
+#undef UNALIGNED_BH
+
+
+/*---------------------------------------------*/
+/*--- The main, O(N^2 log(N)) sorting       ---*/
+/*--- algorithm.  Faster for "normal"       ---*/
+/*--- non-repetitive blocks.                ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+__inline__
+Bool mainGtU ( UInt32  i1, 
+               UInt32  i2,
+               UChar*  block, 
+               UInt16* quadrant,
+               UInt32  nblock,
+               Int32*  budget )
+{
+   Int32  k;
+   UChar  c1, c2;
+   UInt16 s1, s2;
+
+   AssertD ( i1 != i2, "mainGtU" );
+   /* 1 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 2 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 3 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 4 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 5 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 6 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 7 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 8 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 9 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 10 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 11 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 12 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+
+   k = nblock + 8;
+
+   do {
+      /* 1 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 2 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 3 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 4 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 5 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 6 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 7 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 8 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+
+      if (i1 >= nblock) i1 -= nblock;
+      if (i2 >= nblock) i2 -= nblock;
+
+      k -= 8;
+      (*budget)--;
+   }
+      while (k >= 0);
+
+   return False;
+}
+
+
+/*---------------------------------------------*/
+/*--
+   Knuth's increments seem to work better
+   than Incerpi-Sedgewick here.  Possibly
+   because the number of elems to sort is
+   usually small, typically <= 20.
+--*/
+static
+Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280,
+                   9841, 29524, 88573, 265720,
+                   797161, 2391484 };
+
+static
+void mainSimpleSort ( UInt32* ptr,
+                      UChar*  block,
+                      UInt16* quadrant,
+                      Int32   nblock,
+                      Int32   lo, 
+                      Int32   hi, 
+                      Int32   d,
+                      Int32*  budget )
+{
+   Int32 i, j, h, bigN, hp;
+   UInt32 v;
+
+   bigN = hi - lo + 1;
+   if (bigN < 2) return;
+
+   hp = 0;
+   while (incs[hp] < bigN) hp++;
+   hp--;
+
+   for (; hp >= 0; hp--) {
+      h = incs[hp];
+
+      i = lo + h;
+      while (True) {
+
+         /*-- copy 1 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         /*-- copy 2 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         /*-- copy 3 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         if (*budget < 0) return;
+      }
+   }
+}
+
+
+/*---------------------------------------------*/
+/*--
+   The following is an implementation of
+   an elegant 3-way quicksort for strings,
+   described in a paper "Fast Algorithms for
+   Sorting and Searching Strings", by Robert
+   Sedgewick and Jon L. Bentley.
+--*/
+
+#define mswap(zz1, zz2) \
+   { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define mvswap(zzp1, zzp2, zzn)       \
+{                                     \
+   Int32 yyp1 = (zzp1);               \
+   Int32 yyp2 = (zzp2);               \
+   Int32 yyn  = (zzn);                \
+   while (yyn > 0) {                  \
+      mswap(ptr[yyp1], ptr[yyp2]);    \
+      yyp1++; yyp2++; yyn--;          \
+   }                                  \
+}
+
+static 
+__inline__
+UChar mmed3 ( UChar a, UChar b, UChar c )
+{
+   UChar t;
+   if (a > b) { t = a; a = b; b = t; };
+   if (b > c) { 
+      b = c;
+      if (a > b) b = a;
+   }
+   return b;
+}
+
+#define mmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define mpush(lz,hz,dz) { stackLo[sp] = lz; \
+                          stackHi[sp] = hz; \
+                          stackD [sp] = dz; \
+                          sp++; }
+
+#define mpop(lz,hz,dz) { sp--;             \
+                         lz = stackLo[sp]; \
+                         hz = stackHi[sp]; \
+                         dz = stackD [sp]; }
+
+
+#define mnextsize(az) (nextHi[az]-nextLo[az])
+
+#define mnextswap(az,bz)                                        \
+   { Int32 tz;                                                  \
+     tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \
+     tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \
+     tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; }
+
+
+#define MAIN_QSORT_SMALL_THRESH 20
+#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT)
+#define MAIN_QSORT_STACK_SIZE 100
+
+static
+void mainQSort3 ( UInt32* ptr,
+                  UChar*  block,
+                  UInt16* quadrant,
+                  Int32   nblock,
+                  Int32   loSt, 
+                  Int32   hiSt, 
+                  Int32   dSt,
+                  Int32*  budget )
+{
+   Int32 unLo, unHi, ltLo, gtHi, n, m, med;
+   Int32 sp, lo, hi, d;
+
+   Int32 stackLo[MAIN_QSORT_STACK_SIZE];
+   Int32 stackHi[MAIN_QSORT_STACK_SIZE];
+   Int32 stackD [MAIN_QSORT_STACK_SIZE];
+
+   Int32 nextLo[3];
+   Int32 nextHi[3];
+   Int32 nextD [3];
+
+   sp = 0;
+   mpush ( loSt, hiSt, dSt );
+
+   while (sp > 0) {
+
+      AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 );
+
+      mpop ( lo, hi, d );
+      if (hi - lo < MAIN_QSORT_SMALL_THRESH || 
+          d > MAIN_QSORT_DEPTH_THRESH) {
+         mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget );
+         if (*budget < 0) return;
+         continue;
+      }
+
+      med = (Int32) 
+            mmed3 ( block[ptr[ lo         ]+d],
+                    block[ptr[ hi         ]+d],
+                    block[ptr[ (lo+hi)>>1 ]+d] );
+
+      unLo = ltLo = lo;
+      unHi = gtHi = hi;
+
+      while (True) {
+         while (True) {
+            if (unLo > unHi) break;
+            n = ((Int32)block[ptr[unLo]+d]) - med;
+            if (n == 0) { 
+               mswap(ptr[unLo], ptr[ltLo]); 
+               ltLo++; unLo++; continue; 
+            };
+            if (n >  0) break;
+            unLo++;
+         }
+         while (True) {
+            if (unLo > unHi) break;
+            n = ((Int32)block[ptr[unHi]+d]) - med;
+            if (n == 0) { 
+               mswap(ptr[unHi], ptr[gtHi]); 
+               gtHi--; unHi--; continue; 
+            };
+            if (n <  0) break;
+            unHi--;
+         }
+         if (unLo > unHi) break;
+         mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--;
+      }
+
+      AssertD ( unHi == unLo-1, "mainQSort3(2)" );
+
+      if (gtHi < ltLo) {
+         mpush(lo, hi, d+1 );
+         continue;
+      }
+
+      n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n);
+      m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m);
+
+      n = lo + unLo - ltLo - 1;
+      m = hi - (gtHi - unHi) + 1;
+
+      nextLo[0] = lo;  nextHi[0] = n;   nextD[0] = d;
+      nextLo[1] = m;   nextHi[1] = hi;  nextD[1] = d;
+      nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1;
+
+      if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+      if (mnextsize(1) < mnextsize(2)) mnextswap(1,2);
+      if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+
+      AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" );
+      AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" );
+
+      mpush (nextLo[0], nextHi[0], nextD[0]);
+      mpush (nextLo[1], nextHi[1], nextD[1]);
+      mpush (nextLo[2], nextHi[2], nextD[2]);
+   }
+}
+
+#undef mswap
+#undef mvswap
+#undef mpush
+#undef mpop
+#undef mmin
+#undef mnextsize
+#undef mnextswap
+#undef MAIN_QSORT_SMALL_THRESH
+#undef MAIN_QSORT_DEPTH_THRESH
+#undef MAIN_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > N_OVERSHOOT
+      block32 exists for [0 .. nblock-1 +N_OVERSHOOT]
+      ((UChar*)block32) [0 .. nblock-1] holds block
+      ptr exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)block32) [0 .. nblock-1] holds block
+      All other areas of block32 destroyed
+      ftab [0 .. 65536 ] destroyed
+      ptr [0 .. nblock-1] holds sorted order
+      if (*budget < 0), sorting was abandoned
+*/
+
+#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8])
+#define SETMASK (1 << 21)
+#define CLEARMASK (~(SETMASK))
+
+static
+void mainSort ( UInt32* ptr, 
+                UChar*  block,
+                UInt16* quadrant, 
+                UInt32* ftab,
+                Int32   nblock,
+                Int32   verb,
+                Int32*  budget )
+{
+   Int32  i, j, k, ss, sb;
+   Int32  runningOrder[256];
+   Bool   bigDone[256];
+   Int32  copyStart[256];
+   Int32  copyEnd  [256];
+   UChar  c1;
+   Int32  numQSorted;
+   UInt16 s;
+   if (verb >= 4) VPrintf0 ( "        main sort initialise ...\n" );
+
+   /*-- set up the 2-byte frequency table --*/
+   for (i = 65536; i >= 0; i--) ftab[i] = 0;
+
+   j = block[0] << 8;
+   i = nblock-1;
+   for (; i >= 3; i -= 4) {
+      quadrant[i] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+      ftab[j]++;
+      quadrant[i-1] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-1]) << 8);
+      ftab[j]++;
+      quadrant[i-2] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-2]) << 8);
+      ftab[j]++;
+      quadrant[i-3] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-3]) << 8);
+      ftab[j]++;
+   }
+   for (; i >= 0; i--) {
+      quadrant[i] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+      ftab[j]++;
+   }
+
+   /*-- (emphasises close relationship of block & quadrant) --*/
+   for (i = 0; i < BZ_N_OVERSHOOT; i++) {
+      block   [nblock+i] = block[i];
+      quadrant[nblock+i] = 0;
+   }
+
+   if (verb >= 4) VPrintf0 ( "        bucket sorting ...\n" );
+
+   /*-- Complete the initial radix sort --*/
+   for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1];
+
+   s = block[0] << 8;
+   i = nblock-1;
+   for (; i >= 3; i -= 4) {
+      s = (s >> 8) | (block[i] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i;
+      s = (s >> 8) | (block[i-1] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-1;
+      s = (s >> 8) | (block[i-2] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-2;
+      s = (s >> 8) | (block[i-3] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-3;
+   }
+   for (; i >= 0; i--) {
+      s = (s >> 8) | (block[i] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i;
+   }
+
+   /*--
+      Now ftab contains the first loc of every small bucket.
+      Calculate the running order, from smallest to largest
+      big bucket.
+   --*/
+   for (i = 0; i <= 255; i++) {
+      bigDone     [i] = False;
+      runningOrder[i] = i;
+   }
+
+   {
+      Int32 vv;
+      Int32 h = 1;
+      do h = 3 * h + 1; while (h <= 256);
+      do {
+         h = h / 3;
+         for (i = h; i <= 255; i++) {
+            vv = runningOrder[i];
+            j = i;
+            while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) {
+               runningOrder[j] = runningOrder[j-h];
+               j = j - h;
+               if (j <= (h - 1)) goto zero;
+            }
+            zero:
+            runningOrder[j] = vv;
+         }
+      } while (h != 1);
+   }
+
+   /*--
+      The main sorting loop.
+   --*/
+
+   numQSorted = 0;
+
+   for (i = 0; i <= 255; i++) {
+
+      /*--
+         Process big buckets, starting with the least full.
+         Basically this is a 3-step process in which we call
+         mainQSort3 to sort the small buckets [ss, j], but
+         also make a big effort to avoid the calls if we can.
+      --*/
+      ss = runningOrder[i];
+
+      /*--
+         Step 1:
+         Complete the big bucket [ss] by quicksorting
+         any unsorted small buckets [ss, j], for j != ss.  
+         Hopefully previous pointer-scanning phases have already
+         completed many of the small buckets [ss, j], so
+         we don't have to sort them at all.
+      --*/
+      for (j = 0; j <= 255; j++) {
+         if (j != ss) {
+            sb = (ss << 8) + j;
+            if ( ! (ftab[sb] & SETMASK) ) {
+               Int32 lo = ftab[sb]   & CLEARMASK;
+               Int32 hi = (ftab[sb+1] & CLEARMASK) - 1;
+               if (hi > lo) {
+                  if (verb >= 4)
+                     VPrintf4 ( "        qsort [0x%x, 0x%x]   "
+                                "done %d   this %d\n",
+                                ss, j, numQSorted, hi - lo + 1 );
+                  mainQSort3 ( 
+                     ptr, block, quadrant, nblock, 
+                     lo, hi, BZ_N_RADIX, budget 
+                  );   
+                  numQSorted += (hi - lo + 1);
+                  if (*budget < 0) return;
+               }
+            }
+            ftab[sb] |= SETMASK;
+         }
+      }
+
+      AssertH ( !bigDone[ss], 1006 );
+
+      /*--
+         Step 2:
+         Now scan this big bucket [ss] so as to synthesise the
+         sorted order for small buckets [t, ss] for all t,
+         including, magically, the bucket [ss,ss] too.
+         This will avoid doing Real Work in subsequent Step 1's.
+      --*/
+      {
+         for (j = 0; j <= 255; j++) {
+            copyStart[j] =  ftab[(j << 8) + ss]     & CLEARMASK;
+            copyEnd  [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1;
+         }
+         for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) {
+            k = ptr[j]-1; if (k < 0) k += nblock;
+            c1 = block[k];
+            if (!bigDone[c1])
+               ptr[ copyStart[c1]++ ] = k;
+         }
+         for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) {
+            k = ptr[j]-1; if (k < 0) k += nblock;
+            c1 = block[k];
+            if (!bigDone[c1]) 
+               ptr[ copyEnd[c1]-- ] = k;
+         }
+      }
+
+      AssertH ( (copyStart[ss]-1 == copyEnd[ss])
+                || 
+                /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1.
+                   Necessity for this case is demonstrated by compressing 
+                   a sequence of approximately 48.5 million of character 
+                   251; 1.0.0/1.0.1 will then die here. */
+                (copyStart[ss] == 0 && copyEnd[ss] == nblock-1),
+                1007 )
+
+      for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK;
+
+      /*--
+         Step 3:
+         The [ss] big bucket is now done.  Record this fact,
+         and update the quadrant descriptors.  Remember to
+         update quadrants in the overshoot area too, if
+         necessary.  The "if (i < 255)" test merely skips
+         this updating for the last bucket processed, since
+         updating for the last bucket is pointless.
+
+         The quadrant array provides a way to incrementally
+         cache sort orderings, as they appear, so as to 
+         make subsequent comparisons in fullGtU() complete
+         faster.  For repetitive blocks this makes a big
+         difference (but not big enough to be able to avoid
+         the fallback sorting mechanism, exponential radix sort).
+
+         The precise meaning is: at all times:
+
+            for 0 <= i < nblock and 0 <= j <= nblock
+
+            if block[i] != block[j], 
+
+               then the relative values of quadrant[i] and 
+                    quadrant[j] are meaningless.
+
+               else {
+                  if quadrant[i] < quadrant[j]
+                     then the string starting at i lexicographically
+                     precedes the string starting at j
+
+                  else if quadrant[i] > quadrant[j]
+                     then the string starting at j lexicographically
+                     precedes the string starting at i
+
+                  else
+                     the relative ordering of the strings starting
+                     at i and j has not yet been determined.
+               }
+      --*/
+      bigDone[ss] = True;
+
+      if (i < 255) {
+         Int32 bbStart  = ftab[ss << 8] & CLEARMASK;
+         Int32 bbSize   = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart;
+         Int32 shifts   = 0;
+
+         while ((bbSize >> shifts) > 65534) shifts++;
+
+         for (j = bbSize-1; j >= 0; j--) {
+            Int32 a2update     = ptr[bbStart + j];
+            UInt16 qVal        = (UInt16)(j >> shifts);
+            quadrant[a2update] = qVal;
+            if (a2update < BZ_N_OVERSHOOT)
+               quadrant[a2update + nblock] = qVal;
+         }
+         AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 );
+      }
+
+   }
+
+   if (verb >= 4)
+      VPrintf3 ( "        %d pointers, %d sorted, %d scanned\n",
+                 nblock, numQSorted, nblock - numQSorted );
+}
+
+#undef BIGFREQ
+#undef SETMASK
+#undef CLEARMASK
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > 0
+      arr2 exists for [0 .. nblock-1 +N_OVERSHOOT]
+      ((UChar*)arr2)  [0 .. nblock-1] holds block
+      arr1 exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)arr2) [0 .. nblock-1] holds block
+      All other areas of block destroyed
+      ftab [ 0 .. 65536 ] destroyed
+      arr1 [0 .. nblock-1] holds sorted order
+*/
+void BZ2_blockSort ( EState* s )
+{
+   UInt32* ptr    = s->ptr; 
+   UChar*  block  = s->block;
+   UInt32* ftab   = s->ftab;
+   Int32   nblock = s->nblock;
+   Int32   verb   = s->verbosity;
+   Int32   wfact  = s->workFactor;
+   UInt16* quadrant;
+   Int32   budget;
+   Int32   budgetInit;
+   Int32   i;
+
+   if (nblock < 10000) {
+      fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+   } else {
+      /* Calculate the location for quadrant, remembering to get
+         the alignment right.  Assumes that &(block[0]) is at least
+         2-byte aligned -- this should be ok since block is really
+         the first section of arr2.
+      */
+      i = nblock+BZ_N_OVERSHOOT;
+      if (i & 1) i++;
+      quadrant = (UInt16*)(&(block[i]));
+
+      /* (wfact-1) / 3 puts the default-factor-30
+         transition point at very roughly the same place as 
+         with v0.1 and v0.9.0.  
+         Not that it particularly matters any more, since the
+         resulting compressed stream is now the same regardless
+         of whether or not we use the main sort or fallback sort.
+      */
+      if (wfact < 1  ) wfact = 1;
+      if (wfact > 100) wfact = 100;
+      budgetInit = nblock * ((wfact-1) / 3);
+      budget = budgetInit;
+
+      mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget );
+      if (verb >= 3) 
+         VPrintf3 ( "      %d work, %d block, ratio %5.2f\n",
+                    budgetInit - budget,
+                    nblock, 
+                    (float)(budgetInit - budget) /
+                    (float)(nblock==0 ? 1 : nblock) ); 
+      if (budget < 0) {
+         if (verb >= 2) 
+            VPrintf0 ( "    too repetitive; using fallback"
+                       " sorting algorithm\n" );
+         fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+      }
+   }
+
+   s->origPtr = -1;
+   for (i = 0; i < s->nblock; i++)
+      if (ptr[i] == 0)
+         { s->origPtr = i; break; };
+
+   AssertH( s->origPtr != -1, 1003 );
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                       blocksort.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/bz-common.xsl b/Utilities/cmbzip2/bz-common.xsl
new file mode 100644
index 000000000..66fcd6fe0
--- /dev/null
+++ b/Utilities/cmbzip2/bz-common.xsl
@@ -0,0 +1,39 @@
+ 
+
+
+
+ 
+
+
+
+ 
+ 
+   
+    
+      
+     
+  
+
+
+
+
+set       toc,title
+book      toc,title,figure,table,example,equation
+chapter   toc,title
+section   toc
+sect1     toc
+sect2     toc
+sect3     toc
+sect4     nop
+sect5     nop
+qandaset  toc
+qandadiv  nop
+appendix  toc,title
+article/appendix  nop
+article   toc,title
+preface   toc,title
+reference toc,title
+
+
+
diff --git a/Utilities/cmbzip2/bz-fo.xsl b/Utilities/cmbzip2/bz-fo.xsl
new file mode 100644
index 000000000..ba3e30123
--- /dev/null
+++ b/Utilities/cmbzip2/bz-fo.xsl
@@ -0,0 +1,276 @@
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+      
+     
+   
+
+
+
+
+ 
+
+
+
+
+
+
+  
+
+
+
+
+  blue
+
+
+
+
+  
+    
+  
+
+
+
+  
+    
+  
+
+
+
+
+  
+  
+  
+    
+      
+    
+  
+  
+    
+      
+        
+          
+          
+          
+        
+      
+    
+    
+          
+    
+  
+  
+    
+      
+        
+      
+    
+    
+      
+        
+      
+    
+  
+
+
+
+
+  
+  
+  
+    
+      
+        
+      
+    
+    
+          
+    
+  
+  
+    
+      
+        
+      
+    
+    
+      
+        
+      
+    
+  
+
+
+
+
+
+  
+    
+  
+    
+  
+  
+    
+      
+    
+  
+
+
+
+
+
+  
+  
+  
+  
+    
+      0pt
+    
+  
+  
+    
+      
+      
+      
+        
+          
+            baseline
+             
+               
+            
+          
+          
+            baseline
+            
+              
+                
+                
+                
+                
+              
+            
+          
+        
+      
+    
+  
+  
+  
+    
+      
+    
+    
+      
+    
+    
+      
+    
+  
+
+
+
+
+
+  
+  
+  
+  
+    
+      0pt
+    
+  
+  
+    
+      
+        
+        
+        
+      
+      
+      
+      
+        
+          
+            baseline
+            
+               
+            
+          
+          
+            baseline
+            
+              
+                
+                
+                
+                
+              
+            
+          
+        
+      
+    
+  
+  
+  
+    
+      
+    
+    
+      
+    
+    
+      
+    
+  
+
+
+
+
+
+
+  always
+  
+    
+  
+  
+    
+    pt
+  
+  
+    
+    pt
+  
+  false
+
+
+
+
diff --git a/Utilities/cmbzip2/bz-html.xsl b/Utilities/cmbzip2/bz-html.xsl
new file mode 100644
index 000000000..1785fffbc
--- /dev/null
+++ b/Utilities/cmbzip2/bz-html.xsl
@@ -0,0 +1,20 @@
+ 
+ ]>
+
+
+
+
+
+
+
+
+
+
+  
+  
+
+
+
diff --git a/Utilities/cmbzip2/bzdiff b/Utilities/cmbzip2/bzdiff
new file mode 100644
index 000000000..c4c996490
--- /dev/null
+++ b/Utilities/cmbzip2/bzdiff
@@ -0,0 +1,76 @@
+#!/bin/sh
+# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
+
+# Bzcmp/diff wrapped for bzip2, 
+# adapted from zdiff by Philippe Troin  for Debian GNU/Linux.
+
+# Bzcmp and bzdiff are used to invoke the cmp or the  diff  pro-
+# gram  on compressed files.  All options specified are passed
+# directly to cmp or diff.  If only 1 file is specified,  then
+# the  files  compared  are file1 and an uncompressed file1.gz.
+# If two files are specified, then they are  uncompressed  (if
+# necessary) and fed to cmp or diff.  The exit status from cmp
+# or diff is preserved.
+
+PATH="/usr/bin:/bin:$PATH"; export PATH
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+  *cmp) comp=${CMP-cmp}   ;;
+  *)    comp=${DIFF-diff} ;;
+esac
+
+OPTIONS=
+FILES=
+for ARG
+do
+    case "$ARG" in
+    -*) OPTIONS="$OPTIONS $ARG";;
+     *) if test -f "$ARG"; then
+            FILES="$FILES $ARG"
+        else
+            echo "${prog}: $ARG not found or not a regular file"
+        exit 1
+        fi ;;
+    esac
+done
+if test -z "$FILES"; then
+    echo "Usage: $prog [${comp}_options] file [file]"
+    exit 1
+fi
+tmp=`mktemp ${TMPDIR:-/tmp}/bzdiff.XXXXXXXXXX` || {
+      echo 'cannot create a temporary file' >&2
+      exit 1
+}
+set $FILES
+if test $# -eq 1; then
+    FILE=`echo "$1" | sed 's/.bz2$//'`
+    bzip2 -cd "$FILE.bz2" | $comp $OPTIONS - "$FILE"
+    STAT="$?"
+
+elif test $# -eq 2; then
+    case "$1" in
+        *.bz2)
+                case "$2" in
+            *.bz2)
+            F=`echo "$2" | sed 's|.*/||;s|.bz2$||'`
+                        bzip2 -cdfq "$2" > $tmp
+                        bzip2 -cdfq "$1" | $comp $OPTIONS - $tmp
+                        STAT="$?"
+            /bin/rm -f $tmp;;
+
+                *)      bzip2 -cdfq "$1" | $comp $OPTIONS - "$2"
+                        STAT="$?";;
+                esac;;
+        *)      case "$2" in
+            *.bz2)
+                        bzip2 -cdfq "$2" | $comp $OPTIONS "$1" -
+                        STAT="$?";;
+                *)      $comp $OPTIONS "$1" "$2"
+                        STAT="$?";;
+                esac;;
+    esac
+        exit "$STAT"
+else
+    echo "Usage: $prog [${comp}_options] file [file]"
+    exit 1
+fi
diff --git a/Utilities/cmbzip2/bzdiff.1 b/Utilities/cmbzip2/bzdiff.1
new file mode 100644
index 000000000..adb7a8e72
--- /dev/null
+++ b/Utilities/cmbzip2/bzdiff.1
@@ -0,0 +1,47 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin 
+\"for Debian GNU/Linux
+.TH BZDIFF 1
+.SH NAME
+bzcmp, bzdiff \- compare bzip2 compressed files
+.SH SYNOPSIS
+.B bzcmp
+[ cmp_options ] file1
+[ file2 ]
+.br
+.B bzdiff
+[ diff_options ] file1
+[ file2 ]
+.SH DESCRIPTION
+.I  Bzcmp
+and 
+.I bzdiff
+are used to invoke the
+.I cmp
+or the
+.I diff
+program on bzip2 compressed files.  All options specified are passed
+directly to
+.I cmp
+or
+.IR diff "."
+If only 1 file is specified, then the files compared are
+.I file1
+and an uncompressed
+.IR file1 ".bz2."
+If two files are specified, then they are uncompressed if necessary and fed to
+.I cmp
+or
+.IR diff "."
+The exit status from 
+.I cmp
+or
+.I diff
+is preserved.
+.SH "SEE ALSO"
+cmp(1), diff(1), bzmore(1), bzless(1), bzgrep(1), bzip2(1)
+.SH BUGS
+Messages from the
+.I cmp
+or
+.I diff
+programs refer to temporary filenames instead of those specified.
diff --git a/Utilities/cmbzip2/bzgrep b/Utilities/cmbzip2/bzgrep
new file mode 100644
index 000000000..8ccf919ac
--- /dev/null
+++ b/Utilities/cmbzip2/bzgrep
@@ -0,0 +1,75 @@
+#!/bin/sh
+
+# Bzgrep wrapped for bzip2, 
+# adapted from zgrep by Philippe Troin  for Debian GNU/Linux.
+## zgrep notice:
+## zgrep -- a wrapper around a grep program that decompresses files as needed
+## Adapted from a version sent by Charles Levert 
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+    *egrep) grep=${EGREP-egrep} ;;
+    *fgrep) grep=${FGREP-fgrep} ;;
+    *)  grep=${GREP-grep}   ;;
+esac
+pat=""
+while test $# -ne 0; do
+  case "$1" in
+  -e | -f) opt="$opt $1"; shift; pat="$1"
+           if test "$grep" = grep; then  # grep is buggy with -e on SVR4
+             grep=egrep
+           fi;;
+  -A | -B) opt="$opt $1 $2"; shift;;
+  -*)      opt="$opt $1";;
+   *)      if test -z "$pat"; then
+         pat="$1"
+       else
+         break;
+           fi;;
+  esac
+  shift
+done
+
+if test -z "$pat"; then
+  echo "grep through bzip2 files"
+  echo "usage: $prog [grep_options] pattern [files]"
+  exit 1
+fi
+
+list=0
+silent=0
+op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
+case "$op" in
+  *l*) list=1
+esac
+case "$op" in
+  *h*) silent=1
+esac
+
+if test $# -eq 0; then
+  bzip2 -cdfq | $grep $opt "$pat"
+  exit $?
+fi
+
+res=0
+for i do
+  if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi
+  if test $list -eq 1; then
+    bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i
+    r=$?
+  elif test $# -eq 1 -o $silent -eq 1; then
+    bzip2 -cdfq "$i" | $grep $opt "$pat"
+    r=$?
+  else
+    j=${i//\\/\\\\}
+    j=${j//|/\\|}
+    j=${j//&/\\&}
+    j=`printf "%s" "$j" | tr '\n' ' '`
+    bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${j}:|"
+    r=$?
+  fi
+  test "$r" -ne 0 && res="$r"
+done
+exit $res
diff --git a/Utilities/cmbzip2/bzgrep.1 b/Utilities/cmbzip2/bzgrep.1
new file mode 100644
index 000000000..930af8c7f
--- /dev/null
+++ b/Utilities/cmbzip2/bzgrep.1
@@ -0,0 +1,56 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin 
+\"for Debian GNU/Linux
+.TH BZGREP 1
+.SH NAME
+bzgrep, bzfgrep, bzegrep \- search possibly bzip2 compressed files for a regular expression
+.SH SYNOPSIS
+.B bzgrep
+[ grep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzegrep
+[ egrep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzfgrep
+[ fgrep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.SH DESCRIPTION
+.IR  Bzgrep
+is used to invoke the
+.I grep
+on bzip2-compressed files. All options specified are passed directly to
+.I grep.
+If no file is specified, then the standard input is decompressed
+if necessary and fed to grep.
+Otherwise the given files are uncompressed if necessary and fed to
+.I grep.
+.PP
+If
+.I bzgrep
+is invoked as
+.I bzegrep
+or
+.I bzfgrep
+then
+.I egrep
+or
+.I fgrep
+is used instead of
+.I grep.
+If the GREP environment variable is set,
+.I bzgrep
+uses it as the
+.I grep
+program to be invoked. For example:
+
+    for sh:  GREP=fgrep  bzgrep string files
+    for csh: (setenv GREP fgrep; bzgrep string files)
+.SH AUTHOR
+Charles Levert (charles@comm.polymtl.ca). Adapted to bzip2 by Philippe
+Troin  for Debian GNU/Linux.
+.SH "SEE ALSO"
+grep(1), egrep(1), fgrep(1), bzdiff(1), bzmore(1), bzless(1), bzip2(1)
diff --git a/Utilities/cmbzip2/bzip.css b/Utilities/cmbzip2/bzip.css
new file mode 100644
index 000000000..4feb40165
--- /dev/null
+++ b/Utilities/cmbzip2/bzip.css
@@ -0,0 +1,74 @@
+/* Colours:
+#74240f  dark brown      h1, h2, h3, h4
+#336699  medium blue     links
+#339999  turquoise       link hover colour
+#202020  almost black    general text
+#761596  purple          md5sum text
+#626262  dark gray       pre border
+#eeeeee  very light gray pre background
+#f2f2f9  very light blue nav table background
+#3366cc  medium blue     nav table border
+*/
+
+a, a:link, a:visited, a:active { color: #336699; }
+a:hover { color: #339999; }
+
+body { font: 80%/126% sans-serif; }
+h1, h2, h3, h4 { color: #74240f; }
+
+dt { color: #336699; font-weight: bold }
+dd { 
+ margin-left: 1.5em; 
+ padding-bottom: 0.8em;
+}
+
+/* -- ruler -- */
+div.hr_blue { 
+  height:  3px; 
+  background:#ffffff url("/images/hr_blue.png") repeat-x; }
+div.hr_blue hr { display:none; }
+
+/* release styles */
+#release p { margin-top: 0.4em; }
+#release .md5sum { color: #761596; }
+
+
+/* ------ styles for docs|manuals|howto ------ */
+/* -- lists -- */
+ul  { 
+ margin:     0px 4px 16px 16px;
+ padding:    0px;
+ list-style: url("/images/li-blue.png"); 
+}
+ul li { 
+ margin-bottom: 10px;
+}
+ul ul   { 
+ list-style-type:  none; 
+ list-style-image: none; 
+ margin-left:      0px; 
+}
+
+/* header / footer nav tables */
+table.nav {
+ border:     solid 1px #3366cc;
+ background: #f2f2f9;
+ background-color: #f2f2f9;
+ margin-bottom: 0.5em;
+}
+/* don't have underlined links in chunked nav menus */
+table.nav a { text-decoration: none; }
+table.nav a:hover { text-decoration: underline; }
+table.nav td { font-size: 85%; }
+
+code, tt, pre { font-size: 120%; }
+code, tt { color: #761596; }
+
+div.literallayout, pre.programlisting, pre.screen {
+ color:      #000000;
+ padding:    0.5em;
+ background: #eeeeee;
+ border:     1px solid #626262;
+ background-color: #eeeeee;
+ margin: 4px 0px 4px 0px; 
+}
diff --git a/Utilities/cmbzip2/bzip2.1 b/Utilities/cmbzip2/bzip2.1
new file mode 100644
index 000000000..a313f2d5b
--- /dev/null
+++ b/Utilities/cmbzip2/bzip2.1
@@ -0,0 +1,454 @@
+.PU
+.TH bzip2 1
+.SH NAME
+bzip2, bunzip2 \- a block-sorting file compressor, v1.0.4
+.br
+bzcat \- decompresses files to stdout
+.br
+bzip2recover \- recovers data from damaged bzip2 files
+
+.SH SYNOPSIS
+.ll +8
+.B bzip2
+.RB [ " \-cdfkqstvzVL123456789 " ]
+[
+.I "filenames \&..."
+]
+.ll -8
+.br
+.B bunzip2
+.RB [ " \-fkvsVL " ]
+[ 
+.I "filenames \&..."
+]
+.br
+.B bzcat
+.RB [ " \-s " ]
+[ 
+.I "filenames \&..."
+]
+.br
+.B bzip2recover
+.I "filename"
+
+.SH DESCRIPTION
+.I bzip2
+compresses files using the Burrows-Wheeler block sorting
+text compression algorithm, and Huffman coding.  Compression is
+generally considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of the PPM
+family of statistical compressors.
+
+The command-line options are deliberately very similar to 
+those of 
+.I GNU gzip, 
+but they are not identical.
+
+.I bzip2
+expects a list of file names to accompany the
+command-line flags.  Each file is replaced by a compressed version of
+itself, with the name "original_name.bz2".  
+Each compressed file
+has the same modification date, permissions, and, when possible,
+ownership as the corresponding original, so that these properties can
+be correctly restored at decompression time.  File name handling is
+naive in the sense that there is no mechanism for preserving original
+file names, permissions, ownerships or dates in filesystems which lack
+these concepts, or have serious file name length restrictions, such as
+MS-DOS.
+
+.I bzip2
+and
+.I bunzip2
+will by default not overwrite existing
+files.  If you want this to happen, specify the \-f flag.
+
+If no file names are specified,
+.I bzip2
+compresses from standard
+input to standard output.  In this case,
+.I bzip2
+will decline to
+write compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.
+
+.I bunzip2
+(or
+.I bzip2 \-d) 
+decompresses all
+specified files.  Files which were not created by 
+.I bzip2
+will be detected and ignored, and a warning issued.  
+.I bzip2
+attempts to guess the filename for the decompressed file 
+from that of the compressed file as follows:
+
+       filename.bz2    becomes   filename
+       filename.bz     becomes   filename
+       filename.tbz2   becomes   filename.tar
+       filename.tbz    becomes   filename.tar
+       anyothername    becomes   anyothername.out
+
+If the file does not end in one of the recognised endings, 
+.I .bz2, 
+.I .bz, 
+.I .tbz2
+or
+.I .tbz, 
+.I bzip2 
+complains that it cannot
+guess the name of the original file, and uses the original name
+with
+.I .out
+appended.
+
+As with compression, supplying no
+filenames causes decompression from 
+standard input to standard output.
+
+.I bunzip2 
+will correctly decompress a file which is the
+concatenation of two or more compressed files.  The result is the
+concatenation of the corresponding uncompressed files.  Integrity
+testing (\-t) 
+of concatenated 
+compressed files is also supported.
+
+You can also compress or decompress files to the standard output by
+giving the \-c flag.  Multiple files may be compressed and
+decompressed like this.  The resulting outputs are fed sequentially to
+stdout.  Compression of multiple files 
+in this manner generates a stream
+containing multiple compressed file representations.  Such a stream
+can be decompressed correctly only by
+.I bzip2 
+version 0.9.0 or
+later.  Earlier versions of
+.I bzip2
+will stop after decompressing
+the first file in the stream.
+
+.I bzcat
+(or
+.I bzip2 -dc) 
+decompresses all specified files to
+the standard output.
+
+.I bzip2
+will read arguments from the environment variables
+.I BZIP2
+and
+.I BZIP,
+in that order, and will process them
+before any arguments read from the command line.  This gives a 
+convenient way to supply default arguments.
+
+Compression is always performed, even if the compressed 
+file is slightly
+larger than the original.  Files of less than about one hundred bytes
+tend to get larger, since the compression mechanism has a constant
+overhead in the region of 50 bytes.  Random data (including the output
+of most file compressors) is coded at about 8.05 bits per byte, giving
+an expansion of around 0.5%.
+
+As a self-check for your protection, 
+.I 
+bzip2
+uses 32-bit CRCs to
+make sure that the decompressed version of a file is identical to the
+original.  This guards against corruption of the compressed data, and
+against undetected bugs in
+.I bzip2
+(hopefully very unlikely).  The
+chances of data corruption going undetected is microscopic, about one
+chance in four billion for each file processed.  Be aware, though, that
+the check occurs upon decompression, so it can only tell you that
+something is wrong.  It can't help you 
+recover the original uncompressed
+data.  You can use 
+.I bzip2recover
+to try to recover data from
+damaged files.
+
+Return values: 0 for a normal exit, 1 for environmental problems (file
+not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
+compressed file, 3 for an internal consistency error (eg, bug) which
+caused
+.I bzip2
+to panic.
+
+.SH OPTIONS
+.TP
+.B \-c --stdout
+Compress or decompress to standard output.
+.TP
+.B \-d --decompress
+Force decompression.  
+.I bzip2, 
+.I bunzip2 
+and
+.I bzcat 
+are
+really the same program, and the decision about what actions to take is
+done on the basis of which name is used.  This flag overrides that
+mechanism, and forces 
+.I bzip2
+to decompress.
+.TP
+.B \-z --compress
+The complement to \-d: forces compression, regardless of the
+invocation name.
+.TP
+.B \-t --test
+Check integrity of the specified file(s), but don't decompress them.
+This really performs a trial decompression and throws away the result.
+.TP
+.B \-f --force
+Force overwrite of output files.  Normally,
+.I bzip2 
+will not overwrite
+existing output files.  Also forces 
+.I bzip2 
+to break hard links
+to files, which it otherwise wouldn't do.
+
+bzip2 normally declines to decompress files which don't have the
+correct magic header bytes.  If forced (-f), however, it will pass
+such files through unmodified.  This is how GNU gzip behaves.
+.TP
+.B \-k --keep
+Keep (don't delete) input files during compression
+or decompression.
+.TP
+.B \-s --small
+Reduce memory usage, for compression, decompression and testing.  Files
+are decompressed and tested using a modified algorithm which only
+requires 2.5 bytes per block byte.  This means any file can be
+decompressed in 2300k of memory, albeit at about half the normal speed.
+
+During compression, \-s selects a block size of 200k, which limits
+memory use to around the same figure, at the expense of your compression
+ratio.  In short, if your machine is low on memory (8 megabytes or
+less), use \-s for everything.  See MEMORY MANAGEMENT below.
+.TP
+.B \-q --quiet
+Suppress non-essential warning messages.  Messages pertaining to
+I/O errors and other critical events will not be suppressed.
+.TP
+.B \-v --verbose
+Verbose mode -- show the compression ratio for each file processed.
+Further \-v's increase the verbosity level, spewing out lots of
+information which is primarily of interest for diagnostic purposes.
+.TP
+.B \-L --license -V --version
+Display the software version, license terms and conditions.
+.TP
+.B \-1 (or \-\-fast) to \-9 (or \-\-best)
+Set the block size to 100 k, 200 k ..  900 k when compressing.  Has no
+effect when decompressing.  See MEMORY MANAGEMENT below.
+The \-\-fast and \-\-best aliases are primarily for GNU gzip 
+compatibility.  In particular, \-\-fast doesn't make things
+significantly faster.  
+And \-\-best merely selects the default behaviour.
+.TP
+.B \--
+Treats all subsequent arguments as file names, even if they start
+with a dash.  This is so you can handle files with names beginning
+with a dash, for example: bzip2 \-- \-myfilename.
+.TP
+.B \--repetitive-fast --repetitive-best
+These flags are redundant in versions 0.9.5 and above.  They provided
+some coarse control over the behaviour of the sorting algorithm in
+earlier versions, which was sometimes useful.  0.9.5 and above have an
+improved algorithm which renders these flags irrelevant.
+
+.SH MEMORY MANAGEMENT
+.I bzip2 
+compresses large files in blocks.  The block size affects
+both the compression ratio achieved, and the amount of memory needed for
+compression and decompression.  The flags \-1 through \-9
+specify the block size to be 100,000 bytes through 900,000 bytes (the
+default) respectively.  At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+.I bunzip2
+then allocates itself just enough memory to decompress
+the file.  Since block sizes are stored in compressed files, it follows
+that the flags \-1 to \-9 are irrelevant to and so ignored
+during decompression.
+
+Compression and decompression requirements, 
+in bytes, can be estimated as:
+
+       Compression:   400k + ( 8 x block size )
+
+       Decompression: 100k + ( 4 x block size ), or
+                      100k + ( 2.5 x block size )
+
+Larger block sizes give rapidly diminishing marginal returns.  Most of
+the compression comes from the first two or three hundred k of block
+size, a fact worth bearing in mind when using
+.I bzip2
+on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block size.
+
+For files compressed with the default 900k block size,
+.I bunzip2
+will require about 3700 kbytes to decompress.  To support decompression
+of any file on a 4 megabyte machine, 
+.I bunzip2
+has an option to
+decompress using approximately half this amount of memory, about 2300
+kbytes.  Decompression speed is also halved, so you should use this
+option only where necessary.  The relevant flag is -s.
+
+In general, try and use the largest block size memory constraints allow,
+since that maximises the compression achieved.  Compression and
+decompression speed are virtually unaffected by block size.
+
+Another significant point applies to files which fit in a single block
+-- that means most files you'd encounter using a large block size.  The
+amount of real memory touched is proportional to the size of the file,
+since the file is smaller than a block.  For example, compressing a file
+20,000 bytes long with the flag -9 will cause the compressor to
+allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
+kbytes of it.  Similarly, the decompressor will allocate 3700k but only
+touch 100k + 20000 * 4 = 180 kbytes.
+
+Here is a table which summarises the maximum memory usage for different
+block sizes.  Also recorded is the total compressed size for 14 files of
+the Calgary Text Compression Corpus totalling 3,141,622 bytes.  This
+column gives some feel for how compression varies with block size.
+These figures tend to understate the advantage of larger block sizes for
+larger files, since the Corpus is dominated by smaller files.
+
+           Compress   Decompress   Decompress   Corpus
+    Flag     usage      usage       -s usage     Size
+
+     -1      1200k       500k         350k      914704
+     -2      2000k       900k         600k      877703
+     -3      2800k      1300k         850k      860338
+     -4      3600k      1700k        1100k      846899
+     -5      4400k      2100k        1350k      845160
+     -6      5200k      2500k        1600k      838626
+     -7      6100k      2900k        1850k      834096
+     -8      6800k      3300k        2100k      828642
+     -9      7600k      3700k        2350k      828642
+
+.SH RECOVERING DATA FROM DAMAGED FILES
+.I bzip2
+compresses files in blocks, usually 900kbytes long.  Each
+block is handled independently.  If a media or transmission error causes
+a multi-block .bz2
+file to become damaged, it may be possible to
+recover data from the undamaged blocks in the file.
+
+The compressed representation of each block is delimited by a 48-bit
+pattern, which makes it possible to find the block boundaries with
+reasonable certainty.  Each block also carries its own 32-bit CRC, so
+damaged blocks can be distinguished from undamaged ones.
+
+.I bzip2recover
+is a simple program whose purpose is to search for
+blocks in .bz2 files, and write each block out into its own .bz2 
+file.  You can then use
+.I bzip2 
+\-t
+to test the
+integrity of the resulting files, and decompress those which are
+undamaged.
+
+.I bzip2recover
+takes a single argument, the name of the damaged file, 
+and writes a number of files "rec00001file.bz2",
+"rec00002file.bz2", etc, containing the  extracted  blocks.
+The  output  filenames  are  designed  so  that the use of
+wildcards in subsequent processing -- for example,  
+"bzip2 -dc  rec*file.bz2 > recovered_data" -- processes the files in
+the correct order.
+
+.I bzip2recover
+should be of most use dealing with large .bz2
+files,  as  these will contain many blocks.  It is clearly
+futile to use it on damaged single-block  files,  since  a
+damaged  block  cannot  be recovered.  If you wish to minimise 
+any potential data loss through media  or  transmission errors, 
+you might consider compressing with a smaller
+block size.
+
+.SH PERFORMANCE NOTES
+The sorting phase of compression gathers together similar strings in the
+file.  Because of this, files containing very long runs of repeated
+symbols, like "aabaabaabaab ..."  (repeated several hundred times) may
+compress more slowly than normal.  Versions 0.9.5 and above fare much
+better than previous versions in this respect.  The ratio between
+worst-case and average-case compression time is in the region of 10:1.
+For previous versions, this figure was more like 100:1.  You can use the
+\-vvvv option to monitor progress in great detail, if you want.
+
+Decompression speed is unaffected by these phenomena.
+
+.I bzip2
+usually allocates several megabytes of memory to operate
+in, and then charges all over it in a fairly random fashion.  This means
+that performance, both for compressing and decompressing, is largely
+determined by the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss rate have
+been observed to give disproportionately large performance improvements.
+I imagine 
+.I bzip2
+will perform best on machines with very large caches.
+
+.SH CAVEATS
+I/O error messages are not as helpful as they could be.
+.I bzip2
+tries hard to detect I/O errors and exit cleanly, but the details of
+what the problem is sometimes seem rather misleading.
+
+This manual page pertains to version 1.0.4 of
+.I bzip2.  
+Compressed data created by this version is entirely forwards and
+backwards compatible with the previous public releases, versions
+0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and 1.0.3, but with the following
+exception: 0.9.0 and above can correctly decompress multiple
+concatenated compressed files.  0.1pl2 cannot do this; it will stop
+after decompressing just the first file in the stream.
+
+.I bzip2recover
+versions prior to 1.0.2 used 32-bit integers to represent
+bit positions in compressed files, so they could not handle compressed
+files more than 512 megabytes long.  Versions 1.0.2 and above use
+64-bit ints on some platforms which support them (GNU supported
+targets, and Windows).  To establish whether or not bzip2recover was
+built with such a limitation, run it without arguments.  In any event
+you can build yourself an unlimited version if you can recompile it
+with MaybeUInt64 set to be an unsigned 64-bit integer.
+
+
+
+.SH AUTHOR
+Julian Seward, jsewardbzip.org.
+
+http://www.bzip.org
+
+The ideas embodied in
+.I bzip2
+are due to (at least) the following
+people: Michael Burrows and David Wheeler (for the block sorting
+transformation), David Wheeler (again, for the Huffman coder), Peter
+Fenwick (for the structured coding model in the original
+.I bzip,
+and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original
+.I bzip).  
+I am much
+indebted for their help, support and advice.  See the manual in the
+source distribution for pointers to sources of documentation.  Christian
+von Roques encouraged me to look for faster sorting algorithms, so as to
+speed up compression.  Bela Lubkin encouraged me to improve the
+worst-case compression performance.  
+Donna Robinson XMLised the documentation.
+The bz* scripts are derived from those of GNU gzip.
+Many people sent patches, helped
+with portability problems, lent machines, gave advice and were generally
+helpful.
diff --git a/Utilities/cmbzip2/bzip2.1.preformatted b/Utilities/cmbzip2/bzip2.1.preformatted
new file mode 100644
index 000000000..15e16e50a
--- /dev/null
+++ b/Utilities/cmbzip2/bzip2.1.preformatted
@@ -0,0 +1,399 @@
+bzip2(1)                                                 bzip2(1)
+
+
+
+NNAAMMEE
+       bzip2, bunzip2 − a blockâ€sorting file compressor, v1.0.4
+       bzcat − decompresses files to stdout
+       bzip2recover − recovers data from damaged bzip2 files
+
+
+SSYYNNOOPPSSIISS
+       bbzziipp22 [ −−ccddffkkqqssttvvzzVVLL112233445566778899 ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbuunnzziipp22 [ −−ffkkvvssVVLL ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbzzccaatt [ −−ss ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbzziipp22rreeccoovveerr _f_i_l_e_n_a_m_e
+
+
+DDEESSCCRRIIPPTTIIOONN
+       _b_z_i_p_2  compresses  files  using  the Burrowsâ€Wheeler block
+       sorting text compression algorithm,  and  Huffman  coding.
+       Compression  is  generally  considerably  better than that
+       achieved by more conventional LZ77/LZ78â€based compressors,
+       and  approaches  the performance of the PPM family of sta­
+       tistical compressors.
+
+       The commandâ€line options are deliberately very similar  to
+       those of _G_N_U _g_z_i_p_, but they are not identical.
+
+       _b_z_i_p_2  expects  a list of file names to accompany the com­
+       mandâ€line flags.  Each file is replaced  by  a  compressed
+       version  of  itself,  with  the  name "original_name.bz2".
+       Each compressed file has the same modification date,  per­
+       missions, and, when possible, ownership as the correspond­
+       ing original, so that these properties  can  be  correctly
+       restored  at  decompression  time.   File name handling is
+       naive in the sense that there is no mechanism for preserv­
+       ing  original file names, permissions, ownerships or dates
+       in filesystems which lack these concepts, or have  serious
+       file name length restrictions, such as MSâ€DOS.
+
+       _b_z_i_p_2  and  _b_u_n_z_i_p_2 will by default not overwrite existing
+       files.  If you want this to happen, specify the −f flag.
+
+       If no file names  are  specified,  _b_z_i_p_2  compresses  from
+       standard  input  to  standard output.  In this case, _b_z_i_p_2
+       will decline to write compressed output to a terminal,  as
+       this  would  be  entirely  incomprehensible  and therefore
+       pointless.
+
+       _b_u_n_z_i_p_2 (or _b_z_i_p_2 _−_d_) decompresses  all  specified  files.
+       Files which were not created by _b_z_i_p_2 will be detected and
+       ignored, and a warning issued.  _b_z_i_p_2  attempts  to  guess
+       the  filename  for  the decompressed file from that of the
+       compressed file as follows:
+
+              filename.bz2    becomes   filename
+              filename.bz     becomes   filename
+              filename.tbz2   becomes   filename.tar
+              filename.tbz    becomes   filename.tar
+              anyothername    becomes   anyothername.out
+
+       If the file does not end in one of the recognised endings,
+       _._b_z_2_,  _._b_z_,  _._t_b_z_2 or _._t_b_z_, _b_z_i_p_2 complains that it cannot
+       guess the name of the original file, and uses the original
+       name with _._o_u_t appended.
+
+       As  with compression, supplying no filenames causes decom­
+       pression from standard input to standard output.
+
+       _b_u_n_z_i_p_2 will correctly decompress a file which is the con­
+       catenation of two or more compressed files.  The result is
+       the concatenation of the corresponding uncompressed files.
+       Integrity testing (−t) of concatenated compressed files is
+       also supported.
+
+       You can also compress or decompress files to the  standard
+       output  by giving the −c flag.  Multiple files may be com­
+       pressed and decompressed like this.  The resulting outputs
+       are  fed  sequentially to stdout.  Compression of multiple
+       files in this manner generates a stream containing  multi­
+       ple compressed file representations.  Such a stream can be
+       decompressed correctly only  by  _b_z_i_p_2  version  0.9.0  or
+       later.   Earlier  versions of _b_z_i_p_2 will stop after decom­
+       pressing the first file in the stream.
+
+       _b_z_c_a_t (or _b_z_i_p_2 _â€_d_c_) decompresses all specified  files  to
+       the standard output.
+
+       _b_z_i_p_2  will  read arguments from the environment variables
+       _B_Z_I_P_2 and _B_Z_I_P_, in  that  order,  and  will  process  them
+       before  any  arguments  read  from the command line.  This
+       gives a convenient way to supply default arguments.
+
+       Compression is always performed, even  if  the  compressed
+       file  is slightly larger than the original.  Files of less
+       than about one hundred bytes tend to get larger, since the
+       compression  mechanism  has  a  constant  overhead  in the
+       region of 50 bytes.  Random data (including the output  of
+       most  file  compressors)  is  coded at about 8.05 bits per
+       byte, giving an expansion of around 0.5%.
+
+       As a selfâ€check for your  protection,  _b_z_i_p_2  uses  32â€bit
+       CRCs  to make sure that the decompressed version of a file
+       is identical to the original.  This guards against corrup­
+       tion  of  the compressed data, and against undetected bugs
+       in _b_z_i_p_2 (hopefully very unlikely).  The chances  of  data
+       corruption  going  undetected  is  microscopic,  about one
+       chance in four billion for each file processed.  Be aware,
+       though,  that  the  check occurs upon decompression, so it
+       can only tell you that something is wrong.  It can’t  help
+       you  recover  the original uncompressed data.  You can use
+       _b_z_i_p_2_r_e_c_o_v_e_r to try to recover data from damaged files.
+
+       Return values: 0 for a normal exit,  1  for  environmental
+       problems  (file not found, invalid flags, I/O errors, &c),
+       2 to indicate a corrupt compressed file, 3 for an internal
+       consistency error (eg, bug) which caused _b_z_i_p_2 to panic.
+
+
+OOPPTTIIOONNSS
+       −−cc â€â€â€â€ssttddoouutt
+              Compress or decompress to standard output.
+
+       −−dd â€â€â€â€ddeeccoommpprreessss
+              Force  decompression.  _b_z_i_p_2_, _b_u_n_z_i_p_2 and _b_z_c_a_t are
+              really the same program,  and  the  decision  about
+              what  actions to take is done on the basis of which
+              name is used.  This flag overrides that  mechanism,
+              and forces _b_z_i_p_2 to decompress.
+
+       −−zz â€â€â€â€ccoommpprreessss
+              The   complement   to   −d:   forces   compression,
+              regardless of the invocation name.
+
+       −−tt â€â€â€â€tteesstt
+              Check integrity of the specified file(s), but don’t
+              decompress  them.   This  really  performs  a trial
+              decompression and throws away the result.
+
+       −−ff â€â€â€â€ffoorrccee
+              Force overwrite of output files.   Normally,  _b_z_i_p_2
+              will  not  overwrite  existing  output files.  Also
+              forces _b_z_i_p_2 to break hard links to files, which it
+              otherwise wouldn’t do.
+
+              bzip2  normally  declines to decompress files which
+              don’t have the  correct  magic  header  bytes.   If
+              forced  (â€f),  however,  it  will  pass  such files
+              through unmodified.  This is how GNU gzip  behaves.
+
+       −−kk â€â€â€â€kkeeeepp
+              Keep  (don’t delete) input files during compression
+              or decompression.
+
+       −−ss â€â€â€â€ssmmaallll
+              Reduce memory usage, for compression, decompression
+              and  testing.   Files  are  decompressed and tested
+              using a modified algorithm which only requires  2.5
+              bytes  per  block byte.  This means any file can be
+              decompressed in 2300k of memory,  albeit  at  about
+              half the normal speed.
+
+              During  compression,  −s  selects  a  block size of
+              200k, which limits memory use to  around  the  same
+              figure,  at  the expense of your compression ratio.
+              In short, if your  machine  is  low  on  memory  (8
+              megabytes  or  less),  use  −s for everything.  See
+              MEMORY MANAGEMENT below.
+
+       −−qq â€â€â€â€qquuiieett
+              Suppress nonâ€essential warning messages.   Messages
+              pertaining  to I/O errors and other critical events
+              will not be suppressed.
+
+       −−vv â€â€â€â€vveerrbboossee
+              Verbose mode â€â€ show the compression ratio for each
+              file  processed.   Further  −v’s  increase the ver­
+              bosity level, spewing out lots of information which
+              is primarily of interest for diagnostic purposes.
+
+       −−LL â€â€â€â€lliicceennssee â€â€VV â€â€â€â€vveerrssiioonn
+              Display  the  software  version,  license terms and
+              conditions.
+
+       −−11 ((oorr −−−−ffaasstt)) ttoo −−99 ((oorr −−−−bbeesstt))
+              Set the block size to 100 k, 200 k ..  900  k  when
+              compressing.   Has  no  effect  when decompressing.
+              See MEMORY MANAGEMENT below.  The −−fast and −−best
+              aliases  are  primarily for GNU gzip compatibility.
+              In particular, −−fast doesn’t make things  signifi­
+              cantly  faster.   And  −−best  merely  selects  the
+              default behaviour.
+
+       −−     Treats all subsequent arguments as file names, even
+              if they start with a dash.  This is so you can han­
+              dle files with names beginning  with  a  dash,  for
+              example: bzip2 −†−myfilename.
+
+       −−â€â€rreeppeettiittiivveeâ€â€ffaasstt â€â€â€â€rreeppeettiittiivveeâ€â€bbeesstt
+              These  flags  are  redundant  in versions 0.9.5 and
+              above.  They provided some coarse control over  the
+              behaviour  of the sorting algorithm in earlier ver­
+              sions, which was sometimes useful.  0.9.5 and above
+              have  an  improved  algorithm  which  renders these
+              flags irrelevant.
+
+
+MMEEMMOORRYY MMAANNAAGGEEMMEENNTT
+       _b_z_i_p_2 compresses large files in blocks.   The  block  size
+       affects  both  the  compression  ratio  achieved,  and the
+       amount of memory needed for compression and decompression.
+       The  flags  −1  through  −9  specify  the block size to be
+       100,000 bytes through 900,000 bytes (the default)  respec­
+       tively.   At  decompression  time, the block size used for
+       compression is read from  the  header  of  the  compressed
+       file, and _b_u_n_z_i_p_2 then allocates itself just enough memory
+       to decompress the file.  Since block sizes are  stored  in
+       compressed  files,  it follows that the flags −1 to −9 are
+       irrelevant to and so ignored during decompression.
+
+       Compression and decompression requirements, in bytes,  can
+       be estimated as:
+
+              Compression:   400k + ( 8 x block size )
+
+              Decompression: 100k + ( 4 x block size ), or
+                             100k + ( 2.5 x block size )
+
+       Larger  block  sizes  give  rapidly  diminishing  marginal
+       returns.  Most of the compression comes from the first two
+       or  three hundred k of block size, a fact worth bearing in
+       mind when using _b_z_i_p_2  on  small  machines.   It  is  also
+       important  to  appreciate  that  the  decompression memory
+       requirement is set at compression time by  the  choice  of
+       block size.
+
+       For  files  compressed  with  the default 900k block size,
+       _b_u_n_z_i_p_2 will require about 3700 kbytes to decompress.   To
+       support decompression of any file on a 4 megabyte machine,
+       _b_u_n_z_i_p_2 has an option to  decompress  using  approximately
+       half this amount of memory, about 2300 kbytes.  Decompres­
+       sion speed is also halved, so you should use  this  option
+       only where necessary.  The relevant flag is â€s.
+
+       In general, try and use the largest block size memory con­
+       straints  allow,  since  that  maximises  the  compression
+       achieved.   Compression and decompression speed are virtu­
+       ally unaffected by block size.
+
+       Another significant point applies to files which fit in  a
+       single  block  â€â€  that  means  most files you’d encounter
+       using a large block  size.   The  amount  of  real  memory
+       touched is proportional to the size of the file, since the
+       file is smaller than a block.  For example, compressing  a
+       file  20,000  bytes  long  with the flag â€9 will cause the
+       compressor to allocate around 7600k of  memory,  but  only
+       touch 400k + 20000 * 8 = 560 kbytes of it.  Similarly, the
+       decompressor will allocate 3700k but  only  touch  100k  +
+       20000 * 4 = 180 kbytes.
+
+       Here  is a table which summarises the maximum memory usage
+       for different block sizes.  Also  recorded  is  the  total
+       compressed  size for 14 files of the Calgary Text Compres­
+       sion Corpus totalling 3,141,622 bytes.  This column  gives
+       some  feel  for  how  compression  varies with block size.
+       These figures tend to understate the advantage  of  larger
+       block  sizes  for  larger files, since the Corpus is domi­
+       nated by smaller files.
+
+                  Compress   Decompress   Decompress   Corpus
+           Flag     usage      usage       â€s usage     Size
+
+            â€1      1200k       500k         350k      914704
+            â€2      2000k       900k         600k      877703
+            â€3      2800k      1300k         850k      860338
+            â€4      3600k      1700k        1100k      846899
+            â€5      4400k      2100k        1350k      845160
+            â€6      5200k      2500k        1600k      838626
+            â€7      6100k      2900k        1850k      834096
+            â€8      6800k      3300k        2100k      828642
+            â€9      7600k      3700k        2350k      828642
+
+
+RREECCOOVVEERRIINNGG DDAATTAA FFRROOMM DDAAMMAAGGEEDD FFIILLEESS
+       _b_z_i_p_2 compresses files in blocks, usually 900kbytes  long.
+       Each block is handled independently.  If a media or trans­
+       mission error causes a multiâ€block  .bz2  file  to  become
+       damaged,  it  may  be  possible  to  recover data from the
+       undamaged blocks in the file.
+
+       The compressed representation of each block  is  delimited
+       by  a  48â€bit pattern, which makes it possible to find the
+       block boundaries with reasonable  certainty.   Each  block
+       also  carries its own 32â€bit CRC, so damaged blocks can be
+       distinguished from undamaged ones.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r is a  simple  program  whose  purpose  is  to
+       search  for blocks in .bz2 files, and write each block out
+       into its own .bz2 file.  You can then use _b_z_i_p_2 −t to test
+       the integrity of the resulting files, and decompress those
+       which are undamaged.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r takes a single argument, the name of the dam­
+       aged    file,    and    writes    a    number   of   files
+       "rec00001file.bz2",  "rec00002file.bz2",  etc,  containing
+       the   extracted   blocks.   The   output   filenames   are
+       designed  so  that the use of wildcards in subsequent pro­
+       cessing  â€â€ for example, "bzip2 â€dc  rec*file.bz2 > recov­
+       ered_data" â€â€ processes the files in the correct order.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r should be of most use dealing with large .bz2
+       files,  as  these will contain many blocks.  It is clearly
+       futile to use it on damaged singleâ€block  files,  since  a
+       damaged  block  cannot  be recovered.  If you wish to min­
+       imise any potential data loss through media  or  transmis­
+       sion errors, you might consider compressing with a smaller
+       block size.
+
+
+PPEERRFFOORRMMAANNCCEE NNOOTTEESS
+       The sorting phase of compression gathers together  similar
+       strings  in  the  file.  Because of this, files containing
+       very long runs of  repeated  symbols,  like  "aabaabaabaab
+       ..."   (repeated  several hundred times) may compress more
+       slowly than normal.  Versions 0.9.5 and  above  fare  much
+       better  than previous versions in this respect.  The ratio
+       between worstâ€case and averageâ€case compression time is in
+       the  region  of  10:1.  For previous versions, this figure
+       was more like 100:1.  You can use the −vvvv option to mon­
+       itor progress in great detail, if you want.
+
+       Decompression speed is unaffected by these phenomena.
+
+       _b_z_i_p_2  usually  allocates  several  megabytes of memory to
+       operate in, and then charges all over it in a fairly  ran­
+       dom  fashion.   This means that performance, both for com­
+       pressing and decompressing, is largely determined  by  the
+       speed  at  which  your  machine  can service cache misses.
+       Because of this, small changes to the code to  reduce  the
+       miss  rate  have  been observed to give disproportionately
+       large performance improvements.  I imagine _b_z_i_p_2 will per­
+       form best on machines with very large caches.
+
+
+CCAAVVEEAATTSS
+       I/O  error  messages  are not as helpful as they could be.
+       _b_z_i_p_2 tries hard to detect I/O errors  and  exit  cleanly,
+       but  the  details  of  what  the problem is sometimes seem
+       rather misleading.
+
+       This manual page pertains to version 1.0.4 of _b_z_i_p_2_.  Com­
+       pressed  data created by this version is entirely forwards
+       and  backwards  compatible  with   the   previous   public
+       releases,  versions  0.1pl2,  0.9.0,  0.9.5, 1.0.0, 1.0.1, 
+       1.0.2 and 1.0.3, but with the  following  exception: 0.9.0
+       and above can  correctly decompress  multiple concatenated
+       compressed files.  0.1pl2  cannot do this;  it  will  stop 
+       after  decompressing just the first file in the stream.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r  versions prior to 1.0.2 used 32â€bit integers
+       to represent bit positions in compressed  files,  so  they
+       could  not handle compressed files more than 512 megabytes
+       long.  Versions 1.0.2 and above use 64â€bit  ints  on  some
+       platforms  which  support them (GNU supported targets, and
+       Windows).  To establish whether or  not  bzip2recover  was
+       built  with  such  a limitation, run it without arguments.
+       In any event you can build yourself an  unlimited  version
+       if  you  can  recompile  it  with MaybeUInt64 set to be an
+       unsigned 64â€bit integer.
+
+
+
+
+AAUUTTHHOORR
+       Julian Seward, jsewardbzip.org.
+
+       http://www.bzip.org
+
+       The ideas embodied in _b_z_i_p_2 are due to (at least) the fol­
+       lowing  people: Michael Burrows and David Wheeler (for the
+       block sorting transformation), David Wheeler  (again,  for
+       the Huffman coder), Peter Fenwick (for the structured cod­
+       ing model in the original _b_z_i_p_, and many refinements), and
+       Alistair  Moffat,  Radford  Neal  and  Ian Witten (for the
+       arithmetic  coder  in  the  original  _b_z_i_p_)_.   I  am  much
+       indebted for their help, support and advice.  See the man­
+       ual in the source distribution for pointers to sources  of
+       documentation.  Christian von Roques encouraged me to look
+       for faster sorting algorithms, so as to speed up  compres­
+       sion.  Bela Lubkin encouraged me to improve the worstâ€case
+       compression performance.  Donna Robinson XMLised the docu­
+       mentation.   The bz* scripts are derived from those of GNU
+       gzip.  Many people sent patches, helped  with  portability
+       problems,  lent  machines,  gave advice and were generally
+       helpful.
+
+
+
+                                                         bzip2(1)
diff --git a/Utilities/cmbzip2/bzip2.c b/Utilities/cmbzip2/bzip2.c
new file mode 100644
index 000000000..88e5f0936
--- /dev/null
+++ b/Utilities/cmbzip2/bzip2.c
@@ -0,0 +1,2034 @@
+
+/*-----------------------------------------------------------*/
+/*--- A block-sorting, lossless compressor        bzip2.c ---*/
+/*-----------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+/* Place a 1 beside your platform, and 0 elsewhere.
+   Generic 32-bit Unix.
+   Also works on 64-bit Unix boxes.
+   This is the default.
+*/
+#define BZ_UNIX      1
+
+/*--
+  Win32, as seen by Jacob Navia's excellent
+  port of (Chris Fraser & David Hanson)'s excellent
+  lcc compiler.  Or with MS Visual C.
+  This is selected automatically if compiled by a compiler which
+  defines _WIN32, not including the Cygwin GCC.
+--*/
+#define BZ_LCCWIN32  0
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#undef  BZ_LCCWIN32
+#define BZ_LCCWIN32 1
+#undef  BZ_UNIX
+#define BZ_UNIX 0
+#endif
+
+
+/*---------------------------------------------*/
+/*--
+  Some stuff for all platforms.
+--*/
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "bzlib.h"
+
+#define ERROR_IF_EOF(i)       { if ((i) == EOF)  ioError(); }
+#define ERROR_IF_NOT_ZERO(i)  { if ((i) != 0)    ioError(); }
+#define ERROR_IF_MINUS_ONE(i) { if ((i) == (-1)) ioError(); }
+
+
+/*---------------------------------------------*/
+/*--
+   Platform-specific stuff.
+--*/
+
+#if BZ_UNIX
+#   include 
+#   include 
+#   include 
+#   include 
+#   include 
+#   include 
+
+#   define PATH_SEP    '/'
+#   define MY_LSTAT    lstat
+#   define MY_STAT     stat
+#   define MY_S_ISREG  S_ISREG
+#   define MY_S_ISDIR  S_ISDIR
+
+#   define APPEND_FILESPEC(root, name) \
+      root=snocString((root), (name))
+
+#   define APPEND_FLAG(root, name) \
+      root=snocString((root), (name))
+
+#   define SET_BINARY_MODE(fd) /**/
+
+#   ifdef __GNUC__
+#      define NORETURN __attribute__ ((noreturn))
+#   else
+#      define NORETURN /**/
+#   endif
+
+#   ifdef __DJGPP__
+#     include 
+#     include 
+#     undef MY_LSTAT
+#     undef MY_STAT
+#     define MY_LSTAT stat
+#     define MY_STAT stat
+#     undef SET_BINARY_MODE
+#     define SET_BINARY_MODE(fd)                        \
+        do {                                            \
+           int retVal = setmode ( fileno ( fd ),        \
+                                  O_BINARY );           \
+           ERROR_IF_MINUS_ONE ( retVal );               \
+        } while ( 0 )
+#   endif
+
+#   ifdef __CYGWIN__
+#     include 
+#     include 
+#     undef SET_BINARY_MODE
+#     define SET_BINARY_MODE(fd)                        \
+        do {                                            \
+           int retVal = setmode ( fileno ( fd ),        \
+                                  O_BINARY );           \
+           ERROR_IF_MINUS_ONE ( retVal );               \
+        } while ( 0 )
+#   endif
+#endif /* BZ_UNIX */
+
+
+
+#if BZ_LCCWIN32
+#   include 
+#   include 
+#   include 
+
+#   define NORETURN       /**/
+#   define PATH_SEP       '\\'
+#   define MY_LSTAT       _stat
+#   define MY_STAT        _stat
+#   define MY_S_ISREG(x)  ((x) & _S_IFREG)
+#   define MY_S_ISDIR(x)  ((x) & _S_IFDIR)
+
+#   define APPEND_FLAG(root, name) \
+      root=snocString((root), (name))
+
+#   define APPEND_FILESPEC(root, name)                \
+      root = snocString ((root), (name))
+
+#   define SET_BINARY_MODE(fd)                        \
+      do {                                            \
+         int retVal = setmode ( fileno ( fd ),        \
+                                O_BINARY );           \
+         ERROR_IF_MINUS_ONE ( retVal );               \
+      } while ( 0 )
+
+#endif /* BZ_LCCWIN32 */
+
+
+/*---------------------------------------------*/
+/*--
+  Some more stuff for all platforms :-)
+--*/
+
+typedef char            Char;
+typedef unsigned char   Bool;
+typedef unsigned char   UChar;
+typedef int             Int32;
+typedef unsigned int    UInt32;
+typedef short           Int16;
+typedef unsigned short  UInt16;
+                                       
+#define True  ((Bool)1)
+#define False ((Bool)0)
+
+/*--
+  IntNative is your platform's `native' int size.
+  Only here to avoid probs with 64-bit platforms.
+--*/
+typedef int IntNative;
+
+
+/*---------------------------------------------------*/
+/*--- Misc (file handling) data decls             ---*/
+/*---------------------------------------------------*/
+
+Int32   verbosity;
+Bool    keepInputFiles, smallMode, deleteOutputOnInterrupt;
+Bool    forceOverwrite, testFailsExist, unzFailsExist, noisy;
+Int32   numFileNames, numFilesProcessed, blockSize100k;
+Int32   exitValue;
+
+/*-- source modes; F==file, I==stdin, O==stdout --*/
+#define SM_I2O           1
+#define SM_F2O           2
+#define SM_F2F           3
+
+/*-- operation modes --*/
+#define OM_Z             1
+#define OM_UNZ           2
+#define OM_TEST          3
+
+Int32   opMode;
+Int32   srcMode;
+
+#define FILE_NAME_LEN 1034
+
+Int32   longestFileName;
+Char    inName [FILE_NAME_LEN];
+Char    outName[FILE_NAME_LEN];
+Char    tmpName[FILE_NAME_LEN];
+Char    *progName;
+Char    progNameReally[FILE_NAME_LEN];
+FILE    *outputHandleJustInCase;
+Int32   workFactor;
+
+static void    panic                 ( const Char* ) NORETURN;
+static void    ioError               ( void )        NORETURN;
+static void    outOfMemory           ( void )        NORETURN;
+static void    configError           ( void )        NORETURN;
+static void    crcError              ( void )        NORETURN;
+static void    cleanUpAndFail        ( Int32 )       NORETURN;
+static void    compressedStreamEOF   ( void )        NORETURN;
+
+static void    copyFileName ( Char*, Char* );
+static void*   myMalloc     ( Int32 );
+static void    applySavedFileAttrToOutputFile ( IntNative fd );
+
+
+
+/*---------------------------------------------------*/
+/*--- An implementation of 64-bit ints.  Sigh.    ---*/
+/*--- Roll on widespread deployment of ANSI C9X ! ---*/
+/*---------------------------------------------------*/
+
+typedef
+   struct { UChar b[8]; } 
+   UInt64;
+
+
+static
+void uInt64_from_UInt32s ( UInt64* n, UInt32 lo32, UInt32 hi32 )
+{
+   n->b[7] = (UChar)((hi32 >> 24) & 0xFF);
+   n->b[6] = (UChar)((hi32 >> 16) & 0xFF);
+   n->b[5] = (UChar)((hi32 >> 8)  & 0xFF);
+   n->b[4] = (UChar) (hi32        & 0xFF);
+   n->b[3] = (UChar)((lo32 >> 24) & 0xFF);
+   n->b[2] = (UChar)((lo32 >> 16) & 0xFF);
+   n->b[1] = (UChar)((lo32 >> 8)  & 0xFF);
+   n->b[0] = (UChar) (lo32        & 0xFF);
+}
+
+
+static
+double uInt64_to_double ( UInt64* n )
+{
+   Int32  i;
+   double base = 1.0;
+   double sum  = 0.0;
+   for (i = 0; i < 8; i++) {
+      sum  += base * (double)(n->b[i]);
+      base *= 256.0;
+   }
+   return sum;
+}
+
+
+static
+Bool uInt64_isZero ( UInt64* n )
+{
+   Int32 i;
+   for (i = 0; i < 8; i++)
+      if (n->b[i] != 0) return 0;
+   return 1;
+}
+
+
+/* Divide *n by 10, and return the remainder.  */
+static 
+Int32 uInt64_qrm10 ( UInt64* n )
+{
+   UInt32 rem, tmp;
+   Int32  i;
+   rem = 0;
+   for (i = 7; i >= 0; i--) {
+      tmp = rem * 256 + n->b[i];
+      n->b[i] = tmp / 10;
+      rem = tmp % 10;
+   }
+   return rem;
+}
+
+
+/* ... and the Whole Entire Point of all this UInt64 stuff is
+   so that we can supply the following function.
+*/
+static
+void uInt64_toAscii ( char* outbuf, UInt64* n )
+{
+   Int32  i, q;
+   UChar  buf[32];
+   Int32  nBuf   = 0;
+   UInt64 n_copy = *n;
+   do {
+      q = uInt64_qrm10 ( &n_copy );
+      buf[nBuf] = q + '0';
+      nBuf++;
+   } while (!uInt64_isZero(&n_copy));
+   outbuf[nBuf] = 0;
+   for (i = 0; i < nBuf; i++) 
+      outbuf[i] = buf[nBuf-i-1];
+}
+
+
+/*---------------------------------------------------*/
+/*--- Processing of complete files and streams    ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static 
+Bool myfeof ( FILE* f )
+{
+   Int32 c = fgetc ( f );
+   if (c == EOF) return True;
+   ungetc ( c, f );
+   return False;
+}
+
+
+/*---------------------------------------------*/
+static 
+void compressStream ( FILE *stream, FILE *zStream )
+{
+   BZFILE* bzf = NULL;
+   UChar   ibuf[5000];
+   Int32   nIbuf;
+   UInt32  nbytes_in_lo32, nbytes_in_hi32;
+   UInt32  nbytes_out_lo32, nbytes_out_hi32;
+   Int32   bzerr, bzerr_dummy, ret;
+
+   SET_BINARY_MODE(stream);
+   SET_BINARY_MODE(zStream);
+
+   if (ferror(stream)) goto errhandler_io;
+   if (ferror(zStream)) goto errhandler_io;
+
+   bzf = BZ2_bzWriteOpen ( &bzerr, zStream, 
+                           blockSize100k, verbosity, workFactor );   
+   if (bzerr != BZ_OK) goto errhandler;
+
+   if (verbosity >= 2) fprintf ( stderr, "\n" );
+
+   while (True) {
+
+      if (myfeof(stream)) break;
+      nIbuf = fread ( ibuf, sizeof(UChar), 5000, stream );
+      if (ferror(stream)) goto errhandler_io;
+      if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf );
+      if (bzerr != BZ_OK) goto errhandler;
+
+   }
+
+   BZ2_bzWriteClose64 ( &bzerr, bzf, 0, 
+                        &nbytes_in_lo32, &nbytes_in_hi32,
+                        &nbytes_out_lo32, &nbytes_out_hi32 );
+   if (bzerr != BZ_OK) goto errhandler;
+
+   if (ferror(zStream)) goto errhandler_io;
+   ret = fflush ( zStream );
+   if (ret == EOF) goto errhandler_io;
+   if (zStream != stdout) {
+      Int32 fd = fileno ( zStream );
+      if (fd < 0) goto errhandler_io;
+      applySavedFileAttrToOutputFile ( fd );
+      ret = fclose ( zStream );
+      outputHandleJustInCase = NULL;
+      if (ret == EOF) goto errhandler_io;
+   }
+   outputHandleJustInCase = NULL;
+   if (ferror(stream)) goto errhandler_io;
+   ret = fclose ( stream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (verbosity >= 1) {
+      if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0) {
+     fprintf ( stderr, " no data compressed.\n");
+      } else {
+     Char   buf_nin[32], buf_nout[32];
+     UInt64 nbytes_in,   nbytes_out;
+     double nbytes_in_d, nbytes_out_d;
+     uInt64_from_UInt32s ( &nbytes_in, 
+                   nbytes_in_lo32, nbytes_in_hi32 );
+     uInt64_from_UInt32s ( &nbytes_out, 
+                   nbytes_out_lo32, nbytes_out_hi32 );
+     nbytes_in_d  = uInt64_to_double ( &nbytes_in );
+     nbytes_out_d = uInt64_to_double ( &nbytes_out );
+     uInt64_toAscii ( buf_nin, &nbytes_in );
+     uInt64_toAscii ( buf_nout, &nbytes_out );
+     fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
+           "%5.2f%% saved, %s in, %s out.\n",
+           nbytes_in_d / nbytes_out_d,
+           (8.0 * nbytes_out_d) / nbytes_in_d,
+           100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
+           buf_nin,
+           buf_nout
+         );
+      }
+   }
+
+   return;
+
+   errhandler:
+   BZ2_bzWriteClose64 ( &bzerr_dummy, bzf, 1, 
+                        &nbytes_in_lo32, &nbytes_in_hi32,
+                        &nbytes_out_lo32, &nbytes_out_hi32 );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_MEM_ERROR:
+         outOfMemory (); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      default:
+         panic ( "compress:unexpected error" );
+   }
+
+   panic ( "compress:end" );
+   /*notreached*/
+}
+
+
+
+/*---------------------------------------------*/
+static 
+Bool uncompressStream ( FILE *zStream, FILE *stream )
+{
+   BZFILE* bzf = NULL;
+   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
+   UChar   obuf[5000];
+   UChar   unused[BZ_MAX_UNUSED];
+   Int32   nUnused;
+   void*   unusedTmpV;
+   UChar*  unusedTmp;
+
+   nUnused = 0;
+   streamNo = 0;
+
+   SET_BINARY_MODE(stream);
+   SET_BINARY_MODE(zStream);
+
+   if (ferror(stream)) goto errhandler_io;
+   if (ferror(zStream)) goto errhandler_io;
+
+   while (True) {
+
+      bzf = BZ2_bzReadOpen ( 
+               &bzerr, zStream, verbosity, 
+               (int)smallMode, unused, nUnused
+            );
+      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+      streamNo++;
+
+      while (bzerr == BZ_OK) {
+         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+         if (bzerr == BZ_DATA_ERROR_MAGIC) goto trycat;
+         if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0)
+            fwrite ( obuf, sizeof(UChar), nread, stream );
+         if (ferror(stream)) goto errhandler_io;
+      }
+      if (bzerr != BZ_STREAM_END) goto errhandler;
+
+      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+      unusedTmp = (UChar*)unusedTmpV;
+      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+      BZ2_bzReadClose ( &bzerr, bzf );
+      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+      if (nUnused == 0 && myfeof(zStream)) break;
+   }
+
+   closeok:
+   if (ferror(zStream)) goto errhandler_io;
+   if (stream != stdout) {
+      Int32 fd = fileno ( stream );
+      if (fd < 0) goto errhandler_io;
+      applySavedFileAttrToOutputFile ( fd );
+   }
+   ret = fclose ( zStream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (ferror(stream)) goto errhandler_io;
+   ret = fflush ( stream );
+   if (ret != 0) goto errhandler_io;
+   if (stream != stdout) {
+      ret = fclose ( stream );
+      outputHandleJustInCase = NULL;
+      if (ret == EOF) goto errhandler_io;
+   }
+   outputHandleJustInCase = NULL;
+   if (verbosity >= 2) fprintf ( stderr, "\n    " );
+   return True;
+
+   trycat: 
+   if (forceOverwrite) {
+      rewind(zStream);
+      while (True) {
+         if (myfeof(zStream)) break;
+         nread = fread ( obuf, sizeof(UChar), 5000, zStream );
+         if (ferror(zStream)) goto errhandler_io;
+         if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
+         if (ferror(stream)) goto errhandler_io;
+      }
+      goto closeok;
+   }
+  
+   errhandler:
+   BZ2_bzReadClose ( &bzerr_dummy, bzf );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      case BZ_DATA_ERROR:
+         crcError();
+      case BZ_MEM_ERROR:
+         outOfMemory();
+      case BZ_UNEXPECTED_EOF:
+         compressedStreamEOF();
+      case BZ_DATA_ERROR_MAGIC:
+         if (zStream != stdin) fclose(zStream);
+         if (stream != stdout) fclose(stream);
+         if (streamNo == 1) {
+            return False;
+         } else {
+            if (noisy)
+            fprintf ( stderr, 
+                      "\n%s: %s: trailing garbage after EOF ignored\n",
+                      progName, inName );
+            return True;       
+         }
+      default:
+         panic ( "decompress:unexpected error" );
+   }
+
+   panic ( "decompress:end" );
+   return True; /*notreached*/
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool testStream ( FILE *zStream )
+{
+   BZFILE* bzf = NULL;
+   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
+   UChar   obuf[5000];
+   UChar   unused[BZ_MAX_UNUSED];
+   Int32   nUnused;
+   void*   unusedTmpV;
+   UChar*  unusedTmp;
+
+   nUnused = 0;
+   streamNo = 0;
+
+   SET_BINARY_MODE(zStream);
+   if (ferror(zStream)) goto errhandler_io;
+
+   while (True) {
+
+      bzf = BZ2_bzReadOpen ( 
+               &bzerr, zStream, verbosity, 
+               (int)smallMode, unused, nUnused
+            );
+      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+      streamNo++;
+
+      while (bzerr == BZ_OK) {
+         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+         if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;
+      }
+      if (bzerr != BZ_STREAM_END) goto errhandler;
+
+      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+
+      unusedTmp = (UChar*)unusedTmpV;
+      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+      BZ2_bzReadClose ( &bzerr, bzf );
+      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+      if (nUnused == 0 && myfeof(zStream)) break;
+
+   }
+
+   if (ferror(zStream)) goto errhandler_io;
+   ret = fclose ( zStream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (verbosity >= 2) fprintf ( stderr, "\n    " );
+   return True;
+
+   errhandler:
+   BZ2_bzReadClose ( &bzerr_dummy, bzf );
+   if (verbosity == 0) 
+      fprintf ( stderr, "%s: %s: ", progName, inName );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      case BZ_DATA_ERROR:
+         fprintf ( stderr,
+                   "data integrity (CRC) error in data\n" );
+         return False;
+      case BZ_MEM_ERROR:
+         outOfMemory();
+      case BZ_UNEXPECTED_EOF:
+         fprintf ( stderr,
+                   "file ends unexpectedly\n" );
+         return False;
+      case BZ_DATA_ERROR_MAGIC:
+         if (zStream != stdin) fclose(zStream);
+         if (streamNo == 1) {
+          fprintf ( stderr, 
+                    "bad magic number (file not created by bzip2)\n" );
+            return False;
+         } else {
+            if (noisy)
+            fprintf ( stderr, 
+                      "trailing garbage after EOF ignored\n" );
+            return True;       
+         }
+      default:
+         panic ( "test:unexpected error" );
+   }
+
+   panic ( "test:end" );
+   return True; /*notreached*/
+}
+
+
+/*---------------------------------------------------*/
+/*--- Error [non-] handling grunge                ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+void setExit ( Int32 v )
+{
+   if (v > exitValue) exitValue = v;
+}
+
+
+/*---------------------------------------------*/
+static 
+void cadvise ( void )
+{
+   if (noisy)
+   fprintf (
+      stderr,
+      "\nIt is possible that the compressed file(s) have become corrupted.\n"
+        "You can use the -tvv option to test integrity of such files.\n\n"
+        "You can use the `bzip2recover' program to attempt to recover\n"
+        "data from undamaged sections of corrupted files.\n\n"
+    );
+}
+
+
+/*---------------------------------------------*/
+static 
+void showFileNames ( void )
+{
+   if (noisy)
+   fprintf (
+      stderr,
+      "\tInput file = %s, output file = %s\n",
+      inName, outName 
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void cleanUpAndFail ( Int32 ec )
+{
+   IntNative      retVal;
+   struct MY_STAT statBuf;
+
+   if ( srcMode == SM_F2F 
+        && opMode != OM_TEST
+        && deleteOutputOnInterrupt ) {
+
+      /* Check whether input file still exists.  Delete output file
+         only if input exists to avoid loss of data.  Joerg Prante, 5
+         January 2002.  (JRS 06-Jan-2002: other changes in 1.0.2 mean
+         this is less likely to happen.  But to be ultra-paranoid, we
+         do the check anyway.)  */
+      retVal = MY_STAT ( inName, &statBuf );
+      if (retVal == 0) {
+         if (noisy)
+            fprintf ( stderr, 
+                      "%s: Deleting output file %s, if it exists.\n",
+                      progName, outName );
+         if (outputHandleJustInCase != NULL)
+            fclose ( outputHandleJustInCase );
+         retVal = remove ( outName );
+         if (retVal != 0)
+            fprintf ( stderr,
+                      "%s: WARNING: deletion of output file "
+                      "(apparently) failed.\n",
+                      progName );
+      } else {
+         fprintf ( stderr,
+                   "%s: WARNING: deletion of output file suppressed\n",
+                    progName );
+         fprintf ( stderr,
+                   "%s:    since input file no longer exists.  Output file\n",
+                   progName );
+         fprintf ( stderr,
+                   "%s:    `%s' may be incomplete.\n",
+                   progName, outName );
+         fprintf ( stderr, 
+                   "%s:    I suggest doing an integrity test (bzip2 -tv)"
+                   " of it.\n",
+                   progName );
+      }
+   }
+
+   if (noisy && numFileNames > 0 && numFilesProcessed < numFileNames) {
+      fprintf ( stderr, 
+                "%s: WARNING: some files have not been processed:\n"
+                "%s:    %d specified on command line, %d not processed yet.\n\n",
+                progName, progName,
+                numFileNames, numFileNames - numFilesProcessed );
+   }
+   setExit(ec);
+   exit(exitValue);
+}
+
+
+/*---------------------------------------------*/
+static 
+void panic ( const Char* s )
+{
+   fprintf ( stderr,
+             "\n%s: PANIC -- internal consistency error:\n"
+             "\t%s\n"
+             "\tThis is a BUG.  Please report it to me at:\n"
+             "\tjseward@bzip.org\n",
+             progName, s );
+   showFileNames();
+   cleanUpAndFail( 3 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void crcError ( void )
+{
+   fprintf ( stderr,
+             "\n%s: Data integrity error when decompressing.\n",
+             progName );
+   showFileNames();
+   cadvise();
+   cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void compressedStreamEOF ( void )
+{
+  if (noisy) {
+    fprintf ( stderr,
+          "\n%s: Compressed file ends unexpectedly;\n\t"
+          "perhaps it is corrupted?  *Possible* reason follows.\n",
+          progName );
+    perror ( progName );
+    showFileNames();
+    cadvise();
+  }
+  cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void ioError ( void )
+{
+   fprintf ( stderr,
+             "\n%s: I/O or other error, bailing out.  "
+             "Possible reason follows.\n",
+             progName );
+   perror ( progName );
+   showFileNames();
+   cleanUpAndFail( 1 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void mySignalCatcher ( IntNative n )
+{
+   fprintf ( stderr,
+             "\n%s: Control-C or similar caught, quitting.\n",
+             progName );
+   cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static 
+void mySIGSEGVorSIGBUScatcher ( IntNative n )
+{
+   if (opMode == OM_Z)
+      fprintf ( 
+      stderr,
+      "\n%s: Caught a SIGSEGV or SIGBUS whilst compressing.\n"
+      "\n"
+      "   Possible causes are (most likely first):\n"
+      "   (1) This computer has unreliable memory or cache hardware\n"
+      "       (a surprisingly common problem; try a different machine.)\n"
+      "   (2) A bug in the compiler used to create this executable\n"
+      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
+      "   (3) A real bug in bzip2 -- I hope this should never be the case.\n"
+      "   The user's manual, Section 4.3, has more info on (1) and (2).\n"
+      "   \n"
+      "   If you suspect this is a bug in bzip2, or are unsure about (1)\n"
+      "   or (2), feel free to report it to me at: jseward@bzip.org.\n"
+      "   Section 4.3 of the user's manual describes the info a useful\n"
+      "   bug report should have.  If the manual is available on your\n"
+      "   system, please try and read it before mailing me.  If you don't\n"
+      "   have the manual or can't be bothered to read it, mail me anyway.\n"
+      "\n",
+      progName );
+      else
+      fprintf ( 
+      stderr,
+      "\n%s: Caught a SIGSEGV or SIGBUS whilst decompressing.\n"
+      "\n"
+      "   Possible causes are (most likely first):\n"
+      "   (1) The compressed data is corrupted, and bzip2's usual checks\n"
+      "       failed to detect this.  Try bzip2 -tvv my_file.bz2.\n"
+      "   (2) This computer has unreliable memory or cache hardware\n"
+      "       (a surprisingly common problem; try a different machine.)\n"
+      "   (3) A bug in the compiler used to create this executable\n"
+      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
+      "   (4) A real bug in bzip2 -- I hope this should never be the case.\n"
+      "   The user's manual, Section 4.3, has more info on (2) and (3).\n"
+      "   \n"
+      "   If you suspect this is a bug in bzip2, or are unsure about (2)\n"
+      "   or (3), feel free to report it to me at: jseward@bzip.org.\n"
+      "   Section 4.3 of the user's manual describes the info a useful\n"
+      "   bug report should have.  If the manual is available on your\n"
+      "   system, please try and read it before mailing me.  If you don't\n"
+      "   have the manual or can't be bothered to read it, mail me anyway.\n"
+      "\n",
+      progName );
+
+   showFileNames();
+   if (opMode == OM_Z)
+      cleanUpAndFail( 3 ); else
+      { cadvise(); cleanUpAndFail( 2 ); }
+}
+
+
+/*---------------------------------------------*/
+static 
+void outOfMemory ( void )
+{
+   fprintf ( stderr,
+             "\n%s: couldn't allocate enough memory\n",
+             progName );
+   showFileNames();
+   cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static 
+void configError ( void )
+{
+   fprintf ( stderr,
+             "bzip2: I'm not configured correctly for this platform!\n"
+             "\tI require Int32, Int16 and Char to have sizes\n"
+             "\tof 4, 2 and 1 bytes to run properly, and they don't.\n"
+             "\tProbably you can fix this by defining them correctly,\n"
+             "\tand recompiling.  Bye!\n" );
+   setExit(3);
+   exit(exitValue);
+}
+
+
+/*---------------------------------------------------*/
+/*--- The main driver machinery                   ---*/
+/*---------------------------------------------------*/
+
+/* All rather crufty.  The main problem is that input files
+   are stat()d multiple times before use.  This should be
+   cleaned up. 
+*/
+
+/*---------------------------------------------*/
+static 
+void pad ( Char *s )
+{
+   Int32 i;
+   if ( (Int32)strlen(s) >= longestFileName ) return;
+   for (i = 1; i <= longestFileName - (Int32)strlen(s); i++)
+      fprintf ( stderr, " " );
+}
+
+
+/*---------------------------------------------*/
+static 
+void copyFileName ( Char* to, Char* from ) 
+{
+   if ( strlen(from) > FILE_NAME_LEN-10 )  {
+      fprintf (
+         stderr,
+         "bzip2: file name\n`%s'\n"
+         "is suspiciously (more than %d chars) long.\n"
+         "Try using a reasonable file name instead.  Sorry! :-)\n",
+         from, FILE_NAME_LEN-10
+      );
+      setExit(1);
+      exit(exitValue);
+   }
+
+  strncpy(to,from,FILE_NAME_LEN-10);
+  to[FILE_NAME_LEN-10]='\0';
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool fileExists ( Char* name )
+{
+   FILE *tmp   = fopen ( name, "rb" );
+   Bool exists = (tmp != NULL);
+   if (tmp != NULL) fclose ( tmp );
+   return exists;
+}
+
+
+/*---------------------------------------------*/
+/* Open an output file safely with O_EXCL and good permissions.
+   This avoids a race condition in versions < 1.0.2, in which
+   the file was first opened and then had its interim permissions
+   set safely.  We instead use open() to create the file with
+   the interim permissions required. (--- --- rw-).
+
+   For non-Unix platforms, if we are not worrying about
+   security issues, simple this simply behaves like fopen.
+*/
+static
+FILE* fopen_output_safely ( Char* name, const char* mode )
+{
+#  if BZ_UNIX
+   FILE*     fp;
+   IntNative fh;
+   fh = open(name, O_WRONLY|O_CREAT|O_EXCL, S_IWUSR|S_IRUSR);
+   if (fh == -1) return NULL;
+   fp = fdopen(fh, mode);
+   if (fp == NULL) close(fh);
+   return fp;
+#  else
+   return fopen(name, mode);
+#  endif
+}
+
+
+/*---------------------------------------------*/
+/*--
+  if in doubt, return True
+--*/
+static 
+Bool notAStandardFile ( Char* name )
+{
+   IntNative      i;
+   struct MY_STAT statBuf;
+
+   i = MY_LSTAT ( name, &statBuf );
+   if (i != 0) return True;
+   if (MY_S_ISREG(statBuf.st_mode)) return False;
+   return True;
+}
+
+
+/*---------------------------------------------*/
+/*--
+  rac 11/21/98 see if file has hard links to it
+--*/
+static 
+Int32 countHardLinks ( Char* name )
+{  
+   IntNative      i;
+   struct MY_STAT statBuf;
+
+   i = MY_LSTAT ( name, &statBuf );
+   if (i != 0) return 0;
+   return (statBuf.st_nlink - 1);
+}
+
+
+/*---------------------------------------------*/
+/* Copy modification date, access date, permissions and owner from the
+   source to destination file.  We have to copy this meta-info off
+   into fileMetaInfo before starting to compress / decompress it,
+   because doing it afterwards means we get the wrong access time.
+
+   To complicate matters, in compress() and decompress() below, the
+   sequence of tests preceding the call to saveInputFileMetaInfo()
+   involves calling fileExists(), which in turn establishes its result
+   by attempting to fopen() the file, and if successful, immediately
+   fclose()ing it again.  So we have to assume that the fopen() call
+   does not cause the access time field to be updated.
+
+   Reading of the man page for stat() (man 2 stat) on RedHat 7.2 seems
+   to imply that merely doing open() will not affect the access time.
+   Therefore we merely need to hope that the C library only does
+   open() as a result of fopen(), and not any kind of read()-ahead
+   cleverness.
+
+   It sounds pretty fragile to me.  Whether this carries across
+   robustly to arbitrary Unix-like platforms (or even works robustly
+   on this one, RedHat 7.2) is unknown to me.  Nevertheless ...  
+*/
+#if BZ_UNIX
+static 
+struct MY_STAT fileMetaInfo;
+#endif
+
+static 
+void saveInputFileMetaInfo ( Char *srcName )
+{
+#  if BZ_UNIX
+   IntNative retVal;
+   /* Note use of stat here, not lstat. */
+   retVal = MY_STAT( srcName, &fileMetaInfo );
+   ERROR_IF_NOT_ZERO ( retVal );
+#  endif
+}
+
+
+static 
+void applySavedTimeInfoToOutputFile ( Char *dstName )
+{
+#  if BZ_UNIX
+   IntNative      retVal;
+   struct utimbuf uTimBuf;
+
+   uTimBuf.actime = fileMetaInfo.st_atime;
+   uTimBuf.modtime = fileMetaInfo.st_mtime;
+
+   retVal = utime ( dstName, &uTimBuf );
+   ERROR_IF_NOT_ZERO ( retVal );
+#  endif
+}
+
+static 
+void applySavedFileAttrToOutputFile ( IntNative fd )
+{
+#  if BZ_UNIX
+   IntNative retVal;
+
+   retVal = fchmod ( fd, fileMetaInfo.st_mode );
+   ERROR_IF_NOT_ZERO ( retVal );
+
+   (void) fchown ( fd, fileMetaInfo.st_uid, fileMetaInfo.st_gid );
+   /* chown() will in many cases return with EPERM, which can
+      be safely ignored.
+   */
+#  endif
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool containsDubiousChars ( Char* name )
+{
+#  if BZ_UNIX
+   /* On unix, files can contain any characters and the file expansion
+    * is performed by the shell.
+    */
+   return False;
+#  else /* ! BZ_UNIX */
+   /* On non-unix (Win* platforms), wildcard characters are not allowed in 
+    * filenames.
+    */
+   for (; *name != '\0'; name++)
+      if (*name == '?' || *name == '*') return True;
+   return False;
+#  endif /* BZ_UNIX */
+}
+
+
+/*---------------------------------------------*/
+#define BZ_N_SUFFIX_PAIRS 4
+
+const Char* zSuffix[BZ_N_SUFFIX_PAIRS] 
+   = { ".bz2", ".bz", ".tbz2", ".tbz" };
+const Char* unzSuffix[BZ_N_SUFFIX_PAIRS] 
+   = { "", "", ".tar", ".tar" };
+
+static 
+Bool hasSuffix ( Char* s, const Char* suffix )
+{
+   Int32 ns = strlen(s);
+   Int32 nx = strlen(suffix);
+   if (ns < nx) return False;
+   if (strcmp(s + ns - nx, suffix) == 0) return True;
+   return False;
+}
+
+static 
+Bool mapSuffix ( Char* name, 
+                 const Char* oldSuffix, 
+                 const Char* newSuffix )
+{
+   if (!hasSuffix(name,oldSuffix)) return False;
+   name[strlen(name)-strlen(oldSuffix)] = 0;
+   strcat ( name, newSuffix );
+   return True;
+}
+
+
+/*---------------------------------------------*/
+static 
+void compress ( Char *name )
+{
+   FILE  *inStr;
+   FILE  *outStr;
+   Int32 n, i;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "compress: bad modes\n" );
+
+   switch (srcMode) {
+      case SM_I2O: 
+         copyFileName ( inName, (Char*)"(stdin)" );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+      case SM_F2F: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, name );
+         strcat ( outName, ".bz2" ); 
+         break;
+      case SM_F2O: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+   }
+
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++) {
+      if (hasSuffix(inName, zSuffix[i])) {
+         if (noisy)
+         fprintf ( stderr, 
+                   "%s: Input file %s already has %s suffix.\n",
+                   progName, inName, zSuffix[i] );
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+      if (noisy)
+      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+      if (forceOverwrite) {
+     remove(outName);
+      } else {
+     fprintf ( stderr, "%s: Output file %s already exists.\n",
+           progName, outName );
+     setExit(1);
+     return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite &&
+        (n=countHardLinks ( inName )) > 0) {
+      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+                progName, inName, n, n > 1 ? "s" : "" );
+      setExit(1);
+      return;
+   }
+
+   if ( srcMode == SM_F2F ) {
+      /* Save the file's meta-info before we open it.  Doing it later
+         means we mess up the access times. */
+      saveInputFileMetaInfo ( inName );
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         inStr = stdin;
+         outStr = stdout;
+         if ( isatty ( fileno ( stdout ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't write compressed data to a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2O:
+         inStr = fopen ( inName, "rb" );
+         outStr = stdout;
+         if ( isatty ( fileno ( stdout ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't write compressed data to a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         };
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         outStr = fopen_output_safely ( outName, "wb" );
+         if ( outStr == NULL) {
+            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+                      progName, outName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         }
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            if ( outStr != NULL ) fclose ( outStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "compress: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr,  "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
+   outputHandleJustInCase = outStr;
+   deleteOutputOnInterrupt = True;
+   compressStream ( inStr, outStr );
+   outputHandleJustInCase = NULL;
+
+   /*--- If there was an I/O error, we won't get here. ---*/
+   if ( srcMode == SM_F2F ) {
+      applySavedTimeInfoToOutputFile ( outName );
+      deleteOutputOnInterrupt = False;
+      if ( !keepInputFiles ) {
+         IntNative retVal = remove ( inName );
+         ERROR_IF_NOT_ZERO ( retVal );
+      }
+   }
+
+   deleteOutputOnInterrupt = False;
+}
+
+
+/*---------------------------------------------*/
+static 
+void uncompress ( Char *name )
+{
+   FILE  *inStr;
+   FILE  *outStr;
+   Int32 n, i;
+   Bool  magicNumberOK;
+   Bool  cantGuess;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "uncompress: bad modes\n" );
+
+   cantGuess = False;
+   switch (srcMode) {
+      case SM_I2O: 
+         copyFileName ( inName, (Char*)"(stdin)" );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+      case SM_F2F: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, name );
+         for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++)
+            if (mapSuffix(outName,zSuffix[i],unzSuffix[i]))
+               goto zzz; 
+         cantGuess = True;
+         strcat ( outName, ".out" );
+         break;
+      case SM_F2O: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+   }
+
+   zzz:
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+      if (noisy)
+      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( /* srcMode == SM_F2F implied && */ cantGuess ) {
+      if (noisy)
+      fprintf ( stderr, 
+                "%s: Can't guess original name for %s -- using %s\n",
+                progName, inName, outName );
+      /* just a warning, no return */
+   }   
+   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+      if (forceOverwrite) {
+    remove(outName);
+      } else {
+        fprintf ( stderr, "%s: Output file %s already exists.\n",
+                  progName, outName );
+        setExit(1);
+        return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite &&
+        (n=countHardLinks ( inName ) ) > 0) {
+      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+                progName, inName, n, n > 1 ? "s" : "" );
+      setExit(1);
+      return;
+   }
+
+   if ( srcMode == SM_F2F ) {
+      /* Save the file's meta-info before we open it.  Doing it later
+         means we mess up the access times. */
+      saveInputFileMetaInfo ( inName );
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         inStr = stdin;
+         outStr = stdout;
+         if ( isatty ( fileno ( stdin ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't read compressed data from a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2O:
+         inStr = fopen ( inName, "rb" );
+         outStr = stdout;
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+                      progName, inName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         outStr = fopen_output_safely ( outName, "wb" );
+         if ( outStr == NULL) {
+            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+                      progName, outName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         }
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            if ( outStr != NULL ) fclose ( outStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "uncompress: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr, "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
+   outputHandleJustInCase = outStr;
+   deleteOutputOnInterrupt = True;
+   magicNumberOK = uncompressStream ( inStr, outStr );
+   outputHandleJustInCase = NULL;
+
+   /*--- If there was an I/O error, we won't get here. ---*/
+   if ( magicNumberOK ) {
+      if ( srcMode == SM_F2F ) {
+         applySavedTimeInfoToOutputFile ( outName );
+         deleteOutputOnInterrupt = False;
+         if ( !keepInputFiles ) {
+            IntNative retVal = remove ( inName );
+            ERROR_IF_NOT_ZERO ( retVal );
+         }
+      }
+   } else {
+      unzFailsExist = True;
+      deleteOutputOnInterrupt = False;
+      if ( srcMode == SM_F2F ) {
+         IntNative retVal = remove ( outName );
+         ERROR_IF_NOT_ZERO ( retVal );
+      }
+   }
+   deleteOutputOnInterrupt = False;
+
+   if ( magicNumberOK ) {
+      if (verbosity >= 1)
+         fprintf ( stderr, "done\n" );
+   } else {
+      setExit(2);
+      if (verbosity >= 1)
+         fprintf ( stderr, "not a bzip2 file.\n" ); else
+         fprintf ( stderr,
+                   "%s: %s is not a bzip2 file.\n",
+                   progName, inName );
+   }
+
+}
+
+
+/*---------------------------------------------*/
+static 
+void testf ( Char *name )
+{
+   FILE *inStr;
+   Bool allOK;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "testf: bad modes\n" );
+
+   copyFileName ( outName, (Char*)"(none)" );
+   switch (srcMode) {
+      case SM_I2O: copyFileName ( inName, (Char*)"(stdin)" ); break;
+      case SM_F2F: copyFileName ( inName, name ); break;
+      case SM_F2O: copyFileName ( inName, name ); break;
+   }
+
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         if ( isatty ( fileno ( stdin ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't read compressed data from a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         inStr = stdin;
+         break;
+
+      case SM_F2O: case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+                      progName, inName, strerror(errno) );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "testf: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr, "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input handle is sane.  Do the Biz. ---*/
+   outputHandleJustInCase = NULL;
+   allOK = testStream ( inStr );
+
+   if (allOK && verbosity >= 1) fprintf ( stderr, "ok\n" );
+   if (!allOK) testFailsExist = True;
+}
+
+
+/*---------------------------------------------*/
+static 
+void license ( void )
+{
+   fprintf ( stderr,
+
+    "bzip2, a block-sorting file compressor.  "
+    "Version %s.\n"
+    "   \n"
+    "   Copyright (C) 1996-2007 by Julian Seward.\n"
+    "   \n"
+    "   This program is free software; you can redistribute it and/or modify\n"
+    "   it under the terms set out in the LICENSE file, which is included\n"
+    "   in the bzip2-1.0.5 source distribution.\n"
+    "   \n"
+    "   This program is distributed in the hope that it will be useful,\n"
+    "   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+    "   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+    "   LICENSE file for more details.\n"
+    "   \n",
+    BZ2_bzlibVersion()
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void usage ( Char *fullProgName )
+{
+   fprintf (
+      stderr,
+      "bzip2, a block-sorting file compressor.  "
+      "Version %s.\n"
+      "\n   usage: %s [flags and input files in any order]\n"
+      "\n"
+      "   -h --help           print this message\n"
+      "   -d --decompress     force decompression\n"
+      "   -z --compress       force compression\n"
+      "   -k --keep           keep (don't delete) input files\n"
+      "   -f --force          overwrite existing output files\n"
+      "   -t --test           test compressed file integrity\n"
+      "   -c --stdout         output to standard out\n"
+      "   -q --quiet          suppress noncritical error messages\n"
+      "   -v --verbose        be verbose (a 2nd -v gives more)\n"
+      "   -L --license        display software version & license\n"
+      "   -V --version        display software version & license\n"
+      "   -s --small          use less memory (at most 2500k)\n"
+      "   -1 .. -9            set block size to 100k .. 900k\n"
+      "   --fast              alias for -1\n"
+      "   --best              alias for -9\n"
+      "\n"
+      "   If invoked as `bzip2', default action is to compress.\n"
+      "              as `bunzip2',  default action is to decompress.\n"
+      "              as `bzcat', default action is to decompress to stdout.\n"
+      "\n"
+      "   If no file names are given, bzip2 compresses or decompresses\n"
+      "   from standard input to standard output.  You can combine\n"
+      "   short flags, so `-v -4' means the same as -v4 or -4v, &c.\n"
+#     if BZ_UNIX
+      "\n"
+#     endif
+      ,
+
+      BZ2_bzlibVersion(),
+      fullProgName
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void redundant ( Char* flag )
+{
+   fprintf ( 
+      stderr, 
+      "%s: %s is redundant in versions 0.9.5 and above\n",
+      progName, flag );
+}
+
+
+/*---------------------------------------------*/
+/*--
+  All the garbage from here to main() is purely to
+  implement a linked list of command-line arguments,
+  into which main() copies argv[1 .. argc-1].
+
+  The purpose of this exercise is to facilitate 
+  the expansion of wildcard characters * and ? in 
+  filenames for OSs which don't know how to do it
+  themselves, like MSDOS, Windows 95 and NT.
+
+  The actual Dirty Work is done by the platform-
+  specific macro APPEND_FILESPEC.
+--*/
+
+typedef
+   struct zzzz {
+      Char        *name;
+      struct zzzz *link;
+   }
+   Cell;
+
+
+/*---------------------------------------------*/
+static 
+void *myMalloc ( Int32 n )
+{
+   void* p;
+
+   p = malloc ( (size_t)n );
+   if (p == NULL) outOfMemory ();
+   return p;
+}
+
+
+/*---------------------------------------------*/
+static 
+Cell *mkCell ( void )
+{
+   Cell *c;
+
+   c = (Cell*) myMalloc ( sizeof ( Cell ) );
+   c->name = NULL;
+   c->link = NULL;
+   return c;
+}
+
+
+/*---------------------------------------------*/
+static 
+Cell *snocString ( Cell *root, Char *name )
+{
+   if (root == NULL) {
+      Cell *tmp = mkCell();
+      tmp->name = (Char*) myMalloc ( 5 + strlen(name) );
+      strcpy ( tmp->name, name );
+      return tmp;
+   } else {
+      Cell *tmp = root;
+      while (tmp->link != NULL) tmp = tmp->link;
+      tmp->link = snocString ( tmp->link, name );
+      return root;
+   }
+}
+
+
+/*---------------------------------------------*/
+static 
+void addFlagsFromEnvVar ( Cell** argList, Char* varName ) 
+{
+   Int32 i, j, k;
+   Char *envbase, *p;
+
+   envbase = getenv(varName);
+   if (envbase != NULL) {
+      p = envbase;
+      i = 0;
+      while (True) {
+         if (p[i] == 0) break;
+         p += i;
+         i = 0;
+         while (isspace((Int32)(p[0]))) p++;
+         while (p[i] != 0 && !isspace((Int32)(p[i]))) i++;
+         if (i > 0) {
+            k = i; if (k > FILE_NAME_LEN-10) k = FILE_NAME_LEN-10;
+            for (j = 0; j < k; j++) tmpName[j] = p[j];
+            tmpName[k] = 0;
+            APPEND_FLAG(*argList, tmpName);
+         }
+      }
+   }
+}
+
+
+/*---------------------------------------------*/
+#define ISFLAG(s) (strcmp(aa->name, (s))==0)
+
+IntNative main ( IntNative argc, Char *argv[] )
+{
+   Int32  i, j;
+   Char   *tmp;
+   Cell   *argList;
+   Cell   *aa;
+   Bool   decode;
+
+   /*-- Be really really really paranoid :-) --*/
+   if (sizeof(Int32) != 4 || sizeof(UInt32) != 4  ||
+       sizeof(Int16) != 2 || sizeof(UInt16) != 2  ||
+       sizeof(Char)  != 1 || sizeof(UChar)  != 1)
+      configError();
+
+   /*-- Initialise --*/
+   outputHandleJustInCase  = NULL;
+   smallMode               = False;
+   keepInputFiles          = False;
+   forceOverwrite          = False;
+   noisy                   = True;
+   verbosity               = 0;
+   blockSize100k           = 9;
+   testFailsExist          = False;
+   unzFailsExist           = False;
+   numFileNames            = 0;
+   numFilesProcessed       = 0;
+   workFactor              = 30;
+   deleteOutputOnInterrupt = False;
+   exitValue               = 0;
+   i = j = 0; /* avoid bogus warning from egcs-1.1.X */
+
+   /*-- Set up signal handlers for mem access errors --*/
+   signal (SIGSEGV, mySIGSEGVorSIGBUScatcher);
+#  if BZ_UNIX
+#  ifndef __DJGPP__
+   signal (SIGBUS,  mySIGSEGVorSIGBUScatcher);
+#  endif
+#  endif
+
+   copyFileName ( inName,  (Char*)"(none)" );
+   copyFileName ( outName, (Char*)"(none)" );
+
+   copyFileName ( progNameReally, argv[0] );
+   progName = &progNameReally[0];
+   for (tmp = &progNameReally[0]; *tmp != '\0'; tmp++)
+      if (*tmp == PATH_SEP) progName = tmp + 1;
+
+
+   /*-- Copy flags from env var BZIP2, and 
+        expand filename wildcards in arg list.
+   --*/
+   argList = NULL;
+   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP2" );
+   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP" );
+   for (i = 1; i <= argc-1; i++)
+      APPEND_FILESPEC(argList, argv[i]);
+
+
+   /*-- Find the length of the longest filename --*/
+   longestFileName = 7;
+   numFileNames    = 0;
+   decode          = True;
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) { decode = False; continue; }
+      if (aa->name[0] == '-' && decode) continue;
+      numFileNames++;
+      if (longestFileName < (Int32)strlen(aa->name) )
+         longestFileName = (Int32)strlen(aa->name);
+   }
+
+
+   /*-- Determine source modes; flag handling may change this too. --*/
+   if (numFileNames == 0)
+      srcMode = SM_I2O; else srcMode = SM_F2F;
+
+
+   /*-- Determine what to do (compress/uncompress/test/cat). --*/
+   /*-- Note that subsequent flag handling may change this. --*/
+   opMode = OM_Z;
+
+   if ( (strstr ( progName, "unzip" ) != 0) ||
+        (strstr ( progName, "UNZIP" ) != 0) )
+      opMode = OM_UNZ;
+
+   if ( (strstr ( progName, "z2cat" ) != 0) ||
+        (strstr ( progName, "Z2CAT" ) != 0) ||
+        (strstr ( progName, "zcat" ) != 0)  ||
+        (strstr ( progName, "ZCAT" ) != 0) )  {
+      opMode = OM_UNZ;
+      srcMode = (numFileNames == 0) ? SM_I2O : SM_F2O;
+   }
+
+
+   /*-- Look at the flags. --*/
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) break;
+      if (aa->name[0] == '-' && aa->name[1] != '-') {
+         for (j = 1; aa->name[j] != '\0'; j++) {
+            switch (aa->name[j]) {
+               case 'c': srcMode          = SM_F2O; break;
+               case 'd': opMode           = OM_UNZ; break;
+               case 'z': opMode           = OM_Z; break;
+               case 'f': forceOverwrite   = True; break;
+               case 't': opMode           = OM_TEST; break;
+               case 'k': keepInputFiles   = True; break;
+               case 's': smallMode        = True; break;
+               case 'q': noisy            = False; break;
+               case '1': blockSize100k    = 1; break;
+               case '2': blockSize100k    = 2; break;
+               case '3': blockSize100k    = 3; break;
+               case '4': blockSize100k    = 4; break;
+               case '5': blockSize100k    = 5; break;
+               case '6': blockSize100k    = 6; break;
+               case '7': blockSize100k    = 7; break;
+               case '8': blockSize100k    = 8; break;
+               case '9': blockSize100k    = 9; break;
+               case 'V':
+               case 'L': license();            break;
+               case 'v': verbosity++; break;
+               case 'h': usage ( progName );
+                         exit ( 0 );
+                         break;
+               default:  fprintf ( stderr, "%s: Bad flag `%s'\n",
+                                   progName, aa->name );
+                         usage ( progName );
+                         exit ( 1 );
+                         break;
+            }
+         }
+      }
+   }
+   
+   /*-- And again ... --*/
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) break;
+      if (ISFLAG("--stdout"))            srcMode          = SM_F2O;  else
+      if (ISFLAG("--decompress"))        opMode           = OM_UNZ;  else
+      if (ISFLAG("--compress"))          opMode           = OM_Z;    else
+      if (ISFLAG("--force"))             forceOverwrite   = True;    else
+      if (ISFLAG("--test"))              opMode           = OM_TEST; else
+      if (ISFLAG("--keep"))              keepInputFiles   = True;    else
+      if (ISFLAG("--small"))             smallMode        = True;    else
+      if (ISFLAG("--quiet"))             noisy            = False;   else
+      if (ISFLAG("--version"))           license();                  else
+      if (ISFLAG("--license"))           license();                  else
+      if (ISFLAG("--exponential"))       workFactor = 1;             else 
+      if (ISFLAG("--repetitive-best"))   redundant(aa->name);        else
+      if (ISFLAG("--repetitive-fast"))   redundant(aa->name);        else
+      if (ISFLAG("--fast"))              blockSize100k = 1;          else
+      if (ISFLAG("--best"))              blockSize100k = 9;          else
+      if (ISFLAG("--verbose"))           verbosity++;                else
+      if (ISFLAG("--help"))              { usage ( progName ); exit ( 0 ); }
+         else
+         if (strncmp ( aa->name, "--", 2) == 0) {
+            fprintf ( stderr, "%s: Bad flag `%s'\n", progName, aa->name );
+            usage ( progName );
+            exit ( 1 );
+         }
+   }
+
+   if (verbosity > 4) verbosity = 4;
+   if (opMode == OM_Z && smallMode && blockSize100k > 2) 
+      blockSize100k = 2;
+
+   if (opMode == OM_TEST && srcMode == SM_F2O) {
+      fprintf ( stderr, "%s: -c and -t cannot be used together.\n",
+                progName );
+      exit ( 1 );
+   }
+
+   if (srcMode == SM_F2O && numFileNames == 0)
+      srcMode = SM_I2O;
+
+   if (opMode != OM_Z) blockSize100k = 0;
+
+   if (srcMode == SM_F2F) {
+      signal (SIGINT,  mySignalCatcher);
+      signal (SIGTERM, mySignalCatcher);
+#     if BZ_UNIX
+      signal (SIGHUP,  mySignalCatcher);
+#     endif
+   }
+
+   if (opMode == OM_Z) {
+     if (srcMode == SM_I2O) {
+        compress ( NULL );
+     } else {
+        decode = True;
+        for (aa = argList; aa != NULL; aa = aa->link) {
+           if (ISFLAG("--")) { decode = False; continue; }
+           if (aa->name[0] == '-' && decode) continue;
+           numFilesProcessed++;
+           compress ( aa->name );
+        }
+     }
+   } 
+   else
+
+   if (opMode == OM_UNZ) {
+      unzFailsExist = False;
+      if (srcMode == SM_I2O) {
+         uncompress ( NULL );
+      } else {
+         decode = True;
+         for (aa = argList; aa != NULL; aa = aa->link) {
+            if (ISFLAG("--")) { decode = False; continue; }
+            if (aa->name[0] == '-' && decode) continue;
+            numFilesProcessed++;
+            uncompress ( aa->name );
+         }      
+      }
+      if (unzFailsExist) { 
+         setExit(2); 
+         exit(exitValue);
+      }
+   } 
+
+   else {
+      testFailsExist = False;
+      if (srcMode == SM_I2O) {
+         testf ( NULL );
+      } else {
+         decode = True;
+         for (aa = argList; aa != NULL; aa = aa->link) {
+        if (ISFLAG("--")) { decode = False; continue; }
+            if (aa->name[0] == '-' && decode) continue;
+            numFilesProcessed++;
+            testf ( aa->name );
+     }
+      }
+      if (testFailsExist && noisy) {
+         fprintf ( stderr,
+           "\n"
+           "You can use the `bzip2recover' program to attempt to recover\n"
+           "data from undamaged sections of corrupted files.\n\n"
+         );
+         setExit(2);
+         exit(exitValue);
+      }
+   }
+
+   /* Free the argument list memory to mollify leak detectors 
+      (eg) Purify, Checker.  Serves no other useful purpose.
+   */
+   aa = argList;
+   while (aa != NULL) {
+      Cell* aa2 = aa->link;
+      if (aa->name != NULL) free(aa->name);
+      free(aa);
+      aa = aa2;
+   }
+
+   return exitValue;
+}
+
+
+/*-----------------------------------------------------------*/
+/*--- end                                         bzip2.c ---*/
+/*-----------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/bzip2.txt b/Utilities/cmbzip2/bzip2.txt
new file mode 100644
index 000000000..4fb9c7435
--- /dev/null
+++ b/Utilities/cmbzip2/bzip2.txt
@@ -0,0 +1,391 @@
+
+NAME
+       bzip2, bunzip2 - a block-sorting file compressor, v1.0.4
+       bzcat - decompresses files to stdout
+       bzip2recover - recovers data from damaged bzip2 files
+
+
+SYNOPSIS
+       bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ...  ]
+       bunzip2 [ -fkvsVL ] [ filenames ...  ]
+       bzcat [ -s ] [ filenames ...  ]
+       bzip2recover filename
+
+
+DESCRIPTION
+       bzip2  compresses  files  using  the Burrows-Wheeler block
+       sorting text compression algorithm,  and  Huffman  coding.
+       Compression  is  generally  considerably  better than that
+       achieved by more conventional LZ77/LZ78-based compressors,
+       and  approaches  the performance of the PPM family of sta-
+       tistical compressors.
+
+       The command-line options are deliberately very similar  to
+       those of GNU gzip, but they are not identical.
+
+       bzip2  expects  a list of file names to accompany the com-
+       mand-line flags.  Each file is replaced  by  a  compressed
+       version  of  itself,  with  the  name "original_name.bz2".
+       Each compressed file has the same modification date,  per-
+       missions, and, when possible, ownership as the correspond-
+       ing original, so that these properties  can  be  correctly
+       restored  at  decompression  time.   File name handling is
+       naive in the sense that there is no mechanism for preserv-
+       ing  original file names, permissions, ownerships or dates
+       in filesystems which lack these concepts, or have  serious
+       file name length restrictions, such as MS-DOS.
+
+       bzip2  and  bunzip2 will by default not overwrite existing
+       files.  If you want this to happen, specify the -f flag.
+
+       If no file names  are  specified,  bzip2  compresses  from
+       standard  input  to  standard output.  In this case, bzip2
+       will decline to write compressed output to a terminal,  as
+       this  would  be  entirely  incomprehensible  and therefore
+       pointless.
+
+       bunzip2 (or bzip2 -d) decompresses  all  specified  files.
+       Files which were not created by bzip2 will be detected and
+       ignored, and a warning issued.  bzip2  attempts  to  guess
+       the  filename  for  the decompressed file from that of the
+       compressed file as follows:
+
+              filename.bz2    becomes   filename
+              filename.bz     becomes   filename
+              filename.tbz2   becomes   filename.tar
+              filename.tbz    becomes   filename.tar
+              anyothername    becomes   anyothername.out
+
+       If the file does not end in one of the recognised endings,
+       .bz2,  .bz,  .tbz2 or .tbz, bzip2 complains that it cannot
+       guess the name of the original file, and uses the original
+       name with .out appended.
+
+       As  with compression, supplying no filenames causes decom-
+       pression from standard input to standard output.
+
+       bunzip2 will correctly decompress a file which is the con-
+       catenation of two or more compressed files.  The result is
+       the concatenation of the corresponding uncompressed files.
+       Integrity testing (-t) of concatenated compressed files is
+       also supported.
+
+       You can also compress or decompress files to the  standard
+       output  by giving the -c flag.  Multiple files may be com-
+       pressed and decompressed like this.  The resulting outputs
+       are  fed  sequentially to stdout.  Compression of multiple
+       files in this manner generates a stream containing  multi-
+       ple compressed file representations.  Such a stream can be
+       decompressed correctly only  by  bzip2  version  0.9.0  or
+       later.   Earlier  versions of bzip2 will stop after decom-
+       pressing the first file in the stream.
+
+       bzcat (or bzip2 -dc) decompresses all specified  files  to
+       the standard output.
+
+       bzip2  will  read arguments from the environment variables
+       BZIP2 and BZIP, in  that  order,  and  will  process  them
+       before  any  arguments  read  from the command line.  This
+       gives a convenient way to supply default arguments.
+
+       Compression is always performed, even  if  the  compressed
+       file  is slightly larger than the original.  Files of less
+       than about one hundred bytes tend to get larger, since the
+       compression  mechanism  has  a  constant  overhead  in the
+       region of 50 bytes.  Random data (including the output  of
+       most  file  compressors)  is  coded at about 8.05 bits per
+       byte, giving an expansion of around 0.5%.
+
+       As a self-check for your  protection,  bzip2  uses  32-bit
+       CRCs  to make sure that the decompressed version of a file
+       is identical to the original.  This guards against corrup-
+       tion  of  the compressed data, and against undetected bugs
+       in bzip2 (hopefully very unlikely).  The chances  of  data
+       corruption  going  undetected  is  microscopic,  about one
+       chance in four billion for each file processed.  Be aware,
+       though,  that  the  check occurs upon decompression, so it
+       can only tell you that something is wrong.  It can't  help
+       you  recover  the original uncompressed data.  You can use
+       bzip2recover to try to recover data from damaged files.
+
+       Return values: 0 for a normal exit,  1  for  environmental
+       problems  (file not found, invalid flags, I/O errors, &c),
+       2 to indicate a corrupt compressed file, 3 for an internal
+       consistency error (eg, bug) which caused bzip2 to panic.
+
+
+OPTIONS
+       -c --stdout
+              Compress or decompress to standard output.
+
+       -d --decompress
+              Force  decompression.  bzip2, bunzip2 and bzcat are
+              really the same program,  and  the  decision  about
+              what  actions to take is done on the basis of which
+              name is used.  This flag overrides that  mechanism,
+              and forces bzip2 to decompress.
+
+       -z --compress
+              The   complement   to   -d:   forces   compression,
+              regardless of the invocation name.
+
+       -t --test
+              Check integrity of the specified file(s), but don't
+              decompress  them.   This  really  performs  a trial
+              decompression and throws away the result.
+
+       -f --force
+              Force overwrite of output files.   Normally,  bzip2
+              will  not  overwrite  existing  output files.  Also
+              forces bzip2 to break hard links to files, which it
+              otherwise wouldn't do.
+
+              bzip2  normally  declines to decompress files which
+              don't have the  correct  magic  header  bytes.   If
+              forced  (-f),  however,  it  will  pass  such files
+              through unmodified.  This is how GNU gzip  behaves.
+
+       -k --keep
+              Keep  (don't delete) input files during compression
+              or decompression.
+
+       -s --small
+              Reduce memory usage, for compression, decompression
+              and  testing.   Files  are  decompressed and tested
+              using a modified algorithm which only requires  2.5
+              bytes  per  block byte.  This means any file can be
+              decompressed in 2300k of memory,  albeit  at  about
+              half the normal speed.
+
+              During  compression,  -s  selects  a  block size of
+              200k, which limits memory use to  around  the  same
+              figure,  at  the expense of your compression ratio.
+              In short, if your  machine  is  low  on  memory  (8
+              megabytes  or  less),  use  -s for everything.  See
+              MEMORY MANAGEMENT below.
+
+       -q --quiet
+              Suppress non-essential warning messages.   Messages
+              pertaining  to I/O errors and other critical events
+              will not be suppressed.
+
+       -v --verbose
+              Verbose mode -- show the compression ratio for each
+              file  processed.   Further  -v's  increase the ver-
+              bosity level, spewing out lots of information which
+              is primarily of interest for diagnostic purposes.
+
+       -L --license -V --version
+              Display  the  software  version,  license terms and
+              conditions.
+
+       -1 (or --fast) to -9 (or --best)
+              Set the block size to 100 k, 200 k ..  900  k  when
+              compressing.   Has  no  effect  when decompressing.
+              See MEMORY MANAGEMENT below.  The --fast and --best
+              aliases  are  primarily for GNU gzip compatibility.
+              In particular, --fast doesn't make things  signifi-
+              cantly  faster.   And  --best  merely  selects  the
+              default behaviour.
+
+       --     Treats all subsequent arguments as file names, even
+              if they start with a dash.  This is so you can han-
+              dle files with names beginning  with  a  dash,  for
+              example: bzip2 -- -myfilename.
+
+       --repetitive-fast --repetitive-best
+              These  flags  are  redundant  in versions 0.9.5 and
+              above.  They provided some coarse control over  the
+              behaviour  of the sorting algorithm in earlier ver-
+              sions, which was sometimes useful.  0.9.5 and above
+              have  an  improved  algorithm  which  renders these
+              flags irrelevant.
+
+
+MEMORY MANAGEMENT
+       bzip2 compresses large files in blocks.   The  block  size
+       affects  both  the  compression  ratio  achieved,  and the
+       amount of memory needed for compression and decompression.
+       The  flags  -1  through  -9  specify  the block size to be
+       100,000 bytes through 900,000 bytes (the default)  respec-
+       tively.   At  decompression  time, the block size used for
+       compression is read from  the  header  of  the  compressed
+       file, and bunzip2 then allocates itself just enough memory
+       to decompress the file.  Since block sizes are  stored  in
+       compressed  files,  it follows that the flags -1 to -9 are
+       irrelevant to and so ignored during decompression.
+
+       Compression and decompression requirements, in bytes,  can
+       be estimated as:
+
+              Compression:   400k + ( 8 x block size )
+
+              Decompression: 100k + ( 4 x block size ), or
+                             100k + ( 2.5 x block size )
+
+       Larger  block  sizes  give  rapidly  diminishing  marginal
+       returns.  Most of the compression comes from the first two
+       or  three hundred k of block size, a fact worth bearing in
+       mind when using bzip2  on  small  machines.   It  is  also
+       important  to  appreciate  that  the  decompression memory
+       requirement is set at compression time by  the  choice  of
+       block size.
+
+       For  files  compressed  with  the default 900k block size,
+       bunzip2 will require about 3700 kbytes to decompress.   To
+       support decompression of any file on a 4 megabyte machine,
+       bunzip2 has an option to  decompress  using  approximately
+       half this amount of memory, about 2300 kbytes.  Decompres-
+       sion speed is also halved, so you should use  this  option
+       only where necessary.  The relevant flag is -s.
+
+       In general, try and use the largest block size memory con-
+       straints  allow,  since  that  maximises  the  compression
+       achieved.   Compression and decompression speed are virtu-
+       ally unaffected by block size.
+
+       Another significant point applies to files which fit in  a
+       single  block  --  that  means  most files you'd encounter
+       using a large block  size.   The  amount  of  real  memory
+       touched is proportional to the size of the file, since the
+       file is smaller than a block.  For example, compressing  a
+       file  20,000  bytes  long  with the flag -9 will cause the
+       compressor to allocate around 7600k of  memory,  but  only
+       touch 400k + 20000 * 8 = 560 kbytes of it.  Similarly, the
+       decompressor will allocate 3700k but  only  touch  100k  +
+       20000 * 4 = 180 kbytes.
+
+       Here  is a table which summarises the maximum memory usage
+       for different block sizes.  Also  recorded  is  the  total
+       compressed  size for 14 files of the Calgary Text Compres-
+       sion Corpus totalling 3,141,622 bytes.  This column  gives
+       some  feel  for  how  compression  varies with block size.
+       These figures tend to understate the advantage  of  larger
+       block  sizes  for  larger files, since the Corpus is domi-
+       nated by smaller files.
+
+                  Compress   Decompress   Decompress   Corpus
+           Flag     usage      usage       -s usage     Size
+
+            -1      1200k       500k         350k      914704
+            -2      2000k       900k         600k      877703
+            -3      2800k      1300k         850k      860338
+            -4      3600k      1700k        1100k      846899
+            -5      4400k      2100k        1350k      845160
+            -6      5200k      2500k        1600k      838626
+            -7      6100k      2900k        1850k      834096
+            -8      6800k      3300k        2100k      828642
+            -9      7600k      3700k        2350k      828642
+
+
+RECOVERING DATA FROM DAMAGED FILES
+       bzip2 compresses files in blocks, usually 900kbytes  long.
+       Each block is handled independently.  If a media or trans-
+       mission error causes a multi-block  .bz2  file  to  become
+       damaged,  it  may  be  possible  to  recover data from the
+       undamaged blocks in the file.
+
+       The compressed representation of each block  is  delimited
+       by  a  48-bit pattern, which makes it possible to find the
+       block boundaries with reasonable  certainty.   Each  block
+       also  carries its own 32-bit CRC, so damaged blocks can be
+       distinguished from undamaged ones.
+
+       bzip2recover is a  simple  program  whose  purpose  is  to
+       search  for blocks in .bz2 files, and write each block out
+       into its own .bz2 file.  You can then use bzip2 -t to test
+       the integrity of the resulting files, and decompress those
+       which are undamaged.
+
+       bzip2recover takes a single argument, the name of the dam-
+       aged    file,    and    writes    a    number   of   files
+       "rec00001file.bz2",  "rec00002file.bz2",  etc,  containing
+       the   extracted   blocks.   The   output   filenames   are
+       designed  so  that the use of wildcards in subsequent pro-
+       cessing  -- for example, "bzip2 -dc  rec*file.bz2 > recov-
+       ered_data" -- processes the files in the correct order.
+
+       bzip2recover should be of most use dealing with large .bz2
+       files,  as  these will contain many blocks.  It is clearly
+       futile to use it on damaged single-block  files,  since  a
+       damaged  block  cannot  be recovered.  If you wish to min-
+       imise any potential data loss through media  or  transmis-
+       sion errors, you might consider compressing with a smaller
+       block size.
+
+
+PERFORMANCE NOTES
+       The sorting phase of compression gathers together  similar
+       strings  in  the  file.  Because of this, files containing
+       very long runs of  repeated  symbols,  like  "aabaabaabaab
+       ..."   (repeated  several hundred times) may compress more
+       slowly than normal.  Versions 0.9.5 and  above  fare  much
+       better  than previous versions in this respect.  The ratio
+       between worst-case and average-case compression time is in
+       the  region  of  10:1.  For previous versions, this figure
+       was more like 100:1.  You can use the -vvvv option to mon-
+       itor progress in great detail, if you want.
+
+       Decompression speed is unaffected by these phenomena.
+
+       bzip2  usually  allocates  several  megabytes of memory to
+       operate in, and then charges all over it in a fairly  ran-
+       dom  fashion.   This means that performance, both for com-
+       pressing and decompressing, is largely determined  by  the
+       speed  at  which  your  machine  can service cache misses.
+       Because of this, small changes to the code to  reduce  the
+       miss  rate  have  been observed to give disproportionately
+       large performance improvements.  I imagine bzip2 will per-
+       form best on machines with very large caches.
+
+
+CAVEATS
+       I/O  error  messages  are not as helpful as they could be.
+       bzip2 tries hard to detect I/O errors  and  exit  cleanly,
+       but  the  details  of  what  the problem is sometimes seem
+       rather misleading.
+
+       This manual page pertains to version 1.0.4 of bzip2.  Com-
+       pressed  data created by this version is entirely forwards
+       and  backwards  compatible  with   the   previous   public
+       releases,  versions  0.1pl2,  0.9.0,  0.9.5, 1.0.0, 1.0.1,
+       1.0.2 and 1.0.3, but with the  following  exception: 0.9.0
+       and above can  correctly decompress  multiple concatenated
+       compressed files.  0.1pl2  cannot do this;  it  will  stop
+       after  decompressing just the first file in the stream.
+
+       bzip2recover  versions prior to 1.0.2 used 32-bit integers
+       to represent bit positions in compressed  files,  so  they
+       could  not handle compressed files more than 512 megabytes
+       long.  Versions 1.0.2 and above use 64-bit  ints  on  some
+       platforms  which  support them (GNU supported targets, and
+       Windows).  To establish whether or  not  bzip2recover  was
+       built  with  such  a limitation, run it without arguments.
+       In any event you can build yourself an  unlimited  version
+       if  you  can  recompile  it  with MaybeUInt64 set to be an
+       unsigned 64-bit integer.
+
+
+AUTHOR
+       Julian Seward, jsewardbzip.org.
+
+       http://www.bzip.org
+
+       The ideas embodied in bzip2 are due to (at least) the fol-
+       lowing  people: Michael Burrows and David Wheeler (for the
+       block sorting transformation), David Wheeler  (again,  for
+       the Huffman coder), Peter Fenwick (for the structured cod-
+       ing model in the original bzip, and many refinements), and
+       Alistair  Moffat,  Radford  Neal  and  Ian Witten (for the
+       arithmetic  coder  in  the  original  bzip).   I  am  much
+       indebted for their help, support and advice.  See the man-
+       ual in the source distribution for pointers to sources  of
+       documentation.  Christian von Roques encouraged me to look
+       for faster sorting algorithms, so as to speed up  compres-
+       sion.  Bela Lubkin encouraged me to improve the worst-case
+       compression performance.  Donna Robinson XMLised the docu-
+       mentation.   The bz* scripts are derived from those of GNU
+       gzip.  Many people sent patches, helped  with  portability
+       problems,  lent  machines,  gave advice and were generally
+       helpful.
+
diff --git a/Utilities/cmbzip2/bzip2recover.c b/Utilities/cmbzip2/bzip2recover.c
new file mode 100644
index 000000000..6e47b603b
--- /dev/null
+++ b/Utilities/cmbzip2/bzip2recover.c
@@ -0,0 +1,514 @@
+/*-----------------------------------------------------------*/
+/*--- Block recoverer program for bzip2                   ---*/
+/*---                                      bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+/* This program is a complete hack and should be rewritten properly.
+     It isn't very complicated. */
+
+#include 
+#include 
+#include 
+#include 
+
+
+/* This program records bit locations in the file to be recovered.
+   That means that if 64-bit ints are not supported, we will not
+   be able to recover .bz2 files over 512MB (2^32 bits) long.
+   On GNU supported platforms, we take advantage of the 64-bit
+   int support to circumvent this problem.  Ditto MSVC.
+
+   This change occurred in version 1.0.2; all prior versions have
+   the 512MB limitation.
+*/
+#ifdef __GNUC__
+   typedef  unsigned long long int  MaybeUInt64;
+#  define MaybeUInt64_FMT "%Lu"
+#else
+#ifdef _MSC_VER
+   typedef  unsigned __int64  MaybeUInt64;
+#  define MaybeUInt64_FMT "%I64u"
+#else
+   typedef  unsigned int   MaybeUInt64;
+#  define MaybeUInt64_FMT "%u"
+#endif
+#endif
+
+typedef  unsigned int   UInt32;
+typedef  int            Int32;
+typedef  unsigned char  UChar;
+typedef  char           Char;
+typedef  unsigned char  Bool;
+#define True    ((Bool)1)
+#define False   ((Bool)0)
+
+
+#define BZ_MAX_FILENAME 2000
+
+Char inFileName[BZ_MAX_FILENAME];
+Char outFileName[BZ_MAX_FILENAME];
+Char progName[BZ_MAX_FILENAME];
+
+MaybeUInt64 bytesOut = 0;
+MaybeUInt64 bytesIn  = 0;
+
+
+/*---------------------------------------------------*/
+/*--- Header bytes                                ---*/
+/*---------------------------------------------------*/
+
+#define BZ_HDR_B 0x42                         /* 'B' */
+#define BZ_HDR_Z 0x5a                         /* 'Z' */
+#define BZ_HDR_h 0x68                         /* 'h' */
+#define BZ_HDR_0 0x30                         /* '0' */
+ 
+
+/*---------------------------------------------------*/
+/*--- I/O errors                                  ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static void readError ( void )
+{
+   fprintf ( stderr,
+             "%s: I/O error reading `%s', possible reason follows.\n",
+            progName, inFileName );
+   perror ( progName );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void writeError ( void )
+{
+   fprintf ( stderr,
+             "%s: I/O error reading `%s', possible reason follows.\n",
+            progName, inFileName );
+   perror ( progName );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void mallocFail ( Int32 n )
+{
+   fprintf ( stderr,
+             "%s: malloc failed on request for %d bytes.\n",
+            progName, n );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void tooManyBlocks ( Int32 max_handled_blocks )
+{
+   fprintf ( stderr,
+             "%s: `%s' appears to contain more than %d blocks\n",
+            progName, inFileName, max_handled_blocks );
+   fprintf ( stderr,
+             "%s: and cannot be handled.  To fix, increase\n",
+             progName );
+   fprintf ( stderr, 
+             "%s: BZ_MAX_HANDLED_BLOCKS in bzip2recover.c, and recompile.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O                              ---*/
+/*---------------------------------------------------*/
+
+typedef
+   struct {
+      FILE*  handle;
+      Int32  buffer;
+      Int32  buffLive;
+      Char   mode;
+   }
+   BitStream;
+
+
+/*---------------------------------------------*/
+static BitStream* bsOpenReadStream ( FILE* stream )
+{
+   BitStream *bs = malloc ( sizeof(BitStream) );
+   if (bs == NULL) mallocFail ( sizeof(BitStream) );
+   bs->handle = stream;
+   bs->buffer = 0;
+   bs->buffLive = 0;
+   bs->mode = 'r';
+   return bs;
+}
+
+
+/*---------------------------------------------*/
+static BitStream* bsOpenWriteStream ( FILE* stream )
+{
+   BitStream *bs = malloc ( sizeof(BitStream) );
+   if (bs == NULL) mallocFail ( sizeof(BitStream) );
+   bs->handle = stream;
+   bs->buffer = 0;
+   bs->buffLive = 0;
+   bs->mode = 'w';
+   return bs;
+}
+
+
+/*---------------------------------------------*/
+static void bsPutBit ( BitStream* bs, Int32 bit )
+{
+   if (bs->buffLive == 8) {
+      Int32 retVal = putc ( (UChar) bs->buffer, bs->handle );
+      if (retVal == EOF) writeError();
+      bytesOut++;
+      bs->buffLive = 1;
+      bs->buffer = bit & 0x1;
+   } else {
+      bs->buffer = ( (bs->buffer << 1) | (bit & 0x1) );
+      bs->buffLive++;
+   };
+}
+
+
+/*---------------------------------------------*/
+/*--
+   Returns 0 or 1, or 2 to indicate EOF.
+--*/
+static Int32 bsGetBit ( BitStream* bs )
+{
+   if (bs->buffLive > 0) {
+      bs->buffLive --;
+      return ( ((bs->buffer) >> (bs->buffLive)) & 0x1 );
+   } else {
+      Int32 retVal = getc ( bs->handle );
+      if ( retVal == EOF ) {
+         if (errno != 0) readError();
+         return 2;
+      }
+      bs->buffLive = 7;
+      bs->buffer = retVal;
+      return ( ((bs->buffer) >> 7) & 0x1 );
+   }
+}
+
+
+/*---------------------------------------------*/
+static void bsClose ( BitStream* bs )
+{
+   Int32 retVal;
+
+   if ( bs->mode == 'w' ) {
+      while ( bs->buffLive < 8 ) {
+         bs->buffLive++;
+         bs->buffer <<= 1;
+      };
+      retVal = putc ( (UChar) (bs->buffer), bs->handle );
+      if (retVal == EOF) writeError();
+      bytesOut++;
+      retVal = fflush ( bs->handle );
+      if (retVal == EOF) writeError();
+   }
+   retVal = fclose ( bs->handle );
+   if (retVal == EOF) {
+      if (bs->mode == 'w') writeError(); else readError();
+   }
+   free ( bs );
+}
+
+
+/*---------------------------------------------*/
+static void bsPutUChar ( BitStream* bs, UChar c )
+{
+   Int32 i;
+   for (i = 7; i >= 0; i--)
+      bsPutBit ( bs, (((UInt32) c) >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+static void bsPutUInt32 ( BitStream* bs, UInt32 c )
+{
+   Int32 i;
+
+   for (i = 31; i >= 0; i--)
+      bsPutBit ( bs, (c >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+static Bool endsInBz2 ( Char* name )
+{
+   Int32 n = strlen ( name );
+   if (n <= 4) return False;
+   return
+      (name[n-4] == '.' &&
+       name[n-3] == 'b' &&
+       name[n-2] == 'z' &&
+       name[n-1] == '2');
+}
+
+
+/*---------------------------------------------------*/
+/*---                                             ---*/
+/*---------------------------------------------------*/
+
+/* This logic isn't really right when it comes to Cygwin. */
+#ifdef _WIN32
+#  define  BZ_SPLIT_SYM  '\\'  /* path splitter on Windows platform */
+#else
+#  define  BZ_SPLIT_SYM  '/'   /* path splitter on Unix platform */
+#endif
+
+#define BLOCK_HEADER_HI  0x00003141UL
+#define BLOCK_HEADER_LO  0x59265359UL
+
+#define BLOCK_ENDMARK_HI 0x00001772UL
+#define BLOCK_ENDMARK_LO 0x45385090UL
+
+/* Increase if necessary.  However, a .bz2 file with > 50000 blocks
+   would have an uncompressed size of at least 40GB, so the chances
+   are low you'll need to up this.
+*/
+#define BZ_MAX_HANDLED_BLOCKS 50000
+
+MaybeUInt64 bStart [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 bEnd   [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbStart[BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbEnd  [BZ_MAX_HANDLED_BLOCKS];
+
+Int32 main ( Int32 argc, Char** argv )
+{
+   FILE*       inFile;
+   FILE*       outFile;
+   BitStream*  bsIn, *bsWr;
+   Int32       b, wrBlock, currBlock, rbCtr;
+   MaybeUInt64 bitsRead;
+
+   UInt32      buffHi, buffLo, blockCRC;
+   Char*       p;
+
+   strcpy ( progName, argv[0] );
+   inFileName[0] = outFileName[0] = 0;
+
+   fprintf ( stderr, 
+             "bzip2recover 1.0.5: extracts blocks from damaged .bz2 files.\n" );
+
+   if (argc != 2) {
+      fprintf ( stderr, "%s: usage is `%s damaged_file_name'.\n",
+                        progName, progName );
+      switch (sizeof(MaybeUInt64)) {
+         case 8:
+            fprintf(stderr, 
+                    "\trestrictions on size of recovered file: None\n");
+            break;
+         case 4:
+            fprintf(stderr, 
+                    "\trestrictions on size of recovered file: 512 MB\n");
+            fprintf(stderr, 
+                    "\tto circumvent, recompile with MaybeUInt64 as an\n"
+                    "\tunsigned 64-bit int.\n");
+            break;
+         default:
+            fprintf(stderr, 
+                    "\tsizeof(MaybeUInt64) is not 4 or 8 -- "
+                    "configuration error.\n");
+            break;
+      }
+      exit(1);
+   }
+
+   if (strlen(argv[1]) >= BZ_MAX_FILENAME-20) {
+      fprintf ( stderr, 
+                "%s: supplied filename is suspiciously (>= %d chars) long.  Bye!\n",
+                progName, (int)strlen(argv[1]) );
+      exit(1);
+   }
+
+   strcpy ( inFileName, argv[1] );
+
+   inFile = fopen ( inFileName, "rb" );
+   if (inFile == NULL) {
+      fprintf ( stderr, "%s: can't read `%s'\n", progName, inFileName );
+      exit(1);
+   }
+
+   bsIn = bsOpenReadStream ( inFile );
+   fprintf ( stderr, "%s: searching for block boundaries ...\n", progName );
+
+   bitsRead = 0;
+   buffHi = buffLo = 0;
+   currBlock = 0;
+   bStart[currBlock] = 0;
+
+   rbCtr = 0;
+
+   while (True) {
+      b = bsGetBit ( bsIn );
+      bitsRead++;
+      if (b == 2) {
+         if (bitsRead >= bStart[currBlock] &&
+            (bitsRead - bStart[currBlock]) >= 40) {
+            bEnd[currBlock] = bitsRead-1;
+            if (currBlock > 0)
+               fprintf ( stderr, "   block %d runs from " MaybeUInt64_FMT 
+                                 " to " MaybeUInt64_FMT " (incomplete)\n",
+                         currBlock,  bStart[currBlock], bEnd[currBlock] );
+         } else
+            currBlock--;
+         break;
+      }
+      buffHi = (buffHi << 1) | (buffLo >> 31);
+      buffLo = (buffLo << 1) | (b & 1);
+      if ( ( (buffHi & 0x0000ffff) == BLOCK_HEADER_HI 
+             && buffLo == BLOCK_HEADER_LO)
+           || 
+           ( (buffHi & 0x0000ffff) == BLOCK_ENDMARK_HI 
+             && buffLo == BLOCK_ENDMARK_LO)
+         ) {
+         if (bitsRead > 49) {
+            bEnd[currBlock] = bitsRead-49;
+         } else {
+            bEnd[currBlock] = 0;
+         }
+         if (currBlock > 0 &&
+         (bEnd[currBlock] - bStart[currBlock]) >= 130) {
+            fprintf ( stderr, "   block %d runs from " MaybeUInt64_FMT 
+                              " to " MaybeUInt64_FMT "\n",
+                      rbCtr+1,  bStart[currBlock], bEnd[currBlock] );
+            rbStart[rbCtr] = bStart[currBlock];
+            rbEnd[rbCtr] = bEnd[currBlock];
+            rbCtr++;
+         }
+         if (currBlock >= BZ_MAX_HANDLED_BLOCKS)
+            tooManyBlocks(BZ_MAX_HANDLED_BLOCKS);
+         currBlock++;
+
+         bStart[currBlock] = bitsRead;
+      }
+   }
+
+   bsClose ( bsIn );
+
+   /*-- identified blocks run from 1 to rbCtr inclusive. --*/
+
+   if (rbCtr < 1) {
+      fprintf ( stderr,
+                "%s: sorry, I couldn't find any block boundaries.\n",
+                progName );
+      exit(1);
+   };
+
+   fprintf ( stderr, "%s: splitting into blocks\n", progName );
+
+   inFile = fopen ( inFileName, "rb" );
+   if (inFile == NULL) {
+      fprintf ( stderr, "%s: can't open `%s'\n", progName, inFileName );
+      exit(1);
+   }
+   bsIn = bsOpenReadStream ( inFile );
+
+   /*-- placate gcc's dataflow analyser --*/
+   blockCRC = 0; bsWr = 0;
+
+   bitsRead = 0;
+   outFile = NULL;
+   wrBlock = 0;
+   while (True) {
+      b = bsGetBit(bsIn);
+      if (b == 2) break;
+      buffHi = (buffHi << 1) | (buffLo >> 31);
+      buffLo = (buffLo << 1) | (b & 1);
+      if (bitsRead == 47+rbStart[wrBlock]) 
+         blockCRC = (buffHi << 16) | (buffLo >> 16);
+
+      if (outFile != NULL && bitsRead >= rbStart[wrBlock]
+                          && bitsRead <= rbEnd[wrBlock]) {
+         bsPutBit ( bsWr, b );
+      }
+
+      bitsRead++;
+
+      if (bitsRead == rbEnd[wrBlock]+1) {
+         if (outFile != NULL) {
+            bsPutUChar ( bsWr, 0x17 ); bsPutUChar ( bsWr, 0x72 );
+            bsPutUChar ( bsWr, 0x45 ); bsPutUChar ( bsWr, 0x38 );
+            bsPutUChar ( bsWr, 0x50 ); bsPutUChar ( bsWr, 0x90 );
+            bsPutUInt32 ( bsWr, blockCRC );
+            bsClose ( bsWr );
+         }
+         if (wrBlock >= rbCtr) break;
+         wrBlock++;
+      } else
+      if (bitsRead == rbStart[wrBlock]) {
+         /* Create the output file name, correctly handling leading paths. 
+            (31.10.2001 by Sergey E. Kusikov) */
+         Char* split;
+         Int32 ofs, k;
+         for (k = 0; k < BZ_MAX_FILENAME; k++) 
+            outFileName[k] = 0;
+         strcpy (outFileName, inFileName);
+         split = strrchr (outFileName, BZ_SPLIT_SYM);
+         if (split == NULL) {
+            split = outFileName;
+         } else {
+            ++split;
+     }
+     /* Now split points to the start of the basename. */
+         ofs  = split - outFileName;
+         sprintf (split, "rec%5d", wrBlock+1);
+         for (p = split; *p != 0; p++) if (*p == ' ') *p = '0';
+         strcat (outFileName, inFileName + ofs);
+
+         if ( !endsInBz2(outFileName)) strcat ( outFileName, ".bz2" );
+
+         fprintf ( stderr, "   writing block %d to `%s' ...\n",
+                           wrBlock+1, outFileName );
+
+         outFile = fopen ( outFileName, "wb" );
+         if (outFile == NULL) {
+            fprintf ( stderr, "%s: can't write `%s'\n",
+                      progName, outFileName );
+            exit(1);
+         }
+         bsWr = bsOpenWriteStream ( outFile );
+         bsPutUChar ( bsWr, BZ_HDR_B );    
+         bsPutUChar ( bsWr, BZ_HDR_Z );    
+         bsPutUChar ( bsWr, BZ_HDR_h );    
+         bsPutUChar ( bsWr, BZ_HDR_0 + 9 );
+         bsPutUChar ( bsWr, 0x31 ); bsPutUChar ( bsWr, 0x41 );
+         bsPutUChar ( bsWr, 0x59 ); bsPutUChar ( bsWr, 0x26 );
+         bsPutUChar ( bsWr, 0x53 ); bsPutUChar ( bsWr, 0x59 );
+      }
+   }
+
+   fprintf ( stderr, "%s: finished\n", progName );
+   return 0;
+}
+
+
+
+/*-----------------------------------------------------------*/
+/*--- end                                  bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/bzlib.c b/Utilities/cmbzip2/bzlib.c
new file mode 100644
index 000000000..baed28849
--- /dev/null
+++ b/Utilities/cmbzip2/bzlib.c
@@ -0,0 +1,1572 @@
+
+/*-------------------------------------------------------------*/
+/*--- Library top-level functions.                          ---*/
+/*---                                               bzlib.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+/* CHANGES
+   0.9.0    -- original version.
+   0.9.0a/b -- no changes in this file.
+   0.9.0c   -- made zero-length BZ_FLUSH work correctly in bzCompress().
+     fixed bzWrite/bzRead to ignore zero-length requests.
+     fixed bzread to correctly handle read requests after EOF.
+     wrong parameter order in call to bzDecompressInit in
+     bzBuffToBuffDecompress.  Fixed.
+*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Compression stuff                           ---*/
+/*---------------------------------------------------*/
+
+
+/*---------------------------------------------------*/
+#ifndef BZ_NO_STDIO
+void BZ2_bz__AssertH__fail ( int errcode )
+{
+   fprintf(stderr, 
+      "\n\nbzip2/libbzip2: internal error number %d.\n"
+      "This is a bug in bzip2/libbzip2, %s.\n"
+      "Please report it to me at: jseward@bzip.org.  If this happened\n"
+      "when you were using some program which uses libbzip2 as a\n"
+      "component, you should also report this bug to the author(s)\n"
+      "of that program.  Please make an effort to report this bug;\n"
+      "timely and accurate bug reports eventually lead to higher\n"
+      "quality software.  Thanks.  Julian Seward, 10 December 2007.\n\n",
+      errcode,
+      BZ2_bzlibVersion()
+   );
+
+   if (errcode == 1007) {
+   fprintf(stderr,
+      "\n*** A special note about internal error number 1007 ***\n"
+      "\n"
+      "Experience suggests that a common cause of i.e. 1007\n"
+      "is unreliable memory or other hardware.  The 1007 assertion\n"
+      "just happens to cross-check the results of huge numbers of\n"
+      "memory reads/writes, and so acts (unintendedly) as a stress\n"
+      "test of your memory system.\n"
+      "\n"
+      "I suggest the following: try compressing the file again,\n"
+      "possibly monitoring progress in detail with the -vv flag.\n"
+      "\n"
+      "* If the error cannot be reproduced, and/or happens at different\n"
+      "  points in compression, you may have a flaky memory system.\n"
+      "  Try a memory-test program.  I have used Memtest86\n"
+      "  (www.memtest86.com).  At the time of writing it is free (GPLd).\n"
+      "  Memtest86 tests memory much more thorougly than your BIOSs\n"
+      "  power-on test, and may find failures that the BIOS doesn't.\n"
+      "\n"
+      "* If the error can be repeatably reproduced, this is a bug in\n"
+      "  bzip2, and I would very much like to hear about it.  Please\n"
+      "  let me know, and, ideally, save a copy of the file causing the\n"
+      "  problem -- without which I will be unable to investigate it.\n"
+      "\n"
+   );
+   }
+
+   exit(3);
+}
+#endif
+
+
+/*---------------------------------------------------*/
+static
+int bz_config_ok ( void )
+{
+   if (sizeof(int)   != 4) return 0;
+   if (sizeof(short) != 2) return 0;
+   if (sizeof(char)  != 1) return 0;
+   return 1;
+}
+
+
+/*---------------------------------------------------*/
+static
+void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
+{
+   void* v = malloc ( items * size );
+   return v;
+}
+
+static
+void default_bzfree ( void* opaque, void* addr )
+{
+   if (addr != NULL) free ( addr );
+}
+
+
+/*---------------------------------------------------*/
+static
+void prepare_new_block ( EState* s )
+{
+   Int32 i;
+   s->nblock = 0;
+   s->numZ = 0;
+   s->state_out_pos = 0;
+   BZ_INITIALISE_CRC ( s->blockCRC );
+   for (i = 0; i < 256; i++) s->inUse[i] = False;
+   s->blockNo++;
+}
+
+
+/*---------------------------------------------------*/
+static
+void init_RL ( EState* s )
+{
+   s->state_in_ch  = 256;
+   s->state_in_len = 0;
+}
+
+
+static
+Bool isempty_RL ( EState* s )
+{
+   if (s->state_in_ch < 256 && s->state_in_len > 0)
+      return False; else
+      return True;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressInit) 
+                    ( bz_stream* strm, 
+                     int        blockSize100k,
+                     int        verbosity,
+                     int        workFactor )
+{
+   Int32   n;
+   EState* s;
+
+   if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+   if (strm == NULL || 
+       blockSize100k < 1 || blockSize100k > 9 ||
+       workFactor < 0 || workFactor > 250)
+     return BZ_PARAM_ERROR;
+
+   if (workFactor == 0) workFactor = 30;
+   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+   s = BZALLOC( sizeof(EState) );
+   if (s == NULL) return BZ_MEM_ERROR;
+   s->strm = strm;
+
+   s->arr1 = NULL;
+   s->arr2 = NULL;
+   s->ftab = NULL;
+
+   n       = 100000 * blockSize100k;
+   s->arr1 = BZALLOC( n                  * sizeof(UInt32) );
+   s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
+   s->ftab = BZALLOC( 65537              * sizeof(UInt32) );
+
+   if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) {
+      if (s->arr1 != NULL) BZFREE(s->arr1);
+      if (s->arr2 != NULL) BZFREE(s->arr2);
+      if (s->ftab != NULL) BZFREE(s->ftab);
+      if (s       != NULL) BZFREE(s);
+      return BZ_MEM_ERROR;
+   }
+
+   s->blockNo           = 0;
+   s->state             = BZ_S_INPUT;
+   s->mode              = BZ_M_RUNNING;
+   s->combinedCRC       = 0;
+   s->blockSize100k     = blockSize100k;
+   s->nblockMAX         = 100000 * blockSize100k - 19;
+   s->verbosity         = verbosity;
+   s->workFactor        = workFactor;
+
+   s->block             = (UChar*)s->arr2;
+   s->mtfv              = (UInt16*)s->arr1;
+   s->zbits             = NULL;
+   s->ptr               = (UInt32*)s->arr1;
+
+   strm->state          = s;
+   strm->total_in_lo32  = 0;
+   strm->total_in_hi32  = 0;
+   strm->total_out_lo32 = 0;
+   strm->total_out_hi32 = 0;
+   init_RL ( s );
+   prepare_new_block ( s );
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+static
+void add_pair_to_block ( EState* s )
+{
+   Int32 i;
+   UChar ch = (UChar)(s->state_in_ch);
+   for (i = 0; i < s->state_in_len; i++) {
+      BZ_UPDATE_CRC( s->blockCRC, ch );
+   }
+   s->inUse[s->state_in_ch] = True;
+   switch (s->state_in_len) {
+      case 1:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      case 2:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      case 3:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      default:
+         s->inUse[s->state_in_len-4] = True;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = ((UChar)(s->state_in_len-4));
+         s->nblock++;
+         break;
+   }
+}
+
+
+/*---------------------------------------------------*/
+static
+void flush_RL ( EState* s )
+{
+   if (s->state_in_ch < 256) add_pair_to_block ( s );
+   init_RL ( s );
+}
+
+
+/*---------------------------------------------------*/
+#define ADD_CHAR_TO_BLOCK(zs,zchh0)               \
+{                                                 \
+   UInt32 zchh = (UInt32)(zchh0);                 \
+   /*-- fast track the common case --*/           \
+   if (zchh != zs->state_in_ch &&                 \
+       zs->state_in_len == 1) {                   \
+      UChar ch = (UChar)(zs->state_in_ch);        \
+      BZ_UPDATE_CRC( zs->blockCRC, ch );          \
+      zs->inUse[zs->state_in_ch] = True;          \
+      zs->block[zs->nblock] = (UChar)ch;          \
+      zs->nblock++;                               \
+      zs->state_in_ch = zchh;                     \
+   }                                              \
+   else                                           \
+   /*-- general, uncommon cases --*/              \
+   if (zchh != zs->state_in_ch ||                 \
+      zs->state_in_len == 255) {                  \
+      if (zs->state_in_ch < 256)                  \
+         add_pair_to_block ( zs );                \
+      zs->state_in_ch = zchh;                     \
+      zs->state_in_len = 1;                       \
+   } else {                                       \
+      zs->state_in_len++;                         \
+   }                                              \
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_input_until_stop ( EState* s )
+{
+   Bool progress_in = False;
+
+   if (s->mode == BZ_M_RUNNING) {
+
+      /*-- fast track the common case --*/
+      while (True) {
+         /*-- block full? --*/
+         if (s->nblock >= s->nblockMAX) break;
+         /*-- no input? --*/
+         if (s->strm->avail_in == 0) break;
+         progress_in = True;
+         ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 
+         s->strm->next_in++;
+         s->strm->avail_in--;
+         s->strm->total_in_lo32++;
+         if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
+      }
+
+   } else {
+
+      /*-- general, uncommon case --*/
+      while (True) {
+         /*-- block full? --*/
+         if (s->nblock >= s->nblockMAX) break;
+         /*-- no input? --*/
+         if (s->strm->avail_in == 0) break;
+         /*-- flush/finish end? --*/
+         if (s->avail_in_expect == 0) break;
+         progress_in = True;
+         ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 
+         s->strm->next_in++;
+         s->strm->avail_in--;
+         s->strm->total_in_lo32++;
+         if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
+         s->avail_in_expect--;
+      }
+   }
+   return progress_in;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_output_until_stop ( EState* s )
+{
+   Bool progress_out = False;
+
+   while (True) {
+
+      /*-- no output space? --*/
+      if (s->strm->avail_out == 0) break;
+
+      /*-- block done? --*/
+      if (s->state_out_pos >= s->numZ) break;
+
+      progress_out = True;
+      *(s->strm->next_out) = s->zbits[s->state_out_pos];
+      s->state_out_pos++;
+      s->strm->avail_out--;
+      s->strm->next_out++;
+      s->strm->total_out_lo32++;
+      if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+   }
+
+   return progress_out;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool handle_compress ( bz_stream* strm )
+{
+   Bool progress_in  = False;
+   Bool progress_out = False;
+   EState* s = strm->state;
+   
+   while (True) {
+
+      if (s->state == BZ_S_OUTPUT) {
+         progress_out |= copy_output_until_stop ( s );
+         if (s->state_out_pos < s->numZ) break;
+         if (s->mode == BZ_M_FINISHING && 
+             s->avail_in_expect == 0 &&
+             isempty_RL(s)) break;
+         prepare_new_block ( s );
+         s->state = BZ_S_INPUT;
+         if (s->mode == BZ_M_FLUSHING && 
+             s->avail_in_expect == 0 &&
+             isempty_RL(s)) break;
+      }
+
+      if (s->state == BZ_S_INPUT) {
+         progress_in |= copy_input_until_stop ( s );
+         if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) {
+            flush_RL ( s );
+            BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) );
+            s->state = BZ_S_OUTPUT;
+         }
+         else
+         if (s->nblock >= s->nblockMAX) {
+            BZ2_compressBlock ( s, False );
+            s->state = BZ_S_OUTPUT;
+         }
+         else
+         if (s->strm->avail_in == 0) {
+            break;
+         }
+      }
+
+   }
+
+   return progress_in || progress_out;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
+{
+   Bool progress;
+   EState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   preswitch:
+   switch (s->mode) {
+
+      case BZ_M_IDLE:
+         return BZ_SEQUENCE_ERROR;
+
+      case BZ_M_RUNNING:
+         if (action == BZ_RUN) {
+            progress = handle_compress ( strm );
+            return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;
+         } 
+         else
+     if (action == BZ_FLUSH) {
+            s->avail_in_expect = strm->avail_in;
+            s->mode = BZ_M_FLUSHING;
+            goto preswitch;
+         }
+         else
+         if (action == BZ_FINISH) {
+            s->avail_in_expect = strm->avail_in;
+            s->mode = BZ_M_FINISHING;
+            goto preswitch;
+         }
+         else 
+            return BZ_PARAM_ERROR;
+
+      case BZ_M_FLUSHING:
+         if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect != s->strm->avail_in) 
+            return BZ_SEQUENCE_ERROR;
+         progress = handle_compress ( strm );
+         if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+             s->state_out_pos < s->numZ) return BZ_FLUSH_OK;
+         s->mode = BZ_M_RUNNING;
+         return BZ_RUN_OK;
+
+      case BZ_M_FINISHING:
+         if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect != s->strm->avail_in) 
+            return BZ_SEQUENCE_ERROR;
+         progress = handle_compress ( strm );
+         if (!progress) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+             s->state_out_pos < s->numZ) return BZ_FINISH_OK;
+         s->mode = BZ_M_IDLE;
+         return BZ_STREAM_END;
+   }
+   return BZ_OK; /*--not reached--*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressEnd)  ( bz_stream *strm )
+{
+   EState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   if (s->arr1 != NULL) BZFREE(s->arr1);
+   if (s->arr2 != NULL) BZFREE(s->arr2);
+   if (s->ftab != NULL) BZFREE(s->ftab);
+   BZFREE(strm->state);
+
+   strm->state = NULL;   
+
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/*--- Decompression stuff                         ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressInit) 
+                     ( bz_stream* strm, 
+                       int        verbosity,
+                       int        small )
+{
+   DState* s;
+
+   if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   if (small != 0 && small != 1) return BZ_PARAM_ERROR;
+   if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR;
+
+   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+   s = BZALLOC( sizeof(DState) );
+   if (s == NULL) return BZ_MEM_ERROR;
+   s->strm                  = strm;
+   strm->state              = s;
+   s->state                 = BZ_X_MAGIC_1;
+   s->bsLive                = 0;
+   s->bsBuff                = 0;
+   s->calculatedCombinedCRC = 0;
+   strm->total_in_lo32      = 0;
+   strm->total_in_hi32      = 0;
+   strm->total_out_lo32     = 0;
+   strm->total_out_hi32     = 0;
+   s->smallDecompress       = (Bool)small;
+   s->ll4                   = NULL;
+   s->ll16                  = NULL;
+   s->tt                    = NULL;
+   s->currBlockNo           = 0;
+   s->verbosity             = verbosity;
+
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/* Return  True iff data corruption is discovered.
+   Returns False if there is no problem.
+*/
+static
+Bool unRLE_obuf_to_output_FAST ( DState* s )
+{
+   UChar k1;
+
+   if (s->blockRandomised) {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+               
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; 
+         s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+      }
+
+   } else {
+
+      /* restore */
+      UInt32        c_calculatedBlockCRC = s->calculatedBlockCRC;
+      UChar         c_state_out_ch       = s->state_out_ch;
+      Int32         c_state_out_len      = s->state_out_len;
+      Int32         c_nblock_used        = s->nblock_used;
+      Int32         c_k0                 = s->k0;
+      UInt32*       c_tt                 = s->tt;
+      UInt32        c_tPos               = s->tPos;
+      char*         cs_next_out          = s->strm->next_out;
+      unsigned int  cs_avail_out         = s->strm->avail_out;
+      Int32         ro_blockSize100k     = s->blockSize100k;
+      /* end restore */
+
+      UInt32       avail_out_INIT = cs_avail_out;
+      Int32        s_save_nblockPP = s->save_nblock+1;
+      unsigned int total_out_lo32_old;
+
+      while (True) {
+
+         /* try to finish existing run */
+         if (c_state_out_len > 0) {
+            while (True) {
+               if (cs_avail_out == 0) goto return_notr;
+               if (c_state_out_len == 1) break;
+               *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+               c_state_out_len--;
+               cs_next_out++;
+               cs_avail_out--;
+            }
+            s_state_out_len_eq_one:
+            {
+               if (cs_avail_out == 0) { 
+                  c_state_out_len = 1; goto return_notr;
+               };
+               *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+               cs_next_out++;
+               cs_avail_out--;
+            }
+         }   
+         /* Only caused by corrupt data stream? */
+         if (c_nblock_used > s_save_nblockPP)
+            return True;
+
+         /* can a new run be started? */
+         if (c_nblock_used == s_save_nblockPP) {
+            c_state_out_len = 0; goto return_notr;
+         };   
+         c_state_out_ch = c_k0;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (k1 != c_k0) { 
+            c_k0 = k1; goto s_state_out_len_eq_one; 
+         };
+         if (c_nblock_used == s_save_nblockPP) 
+            goto s_state_out_len_eq_one;
+   
+         c_state_out_len = 2;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (c_nblock_used == s_save_nblockPP) continue;
+         if (k1 != c_k0) { c_k0 = k1; continue; };
+   
+         c_state_out_len = 3;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (c_nblock_used == s_save_nblockPP) continue;
+         if (k1 != c_k0) { c_k0 = k1; continue; };
+   
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         c_state_out_len = ((Int32)k1) + 4;
+         BZ_GET_FAST_C(c_k0); c_nblock_used++;
+      }
+
+      return_notr:
+      total_out_lo32_old = s->strm->total_out_lo32;
+      s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out);
+      if (s->strm->total_out_lo32 < total_out_lo32_old)
+         s->strm->total_out_hi32++;
+
+      /* save */
+      s->calculatedBlockCRC = c_calculatedBlockCRC;
+      s->state_out_ch       = c_state_out_ch;
+      s->state_out_len      = c_state_out_len;
+      s->nblock_used        = c_nblock_used;
+      s->k0                 = c_k0;
+      s->tt                 = c_tt;
+      s->tPos               = c_tPos;
+      s->strm->next_out     = cs_next_out;
+      s->strm->avail_out    = cs_avail_out;
+      /* end save */
+   }
+   return False;
+}
+
+
+
+/*---------------------------------------------------*/
+__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
+{
+   Int32 nb, na, mid;
+   nb = 0;
+   na = 256;
+   do {
+      mid = (nb + na) >> 1;
+      if (indx >= cftab[mid]) nb = mid; else na = mid;
+   }
+   while (na - nb != 1);
+   return nb;
+}
+
+
+/*---------------------------------------------------*/
+/* Return  True iff data corruption is discovered.
+   Returns False if there is no problem.
+*/
+static
+Bool unRLE_obuf_to_output_SMALL ( DState* s )
+{
+   UChar k1;
+
+   if (s->blockRandomised) {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+   
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; 
+         s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+      }
+
+   } else {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+   
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_SMALL(s->k0); s->nblock_used++;
+      }
+
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompress) ( bz_stream *strm )
+{
+   Bool    corrupt;
+   DState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   while (True) {
+      if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR;
+      if (s->state == BZ_X_OUTPUT) {
+         if (s->smallDecompress)
+            corrupt = unRLE_obuf_to_output_SMALL ( s ); else
+            corrupt = unRLE_obuf_to_output_FAST  ( s );
+         if (corrupt) return BZ_DATA_ERROR;
+         if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {
+            BZ_FINALISE_CRC ( s->calculatedBlockCRC );
+            if (s->verbosity >= 3) 
+               VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, 
+                          s->calculatedBlockCRC );
+            if (s->verbosity >= 2) VPrintf0 ( "]" );
+            if (s->calculatedBlockCRC != s->storedBlockCRC)
+               return BZ_DATA_ERROR;
+            s->calculatedCombinedCRC 
+               = (s->calculatedCombinedCRC << 1) | 
+                    (s->calculatedCombinedCRC >> 31);
+            s->calculatedCombinedCRC ^= s->calculatedBlockCRC;
+            s->state = BZ_X_BLKHDR_1;
+         } else {
+            return BZ_OK;
+         }
+      }
+      if (s->state >= BZ_X_MAGIC_1) {
+         Int32 r = BZ2_decompress ( s );
+         if (r == BZ_STREAM_END) {
+            if (s->verbosity >= 3)
+               VPrintf2 ( "\n    combined CRCs: stored = 0x%08x, computed = 0x%08x", 
+                          s->storedCombinedCRC, s->calculatedCombinedCRC );
+            if (s->calculatedCombinedCRC != s->storedCombinedCRC)
+               return BZ_DATA_ERROR;
+            return r;
+         }
+         if (s->state != BZ_X_OUTPUT) return r;
+      }
+   }
+
+   AssertH ( 0, 6001 );
+
+   return 0;  /*NOTREACHED*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressEnd)  ( bz_stream *strm )
+{
+   DState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   if (s->tt   != NULL) BZFREE(s->tt);
+   if (s->ll16 != NULL) BZFREE(s->ll16);
+   if (s->ll4  != NULL) BZFREE(s->ll4);
+
+   BZFREE(strm->state);
+   strm->state = NULL;
+
+   return BZ_OK;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+/*--- File I/O stuff                              ---*/
+/*---------------------------------------------------*/
+
+#define BZ_SETERR(eee)                    \
+{                                         \
+   if (bzerror != NULL) *bzerror = eee;   \
+   if (bzf != NULL) bzf->lastErr = eee;   \
+}
+
+typedef 
+   struct {
+      FILE*     handle;
+      Char      buf[BZ_MAX_UNUSED];
+      Int32     bufN;
+      Bool      writing;
+      bz_stream strm;
+      Int32     lastErr;
+      Bool      initialisedOk;
+   }
+   bzFile;
+
+
+/*---------------------------------------------*/
+static Bool myfeof ( FILE* f )
+{
+   Int32 c = fgetc ( f );
+   if (c == EOF) return True;
+   ungetc ( c, f );
+   return False;
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzWriteOpen) 
+                    ( int*  bzerror,      
+                      FILE* f, 
+                      int   blockSize100k, 
+                      int   verbosity,
+                      int   workFactor )
+{
+   Int32   ret;
+   bzFile* bzf = NULL;
+
+   BZ_SETERR(BZ_OK);
+
+   if (f == NULL ||
+       (blockSize100k < 1 || blockSize100k > 9) ||
+       (workFactor < 0 || workFactor > 250) ||
+       (verbosity < 0 || verbosity > 4))
+      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+   if (ferror(f))
+      { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+   bzf = malloc ( sizeof(bzFile) );
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+   BZ_SETERR(BZ_OK);
+   bzf->initialisedOk = False;
+   bzf->bufN          = 0;
+   bzf->handle        = f;
+   bzf->writing       = True;
+   bzf->strm.bzalloc  = NULL;
+   bzf->strm.bzfree   = NULL;
+   bzf->strm.opaque   = NULL;
+
+   if (workFactor == 0) workFactor = 30;
+   ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, 
+                              verbosity, workFactor );
+   if (ret != BZ_OK)
+      { BZ_SETERR(ret); free(bzf); return NULL; };
+
+   bzf->strm.avail_in = 0;
+   bzf->initialisedOk = True;
+   return bzf;   
+}
+
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWrite)
+             ( int*    bzerror, 
+               BZFILE* b, 
+               void*   buf, 
+               int     len )
+{
+   Int32 n, n2, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+   if (bzf == NULL || buf == NULL || len < 0)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+   if (!(bzf->writing))
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (ferror(bzf->handle))
+      { BZ_SETERR(BZ_IO_ERROR); return; };
+
+   if (len == 0)
+      { BZ_SETERR(BZ_OK); return; };
+
+   bzf->strm.avail_in = len;
+   bzf->strm.next_in  = buf;
+
+   while (True) {
+      bzf->strm.avail_out = BZ_MAX_UNUSED;
+      bzf->strm.next_out = bzf->buf;
+      ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN );
+      if (ret != BZ_RUN_OK)
+         { BZ_SETERR(ret); return; };
+
+      if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+         n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+         n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 
+                       n, bzf->handle );
+         if (n != n2 || ferror(bzf->handle))
+            { BZ_SETERR(BZ_IO_ERROR); return; };
+      }
+
+      if (bzf->strm.avail_in == 0)
+         { BZ_SETERR(BZ_OK); return; };
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWriteClose)
+                  ( int*          bzerror, 
+                    BZFILE*       b, 
+                    int           abandon,
+                    unsigned int* nbytes_in,
+                    unsigned int* nbytes_out )
+{
+   BZ2_bzWriteClose64 ( bzerror, b, abandon, 
+                        nbytes_in, NULL, nbytes_out, NULL );
+}
+
+
+void BZ_API(BZ2_bzWriteClose64)
+                  ( int*          bzerror, 
+                    BZFILE*       b, 
+                    int           abandon,
+                    unsigned int* nbytes_in_lo32,
+                    unsigned int* nbytes_in_hi32,
+                    unsigned int* nbytes_out_lo32,
+                    unsigned int* nbytes_out_hi32 )
+{
+   Int32   n, n2, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_OK); return; };
+   if (!(bzf->writing))
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (ferror(bzf->handle))
+      { BZ_SETERR(BZ_IO_ERROR); return; };
+
+   if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0;
+   if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0;
+   if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0;
+   if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0;
+
+   if ((!abandon) && bzf->lastErr == BZ_OK) {
+      while (True) {
+         bzf->strm.avail_out = BZ_MAX_UNUSED;
+         bzf->strm.next_out = bzf->buf;
+         ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH );
+         if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END)
+            { BZ_SETERR(ret); return; };
+
+         if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+            n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+            n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 
+                          n, bzf->handle );
+            if (n != n2 || ferror(bzf->handle))
+               { BZ_SETERR(BZ_IO_ERROR); return; };
+         }
+
+         if (ret == BZ_STREAM_END) break;
+      }
+   }
+
+   if ( !abandon && !ferror ( bzf->handle ) ) {
+      fflush ( bzf->handle );
+      if (ferror(bzf->handle))
+         { BZ_SETERR(BZ_IO_ERROR); return; };
+   }
+
+   if (nbytes_in_lo32 != NULL)
+      *nbytes_in_lo32 = bzf->strm.total_in_lo32;
+   if (nbytes_in_hi32 != NULL)
+      *nbytes_in_hi32 = bzf->strm.total_in_hi32;
+   if (nbytes_out_lo32 != NULL)
+      *nbytes_out_lo32 = bzf->strm.total_out_lo32;
+   if (nbytes_out_hi32 != NULL)
+      *nbytes_out_hi32 = bzf->strm.total_out_hi32;
+
+   BZ_SETERR(BZ_OK);
+   BZ2_bzCompressEnd ( &(bzf->strm) );
+   free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzReadOpen) 
+                   ( int*  bzerror, 
+                     FILE* f, 
+                     int   verbosity,
+                     int   small,
+                     void* unused,
+                     int   nUnused )
+{
+   bzFile* bzf = NULL;
+   int     ret;
+
+   BZ_SETERR(BZ_OK);
+
+   if (f == NULL || 
+       (small != 0 && small != 1) ||
+       (verbosity < 0 || verbosity > 4) ||
+       (unused == NULL && nUnused != 0) ||
+       (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED)))
+      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+   if (ferror(f))
+      { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+   bzf = malloc ( sizeof(bzFile) );
+   if (bzf == NULL) 
+      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+   BZ_SETERR(BZ_OK);
+
+   bzf->initialisedOk = False;
+   bzf->handle        = f;
+   bzf->bufN          = 0;
+   bzf->writing       = False;
+   bzf->strm.bzalloc  = NULL;
+   bzf->strm.bzfree   = NULL;
+   bzf->strm.opaque   = NULL;
+   
+   while (nUnused > 0) {
+      bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++;
+      unused = ((void*)( 1 + ((UChar*)(unused))  ));
+      nUnused--;
+   }
+
+   ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small );
+   if (ret != BZ_OK)
+      { BZ_SETERR(ret); free(bzf); return NULL; };
+
+   bzf->strm.avail_in = bzf->bufN;
+   bzf->strm.next_in  = bzf->buf;
+
+   bzf->initialisedOk = True;
+   return bzf;   
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b )
+{
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_OK); return; };
+
+   if (bzf->writing)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+
+   if (bzf->initialisedOk)
+      (void)BZ2_bzDecompressEnd ( &(bzf->strm) );
+   free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzRead) 
+           ( int*    bzerror, 
+             BZFILE* b, 
+             void*   buf, 
+             int     len )
+{
+   Int32   n, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+
+   if (bzf == NULL || buf == NULL || len < 0)
+      { BZ_SETERR(BZ_PARAM_ERROR); return 0; };
+
+   if (bzf->writing)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; };
+
+   if (len == 0)
+      { BZ_SETERR(BZ_OK); return 0; };
+
+   bzf->strm.avail_out = len;
+   bzf->strm.next_out = buf;
+
+   while (True) {
+
+      if (ferror(bzf->handle)) 
+         { BZ_SETERR(BZ_IO_ERROR); return 0; };
+
+      if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) {
+         n = fread ( bzf->buf, sizeof(UChar), 
+                     BZ_MAX_UNUSED, bzf->handle );
+         if (ferror(bzf->handle))
+            { BZ_SETERR(BZ_IO_ERROR); return 0; };
+         bzf->bufN = n;
+         bzf->strm.avail_in = bzf->bufN;
+         bzf->strm.next_in = bzf->buf;
+      }
+
+      ret = BZ2_bzDecompress ( &(bzf->strm) );
+
+      if (ret != BZ_OK && ret != BZ_STREAM_END)
+         { BZ_SETERR(ret); return 0; };
+
+      if (ret == BZ_OK && myfeof(bzf->handle) && 
+          bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0)
+         { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; };
+
+      if (ret == BZ_STREAM_END)
+         { BZ_SETERR(BZ_STREAM_END);
+           return len - bzf->strm.avail_out; };
+      if (bzf->strm.avail_out == 0)
+         { BZ_SETERR(BZ_OK); return len; };
+      
+   }
+
+   return 0; /*not reached*/
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadGetUnused) 
+                     ( int*    bzerror, 
+                       BZFILE* b, 
+                       void**  unused, 
+                       int*    nUnused )
+{
+   bzFile* bzf = (bzFile*)b;
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+   if (bzf->lastErr != BZ_STREAM_END)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (unused == NULL || nUnused == NULL)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+
+   BZ_SETERR(BZ_OK);
+   *nUnused = bzf->strm.avail_in;
+   *unused = bzf->strm.next_in;
+}
+#endif
+
+
+/*---------------------------------------------------*/
+/*--- Misc convenience stuff                      ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffCompress) 
+                         ( char*         dest, 
+                           unsigned int* destLen,
+                           char*         source, 
+                           unsigned int  sourceLen,
+                           int           blockSize100k, 
+                           int           verbosity, 
+                           int           workFactor )
+{
+   bz_stream strm;
+   int ret;
+
+   if (dest == NULL || destLen == NULL || 
+       source == NULL ||
+       blockSize100k < 1 || blockSize100k > 9 ||
+       verbosity < 0 || verbosity > 4 ||
+       workFactor < 0 || workFactor > 250) 
+      return BZ_PARAM_ERROR;
+
+   if (workFactor == 0) workFactor = 30;
+   strm.bzalloc = NULL;
+   strm.bzfree = NULL;
+   strm.opaque = NULL;
+   ret = BZ2_bzCompressInit ( &strm, blockSize100k, 
+                              verbosity, workFactor );
+   if (ret != BZ_OK) return ret;
+
+   strm.next_in = source;
+   strm.next_out = dest;
+   strm.avail_in = sourceLen;
+   strm.avail_out = *destLen;
+
+   ret = BZ2_bzCompress ( &strm, BZ_FINISH );
+   if (ret == BZ_FINISH_OK) goto output_overflow;
+   if (ret != BZ_STREAM_END) goto errhandler;
+
+   /* normal termination */
+   *destLen -= strm.avail_out;   
+   BZ2_bzCompressEnd ( &strm );
+   return BZ_OK;
+
+   output_overflow:
+   BZ2_bzCompressEnd ( &strm );
+   return BZ_OUTBUFF_FULL;
+
+   errhandler:
+   BZ2_bzCompressEnd ( &strm );
+   return ret;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffDecompress) 
+                           ( char*         dest, 
+                             unsigned int* destLen,
+                             char*         source, 
+                             unsigned int  sourceLen,
+                             int           small,
+                             int           verbosity )
+{
+   bz_stream strm;
+   int ret;
+
+   if (dest == NULL || destLen == NULL || 
+       source == NULL ||
+       (small != 0 && small != 1) ||
+       verbosity < 0 || verbosity > 4) 
+          return BZ_PARAM_ERROR;
+
+   strm.bzalloc = NULL;
+   strm.bzfree = NULL;
+   strm.opaque = NULL;
+   ret = BZ2_bzDecompressInit ( &strm, verbosity, small );
+   if (ret != BZ_OK) return ret;
+
+   strm.next_in = source;
+   strm.next_out = dest;
+   strm.avail_in = sourceLen;
+   strm.avail_out = *destLen;
+
+   ret = BZ2_bzDecompress ( &strm );
+   if (ret == BZ_OK) goto output_overflow_or_eof;
+   if (ret != BZ_STREAM_END) goto errhandler;
+
+   /* normal termination */
+   *destLen -= strm.avail_out;
+   BZ2_bzDecompressEnd ( &strm );
+   return BZ_OK;
+
+   output_overflow_or_eof:
+   if (strm.avail_out > 0) {
+      BZ2_bzDecompressEnd ( &strm );
+      return BZ_UNEXPECTED_EOF;
+   } else {
+      BZ2_bzDecompressEnd ( &strm );
+      return BZ_OUTBUFF_FULL;
+   };      
+
+   errhandler:
+   BZ2_bzDecompressEnd ( &strm );
+   return ret; 
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+   to support better zlib compatibility.
+   This code is not _officially_ part of libbzip2 (yet);
+   I haven't tested it, documented it, or considered the
+   threading-safeness of it.
+   If this code breaks, please contact both Yoshioka and me.
+--*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+/*--
+   return version like "0.9.5d, 4-Sept-1999".
+--*/
+const char * BZ_API(BZ2_bzlibVersion)(void)
+{
+   return BZ_VERSION;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+
+#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
+#   include 
+#   include 
+#   define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY)
+#else
+#   define SET_BINARY_MODE(file)
+#endif
+static
+BZFILE * bzopen_or_bzdopen
+               ( const char *path,   /* no use when bzdopen */
+                 int fd,             /* no use when bzdopen */
+                 const char *mode,
+                 int open_mode)      /* bzopen: 0, bzdopen:1 */
+{
+   int    bzerr;
+   char   unused[BZ_MAX_UNUSED];
+   int    blockSize100k = 9;
+   int    writing       = 0;
+   char   mode2[10]     = "";
+   FILE   *fp           = NULL;
+   BZFILE *bzfp         = NULL;
+   int    verbosity     = 0;
+   int    workFactor    = 30;
+   int    smallMode     = 0;
+   int    nUnused       = 0; 
+
+   if (mode == NULL) return NULL;
+   while (*mode) {
+      switch (*mode) {
+      case 'r':
+         writing = 0; break;
+      case 'w':
+         writing = 1; break;
+      case 's':
+         smallMode = 1; break;
+      default:
+         if (isdigit((int)(*mode))) {
+            blockSize100k = *mode-BZ_HDR_0;
+         }
+      }
+      mode++;
+   }
+   strcat(mode2, writing ? "w" : "r" );
+   strcat(mode2,"b");   /* binary mode */
+
+   if (open_mode==0) {
+      if (path==NULL || strcmp(path,"")==0) {
+        fp = (writing ? stdout : stdin);
+        SET_BINARY_MODE(fp);
+      } else {
+        fp = fopen(path,mode2);
+      }
+   } else {
+#ifdef BZ_STRICT_ANSI
+      fp = NULL;
+#else
+      fp = fdopen(fd,mode2);
+#endif
+   }
+   if (fp == NULL) return NULL;
+
+   if (writing) {
+      /* Guard against total chaos and anarchy -- JRS */
+      if (blockSize100k < 1) blockSize100k = 1;
+      if (blockSize100k > 9) blockSize100k = 9; 
+      bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k,
+                             verbosity,workFactor);
+   } else {
+      bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode,
+                            unused,nUnused);
+   }
+   if (bzfp == NULL) {
+      if (fp != stdin && fp != stdout) fclose(fp);
+      return NULL;
+   }
+   return bzfp;
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   open file for read or write.
+      ex) bzopen("file","w9")
+      case path="" or NULL => use stdin or stdout.
+--*/
+BZFILE * BZ_API(BZ2_bzopen)
+               ( const char *path,
+                 const char *mode )
+{
+   return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0);
+}
+
+
+/*---------------------------------------------------*/
+BZFILE * BZ_API(BZ2_bzdopen)
+               ( int fd,
+                 const char *mode )
+{
+   return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1);
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len )
+{
+   int bzerr, nread;
+   if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0;
+   nread = BZ2_bzRead(&bzerr,b,buf,len);
+   if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) {
+      return nread;
+   } else {
+      return -1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
+{
+   int bzerr;
+
+   BZ2_bzWrite(&bzerr,b,buf,len);
+   if(bzerr == BZ_OK){
+      return len;
+   }else{
+      return -1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzflush) (BZFILE *b)
+{
+   /* do nothing now... */
+   return 0;
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzclose) (BZFILE* b)
+{
+   int bzerr;
+   FILE *fp;
+   
+   if (b==NULL) {return;}
+   fp = ((bzFile *)b)->handle;
+   if(((bzFile*)b)->writing){
+      BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL);
+      if(bzerr != BZ_OK){
+         BZ2_bzWriteClose(NULL,b,1,NULL,NULL);
+      }
+   }else{
+      BZ2_bzReadClose(&bzerr,b);
+   }
+   if(fp!=stdin && fp!=stdout){
+      fclose(fp);
+   }
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   return last error code 
+--*/
+static const char *bzerrorstrings[] = {
+       "OK"
+      ,"SEQUENCE_ERROR"
+      ,"PARAM_ERROR"
+      ,"MEM_ERROR"
+      ,"DATA_ERROR"
+      ,"DATA_ERROR_MAGIC"
+      ,"IO_ERROR"
+      ,"UNEXPECTED_EOF"
+      ,"OUTBUFF_FULL"
+      ,"CONFIG_ERROR"
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+};
+
+
+const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum)
+{
+   int err = ((bzFile *)b)->lastErr;
+
+   if(err>0) err = 0;
+   *errnum = err;
+   return bzerrorstrings[err*-1];
+}
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                           bzlib.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/bzlib.h b/Utilities/cmbzip2/bzlib.h
new file mode 100644
index 000000000..c5b75d6d8
--- /dev/null
+++ b/Utilities/cmbzip2/bzlib.h
@@ -0,0 +1,282 @@
+
+/*-------------------------------------------------------------*/
+/*--- Public header file for the library.                   ---*/
+/*---                                               bzlib.h ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#ifndef _BZLIB_H
+#define _BZLIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BZ_RUN               0
+#define BZ_FLUSH             1
+#define BZ_FINISH            2
+
+#define BZ_OK                0
+#define BZ_RUN_OK            1
+#define BZ_FLUSH_OK          2
+#define BZ_FINISH_OK         3
+#define BZ_STREAM_END        4
+#define BZ_SEQUENCE_ERROR    (-1)
+#define BZ_PARAM_ERROR       (-2)
+#define BZ_MEM_ERROR         (-3)
+#define BZ_DATA_ERROR        (-4)
+#define BZ_DATA_ERROR_MAGIC  (-5)
+#define BZ_IO_ERROR          (-6)
+#define BZ_UNEXPECTED_EOF    (-7)
+#define BZ_OUTBUFF_FULL      (-8)
+#define BZ_CONFIG_ERROR      (-9)
+
+typedef 
+   struct {
+      char *next_in;
+      unsigned int avail_in;
+      unsigned int total_in_lo32;
+      unsigned int total_in_hi32;
+
+      char *next_out;
+      unsigned int avail_out;
+      unsigned int total_out_lo32;
+      unsigned int total_out_hi32;
+
+      void *state;
+
+      void *(*bzalloc)(void *,int,int);
+      void (*bzfree)(void *,void *);
+      void *opaque;
+   } 
+   bz_stream;
+
+
+#ifndef BZ_IMPORT
+#define BZ_EXPORT
+#endif
+
+#ifndef BZ_NO_STDIO
+/* Need a definitition for FILE */
+#include 
+#endif
+
+#ifdef _WIN32
+#   include 
+#   ifdef small
+      /* windows.h define small to char */
+#      undef small
+#   endif
+#   ifdef BZ_EXPORT
+#   define BZ_API(func) WINAPI func
+#   define BZ_EXTERN extern
+#   else
+   /* import windows dll dynamically */
+#   define BZ_API(func) (WINAPI * func)
+#   define BZ_EXTERN
+#   endif
+#else
+#   define BZ_API(func) func
+#   define BZ_EXTERN extern
+#endif
+
+
+/*-- Core (low-level) library functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( 
+      bz_stream* strm, 
+      int        blockSize100k, 
+      int        verbosity, 
+      int        workFactor 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompress) ( 
+      bz_stream* strm, 
+      int action 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( 
+      bz_stream* strm 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( 
+      bz_stream *strm, 
+      int       verbosity, 
+      int       small
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( 
+      bz_stream* strm 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( 
+      bz_stream *strm 
+   );
+
+
+
+/*-- High(er) level library functions --*/
+
+#ifndef BZ_NO_STDIO
+#define BZ_MAX_UNUSED 5000
+
+typedef void BZFILE;
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( 
+      int*  bzerror,   
+      FILE* f, 
+      int   verbosity, 
+      int   small,
+      void* unused,    
+      int   nUnused 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( 
+      int*    bzerror, 
+      BZFILE* b 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void**  unused,  
+      int*    nUnused 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzRead) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( 
+      int*  bzerror,      
+      FILE* f, 
+      int   blockSize100k, 
+      int   verbosity, 
+      int   workFactor 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWrite) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( 
+      int*          bzerror, 
+      BZFILE*       b, 
+      int           abandon, 
+      unsigned int* nbytes_in, 
+      unsigned int* nbytes_out 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( 
+      int*          bzerror, 
+      BZFILE*       b, 
+      int           abandon, 
+      unsigned int* nbytes_in_lo32, 
+      unsigned int* nbytes_in_hi32, 
+      unsigned int* nbytes_out_lo32, 
+      unsigned int* nbytes_out_hi32
+   );
+#endif
+
+
+/*-- Utility functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( 
+      char*         dest, 
+      unsigned int* destLen,
+      char*         source, 
+      unsigned int  sourceLen,
+      int           blockSize100k, 
+      int           verbosity, 
+      int           workFactor 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( 
+      char*         dest, 
+      unsigned int* destLen,
+      char*         source, 
+      unsigned int  sourceLen,
+      int           small, 
+      int           verbosity 
+   );
+
+
+/*--
+   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+   to support better zlib compatibility.
+   This code is not _officially_ part of libbzip2 (yet);
+   I haven't tested it, documented it, or considered the
+   threading-safeness of it.
+   If this code breaks, please contact both Yoshioka and me.
+--*/
+
+BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) (
+      void
+   );
+
+#ifndef BZ_NO_STDIO
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) (
+      const char *path,
+      const char *mode
+   );
+
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) (
+      int        fd,
+      const char *mode
+   );
+         
+BZ_EXTERN int BZ_API(BZ2_bzread) (
+      BZFILE* b, 
+      void* buf, 
+      int len 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzwrite) (
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzflush) (
+      BZFILE* b
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzclose) (
+      BZFILE* b
+   );
+
+BZ_EXTERN const char * BZ_API(BZ2_bzerror) (
+      BZFILE *b, 
+      int    *errnum
+   );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/*-------------------------------------------------------------*/
+/*--- end                                           bzlib.h ---*/
+/*-------------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/bzlib_private.h b/Utilities/cmbzip2/bzlib_private.h
new file mode 100644
index 000000000..23427879b
--- /dev/null
+++ b/Utilities/cmbzip2/bzlib_private.h
@@ -0,0 +1,509 @@
+
+/*-------------------------------------------------------------*/
+/*--- Private header file for the library.                  ---*/
+/*---                                       bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#ifndef _BZLIB_PRIVATE_H
+#define _BZLIB_PRIVATE_H
+
+#include 
+
+#ifndef BZ_NO_STDIO
+#include 
+#include 
+#include 
+#endif
+
+#include "bzlib.h"
+
+
+
+/*-- General stuff. --*/
+
+#define BZ_VERSION  "1.0.5, 10-Dec-2007"
+
+typedef char            Char;
+typedef unsigned char   Bool;
+typedef unsigned char   UChar;
+typedef int             Int32;
+typedef unsigned int    UInt32;
+typedef short           Int16;
+typedef unsigned short  UInt16;
+
+#define True  ((Bool)1)
+#define False ((Bool)0)
+
+#ifndef __GNUC__
+#define __inline__  /* */
+#endif 
+
+#ifndef BZ_NO_STDIO
+
+extern void BZ2_bz__AssertH__fail ( int errcode );
+#define AssertH(cond,errcode) \
+   { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
+
+#if BZ_DEBUG
+#define AssertD(cond,msg) \
+   { if (!(cond)) {       \
+      fprintf ( stderr,   \
+        "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\
+      exit(1); \
+   }}
+#else
+#define AssertD(cond,msg) /* */
+#endif
+
+#define VPrintf0(zf) \
+   fprintf(stderr,zf)
+#define VPrintf1(zf,za1) \
+   fprintf(stderr,zf,za1)
+#define VPrintf2(zf,za1,za2) \
+   fprintf(stderr,zf,za1,za2)
+#define VPrintf3(zf,za1,za2,za3) \
+   fprintf(stderr,zf,za1,za2,za3)
+#define VPrintf4(zf,za1,za2,za3,za4) \
+   fprintf(stderr,zf,za1,za2,za3,za4)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) \
+   fprintf(stderr,zf,za1,za2,za3,za4,za5)
+
+#else
+
+extern void bz_internal_error ( int errcode );
+#define AssertH(cond,errcode) \
+   { if (!(cond)) bz_internal_error ( errcode ); }
+#define AssertD(cond,msg)                do { } while (0)
+#define VPrintf0(zf)                     do { } while (0)
+#define VPrintf1(zf,za1)                 do { } while (0)
+#define VPrintf2(zf,za1,za2)             do { } while (0)
+#define VPrintf3(zf,za1,za2,za3)         do { } while (0)
+#define VPrintf4(zf,za1,za2,za3,za4)     do { } while (0)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0)
+
+#endif
+
+
+#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
+#define BZFREE(ppp)  (strm->bzfree)(strm->opaque,(ppp))
+
+
+/*-- Header bytes. --*/
+
+#define BZ_HDR_B 0x42   /* 'B' */
+#define BZ_HDR_Z 0x5a   /* 'Z' */
+#define BZ_HDR_h 0x68   /* 'h' */
+#define BZ_HDR_0 0x30   /* '0' */
+  
+/*-- Constants for the back end. --*/
+
+#define BZ_MAX_ALPHA_SIZE 258
+#define BZ_MAX_CODE_LEN    23
+
+#define BZ_RUNA 0
+#define BZ_RUNB 1
+
+#define BZ_N_GROUPS 6
+#define BZ_G_SIZE   50
+#define BZ_N_ITERS  4
+
+#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
+
+
+
+/*-- Stuff for randomising repetitive blocks. --*/
+
+extern Int32 BZ2_rNums[512];
+
+#define BZ_RAND_DECLS                          \
+   Int32 rNToGo;                               \
+   Int32 rTPos                                 \
+
+#define BZ_RAND_INIT_MASK                      \
+   s->rNToGo = 0;                              \
+   s->rTPos  = 0                               \
+
+#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
+
+#define BZ_RAND_UPD_MASK                       \
+   if (s->rNToGo == 0) {                       \
+      s->rNToGo = BZ2_rNums[s->rTPos];         \
+      s->rTPos++;                              \
+      if (s->rTPos == 512) s->rTPos = 0;       \
+   }                                           \
+   s->rNToGo--;
+
+
+
+/*-- Stuff for doing CRCs. --*/
+
+extern UInt32 BZ2_crc32Table[256];
+
+#define BZ_INITIALISE_CRC(crcVar)              \
+{                                              \
+   crcVar = 0xffffffffL;                       \
+}
+
+#define BZ_FINALISE_CRC(crcVar)                \
+{                                              \
+   crcVar = ~(crcVar);                         \
+}
+
+#define BZ_UPDATE_CRC(crcVar,cha)              \
+{                                              \
+   crcVar = (crcVar << 8) ^                    \
+            BZ2_crc32Table[(crcVar >> 24) ^    \
+                           ((UChar)cha)];      \
+}
+
+
+
+/*-- States and modes for compression. --*/
+
+#define BZ_M_IDLE      1
+#define BZ_M_RUNNING   2
+#define BZ_M_FLUSHING  3
+#define BZ_M_FINISHING 4
+
+#define BZ_S_OUTPUT    1
+#define BZ_S_INPUT     2
+
+#define BZ_N_RADIX 2
+#define BZ_N_QSORT 12
+#define BZ_N_SHELL 18
+#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
+
+
+
+
+/*-- Structure holding all the compression-side stuff. --*/
+
+typedef
+   struct {
+      /* pointer back to the struct bz_stream */
+      bz_stream* strm;
+
+      /* mode this stream is in, and whether inputting */
+      /* or outputting data */
+      Int32    mode;
+      Int32    state;
+
+      /* remembers avail_in when flush/finish requested */
+      UInt32   avail_in_expect;
+
+      /* for doing the block sorting */
+      UInt32*  arr1;
+      UInt32*  arr2;
+      UInt32*  ftab;
+      Int32    origPtr;
+
+      /* aliases for arr1 and arr2 */
+      UInt32*  ptr;
+      UChar*   block;
+      UInt16*  mtfv;
+      UChar*   zbits;
+
+      /* for deciding when to use the fallback sorting algorithm */
+      Int32    workFactor;
+
+      /* run-length-encoding of the input */
+      UInt32   state_in_ch;
+      Int32    state_in_len;
+      BZ_RAND_DECLS;
+
+      /* input and output limits and current posns */
+      Int32    nblock;
+      Int32    nblockMAX;
+      Int32    numZ;
+      Int32    state_out_pos;
+
+      /* map of bytes used in block */
+      Int32    nInUse;
+      Bool     inUse[256];
+      UChar    unseqToSeq[256];
+
+      /* the buffer for bit stream creation */
+      UInt32   bsBuff;
+      Int32    bsLive;
+
+      /* block and combined CRCs */
+      UInt32   blockCRC;
+      UInt32   combinedCRC;
+
+      /* misc administratium */
+      Int32    verbosity;
+      Int32    blockNo;
+      Int32    blockSize100k;
+
+      /* stuff for coding the MTF values */
+      Int32    nMTF;
+      Int32    mtfFreq    [BZ_MAX_ALPHA_SIZE];
+      UChar    selector   [BZ_MAX_SELECTORS];
+      UChar    selectorMtf[BZ_MAX_SELECTORS];
+
+      UChar    len     [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    code    [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    rfreq   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      /* second dimension: only 3 needed; 4 makes index calculations faster */
+      UInt32   len_pack[BZ_MAX_ALPHA_SIZE][4];
+
+   }
+   EState;
+
+
+
+/*-- externs for compression. --*/
+
+extern void 
+BZ2_blockSort ( EState* );
+
+extern void 
+BZ2_compressBlock ( EState*, Bool );
+
+extern void 
+BZ2_bsInitWrite ( EState* );
+
+extern void 
+BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
+
+extern void 
+BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
+
+
+
+/*-- states for decompression. --*/
+
+#define BZ_X_IDLE        1
+#define BZ_X_OUTPUT      2
+
+#define BZ_X_MAGIC_1     10
+#define BZ_X_MAGIC_2     11
+#define BZ_X_MAGIC_3     12
+#define BZ_X_MAGIC_4     13
+#define BZ_X_BLKHDR_1    14
+#define BZ_X_BLKHDR_2    15
+#define BZ_X_BLKHDR_3    16
+#define BZ_X_BLKHDR_4    17
+#define BZ_X_BLKHDR_5    18
+#define BZ_X_BLKHDR_6    19
+#define BZ_X_BCRC_1      20
+#define BZ_X_BCRC_2      21
+#define BZ_X_BCRC_3      22
+#define BZ_X_BCRC_4      23
+#define BZ_X_RANDBIT     24
+#define BZ_X_ORIGPTR_1   25
+#define BZ_X_ORIGPTR_2   26
+#define BZ_X_ORIGPTR_3   27
+#define BZ_X_MAPPING_1   28
+#define BZ_X_MAPPING_2   29
+#define BZ_X_SELECTOR_1  30
+#define BZ_X_SELECTOR_2  31
+#define BZ_X_SELECTOR_3  32
+#define BZ_X_CODING_1    33
+#define BZ_X_CODING_2    34
+#define BZ_X_CODING_3    35
+#define BZ_X_MTF_1       36
+#define BZ_X_MTF_2       37
+#define BZ_X_MTF_3       38
+#define BZ_X_MTF_4       39
+#define BZ_X_MTF_5       40
+#define BZ_X_MTF_6       41
+#define BZ_X_ENDHDR_2    42
+#define BZ_X_ENDHDR_3    43
+#define BZ_X_ENDHDR_4    44
+#define BZ_X_ENDHDR_5    45
+#define BZ_X_ENDHDR_6    46
+#define BZ_X_CCRC_1      47
+#define BZ_X_CCRC_2      48
+#define BZ_X_CCRC_3      49
+#define BZ_X_CCRC_4      50
+
+
+
+/*-- Constants for the fast MTF decoder. --*/
+
+#define MTFA_SIZE 4096
+#define MTFL_SIZE 16
+
+
+
+/*-- Structure holding all the decompression-side stuff. --*/
+
+typedef
+   struct {
+      /* pointer back to the struct bz_stream */
+      bz_stream* strm;
+
+      /* state indicator for this stream */
+      Int32    state;
+
+      /* for doing the final run-length decoding */
+      UChar    state_out_ch;
+      Int32    state_out_len;
+      Bool     blockRandomised;
+      BZ_RAND_DECLS;
+
+      /* the buffer for bit stream reading */
+      UInt32   bsBuff;
+      Int32    bsLive;
+
+      /* misc administratium */
+      Int32    blockSize100k;
+      Bool     smallDecompress;
+      Int32    currBlockNo;
+      Int32    verbosity;
+
+      /* for undoing the Burrows-Wheeler transform */
+      Int32    origPtr;
+      UInt32   tPos;
+      Int32    k0;
+      Int32    unzftab[256];
+      Int32    nblock_used;
+      Int32    cftab[257];
+      Int32    cftabCopy[257];
+
+      /* for undoing the Burrows-Wheeler transform (FAST) */
+      UInt32   *tt;
+
+      /* for undoing the Burrows-Wheeler transform (SMALL) */
+      UInt16   *ll16;
+      UChar    *ll4;
+
+      /* stored and calculated CRCs */
+      UInt32   storedBlockCRC;
+      UInt32   storedCombinedCRC;
+      UInt32   calculatedBlockCRC;
+      UInt32   calculatedCombinedCRC;
+
+      /* map of bytes used in block */
+      Int32    nInUse;
+      Bool     inUse[256];
+      Bool     inUse16[16];
+      UChar    seqToUnseq[256];
+
+      /* for decoding the MTF values */
+      UChar    mtfa   [MTFA_SIZE];
+      Int32    mtfbase[256 / MTFL_SIZE];
+      UChar    selector   [BZ_MAX_SELECTORS];
+      UChar    selectorMtf[BZ_MAX_SELECTORS];
+      UChar    len  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+
+      Int32    limit  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    base   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    perm   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    minLens[BZ_N_GROUPS];
+
+      /* save area for scalars in the main decompress code */
+      Int32    save_i;
+      Int32    save_j;
+      Int32    save_t;
+      Int32    save_alphaSize;
+      Int32    save_nGroups;
+      Int32    save_nSelectors;
+      Int32    save_EOB;
+      Int32    save_groupNo;
+      Int32    save_groupPos;
+      Int32    save_nextSym;
+      Int32    save_nblockMAX;
+      Int32    save_nblock;
+      Int32    save_es;
+      Int32    save_N;
+      Int32    save_curr;
+      Int32    save_zt;
+      Int32    save_zn; 
+      Int32    save_zvec;
+      Int32    save_zj;
+      Int32    save_gSel;
+      Int32    save_gMinlen;
+      Int32*   save_gLimit;
+      Int32*   save_gBase;
+      Int32*   save_gPerm;
+
+   }
+   DState;
+
+
+
+/*-- Macros for decompression. --*/
+
+#define BZ_GET_FAST(cccc)                     \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
+    s->tPos = s->tt[s->tPos];                 \
+    cccc = (UChar)(s->tPos & 0xff);           \
+    s->tPos >>= 8;
+
+#define BZ_GET_FAST_C(cccc)                   \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \
+    c_tPos = c_tt[c_tPos];                    \
+    cccc = (UChar)(c_tPos & 0xff);            \
+    c_tPos >>= 8;
+
+#define SET_LL4(i,n)                                          \
+   { if (((i) & 0x1) == 0)                                    \
+        s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else    \
+        s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4);  \
+   }
+
+#define GET_LL4(i)                             \
+   ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
+
+#define SET_LL(i,n)                          \
+   { s->ll16[i] = (UInt16)(n & 0x0000ffff);  \
+     SET_LL4(i, n >> 16);                    \
+   }
+
+#define GET_LL(i) \
+   (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
+
+#define BZ_GET_SMALL(cccc)                            \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
+    cccc = BZ2_indexIntoF ( s->tPos, s->cftab );    \
+    s->tPos = GET_LL(s->tPos);
+
+
+/*-- externs for decompression. --*/
+
+extern Int32 
+BZ2_indexIntoF ( Int32, Int32* );
+
+extern Int32 
+BZ2_decompress ( DState* );
+
+extern void 
+BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
+                           Int32,  Int32, Int32 );
+
+
+#endif
+
+
+/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/
+
+#ifdef BZ_NO_STDIO
+#ifndef NULL
+#define NULL 0
+#endif
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                   bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/bzmore b/Utilities/cmbzip2/bzmore
new file mode 100644
index 000000000..21b1de61c
--- /dev/null
+++ b/Utilities/cmbzip2/bzmore
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+# Bzmore wrapped for bzip2, 
+# adapted from zmore by Philippe Troin  for Debian GNU/Linux.
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+    *less)  more=less   ;;
+    *)  more=more       ;;
+esac
+
+if test "`echo -n a`" = "-n a"; then
+  # looks like a SysV system:
+  n1=''; n2='\c'
+else
+  n1='-n'; n2=''
+fi
+oldtty=`stty -g 2>/dev/null`
+if stty -cbreak 2>/dev/null; then
+  cb='cbreak'; ncb='-cbreak'
+else
+  # 'stty min 1' resets eof to ^a on both SunOS and SysV!
+  cb='min 1 -icanon'; ncb='icanon eof ^d'
+fi
+if test $? -eq 0 -a -n "$oldtty"; then
+   trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
+else
+   trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
+fi
+
+if test $# = 0; then
+    if test -t 0; then
+    echo usage: $prog files...
+    else
+    bzip2 -cdfq | eval $more
+    fi
+else
+    FIRST=1
+    for FILE
+    do
+    if test $FIRST -eq 0; then
+        echo $n1 "--More--(Next file: $FILE)$n2"
+        stty $cb -echo 2>/dev/null
+        ANS=`dd bs=1 count=1 2>/dev/null` 
+        stty $ncb echo 2>/dev/null
+        echo " "
+        if test "$ANS" = 'e' -o "$ANS" = 'q'; then
+            exit
+        fi
+    fi
+    if test "$ANS" != 's'; then
+        echo "------> $FILE <------"
+        bzip2 -cdfq "$FILE" | eval $more
+    fi
+    if test -t; then
+        FIRST=0
+    fi
+    done
+fi
diff --git a/Utilities/cmbzip2/bzmore.1 b/Utilities/cmbzip2/bzmore.1
new file mode 100644
index 000000000..c6868ed5c
--- /dev/null
+++ b/Utilities/cmbzip2/bzmore.1
@@ -0,0 +1,152 @@
+.\"Shamelessly copied from zmore.1 by Philippe Troin 
+.\"for Debian GNU/Linux
+.TH BZMORE 1
+.SH NAME
+bzmore, bzless \- file perusal filter for crt viewing of bzip2 compressed text
+.SH SYNOPSIS
+.B bzmore
+[ name ...  ]
+.br
+.B bzless
+[ name ...  ]
+.SH NOTE
+In the following description,
+.I bzless
+and
+.I less
+can be used interchangeably with
+.I bzmore
+and
+.I more.
+.SH DESCRIPTION
+.I  Bzmore
+is a filter which allows examination of compressed or plain text files
+one screenful at a time on a soft-copy terminal.
+.I bzmore
+works on files compressed with
+.I bzip2
+and also on uncompressed files.
+If a file does not exist,
+.I bzmore
+looks for a file of the same name with the addition of a .bz2 suffix.
+.PP
+.I Bzmore
+normally pauses after each screenful, printing --More--
+at the bottom of the screen.
+If the user then types a carriage return, one more line is displayed.
+If the user hits a space,
+another screenful is displayed.  Other possibilities are enumerated later.
+.PP
+.I Bzmore
+looks in the file
+.I /etc/termcap
+to determine terminal characteristics,
+and to determine the default window size.
+On a terminal capable of displaying 24 lines,
+the default window size is 22 lines.
+Other sequences which may be typed when
+.I bzmore
+pauses, and their effects, are as follows (\fIi\fP is an optional integer
+argument, defaulting to 1) :
+.PP
+.IP \fIi\|\fP
+display
+.I i
+more lines, (or another screenful if no argument is given)
+.PP
+.IP ^D
+display 11 more lines (a ``scroll'').
+If
+.I i
+is given, then the scroll size is set to \fIi\|\fP.
+.PP
+.IP d
+same as ^D (control-D)
+.PP
+.IP \fIi\|\fPz
+same as typing a space except that \fIi\|\fP, if present, becomes the new
+window size.  Note that the window size reverts back to the default at the
+end of the current file.
+.PP
+.IP \fIi\|\fPs
+skip \fIi\|\fP lines and print a screenful of lines
+.PP
+.IP \fIi\|\fPf
+skip \fIi\fP screenfuls and print a screenful of lines
+.PP
+.IP "q or Q"
+quit reading the current file; go on to the next (if any)
+.PP
+.IP "e or q"
+When the prompt --More--(Next file: 
+.IR file )
+is printed, this command causes bzmore to exit.
+.PP
+.IP s
+When the prompt --More--(Next file: 
+.IR file )
+is printed, this command causes bzmore to skip the next file and continue.
+.PP 
+.IP =
+Display the current line number.
+.PP
+.IP \fIi\|\fP/expr
+search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP
+If the pattern is not found,
+.I bzmore
+goes on to the next file (if any).
+Otherwise, a screenful is displayed, starting two lines before the place
+where the expression was found.
+The user's erase and kill characters may be used to edit the regular
+expression.
+Erasing back past the first column cancels the search command.
+.PP
+.IP \fIi\|\fPn
+search for the \fIi\|\fP-th occurrence of the last regular expression entered.
+.PP
+.IP !command
+invoke a shell with \fIcommand\|\fP. 
+The character `!' in "command" are replaced with the
+previous shell command.  The sequence "\\!" is replaced by "!".
+.PP
+.IP ":q or :Q"
+quit reading the current file; go on to the next (if any)
+(same as q or Q).
+.PP
+.IP .
+(dot) repeat the previous command.
+.PP
+The commands take effect immediately, i.e., it is not necessary to
+type a carriage return.
+Up to the time when the command character itself is given,
+the user may hit the line kill character to cancel the numerical
+argument being formed.
+In addition, the user may hit the erase character to redisplay the
+--More-- message.
+.PP
+At any time when output is being sent to the terminal, the user can
+hit the quit key (normally control\-\\).
+.I Bzmore
+will stop sending output, and will display the usual --More--
+prompt.
+The user may then enter one of the above commands in the normal manner.
+Unfortunately, some output is lost when this is done, due to the
+fact that any characters waiting in the terminal's output queue
+are flushed when the quit signal occurs.
+.PP
+The terminal is set to
+.I noecho
+mode by this program so that the output can be continuous.
+What you type will thus not show on your terminal, except for the / and !
+commands.
+.PP
+If the standard output is not a teletype, then
+.I bzmore
+acts just like
+.I bzcat,
+except that a header is printed before each file.
+.SH FILES
+.DT
+/etc/termcap        Terminal data base
+.SH "SEE ALSO"
+more(1), less(1), bzip2(1), bzdiff(1), bzgrep(1)
diff --git a/Utilities/cmbzip2/compress.c b/Utilities/cmbzip2/compress.c
new file mode 100644
index 000000000..7d9b3da75
--- /dev/null
+++ b/Utilities/cmbzip2/compress.c
@@ -0,0 +1,672 @@
+
+/*-------------------------------------------------------------*/
+/*--- Compression machinery (not incl block sorting)        ---*/
+/*---                                            compress.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+/* CHANGES
+    0.9.0    -- original version.
+    0.9.0a/b -- no changes in this file.
+    0.9.0c   -- changed setting of nGroups in sendMTFValues() 
+                so as to do a bit better on small files
+*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O                              ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+void BZ2_bsInitWrite ( EState* s )
+{
+   s->bsLive = 0;
+   s->bsBuff = 0;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsFinishWrite ( EState* s )
+{
+   while (s->bsLive > 0) {
+      s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
+      s->numZ++;
+      s->bsBuff <<= 8;
+      s->bsLive -= 8;
+   }
+}
+
+
+/*---------------------------------------------------*/
+#define bsNEEDW(nz)                           \
+{                                             \
+   while (s->bsLive >= 8) {                   \
+      s->zbits[s->numZ]                       \
+         = (UChar)(s->bsBuff >> 24);          \
+      s->numZ++;                              \
+      s->bsBuff <<= 8;                        \
+      s->bsLive -= 8;                         \
+   }                                          \
+}
+
+
+/*---------------------------------------------------*/
+static
+__inline__
+void bsW ( EState* s, Int32 n, UInt32 v )
+{
+   bsNEEDW ( n );
+   s->bsBuff |= (v << (32 - s->bsLive - n));
+   s->bsLive += n;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUInt32 ( EState* s, UInt32 u )
+{
+   bsW ( s, 8, (u >> 24) & 0xffL );
+   bsW ( s, 8, (u >> 16) & 0xffL );
+   bsW ( s, 8, (u >>  8) & 0xffL );
+   bsW ( s, 8,  u        & 0xffL );
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUChar ( EState* s, UChar c )
+{
+   bsW( s, 8, (UInt32)c );
+}
+
+
+/*---------------------------------------------------*/
+/*--- The back end proper                         ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+static
+void makeMaps_e ( EState* s )
+{
+   Int32 i;
+   s->nInUse = 0;
+   for (i = 0; i < 256; i++)
+      if (s->inUse[i]) {
+         s->unseqToSeq[i] = s->nInUse;
+         s->nInUse++;
+      }
+}
+
+
+/*---------------------------------------------------*/
+static
+void generateMTFValues ( EState* s )
+{
+   UChar   yy[256];
+   Int32   i, j;
+   Int32   zPend;
+   Int32   wr;
+   Int32   EOB;
+
+   /* 
+      After sorting (eg, here),
+         s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
+         and
+         ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] 
+         holds the original block data.
+
+      The first thing to do is generate the MTF values,
+      and put them in
+         ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
+      Because there are strictly fewer or equal MTF values
+      than block values, ptr values in this area are overwritten
+      with MTF values only when they are no longer needed.
+
+      The final compressed bitstream is generated into the
+      area starting at
+         (UChar*) (&((UChar*)s->arr2)[s->nblock])
+
+      These storage aliases are set up in bzCompressInit(),
+      except for the last one, which is arranged in 
+      compressBlock().
+   */
+   UInt32* ptr   = s->ptr;
+   UChar* block  = s->block;
+   UInt16* mtfv  = s->mtfv;
+
+   makeMaps_e ( s );
+   EOB = s->nInUse+1;
+
+   for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
+
+   wr = 0;
+   zPend = 0;
+   for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
+
+   for (i = 0; i < s->nblock; i++) {
+      UChar ll_i;
+      AssertD ( wr <= i, "generateMTFValues(1)" );
+      j = ptr[i]-1; if (j < 0) j += s->nblock;
+      ll_i = s->unseqToSeq[block[j]];
+      AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
+
+      if (yy[0] == ll_i) { 
+         zPend++;
+      } else {
+
+         if (zPend > 0) {
+            zPend--;
+            while (True) {
+               if (zPend & 1) {
+                  mtfv[wr] = BZ_RUNB; wr++; 
+                  s->mtfFreq[BZ_RUNB]++; 
+               } else {
+                  mtfv[wr] = BZ_RUNA; wr++; 
+                  s->mtfFreq[BZ_RUNA]++; 
+               }
+               if (zPend < 2) break;
+               zPend = (zPend - 2) / 2;
+            };
+            zPend = 0;
+         }
+         {
+            register UChar  rtmp;
+            register UChar* ryy_j;
+            register UChar  rll_i;
+            rtmp  = yy[1];
+            yy[1] = yy[0];
+            ryy_j = &(yy[1]);
+            rll_i = ll_i;
+            while ( rll_i != rtmp ) {
+               register UChar rtmp2;
+               ryy_j++;
+               rtmp2  = rtmp;
+               rtmp   = *ryy_j;
+               *ryy_j = rtmp2;
+            };
+            yy[0] = rtmp;
+            j = ryy_j - &(yy[0]);
+            mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
+         }
+
+      }
+   }
+
+   if (zPend > 0) {
+      zPend--;
+      while (True) {
+         if (zPend & 1) {
+            mtfv[wr] = BZ_RUNB; wr++; 
+            s->mtfFreq[BZ_RUNB]++; 
+         } else {
+            mtfv[wr] = BZ_RUNA; wr++; 
+            s->mtfFreq[BZ_RUNA]++; 
+         }
+         if (zPend < 2) break;
+         zPend = (zPend - 2) / 2;
+      };
+      zPend = 0;
+   }
+
+   mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
+
+   s->nMTF = wr;
+}
+
+
+/*---------------------------------------------------*/
+#define BZ_LESSER_ICOST  0
+#define BZ_GREATER_ICOST 15
+
+static
+void sendMTFValues ( EState* s )
+{
+   Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
+   Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
+   Int32 nGroups, nBytes;
+
+   /*--
+   UChar  len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   is a global since the decoder also needs it.
+
+   Int32  code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   Int32  rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   are also globals only used in this proc.
+   Made global to keep stack frame size small.
+   --*/
+
+
+   UInt16 cost[BZ_N_GROUPS];
+   Int32  fave[BZ_N_GROUPS];
+
+   UInt16* mtfv = s->mtfv;
+
+   if (s->verbosity >= 3)
+      VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
+                "%d+2 syms in use\n", 
+                s->nblock, s->nMTF, s->nInUse );
+
+   alphaSize = s->nInUse+2;
+   for (t = 0; t < BZ_N_GROUPS; t++)
+      for (v = 0; v < alphaSize; v++)
+         s->len[t][v] = BZ_GREATER_ICOST;
+
+   /*--- Decide how many coding tables to use ---*/
+   AssertH ( s->nMTF > 0, 3001 );
+   if (s->nMTF < 200)  nGroups = 2; else
+   if (s->nMTF < 600)  nGroups = 3; else
+   if (s->nMTF < 1200) nGroups = 4; else
+   if (s->nMTF < 2400) nGroups = 5; else
+                       nGroups = 6;
+
+   /*--- Generate an initial set of coding tables ---*/
+   { 
+      Int32 nPart, remF, tFreq, aFreq;
+
+      nPart = nGroups;
+      remF  = s->nMTF;
+      gs = 0;
+      while (nPart > 0) {
+         tFreq = remF / nPart;
+         ge = gs-1;
+         aFreq = 0;
+         while (aFreq < tFreq && ge < alphaSize-1) {
+            ge++;
+            aFreq += s->mtfFreq[ge];
+         }
+
+         if (ge > gs 
+             && nPart != nGroups && nPart != 1 
+             && ((nGroups-nPart) % 2 == 1)) {
+            aFreq -= s->mtfFreq[ge];
+            ge--;
+         }
+
+         if (s->verbosity >= 3)
+            VPrintf5( "      initial group %d, [%d .. %d], "
+                      "has %d syms (%4.1f%%)\n",
+                      nPart, gs, ge, aFreq, 
+                      (100.0 * (float)aFreq) / (float)(s->nMTF) );
+ 
+         for (v = 0; v < alphaSize; v++)
+            if (v >= gs && v <= ge) 
+               s->len[nPart-1][v] = BZ_LESSER_ICOST; else
+               s->len[nPart-1][v] = BZ_GREATER_ICOST;
+ 
+         nPart--;
+         gs = ge+1;
+         remF -= aFreq;
+      }
+   }
+
+   /*--- 
+      Iterate up to BZ_N_ITERS times to improve the tables.
+   ---*/
+   for (iter = 0; iter < BZ_N_ITERS; iter++) {
+
+      for (t = 0; t < nGroups; t++) fave[t] = 0;
+
+      for (t = 0; t < nGroups; t++)
+         for (v = 0; v < alphaSize; v++)
+            s->rfreq[t][v] = 0;
+
+      /*---
+        Set up an auxiliary length table which is used to fast-track
+    the common case (nGroups == 6). 
+      ---*/
+      if (nGroups == 6) {
+         for (v = 0; v < alphaSize; v++) {
+            s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
+            s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
+            s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
+     }
+      }
+
+      nSelectors = 0;
+      totc = 0;
+      gs = 0;
+      while (True) {
+
+         /*--- Set group start & end marks. --*/
+         if (gs >= s->nMTF) break;
+         ge = gs + BZ_G_SIZE - 1; 
+         if (ge >= s->nMTF) ge = s->nMTF-1;
+
+         /*-- 
+            Calculate the cost of this group as coded
+            by each of the coding tables.
+         --*/
+         for (t = 0; t < nGroups; t++) cost[t] = 0;
+
+         if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+            register UInt32 cost01, cost23, cost45;
+            register UInt16 icv;
+            cost01 = cost23 = cost45 = 0;
+
+#           define BZ_ITER(nn)                \
+               icv = mtfv[gs+(nn)];           \
+               cost01 += s->len_pack[icv][0]; \
+               cost23 += s->len_pack[icv][1]; \
+               cost45 += s->len_pack[icv][2]; \
+
+            BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);
+            BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);
+            BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
+            BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
+            BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
+            BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
+            BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
+            BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
+            BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
+            BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
+
+#           undef BZ_ITER
+
+            cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
+            cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
+            cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
+
+         } else {
+        /*--- slow version which correctly handles all situations ---*/
+            for (i = gs; i <= ge; i++) { 
+               UInt16 icv = mtfv[i];
+               for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
+            }
+         }
+ 
+         /*-- 
+            Find the coding table which is best for this group,
+            and record its identity in the selector table.
+         --*/
+         bc = 999999999; bt = -1;
+         for (t = 0; t < nGroups; t++)
+            if (cost[t] < bc) { bc = cost[t]; bt = t; };
+         totc += bc;
+         fave[bt]++;
+         s->selector[nSelectors] = bt;
+         nSelectors++;
+
+         /*-- 
+            Increment the symbol frequencies for the selected table.
+          --*/
+         if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+
+#           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
+
+            BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);
+            BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);
+            BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
+            BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
+            BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
+            BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
+            BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
+            BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
+            BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
+            BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
+
+#           undef BZ_ITUR
+
+         } else {
+        /*--- slow version which correctly handles all situations ---*/
+            for (i = gs; i <= ge; i++)
+               s->rfreq[bt][ mtfv[i] ]++;
+         }
+
+         gs = ge+1;
+      }
+      if (s->verbosity >= 3) {
+         VPrintf2 ( "      pass %d: size is %d, grp uses are ", 
+                   iter+1, totc/8 );
+         for (t = 0; t < nGroups; t++)
+            VPrintf1 ( "%d ", fave[t] );
+         VPrintf0 ( "\n" );
+      }
+
+      /*--
+        Recompute the tables based on the accumulated frequencies.
+      --*/
+      /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See 
+         comment in huffman.c for details. */
+      for (t = 0; t < nGroups; t++)
+         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 
+                                 alphaSize, 17 /*20*/ );
+   }
+
+
+   AssertH( nGroups < 8, 3002 );
+   AssertH( nSelectors < 32768 &&
+            nSelectors <= (2 + (900000 / BZ_G_SIZE)),
+            3003 );
+
+
+   /*--- Compute MTF values for the selectors. ---*/
+   {
+      UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
+      for (i = 0; i < nGroups; i++) pos[i] = i;
+      for (i = 0; i < nSelectors; i++) {
+         ll_i = s->selector[i];
+         j = 0;
+         tmp = pos[j];
+         while ( ll_i != tmp ) {
+            j++;
+            tmp2 = tmp;
+            tmp = pos[j];
+            pos[j] = tmp2;
+         };
+         pos[0] = tmp;
+         s->selectorMtf[i] = j;
+      }
+   };
+
+   /*--- Assign actual codes for the tables. --*/
+   for (t = 0; t < nGroups; t++) {
+      minLen = 32;
+      maxLen = 0;
+      for (i = 0; i < alphaSize; i++) {
+         if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+         if (s->len[t][i] < minLen) minLen = s->len[t][i];
+      }
+      AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
+      AssertH ( !(minLen < 1),  3005 );
+      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 
+                          minLen, maxLen, alphaSize );
+   }
+
+   /*--- Transmit the mapping table. ---*/
+   { 
+      Bool inUse16[16];
+      for (i = 0; i < 16; i++) {
+          inUse16[i] = False;
+          for (j = 0; j < 16; j++)
+             if (s->inUse[i * 16 + j]) inUse16[i] = True;
+      }
+     
+      nBytes = s->numZ;
+      for (i = 0; i < 16; i++)
+         if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
+
+      for (i = 0; i < 16; i++)
+         if (inUse16[i])
+            for (j = 0; j < 16; j++) {
+               if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
+            }
+
+      if (s->verbosity >= 3) 
+         VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
+   }
+
+   /*--- Now the selectors. ---*/
+   nBytes = s->numZ;
+   bsW ( s, 3, nGroups );
+   bsW ( s, 15, nSelectors );
+   for (i = 0; i < nSelectors; i++) { 
+      for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
+      bsW(s,1,0);
+   }
+   if (s->verbosity >= 3)
+      VPrintf1( "selectors %d, ", s->numZ-nBytes );
+
+   /*--- Now the coding tables. ---*/
+   nBytes = s->numZ;
+
+   for (t = 0; t < nGroups; t++) {
+      Int32 curr = s->len[t][0];
+      bsW ( s, 5, curr );
+      for (i = 0; i < alphaSize; i++) {
+         while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
+         while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
+         bsW ( s, 1, 0 );
+      }
+   }
+
+   if (s->verbosity >= 3)
+      VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
+
+   /*--- And finally, the block data proper ---*/
+   nBytes = s->numZ;
+   selCtr = 0;
+   gs = 0;
+   while (True) {
+      if (gs >= s->nMTF) break;
+      ge = gs + BZ_G_SIZE - 1; 
+      if (ge >= s->nMTF) ge = s->nMTF-1;
+      AssertH ( s->selector[selCtr] < nGroups, 3006 );
+
+      if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+            UInt16 mtfv_i;
+            UChar* s_len_sel_selCtr 
+               = &(s->len[s->selector[selCtr]][0]);
+            Int32* s_code_sel_selCtr
+               = &(s->code[s->selector[selCtr]][0]);
+
+#           define BZ_ITAH(nn)                      \
+               mtfv_i = mtfv[gs+(nn)];              \
+               bsW ( s,                             \
+                     s_len_sel_selCtr[mtfv_i],      \
+                     s_code_sel_selCtr[mtfv_i] )
+
+            BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);
+            BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);
+            BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
+            BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
+            BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
+            BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
+            BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
+            BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
+            BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
+            BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
+
+#           undef BZ_ITAH
+
+      } else {
+     /*--- slow version which correctly handles all situations ---*/
+         for (i = gs; i <= ge; i++) {
+            bsW ( s, 
+                  s->len  [s->selector[selCtr]] [mtfv[i]],
+                  s->code [s->selector[selCtr]] [mtfv[i]] );
+         }
+      }
+
+
+      gs = ge+1;
+      selCtr++;
+   }
+   AssertH( selCtr == nSelectors, 3007 );
+
+   if (s->verbosity >= 3)
+      VPrintf1( "codes %d\n", s->numZ-nBytes );
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_compressBlock ( EState* s, Bool is_last_block )
+{
+   if (s->nblock > 0) {
+
+      BZ_FINALISE_CRC ( s->blockCRC );
+      s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
+      s->combinedCRC ^= s->blockCRC;
+      if (s->blockNo > 1) s->numZ = 0;
+
+      if (s->verbosity >= 2)
+         VPrintf4( "    block %d: crc = 0x%08x, "
+                   "combined CRC = 0x%08x, size = %d\n",
+                   s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
+
+      BZ2_blockSort ( s );
+   }
+
+   s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
+
+   /*-- If this is the first block, create the stream header. --*/
+   if (s->blockNo == 1) {
+      BZ2_bsInitWrite ( s );
+      bsPutUChar ( s, BZ_HDR_B );
+      bsPutUChar ( s, BZ_HDR_Z );
+      bsPutUChar ( s, BZ_HDR_h );
+      bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
+   }
+
+   if (s->nblock > 0) {
+
+      bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
+      bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
+      bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
+
+      /*-- Now the block's CRC, so it is in a known place. --*/
+      bsPutUInt32 ( s, s->blockCRC );
+
+      /*-- 
+         Now a single bit indicating (non-)randomisation. 
+         As of version 0.9.5, we use a better sorting algorithm
+         which makes randomisation unnecessary.  So always set
+         the randomised bit to 'no'.  Of course, the decoder
+         still needs to be able to handle randomised blocks
+         so as to maintain backwards compatibility with
+         older versions of bzip2.
+      --*/
+      bsW(s,1,0);
+
+      bsW ( s, 24, s->origPtr );
+      generateMTFValues ( s );
+      sendMTFValues ( s );
+   }
+
+
+   /*-- If this is the last block, add the stream trailer. --*/
+   if (is_last_block) {
+
+      bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
+      bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
+      bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
+      bsPutUInt32 ( s, s->combinedCRC );
+      if (s->verbosity >= 2)
+         VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );
+      bsFinishWrite ( s );
+   }
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                        compress.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/crctable.c b/Utilities/cmbzip2/crctable.c
new file mode 100644
index 000000000..215687b2c
--- /dev/null
+++ b/Utilities/cmbzip2/crctable.c
@@ -0,0 +1,104 @@
+
+/*-------------------------------------------------------------*/
+/*--- Table for doing CRCs                                  ---*/
+/*---                                            crctable.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*--
+  I think this is an implementation of the AUTODIN-II,
+  Ethernet & FDDI 32-bit CRC standard.  Vaguely derived
+  from code by Rob Warnock, in Section 51 of the
+  comp.compression FAQ.
+--*/
+
+UInt32 BZ2_crc32Table[256] = {
+
+   /*-- Ugly, innit? --*/
+
+   0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
+   0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
+   0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
+   0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
+   0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
+   0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
+   0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
+   0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
+   0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
+   0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
+   0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
+   0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
+   0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
+   0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
+   0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
+   0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
+   0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
+   0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
+   0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
+   0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
+   0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
+   0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
+   0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
+   0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
+   0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
+   0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
+   0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
+   0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
+   0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
+   0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
+   0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
+   0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
+   0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
+   0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
+   0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
+   0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
+   0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
+   0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
+   0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
+   0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
+   0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
+   0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
+   0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
+   0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
+   0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
+   0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
+   0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
+   0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
+   0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
+   0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
+   0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
+   0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
+   0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
+   0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
+   0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
+   0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
+   0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
+   0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
+   0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
+   0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
+   0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
+   0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
+   0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
+   0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
+};
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                        crctable.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/decompress.c b/Utilities/cmbzip2/decompress.c
new file mode 100644
index 000000000..bba5e0fa3
--- /dev/null
+++ b/Utilities/cmbzip2/decompress.c
@@ -0,0 +1,626 @@
+
+/*-------------------------------------------------------------*/
+/*--- Decompression machinery                               ---*/
+/*---                                          decompress.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+static
+void makeMaps_d ( DState* s )
+{
+   Int32 i;
+   s->nInUse = 0;
+   for (i = 0; i < 256; i++)
+      if (s->inUse[i]) {
+         s->seqToUnseq[s->nInUse] = i;
+         s->nInUse++;
+      }
+}
+
+
+/*---------------------------------------------------*/
+#define RETURN(rrr)                               \
+   { retVal = rrr; goto save_state_and_return; };
+
+#define GET_BITS(lll,vvv,nnn)                     \
+   case lll: s->state = lll;                      \
+   while (True) {                                 \
+      if (s->bsLive >= nnn) {                     \
+         UInt32 v;                                \
+         v = (s->bsBuff >>                        \
+             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
+         s->bsLive -= nnn;                        \
+         vvv = v;                                 \
+         break;                                   \
+      }                                           \
+      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
+      s->bsBuff                                   \
+         = (s->bsBuff << 8) |                     \
+           ((UInt32)                              \
+              (*((UChar*)(s->strm->next_in))));   \
+      s->bsLive += 8;                             \
+      s->strm->next_in++;                         \
+      s->strm->avail_in--;                        \
+      s->strm->total_in_lo32++;                   \
+      if (s->strm->total_in_lo32 == 0)            \
+         s->strm->total_in_hi32++;                \
+   }
+
+#define GET_UCHAR(lll,uuu)                        \
+   GET_BITS(lll,uuu,8)
+
+#define GET_BIT(lll,uuu)                          \
+   GET_BITS(lll,uuu,1)
+
+/*---------------------------------------------------*/
+#define GET_MTF_VAL(label1,label2,lval)           \
+{                                                 \
+   if (groupPos == 0) {                           \
+      groupNo++;                                  \
+      if (groupNo >= nSelectors)                  \
+         RETURN(BZ_DATA_ERROR);                   \
+      groupPos = BZ_G_SIZE;                       \
+      gSel = s->selector[groupNo];                \
+      gMinlen = s->minLens[gSel];                 \
+      gLimit = &(s->limit[gSel][0]);              \
+      gPerm = &(s->perm[gSel][0]);                \
+      gBase = &(s->base[gSel][0]);                \
+   }                                              \
+   groupPos--;                                    \
+   zn = gMinlen;                                  \
+   GET_BITS(label1, zvec, zn);                    \
+   while (1) {                                    \
+      if (zn > 20 /* the longest code */)         \
+         RETURN(BZ_DATA_ERROR);                   \
+      if (zvec <= gLimit[zn]) break;              \
+      zn++;                                       \
+      GET_BIT(label2, zj);                        \
+      zvec = (zvec << 1) | zj;                    \
+   };                                             \
+   if (zvec - gBase[zn] < 0                       \
+       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
+      RETURN(BZ_DATA_ERROR);                      \
+   lval = gPerm[zvec - gBase[zn]];                \
+}
+
+
+/*---------------------------------------------------*/
+Int32 BZ2_decompress ( DState* s )
+{
+   UChar      uc;
+   Int32      retVal;
+   Int32      minLen, maxLen;
+   bz_stream* strm = s->strm;
+
+   /* stuff that needs to be saved/restored */
+   Int32  i;
+   Int32  j;
+   Int32  t;
+   Int32  alphaSize;
+   Int32  nGroups;
+   Int32  nSelectors;
+   Int32  EOB;
+   Int32  groupNo;
+   Int32  groupPos;
+   Int32  nextSym;
+   Int32  nblockMAX;
+   Int32  nblock;
+   Int32  es;
+   Int32  N;
+   Int32  curr;
+   Int32  zt;
+   Int32  zn; 
+   Int32  zvec;
+   Int32  zj;
+   Int32  gSel;
+   Int32  gMinlen;
+   Int32* gLimit;
+   Int32* gBase;
+   Int32* gPerm;
+
+   if (s->state == BZ_X_MAGIC_1) {
+      /*initialise the save area*/
+      s->save_i           = 0;
+      s->save_j           = 0;
+      s->save_t           = 0;
+      s->save_alphaSize   = 0;
+      s->save_nGroups     = 0;
+      s->save_nSelectors  = 0;
+      s->save_EOB         = 0;
+      s->save_groupNo     = 0;
+      s->save_groupPos    = 0;
+      s->save_nextSym     = 0;
+      s->save_nblockMAX   = 0;
+      s->save_nblock      = 0;
+      s->save_es          = 0;
+      s->save_N           = 0;
+      s->save_curr        = 0;
+      s->save_zt          = 0;
+      s->save_zn          = 0;
+      s->save_zvec        = 0;
+      s->save_zj          = 0;
+      s->save_gSel        = 0;
+      s->save_gMinlen     = 0;
+      s->save_gLimit      = NULL;
+      s->save_gBase       = NULL;
+      s->save_gPerm       = NULL;
+   }
+
+   /*restore from the save area*/
+   i           = s->save_i;
+   j           = s->save_j;
+   t           = s->save_t;
+   alphaSize   = s->save_alphaSize;
+   nGroups     = s->save_nGroups;
+   nSelectors  = s->save_nSelectors;
+   EOB         = s->save_EOB;
+   groupNo     = s->save_groupNo;
+   groupPos    = s->save_groupPos;
+   nextSym     = s->save_nextSym;
+   nblockMAX   = s->save_nblockMAX;
+   nblock      = s->save_nblock;
+   es          = s->save_es;
+   N           = s->save_N;
+   curr        = s->save_curr;
+   zt          = s->save_zt;
+   zn          = s->save_zn; 
+   zvec        = s->save_zvec;
+   zj          = s->save_zj;
+   gSel        = s->save_gSel;
+   gMinlen     = s->save_gMinlen;
+   gLimit      = s->save_gLimit;
+   gBase       = s->save_gBase;
+   gPerm       = s->save_gPerm;
+
+   retVal = BZ_OK;
+
+   switch (s->state) {
+
+      GET_UCHAR(BZ_X_MAGIC_1, uc);
+      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_UCHAR(BZ_X_MAGIC_2, uc);
+      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_UCHAR(BZ_X_MAGIC_3, uc)
+      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
+      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
+          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
+      s->blockSize100k -= BZ_HDR_0;
+
+      if (s->smallDecompress) {
+         s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
+         s->ll4  = BZALLOC( 
+                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
+                   );
+         if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
+      } else {
+         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
+         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
+      }
+
+      GET_UCHAR(BZ_X_BLKHDR_1, uc);
+
+      if (uc == 0x17) goto endhdr_2;
+      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_2, uc);
+      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_3, uc);
+      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_4, uc);
+      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_5, uc);
+      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_6, uc);
+      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+
+      s->currBlockNo++;
+      if (s->verbosity >= 2)
+         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
+ 
+      s->storedBlockCRC = 0;
+      GET_UCHAR(BZ_X_BCRC_1, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_2, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_3, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_4, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+
+      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
+
+      s->origPtr = 0;
+      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+
+      if (s->origPtr < 0)
+         RETURN(BZ_DATA_ERROR);
+      if (s->origPtr > 10 + 100000*s->blockSize100k) 
+         RETURN(BZ_DATA_ERROR);
+
+      /*--- Receive the mapping table ---*/
+      for (i = 0; i < 16; i++) {
+         GET_BIT(BZ_X_MAPPING_1, uc);
+         if (uc == 1) 
+            s->inUse16[i] = True; else 
+            s->inUse16[i] = False;
+      }
+
+      for (i = 0; i < 256; i++) s->inUse[i] = False;
+
+      for (i = 0; i < 16; i++)
+         if (s->inUse16[i])
+            for (j = 0; j < 16; j++) {
+               GET_BIT(BZ_X_MAPPING_2, uc);
+               if (uc == 1) s->inUse[i * 16 + j] = True;
+            }
+      makeMaps_d ( s );
+      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
+      alphaSize = s->nInUse+2;
+
+      /*--- Now the selectors ---*/
+      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
+      if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
+      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
+      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
+      for (i = 0; i < nSelectors; i++) {
+         j = 0;
+         while (True) {
+            GET_BIT(BZ_X_SELECTOR_3, uc);
+            if (uc == 0) break;
+            j++;
+            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
+         }
+         s->selectorMtf[i] = j;
+      }
+
+      /*--- Undo the MTF values for the selectors. ---*/
+      {
+         UChar pos[BZ_N_GROUPS], tmp, v;
+         for (v = 0; v < nGroups; v++) pos[v] = v;
+   
+         for (i = 0; i < nSelectors; i++) {
+            v = s->selectorMtf[i];
+            tmp = pos[v];
+            while (v > 0) { pos[v] = pos[v-1]; v--; }
+            pos[0] = tmp;
+            s->selector[i] = tmp;
+         }
+      }
+
+      /*--- Now the coding tables ---*/
+      for (t = 0; t < nGroups; t++) {
+         GET_BITS(BZ_X_CODING_1, curr, 5);
+         for (i = 0; i < alphaSize; i++) {
+            while (True) {
+               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
+               GET_BIT(BZ_X_CODING_2, uc);
+               if (uc == 0) break;
+               GET_BIT(BZ_X_CODING_3, uc);
+               if (uc == 0) curr++; else curr--;
+            }
+            s->len[t][i] = curr;
+         }
+      }
+
+      /*--- Create the Huffman decoding tables ---*/
+      for (t = 0; t < nGroups; t++) {
+         minLen = 32;
+         maxLen = 0;
+         for (i = 0; i < alphaSize; i++) {
+            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+            if (s->len[t][i] < minLen) minLen = s->len[t][i];
+         }
+         BZ2_hbCreateDecodeTables ( 
+            &(s->limit[t][0]), 
+            &(s->base[t][0]), 
+            &(s->perm[t][0]), 
+            &(s->len[t][0]),
+            minLen, maxLen, alphaSize
+         );
+         s->minLens[t] = minLen;
+      }
+
+      /*--- Now the MTF values ---*/
+
+      EOB      = s->nInUse+1;
+      nblockMAX = 100000 * s->blockSize100k;
+      groupNo  = -1;
+      groupPos = 0;
+
+      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
+
+      /*-- MTF init --*/
+      {
+         Int32 ii, jj, kk;
+         kk = MTFA_SIZE-1;
+         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
+            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
+               kk--;
+            }
+            s->mtfbase[ii] = kk + 1;
+         }
+      }
+      /*-- end MTF init --*/
+
+      nblock = 0;
+      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
+
+      while (True) {
+
+         if (nextSym == EOB) break;
+
+         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
+
+            es = -1;
+            N = 1;
+            do {
+               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
+               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
+               N = N * 2;
+               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
+            }
+               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
+
+            es++;
+            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
+            s->unzftab[uc] += es;
+
+            if (s->smallDecompress)
+               while (es > 0) {
+                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+                  s->ll16[nblock] = (UInt16)uc;
+                  nblock++;
+                  es--;
+               }
+            else
+               while (es > 0) {
+                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+                  s->tt[nblock] = (UInt32)uc;
+                  nblock++;
+                  es--;
+               };
+
+            continue;
+
+         } else {
+
+            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+
+            /*-- uc = MTF ( nextSym-1 ) --*/
+            {
+               Int32 ii, jj, kk, pp, lno, off;
+               UInt32 nn;
+               nn = (UInt32)(nextSym - 1);
+
+               if (nn < MTFL_SIZE) {
+                  /* avoid general-case expense */
+                  pp = s->mtfbase[0];
+                  uc = s->mtfa[pp+nn];
+                  while (nn > 3) {
+                     Int32 z = pp+nn;
+                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
+                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
+                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
+                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
+                     nn -= 4;
+                  }
+                  while (nn > 0) { 
+                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
+                  };
+                  s->mtfa[pp] = uc;
+               } else { 
+                  /* general case */
+                  lno = nn / MTFL_SIZE;
+                  off = nn % MTFL_SIZE;
+                  pp = s->mtfbase[lno] + off;
+                  uc = s->mtfa[pp];
+                  while (pp > s->mtfbase[lno]) { 
+                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
+                  };
+                  s->mtfbase[lno]++;
+                  while (lno > 0) {
+                     s->mtfbase[lno]--;
+                     s->mtfa[s->mtfbase[lno]] 
+                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
+                     lno--;
+                  }
+                  s->mtfbase[0]--;
+                  s->mtfa[s->mtfbase[0]] = uc;
+                  if (s->mtfbase[0] == 0) {
+                     kk = MTFA_SIZE-1;
+                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
+                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
+                           kk--;
+                        }
+                        s->mtfbase[ii] = kk + 1;
+                     }
+                  }
+               }
+            }
+            /*-- end uc = MTF ( nextSym-1 ) --*/
+
+            s->unzftab[s->seqToUnseq[uc]]++;
+            if (s->smallDecompress)
+               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
+               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
+            nblock++;
+
+            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
+            continue;
+         }
+      }
+
+      /* Now we know what nblock is, we can do a better sanity
+         check on s->origPtr.
+      */
+      if (s->origPtr < 0 || s->origPtr >= nblock)
+         RETURN(BZ_DATA_ERROR);
+
+      /*-- Set up cftab to facilitate generation of T^(-1) --*/
+      s->cftab[0] = 0;
+      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
+      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
+      for (i = 0; i <= 256; i++) {
+         if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
+            /* s->cftab[i] can legitimately be == nblock */
+            RETURN(BZ_DATA_ERROR);
+         }
+      }
+
+      s->state_out_len = 0;
+      s->state_out_ch  = 0;
+      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
+      s->state = BZ_X_OUTPUT;
+      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
+
+      if (s->smallDecompress) {
+
+         /*-- Make a copy of cftab, used in generation of T --*/
+         for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
+
+         /*-- compute the T vector --*/
+         for (i = 0; i < nblock; i++) {
+            uc = (UChar)(s->ll16[i]);
+            SET_LL(i, s->cftabCopy[uc]);
+            s->cftabCopy[uc]++;
+         }
+
+         /*-- Compute T^(-1) by pointer reversal on T --*/
+         i = s->origPtr;
+         j = GET_LL(i);
+         do {
+            Int32 tmp = GET_LL(j);
+            SET_LL(j, i);
+            i = j;
+            j = tmp;
+         }
+            while (i != s->origPtr);
+
+         s->tPos = s->origPtr;
+         s->nblock_used = 0;
+         if (s->blockRandomised) {
+            BZ_RAND_INIT_MASK;
+            BZ_GET_SMALL(s->k0); s->nblock_used++;
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+         } else {
+            BZ_GET_SMALL(s->k0); s->nblock_used++;
+         }
+
+      } else {
+
+         /*-- compute the T^(-1) vector --*/
+         for (i = 0; i < nblock; i++) {
+            uc = (UChar)(s->tt[i] & 0xff);
+            s->tt[s->cftab[uc]] |= (i << 8);
+            s->cftab[uc]++;
+         }
+
+         s->tPos = s->tt[s->origPtr] >> 8;
+         s->nblock_used = 0;
+         if (s->blockRandomised) {
+            BZ_RAND_INIT_MASK;
+            BZ_GET_FAST(s->k0); s->nblock_used++;
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+         } else {
+            BZ_GET_FAST(s->k0); s->nblock_used++;
+         }
+
+      }
+
+      RETURN(BZ_OK);
+
+
+
+    endhdr_2:
+
+      GET_UCHAR(BZ_X_ENDHDR_2, uc);
+      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_3, uc);
+      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_4, uc);
+      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_5, uc);
+      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_6, uc);
+      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
+
+      s->storedCombinedCRC = 0;
+      GET_UCHAR(BZ_X_CCRC_1, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_2, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_3, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_4, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+
+      s->state = BZ_X_IDLE;
+      RETURN(BZ_STREAM_END);
+
+      default: AssertH ( False, 4001 );
+   }
+
+   AssertH ( False, 4002 );
+
+   save_state_and_return:
+
+   s->save_i           = i;
+   s->save_j           = j;
+   s->save_t           = t;
+   s->save_alphaSize   = alphaSize;
+   s->save_nGroups     = nGroups;
+   s->save_nSelectors  = nSelectors;
+   s->save_EOB         = EOB;
+   s->save_groupNo     = groupNo;
+   s->save_groupPos    = groupPos;
+   s->save_nextSym     = nextSym;
+   s->save_nblockMAX   = nblockMAX;
+   s->save_nblock      = nblock;
+   s->save_es          = es;
+   s->save_N           = N;
+   s->save_curr        = curr;
+   s->save_zt          = zt;
+   s->save_zn          = zn;
+   s->save_zvec        = zvec;
+   s->save_zj          = zj;
+   s->save_gSel        = gSel;
+   s->save_gMinlen     = gMinlen;
+   s->save_gLimit      = gLimit;
+   s->save_gBase       = gBase;
+   s->save_gPerm       = gPerm;
+
+   return retVal;   
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                      decompress.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/dlltest.c b/Utilities/cmbzip2/dlltest.c
new file mode 100644
index 000000000..4e27da280
--- /dev/null
+++ b/Utilities/cmbzip2/dlltest.c
@@ -0,0 +1,175 @@
+/*
+   minibz2
+      libbz2.dll test program.
+      by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+      This file is Public Domain.  Welcome any email to me.
+
+   usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
+*/
+
+#define BZ_IMPORT
+#include 
+#include 
+#include "bzlib.h"
+#ifdef _WIN32
+#include 
+#endif
+
+
+#ifdef _WIN32
+
+#define BZ2_LIBNAME "libbz2-1.0.2.DLL" 
+
+#include 
+static int BZ2DLLLoaded = 0;
+static HINSTANCE BZ2DLLhLib;
+int BZ2DLLLoadLibrary(void)
+{
+   HINSTANCE hLib;
+
+   if(BZ2DLLLoaded==1){return 0;}
+   hLib=LoadLibrary(BZ2_LIBNAME);
+   if(hLib == NULL){
+      fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
+      return -1;
+   }
+   BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
+   BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
+   BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
+   BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
+   BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
+   BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
+   BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
+   BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
+
+   if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
+       || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
+       || !BZ2_bzclose || !BZ2_bzerror) {
+      fprintf(stderr,"GetProcAddress failed.\n");
+      return -1;
+   }
+   BZ2DLLLoaded=1;
+   BZ2DLLhLib=hLib;
+   return 0;
+
+}
+int BZ2DLLFreeLibrary(void)
+{
+   if(BZ2DLLLoaded==0){return 0;}
+   FreeLibrary(BZ2DLLhLib);
+   BZ2DLLLoaded=0;
+}
+#endif /* WIN32 */
+
+void usage(void)
+{
+   puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
+}
+
+int main(int argc,char *argv[])
+{
+   int decompress = 0;
+   int level = 9;
+   char *fn_r = NULL;
+   char *fn_w = NULL;
+
+#ifdef _WIN32
+   if(BZ2DLLLoadLibrary()<0){
+      fprintf(stderr,"Loading of %s failed.  Giving up.\n", BZ2_LIBNAME);
+      exit(1);
+   }
+   printf("Loading of %s succeeded.  Library version is %s.\n",
+          BZ2_LIBNAME, BZ2_bzlibVersion() );
+#endif
+   while(++argv,--argc){
+      if(**argv =='-' || **argv=='/'){
+         char *p;
+
+         for(p=*argv+1;*p;p++){
+            if(*p=='d'){
+               decompress = 1;
+            }else if('1'<=*p && *p<='9'){
+               level = *p - '0';
+            }else{
+               usage();
+               exit(1);
+            }
+         }
+      }else{
+         break;
+      }
+   }
+   if(argc>=1){
+      fn_r = *argv;
+      argc--;argv++;
+   }else{
+      fn_r = NULL;
+   }
+   if(argc>=1){
+      fn_w = *argv;
+      argc--;argv++;
+   }else{
+      fn_w = NULL;
+   }
+   {
+      int len;
+      char buff[0x1000];
+      char mode[10];
+
+      if(decompress){
+         BZFILE *BZ2fp_r = NULL;
+         FILE *fp_w = NULL;
+
+         if(fn_w){
+            if((fp_w = fopen(fn_w,"wb"))==NULL){
+               printf("can't open [%s]\n",fn_w);
+               perror("reason:");
+               exit(1);
+            }
+         }else{
+            fp_w = stdout;
+         }
+         if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
+            || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
+            printf("can't bz2openstream\n");
+            exit(1);
+         }
+         while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
+            fwrite(buff,1,len,fp_w);
+         }
+         BZ2_bzclose(BZ2fp_r);
+         if(fp_w != stdout) fclose(fp_w);
+      }else{
+         BZFILE *BZ2fp_w = NULL;
+         FILE *fp_r = NULL;
+
+         if(fn_r){
+            if((fp_r = fopen(fn_r,"rb"))==NULL){
+               printf("can't open [%s]\n",fn_r);
+               perror("reason:");
+               exit(1);
+            }
+         }else{
+            fp_r = stdin;
+         }
+         mode[0]='w';
+         mode[1] = '0' + level;
+         mode[2] = '\0';
+
+         if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
+            || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
+            printf("can't bz2openstream\n");
+            exit(1);
+         }
+         while((len=fread(buff,1,0x1000,fp_r))>0){
+            BZ2_bzwrite(BZ2fp_w,buff,len);
+         }
+         BZ2_bzclose(BZ2fp_w);
+         if(fp_r!=stdin)fclose(fp_r);
+      }
+   }
+#ifdef _WIN32
+   BZ2DLLFreeLibrary();
+#endif
+   return 0;
+}
diff --git a/Utilities/cmbzip2/dlltest.dsp b/Utilities/cmbzip2/dlltest.dsp
new file mode 100644
index 000000000..4b1615edc
--- /dev/null
+++ b/Utilities/cmbzip2/dlltest.dsp
@@ -0,0 +1,93 @@
+# Microsoft Developer Studio Project File - Name="dlltest" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** •ÒW‚µ‚È‚¢‚Å‚­‚¾‚³‚¢ **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=dlltest - Win32 Debug
+!MESSAGE ‚±‚ê‚Í—LŒø‚ÈÒ²¸Ì§²Ù‚Å‚Í‚ ‚è‚Ü‚¹‚ñB ‚±‚ÌÌßÛ¼Þª¸Ä‚ðËÞÙÄÞ‚·‚邽‚ß‚É‚Í NMAKE ‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+!MESSAGE [Ò²¸Ì§²Ù‚Ì´¸½Îß°Ä] ºÏÝÄÞ‚ðŽg—p‚µ‚ÄŽÀs‚µ‚Ä‚­‚¾‚³‚¢
+!MESSAGE 
+!MESSAGE NMAKE /f "dlltest.mak".
+!MESSAGE 
+!MESSAGE NMAKE ‚ÌŽÀsŽž‚É\¬‚ðŽw’è‚Å‚«‚Ü‚·
+!MESSAGE ºÏÝÄÞ ×²Ýã‚ÅϸۂÌÝ’è‚ð’è‹`‚µ‚Ü‚·B—á:
+!MESSAGE 
+!MESSAGE NMAKE /f "dlltest.mak" CFG="dlltest - Win32 Debug"
+!MESSAGE 
+!MESSAGE ‘I‘ð‰Â”\‚ÈËÞÙÄÞ Ó°ÄÞ:
+!MESSAGE 
+!MESSAGE "dlltest - Win32 Release" ("Win32 (x86) Console Application" —p)
+!MESSAGE "dlltest - Win32 Debug" ("Win32 (x86) Console Application" —p)
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "dlltest - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"minibz2.exe"
+
+!ELSEIF  "$(CFG)" == "dlltest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "dlltest_"
+# PROP BASE Intermediate_Dir "dlltest_"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "dlltest_"
+# PROP Intermediate_Dir "dlltest_"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"minibz2.exe" /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "dlltest - Win32 Release"
+# Name "dlltest - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dlltest.c
+# End Source File
+# End Target
+# End Project
diff --git a/Utilities/cmbzip2/entities.xml b/Utilities/cmbzip2/entities.xml
new file mode 100644
index 000000000..e9e0553b7
--- /dev/null
+++ b/Utilities/cmbzip2/entities.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Utilities/cmbzip2/format.pl b/Utilities/cmbzip2/format.pl
new file mode 100755
index 000000000..2b391dad6
--- /dev/null
+++ b/Utilities/cmbzip2/format.pl
@@ -0,0 +1,68 @@
+#!/usr/bin/perl -w
+#
+# ------------------------------------------------------------------
+# This file is part of bzip2/libbzip2, a program and library for
+# lossless, block-sorting data compression.
+#
+# bzip2/libbzip2 version 1.0.5 of 10 December 2007
+# Copyright (C) 1996-2007 Julian Seward 
+#
+# Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+# README file.
+#
+# This program is released under the terms of the license contained
+# in the file LICENSE.
+# ------------------------------------------------------------------
+#
+use strict;
+
+# get command line values:
+if ( $#ARGV !=1 ) {
+    die "Usage:  $0 xml_infile xml_outfile\n";
+}
+
+my $infile = shift;
+# check infile exists
+die "Can't find file \"$infile\""
+  unless -f $infile;
+# check we can read infile
+if (! -r $infile) {
+    die "Can't read input $infile\n";
+}
+# check we can open infile
+open( INFILE,"<$infile" ) or 
+    die "Can't input $infile $!";
+
+#my $outfile = 'fmt-manual.xml';
+my $outfile = shift;
+#print "Infile: $infile, Outfile: $outfile\n";
+# check we can write to outfile
+open( OUTFILE,">$outfile" ) or 
+    die "Can't output $outfile $! for writing";
+
+my ($prev, $curr, $str);
+$prev = ''; $curr = '';
+while (  ) {
+
+        print OUTFILE $prev;
+    $prev = $curr;
+    $curr = $_;
+    $str = '';
+
+    if ( $prev =~ /$|$/ ) {
+        chomp $prev;
+        $curr = join( '', $prev, "|<\/screen>/ ) {
+        chomp $prev;
+        $curr = join( '', $prev, "]]>", $curr );
+                $prev = '';
+        next;
+    }
+}
+print OUTFILE $curr;
+close INFILE;
+close OUTFILE;
+exit;
diff --git a/Utilities/cmbzip2/huffman.c b/Utilities/cmbzip2/huffman.c
new file mode 100644
index 000000000..87e79e38a
--- /dev/null
+++ b/Utilities/cmbzip2/huffman.c
@@ -0,0 +1,205 @@
+
+/*-------------------------------------------------------------*/
+/*--- Huffman coding low-level stuff                        ---*/
+/*---                                             huffman.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------------*/
+#define WEIGHTOF(zz0)  ((zz0) & 0xffffff00)
+#define DEPTHOF(zz1)   ((zz1) & 0x000000ff)
+#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3))
+
+#define ADDWEIGHTS(zw1,zw2)                           \
+   (WEIGHTOF(zw1)+WEIGHTOF(zw2)) |                    \
+   (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2)))
+
+#define UPHEAP(z)                                     \
+{                                                     \
+   Int32 zz, tmp;                                     \
+   zz = z; tmp = heap[zz];                            \
+   while (weight[tmp] < weight[heap[zz >> 1]]) {      \
+      heap[zz] = heap[zz >> 1];                       \
+      zz >>= 1;                                       \
+   }                                                  \
+   heap[zz] = tmp;                                    \
+}
+
+#define DOWNHEAP(z)                                   \
+{                                                     \
+   Int32 zz, yy, tmp;                                 \
+   zz = z; tmp = heap[zz];                            \
+   while (True) {                                     \
+      yy = zz << 1;                                   \
+      if (yy > nHeap) break;                          \
+      if (yy < nHeap &&                               \
+          weight[heap[yy+1]] < weight[heap[yy]])      \
+         yy++;                                        \
+      if (weight[tmp] < weight[heap[yy]]) break;      \
+      heap[zz] = heap[yy];                            \
+      zz = yy;                                        \
+   }                                                  \
+   heap[zz] = tmp;                                    \
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbMakeCodeLengths ( UChar *len, 
+                             Int32 *freq,
+                             Int32 alphaSize,
+                             Int32 maxLen )
+{
+   /*--
+      Nodes and heap entries run from 1.  Entry 0
+      for both the heap and nodes is a sentinel.
+   --*/
+   Int32 nNodes, nHeap, n1, n2, i, j, k;
+   Bool  tooLong;
+
+   Int32 heap   [ BZ_MAX_ALPHA_SIZE + 2 ];
+   Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
+   Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; 
+
+   for (i = 0; i < alphaSize; i++)
+      weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
+
+   while (True) {
+
+      nNodes = alphaSize;
+      nHeap = 0;
+
+      heap[0] = 0;
+      weight[0] = 0;
+      parent[0] = -2;
+
+      for (i = 1; i <= alphaSize; i++) {
+         parent[i] = -1;
+         nHeap++;
+         heap[nHeap] = i;
+         UPHEAP(nHeap);
+      }
+
+      AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
+   
+      while (nHeap > 1) {
+         n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+         n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+         nNodes++;
+         parent[n1] = parent[n2] = nNodes;
+         weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);
+         parent[nNodes] = -1;
+         nHeap++;
+         heap[nHeap] = nNodes;
+         UPHEAP(nHeap);
+      }
+
+      AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 );
+
+      tooLong = False;
+      for (i = 1; i <= alphaSize; i++) {
+         j = 0;
+         k = i;
+         while (parent[k] >= 0) { k = parent[k]; j++; }
+         len[i-1] = j;
+         if (j > maxLen) tooLong = True;
+      }
+      
+      if (! tooLong) break;
+
+      /* 17 Oct 04: keep-going condition for the following loop used
+         to be 'i < alphaSize', which missed the last element,
+         theoretically leading to the possibility of the compressor
+         looping.  However, this count-scaling step is only needed if
+         one of the generated Huffman code words is longer than
+         maxLen, which up to and including version 1.0.2 was 20 bits,
+         which is extremely unlikely.  In version 1.0.3 maxLen was
+         changed to 17 bits, which has minimal effect on compression
+         ratio, but does mean this scaling step is used from time to
+         time, enough to verify that it works.
+
+         This means that bzip2-1.0.3 and later will only produce
+         Huffman codes with a maximum length of 17 bits.  However, in
+         order to preserve backwards compatibility with bitstreams
+         produced by versions pre-1.0.3, the decompressor must still
+         handle lengths of up to 20. */
+
+      for (i = 1; i <= alphaSize; i++) {
+         j = weight[i] >> 8;
+         j = 1 + (j / 2);
+         weight[i] = j << 8;
+      }
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbAssignCodes ( Int32 *code,
+                         UChar *length,
+                         Int32 minLen,
+                         Int32 maxLen,
+                         Int32 alphaSize )
+{
+   Int32 n, vec, i;
+
+   vec = 0;
+   for (n = minLen; n <= maxLen; n++) {
+      for (i = 0; i < alphaSize; i++)
+         if (length[i] == n) { code[i] = vec; vec++; };
+      vec <<= 1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbCreateDecodeTables ( Int32 *limit,
+                                Int32 *base,
+                                Int32 *perm,
+                                UChar *length,
+                                Int32 minLen,
+                                Int32 maxLen,
+                                Int32 alphaSize )
+{
+   Int32 pp, i, j, vec;
+
+   pp = 0;
+   for (i = minLen; i <= maxLen; i++)
+      for (j = 0; j < alphaSize; j++)
+         if (length[j] == i) { perm[pp] = j; pp++; };
+
+   for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0;
+   for (i = 0; i < alphaSize; i++) base[length[i]+1]++;
+
+   for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1];
+
+   for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0;
+   vec = 0;
+
+   for (i = minLen; i <= maxLen; i++) {
+      vec += (base[i+1] - base[i]);
+      limit[i] = vec-1;
+      vec <<= 1;
+   }
+   for (i = minLen + 1; i <= maxLen; i++)
+      base[i] = ((limit[i-1] + 1) << 1) - base[i];
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                         huffman.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Utilities/cmbzip2/libbz2.def b/Utilities/cmbzip2/libbz2.def
new file mode 100644
index 000000000..69fef54bc
--- /dev/null
+++ b/Utilities/cmbzip2/libbz2.def
@@ -0,0 +1,27 @@
+LIBRARY         LIBBZ2
+DESCRIPTION     "libbzip2: library for data compression"
+EXPORTS
+    BZ2_bzCompressInit
+    BZ2_bzCompress
+    BZ2_bzCompressEnd
+    BZ2_bzDecompressInit
+    BZ2_bzDecompress
+    BZ2_bzDecompressEnd
+    BZ2_bzReadOpen
+    BZ2_bzReadClose
+    BZ2_bzReadGetUnused
+    BZ2_bzRead
+    BZ2_bzWriteOpen
+    BZ2_bzWrite
+    BZ2_bzWriteClose
+    BZ2_bzWriteClose64
+    BZ2_bzBuffToBuffCompress
+    BZ2_bzBuffToBuffDecompress
+    BZ2_bzlibVersion
+    BZ2_bzopen
+    BZ2_bzdopen
+    BZ2_bzread
+    BZ2_bzwrite
+    BZ2_bzflush
+    BZ2_bzclose
+    BZ2_bzerror
diff --git a/Utilities/cmbzip2/libbz2.dsp b/Utilities/cmbzip2/libbz2.dsp
new file mode 100644
index 000000000..a21a20f75
--- /dev/null
+++ b/Utilities/cmbzip2/libbz2.dsp
@@ -0,0 +1,130 @@
+# Microsoft Developer Studio Project File - Name="libbz2" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** •ÒW‚µ‚È‚¢‚Å‚­‚¾‚³‚¢ **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libbz2 - Win32 Debug
+!MESSAGE ‚±‚ê‚Í—LŒø‚ÈÒ²¸Ì§²Ù‚Å‚Í‚ ‚è‚Ü‚¹‚ñB ‚±‚ÌÌßÛ¼Þª¸Ä‚ðËÞÙÄÞ‚·‚邽‚ß‚É‚Í NMAKE ‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+!MESSAGE [Ò²¸Ì§²Ù‚Ì´¸½Îß°Ä] ºÏÝÄÞ‚ðŽg—p‚µ‚ÄŽÀs‚µ‚Ä‚­‚¾‚³‚¢
+!MESSAGE 
+!MESSAGE NMAKE /f "libbz2.mak".
+!MESSAGE 
+!MESSAGE NMAKE ‚ÌŽÀsŽž‚É\¬‚ðŽw’è‚Å‚«‚Ü‚·
+!MESSAGE ºÏÝÄÞ ×²Ýã‚ÅϸۂÌÝ’è‚ð’è‹`‚µ‚Ü‚·B—á:
+!MESSAGE 
+!MESSAGE NMAKE /f "libbz2.mak" CFG="libbz2 - Win32 Debug"
+!MESSAGE 
+!MESSAGE ‘I‘ð‰Â”\‚ÈËÞÙÄÞ Ó°ÄÞ:
+!MESSAGE 
+!MESSAGE "libbz2 - Win32 Release" ("Win32 (x86) Dynamic-Link Library" —p)
+!MESSAGE "libbz2 - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" —p)
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libbz2 - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"libbz2.dll"
+
+!ELSEIF  "$(CFG)" == "libbz2 - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"libbz2.dll" /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libbz2 - Win32 Release"
+# Name "libbz2 - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\blocksort.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib_private.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\compress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\crctable.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\decompress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\huffman.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\libbz2.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\randtable.c
+# End Source File
+# End Target
+# End Project
diff --git a/Utilities/cmbzip2/libbz2.lib b/Utilities/cmbzip2/libbz2.lib
new file mode 100644
index 0000000000000000000000000000000000000000..9a97a75e24f4a9c5b8f550597c45544d74d1d830
GIT binary patch
literal 60774
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 sample1.rb2
+    .\\bzip2 -2  < sample2.ref > sample2.rb2
+    .\\bzip2 -3  < sample3.ref > sample3.rb2
+    .\\bzip2 -d  < sample1.bz2 > sample1.tst
+    .\\bzip2 -d  < sample2.bz2 > sample2.tst
+    .\\bzip2 -ds < sample3.bz2 > sample3.tst
+    @echo All six of the fc's should find no differences.
+    @echo If fc finds an error on sample3.bz2, this could be
+    @echo because WinZip's 'TAR file smart CR/LF conversion'
+    @echo is too clever for its own good.  Disable this option.
+    @echo The correct size for sample3.ref is 120,244.  If it
+    @echo is 150,251, WinZip has messed it up.
+    fc sample1.bz2 sample1.rb2 
+    fc sample2.bz2 sample2.rb2
+    fc sample3.bz2 sample3.rb2
+    fc sample1.tst sample1.ref
+    fc sample2.tst sample2.ref
+    fc sample3.tst sample3.ref
+
+
+
+clean: 
+    del *.obj
+    del libbz2.lib 
+    del bzip2.exe
+    del bzip2recover.exe
+    del sample1.rb2 
+    del sample2.rb2 
+    del sample3.rb2
+    del sample1.tst 
+    del sample2.tst
+    del sample3.tst
+
+.c.obj: 
+    $(CC) $(CFLAGS) -c $*.c -o $*.obj
+
diff --git a/Utilities/cmbzip2/manual.html b/Utilities/cmbzip2/manual.html
new file mode 100644
index 000000000..bb4495385
--- /dev/null
+++ b/Utilities/cmbzip2/manual.html
@@ -0,0 +1,2540 @@
+
+
+
+bzip2 and libbzip2, version 1.0.5
+
+
+
+
+
+
+

+bzip2 and libbzip2, version 1.0.5

+

A program and library for data compression

+
+

+Julian Seward +

+
http://www.bzip.org
+
+

Version 1.0.5 of 10 December 2007

+
+
+

This program, bzip2, the + associated library libbzip2, and + all documentation, are copyright © 1996-2007 Julian Seward. + All rights reserved.

+

Redistribution and use in source and binary forms, with + or without modification, are permitted provided that the + following conditions are met:

+
    +
  • Redistributions of source code must retain the + above copyright notice, this list of conditions and the + following disclaimer.

  • +
  • The origin of this software must not be + misrepresented; you must not claim that you wrote the original + software. If you use this software in a product, an + acknowledgment in the product documentation would be + appreciated but is not required.

  • +
  • Altered source versions must be plainly marked + as such, and must not be misrepresented as being the original + software.

  • +
  • The name of the author may not be used to + endorse or promote products derived from this software without + specific prior written permission.

  • +
+

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 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.

+

PATENTS: To the best of my knowledge, + bzip2 and + libbzip2 do not use any patented + algorithms. However, I do not have the resources to carry + out a patent search. Therefore I cannot give any guarantee of + the above statement. +

+
+
+
+
+ +
+

+1. Introduction

+

bzip2 compresses files +using the Burrows-Wheeler block-sorting text compression +algorithm, and Huffman coding. Compression is generally +considerably better than that achieved by more conventional +LZ77/LZ78-based compressors, and approaches the performance of +the PPM family of statistical compressors.

+

bzip2 is built on top of +libbzip2, a flexible library for +handling compressed data in the +bzip2 format. This manual +describes both how to use the program and how to work with the +library interface. Most of the manual is devoted to this +library, not the program, which is good news if your interest is +only in the program.

+
    +
  • How to use bzip2 describes how to use + bzip2; this is the only part + you need to read if you just want to know how to operate the + program.

  • +
  • Programming with libbzip2 describes the + programming interfaces in detail, and

  • +
  • Miscellanea records some + miscellaneous notes which I thought ought to be recorded + somewhere.

  • +
+
+
+

+2. How to use bzip2

+ +

This chapter contains a copy of the +bzip2 man page, and nothing +else.

+
+

+2.1. NAME

+
    +
  • bzip2, + bunzip2 - a block-sorting file + compressor, v1.0.4

  • +
  • bzcat - + decompresses files to stdout

  • +
  • bzip2recover - + recovers data from damaged bzip2 files

  • +
+
+
+

+2.2. SYNOPSIS

+
    +
  • bzip2 [ + -cdfkqstvzVL123456789 ] [ filenames ... ]

  • +
  • bunzip2 [ + -fkvsVL ] [ filenames ... ]

  • +
  • bzcat [ -s ] [ + filenames ... ]

  • +
  • bzip2recover + filename

  • +
+
+
+

+2.3. DESCRIPTION

+

bzip2 compresses files +using the Burrows-Wheeler block sorting text compression +algorithm, and Huffman coding. Compression is generally +considerably better than that achieved by more conventional +LZ77/LZ78-based compressors, and approaches the performance of +the PPM family of statistical compressors.

+

The command-line options are deliberately very similar to +those of GNU gzip, but they are +not identical.

+

bzip2 expects a list of +file names to accompany the command-line flags. Each file is +replaced by a compressed version of itself, with the name +original_name.bz2. Each +compressed file has the same modification date, permissions, and, +when possible, ownership as the corresponding original, so that +these properties can be correctly restored at decompression time. +File name handling is naive in the sense that there is no +mechanism for preserving original file names, permissions, +ownerships or dates in filesystems which lack these concepts, or +have serious file name length restrictions, such as +MS-DOS.

+

bzip2 and +bunzip2 will by default not +overwrite existing files. If you want this to happen, specify +the -f flag.

+

If no file names are specified, +bzip2 compresses from standard +input to standard output. In this case, +bzip2 will decline to write +compressed output to a terminal, as this would be entirely +incomprehensible and therefore pointless.

+

bunzip2 (or +bzip2 -d) decompresses all +specified files. Files which were not created by +bzip2 will be detected and +ignored, and a warning issued. +bzip2 attempts to guess the +filename for the decompressed file from that of the compressed +file as follows:

+
    +
  • filename.bz2 + becomes + filename

  • +
  • filename.bz + becomes + filename

  • +
  • filename.tbz2 + becomes + filename.tar

  • +
  • filename.tbz + becomes + filename.tar

  • +
  • anyothername + becomes + anyothername.out

  • +
+

If the file does not end in one of the recognised endings, +.bz2, +.bz, +.tbz2 or +.tbz, +bzip2 complains that it cannot +guess the name of the original file, and uses the original name +with .out appended.

+

As with compression, supplying no filenames causes +decompression from standard input to standard output.

+

bunzip2 will correctly +decompress a file which is the concatenation of two or more +compressed files. The result is the concatenation of the +corresponding uncompressed files. Integrity testing +(-t) of concatenated compressed +files is also supported.

+

You can also compress or decompress files to the standard +output by giving the -c flag. +Multiple files may be compressed and decompressed like this. The +resulting outputs are fed sequentially to stdout. Compression of +multiple files in this manner generates a stream containing +multiple compressed file representations. Such a stream can be +decompressed correctly only by +bzip2 version 0.9.0 or later. +Earlier versions of bzip2 will +stop after decompressing the first file in the stream.

+

bzcat (or +bzip2 -dc) decompresses all +specified files to the standard output.

+

bzip2 will read arguments +from the environment variables +BZIP2 and +BZIP, in that order, and will +process them before any arguments read from the command line. +This gives a convenient way to supply default arguments.

+

Compression is always performed, even if the compressed +file is slightly larger than the original. Files of less than +about one hundred bytes tend to get larger, since the compression +mechanism has a constant overhead in the region of 50 bytes. +Random data (including the output of most file compressors) is +coded at about 8.05 bits per byte, giving an expansion of around +0.5%.

+

As a self-check for your protection, +bzip2 uses 32-bit CRCs to make +sure that the decompressed version of a file is identical to the +original. This guards against corruption of the compressed data, +and against undetected bugs in +bzip2 (hopefully very unlikely). +The chances of data corruption going undetected is microscopic, +about one chance in four billion for each file processed. Be +aware, though, that the check occurs upon decompression, so it +can only tell you that something is wrong. It can't help you +recover the original uncompressed data. You can use +bzip2recover to try to recover +data from damaged files.

+

Return values: 0 for a normal exit, 1 for environmental +problems (file not found, invalid flags, I/O errors, etc.), 2 +to indicate a corrupt compressed file, 3 for an internal +consistency error (eg, bug) which caused +bzip2 to panic.

+
+
+

+2.4. OPTIONS

+
+
-c --stdout
+

Compress or decompress to standard + output.

+
-d --decompress
+

Force decompression. + bzip2, + bunzip2 and + bzcat are really the same + program, and the decision about what actions to take is done on + the basis of which name is used. This flag overrides that + mechanism, and forces bzip2 to decompress.

+
-z --compress
+

The complement to + -d: forces compression, + regardless of the invokation name.

+
-t --test
+

Check integrity of the specified file(s), but + don't decompress them. This really performs a trial + decompression and throws away the result.

+
-f --force
+
+

Force overwrite of output files. Normally, + bzip2 will not overwrite + existing output files. Also forces + bzip2 to break hard links to + files, which it otherwise wouldn't do.

+

bzip2 normally declines + to decompress files which don't have the correct magic header + bytes. If forced (-f), + however, it will pass such files through unmodified. This is + how GNU gzip behaves.

+
+
-k --keep
+

Keep (don't delete) input files during + compression or decompression.

+
-s --small
+
+

Reduce memory usage, for compression, + decompression and testing. Files are decompressed and tested + using a modified algorithm which only requires 2.5 bytes per + block byte. This means any file can be decompressed in 2300k + of memory, albeit at about half the normal speed.

+

During compression, -s + selects a block size of 200k, which limits memory use to around + the same figure, at the expense of your compression ratio. In + short, if your machine is low on memory (8 megabytes or less), + use -s for everything. See + MEMORY MANAGEMENT below.

+
+
-q --quiet
+

Suppress non-essential warning messages. + Messages pertaining to I/O errors and other critical events + will not be suppressed.

+
-v --verbose
+

Verbose mode -- show the compression ratio for + each file processed. Further + -v's increase the verbosity + level, spewing out lots of information which is primarily of + interest for diagnostic purposes.

+
-L --license -V --version
+

Display the software version, license terms and + conditions.

+
-1 (or + --fast) to + -9 (or + -best)
+

Set the block size to 100 k, 200 k ... 900 k + when compressing. Has no effect when decompressing. See MEMORY MANAGEMENT below. The + --fast and + --best aliases are primarily + for GNU gzip compatibility. + In particular, --fast doesn't + make things significantly faster. And + --best merely selects the + default behaviour.

+
--
+

Treats all subsequent arguments as file names, + even if they start with a dash. This is so you can handle + files with names beginning with a dash, for example: + bzip2 -- + -myfilename.

+
+--repetitive-fast, --repetitive-best +
+

These flags are redundant in versions 0.9.5 and + above. They provided some coarse control over the behaviour of + the sorting algorithm in earlier versions, which was sometimes + useful. 0.9.5 and above have an improved algorithm which + renders these flags irrelevant.

+
+
+
+

+2.5. MEMORY MANAGEMENT

+

bzip2 compresses large +files in blocks. The block size affects both the compression +ratio achieved, and the amount of memory needed for compression +and decompression. The flags -1 +through -9 specify the block +size to be 100,000 bytes through 900,000 bytes (the default) +respectively. At decompression time, the block size used for +compression is read from the header of the compressed file, and +bunzip2 then allocates itself +just enough memory to decompress the file. Since block sizes are +stored in compressed files, it follows that the flags +-1 to +-9 are irrelevant to and so +ignored during decompression.

+

Compression and decompression requirements, in bytes, can be +estimated as:

+
Compression:   400k + ( 8 x block size )
+
+Decompression: 100k + ( 4 x block size ), or
+               100k + ( 2.5 x block size )
+

Larger block sizes give rapidly diminishing marginal +returns. Most of the compression comes from the first two or +three hundred k of block size, a fact worth bearing in mind when +using bzip2 on small machines. +It is also important to appreciate that the decompression memory +requirement is set at compression time by the choice of block +size.

+

For files compressed with the default 900k block size, +bunzip2 will require about 3700 +kbytes to decompress. To support decompression of any file on a +4 megabyte machine, bunzip2 has +an option to decompress using approximately half this amount of +memory, about 2300 kbytes. Decompression speed is also halved, +so you should use this option only where necessary. The relevant +flag is -s.

+

In general, try and use the largest block size memory +constraints allow, since that maximises the compression achieved. +Compression and decompression speed are virtually unaffected by +block size.

+

Another significant point applies to files which fit in a +single block -- that means most files you'd encounter using a +large block size. The amount of real memory touched is +proportional to the size of the file, since the file is smaller +than a block. For example, compressing a file 20,000 bytes long +with the flag -9 will cause the +compressor to allocate around 7600k of memory, but only touch +400k + 20000 * 8 = 560 kbytes of it. Similarly, the decompressor +will allocate 3700k but only touch 100k + 20000 * 4 = 180 +kbytes.

+

Here is a table which summarises the maximum memory usage +for different block sizes. Also recorded is the total compressed +size for 14 files of the Calgary Text Compression Corpus +totalling 3,141,622 bytes. This column gives some feel for how +compression varies with block size. These figures tend to +understate the advantage of larger block sizes for larger files, +since the Corpus is dominated by smaller files.

+
        Compress   Decompress   Decompress   Corpus
+Flag     usage      usage       -s usage     Size
+
+ -1      1200k       500k         350k      914704
+ -2      2000k       900k         600k      877703
+ -3      2800k      1300k         850k      860338
+ -4      3600k      1700k        1100k      846899
+ -5      4400k      2100k        1350k      845160
+ -6      5200k      2500k        1600k      838626
+ -7      6100k      2900k        1850k      834096
+ -8      6800k      3300k        2100k      828642
+ -9      7600k      3700k        2350k      828642
+
+
+

+2.6. RECOVERING DATA FROM DAMAGED FILES

+

bzip2 compresses files in +blocks, usually 900kbytes long. Each block is handled +independently. If a media or transmission error causes a +multi-block .bz2 file to become +damaged, it may be possible to recover data from the undamaged +blocks in the file.

+

The compressed representation of each block is delimited by +a 48-bit pattern, which makes it possible to find the block +boundaries with reasonable certainty. Each block also carries +its own 32-bit CRC, so damaged blocks can be distinguished from +undamaged ones.

+

bzip2recover is a simple +program whose purpose is to search for blocks in +.bz2 files, and write each block +out into its own .bz2 file. You +can then use bzip2 -t to test +the integrity of the resulting files, and decompress those which +are undamaged.

+

bzip2recover takes a +single argument, the name of the damaged file, and writes a +number of files rec0001file.bz2, +rec0002file.bz2, etc, containing +the extracted blocks. The output filenames are designed so that +the use of wildcards in subsequent processing -- for example, +bzip2 -dc rec*file.bz2 > +recovered_data -- lists the files in the correct +order.

+

bzip2recover should be of +most use dealing with large .bz2 +files, as these will contain many blocks. It is clearly futile +to use it on damaged single-block files, since a damaged block +cannot be recovered. If you wish to minimise any potential data +loss through media or transmission errors, you might consider +compressing with a smaller block size.

+
+
+

+2.7. PERFORMANCE NOTES

+

The sorting phase of compression gathers together similar +strings in the file. Because of this, files containing very long +runs of repeated symbols, like "aabaabaabaab ..." (repeated +several hundred times) may compress more slowly than normal. +Versions 0.9.5 and above fare much better than previous versions +in this respect. The ratio between worst-case and average-case +compression time is in the region of 10:1. For previous +versions, this figure was more like 100:1. You can use the +-vvvv option to monitor progress +in great detail, if you want.

+

Decompression speed is unaffected by these +phenomena.

+

bzip2 usually allocates +several megabytes of memory to operate in, and then charges all +over it in a fairly random fashion. This means that performance, +both for compressing and decompressing, is largely determined by +the speed at which your machine can service cache misses. +Because of this, small changes to the code to reduce the miss +rate have been observed to give disproportionately large +performance improvements. I imagine +bzip2 will perform best on +machines with very large caches.

+
+
+

+2.8. CAVEATS

+

I/O error messages are not as helpful as they could be. +bzip2 tries hard to detect I/O +errors and exit cleanly, but the details of what the problem is +sometimes seem rather misleading.

+

This manual page pertains to version 1.0.5 of +bzip2. Compressed data created by +this version is entirely forwards and backwards compatible with the +previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0, +1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and +above can correctly decompress multiple concatenated compressed files. +0.1pl2 cannot do this; it will stop after decompressing just the first +file in the stream.

+

bzip2recover versions +prior to 1.0.2 used 32-bit integers to represent bit positions in +compressed files, so it could not handle compressed files more +than 512 megabytes long. Versions 1.0.2 and above use 64-bit ints +on some platforms which support them (GNU supported targets, and +Windows). To establish whether or not +bzip2recover was built with such +a limitation, run it without arguments. In any event you can +build yourself an unlimited version if you can recompile it with +MaybeUInt64 set to be an +unsigned 64-bit integer.

+
+
+

+2.9. AUTHOR

+

Julian Seward, +jseward@bzip.org

+

The ideas embodied in +bzip2 are due to (at least) the +following people: Michael Burrows and David Wheeler (for the +block sorting transformation), David Wheeler (again, for the +Huffman coder), Peter Fenwick (for the structured coding model in +the original bzip, and many +refinements), and Alistair Moffat, Radford Neal and Ian Witten +(for the arithmetic coder in the original +bzip). I am much indebted for +their help, support and advice. See the manual in the source +distribution for pointers to sources of documentation. Christian +von Roques encouraged me to look for faster sorting algorithms, +so as to speed up compression. Bela Lubkin encouraged me to +improve the worst-case compression performance. +Donna Robinson XMLised the documentation. +Many people sent +patches, helped with portability problems, lent machines, gave +advice and were generally helpful.

+
+
+
+

+3.  +Programming with libbzip2 +

+ +

This chapter describes the programming interface to +libbzip2.

+

For general background information, particularly about +memory use and performance aspects, you'd be well advised to read +How to use bzip2 as well.

+
+

+3.1. Top-level structure

+

libbzip2 is a flexible +library for compressing and decompressing data in the +bzip2 data format. Although +packaged as a single entity, it helps to regard the library as +three separate parts: the low level interface, and the high level +interface, and some utility functions.

+

The structure of +libbzip2's interfaces is similar +to that of Jean-loup Gailly's and Mark Adler's excellent +zlib library.

+

All externally visible symbols have names beginning +BZ2_. This is new in version +1.0. The intention is to minimise pollution of the namespaces of +library clients.

+

To use any part of the library, you need to +#include <bzlib.h> +into your sources.

+
+

+3.1.1. Low-level summary

+

This interface provides services for compressing and +decompressing data in memory. There's no provision for dealing +with files, streams or any other I/O mechanisms, just straight +memory-to-memory work. In fact, this part of the library can be +compiled without inclusion of +stdio.h, which may be helpful +for embedded applications.

+

The low-level part of the library has no global variables +and is therefore thread-safe.

+

Six routines make up the low level interface: +BZ2_bzCompressInit, +BZ2_bzCompress, and +BZ2_bzCompressEnd for +compression, and a corresponding trio +BZ2_bzDecompressInit, +BZ2_bzDecompress and +BZ2_bzDecompressEnd for +decompression. The *Init +functions allocate memory for compression/decompression and do +other initialisations, whilst the +*End functions close down +operations and release memory.

+

The real work is done by +BZ2_bzCompress and +BZ2_bzDecompress. These +compress and decompress data from a user-supplied input buffer to +a user-supplied output buffer. These buffers can be any size; +arbitrary quantities of data are handled by making repeated calls +to these functions. This is a flexible mechanism allowing a +consumer-pull style of activity, or producer-push, or a mixture +of both.

+
+
+

+3.1.2. High-level summary

+

This interface provides some handy wrappers around the +low-level interface to facilitate reading and writing +bzip2 format files +(.bz2 files). The routines +provide hooks to facilitate reading files in which the +bzip2 data stream is embedded +within some larger-scale file structure, or where there are +multiple bzip2 data streams +concatenated end-to-end.

+

For reading files, +BZ2_bzReadOpen, +BZ2_bzRead, +BZ2_bzReadClose and +BZ2_bzReadGetUnused are +supplied. For writing files, +BZ2_bzWriteOpen, +BZ2_bzWrite and +BZ2_bzWriteFinish are +available.

+

As with the low-level library, no global variables are used +so the library is per se thread-safe. However, if I/O errors +occur whilst reading or writing the underlying compressed files, +you may have to consult errno to +determine the cause of the error. In that case, you'd need a C +library which correctly supports +errno in a multithreaded +environment.

+

To make the library a little simpler and more portable, +BZ2_bzReadOpen and +BZ2_bzWriteOpen require you to +pass them file handles (FILE*s) +which have previously been opened for reading or writing +respectively. That avoids portability problems associated with +file operations and file attributes, whilst not being much of an +imposition on the programmer.

+
+
+

+3.1.3. Utility functions summary

+

For very simple needs, +BZ2_bzBuffToBuffCompress and +BZ2_bzBuffToBuffDecompress are +provided. These compress data in memory from one buffer to +another buffer in a single function call. You should assess +whether these functions fulfill your memory-to-memory +compression/decompression requirements before investing effort in +understanding the more general but more complex low-level +interface.

+

Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp) has +contributed some functions to give better +zlib compatibility. These +functions are BZ2_bzopen, +BZ2_bzread, +BZ2_bzwrite, +BZ2_bzflush, +BZ2_bzclose, +BZ2_bzerror and +BZ2_bzlibVersion. You may find +these functions more convenient for simple file reading and +writing, than those in the high-level interface. These functions +are not (yet) officially part of the library, and are minimally +documented here. If they break, you get to keep all the pieces. +I hope to document them properly when time permits.

+

Yoshioka also contributed modifications to allow the +library to be built as a Windows DLL.

+
+
+
+

+3.2. Error handling

+

The library is designed to recover cleanly in all +situations, including the worst-case situation of decompressing +random data. I'm not 100% sure that it can always do this, so +you might want to add a signal handler to catch segmentation +violations during decompression if you are feeling especially +paranoid. I would be interested in hearing more about the +robustness of the library to corrupted compressed data.

+

Version 1.0.3 more robust in this respect than any +previous version. Investigations with Valgrind (a tool for detecting +problems with memory management) indicate +that, at least for the few files I tested, all single-bit errors +in the decompressed data are caught properly, with no +segmentation faults, no uses of uninitialised data, no out of +range reads or writes, and no infinite looping in the decompressor. +So it's certainly pretty robust, although +I wouldn't claim it to be totally bombproof.

+

The file bzlib.h contains +all definitions needed to use the library. In particular, you +should definitely not include +bzlib_private.h.

+

In bzlib.h, the various +return values are defined. The following list is not intended as +an exhaustive description of the circumstances in which a given +value may be returned -- those descriptions are given later. +Rather, it is intended to convey the rough meaning of each return +value. The first five actions are normal and not intended to +denote an error situation.

+
+
BZ_OK
+

The requested action was completed + successfully.

+
BZ_RUN_OK, BZ_FLUSH_OK, + BZ_FINISH_OK
+

In + BZ2_bzCompress, the requested + flush/finish/nothing-special action was completed + successfully.

+
BZ_STREAM_END
+

Compression of data was completed, or the + logical stream end was detected during + decompression.

+
+

The following return values indicate an error of some +kind.

+
+
BZ_CONFIG_ERROR
+

Indicates that the library has been improperly + compiled on your platform -- a major configuration error. + Specifically, it means that + sizeof(char), + sizeof(short) and + sizeof(int) are not 1, 2 and + 4 respectively, as they should be. Note that the library + should still work properly on 64-bit platforms which follow + the LP64 programming model -- that is, where + sizeof(long) and + sizeof(void*) are 8. Under + LP64, sizeof(int) is still 4, + so libbzip2, which doesn't + use the long type, is + OK.

+
BZ_SEQUENCE_ERROR
+

When using the library, it is important to call + the functions in the correct sequence and with data structures + (buffers etc) in the correct states. + libbzip2 checks as much as it + can to ensure this is happening, and returns + BZ_SEQUENCE_ERROR if not. + Code which complies precisely with the function semantics, as + detailed below, should never receive this value; such an event + denotes buggy code which you should + investigate.

+
BZ_PARAM_ERROR
+

Returned when a parameter to a function call is + out of range or otherwise manifestly incorrect. As with + BZ_SEQUENCE_ERROR, this + denotes a bug in the client code. The distinction between + BZ_PARAM_ERROR and + BZ_SEQUENCE_ERROR is a bit + hazy, but still worth making.

+
BZ_MEM_ERROR
+

Returned when a request to allocate memory + failed. Note that the quantity of memory needed to decompress + a stream cannot be determined until the stream's header has + been read. So + BZ2_bzDecompress and + BZ2_bzRead may return + BZ_MEM_ERROR even though some + of the compressed data has been read. The same is not true + for compression; once + BZ2_bzCompressInit or + BZ2_bzWriteOpen have + successfully completed, + BZ_MEM_ERROR cannot + occur.

+
BZ_DATA_ERROR
+

Returned when a data integrity error is + detected during decompression. Most importantly, this means + when stored and computed CRCs for the data do not match. This + value is also returned upon detection of any other anomaly in + the compressed data.

+
BZ_DATA_ERROR_MAGIC
+

As a special case of + BZ_DATA_ERROR, it is + sometimes useful to know when the compressed stream does not + start with the correct magic bytes ('B' 'Z' + 'h').

+
BZ_IO_ERROR
+

Returned by + BZ2_bzRead and + BZ2_bzWrite when there is an + error reading or writing in the compressed file, and by + BZ2_bzReadOpen and + BZ2_bzWriteOpen for attempts + to use a file for which the error indicator (viz, + ferror(f)) is set. On + receipt of BZ_IO_ERROR, the + caller should consult errno + and/or perror to acquire + operating-system specific information about the + problem.

+
BZ_UNEXPECTED_EOF
+

Returned by + BZ2_bzRead when the + compressed file finishes before the logical end of stream is + detected.

+
BZ_OUTBUFF_FULL
+

Returned by + BZ2_bzBuffToBuffCompress and + BZ2_bzBuffToBuffDecompress to + indicate that the output data will not fit into the output + buffer provided.

+
+
+
+

+3.3. Low-level interface

+
+

+3.3.1. BZ2_bzCompressInit

+
typedef struct {
+  char *next_in;
+  unsigned int avail_in;
+  unsigned int total_in_lo32;
+  unsigned int total_in_hi32;
+
+  char *next_out;
+  unsigned int avail_out;
+  unsigned int total_out_lo32;
+  unsigned int total_out_hi32;
+
+  void *state;
+
+  void *(*bzalloc)(void *,int,int);
+  void (*bzfree)(void *,void *);
+  void *opaque;
+} bz_stream;
+
+int BZ2_bzCompressInit ( bz_stream *strm, 
+                         int blockSize100k, 
+                         int verbosity,
+                         int workFactor );
+

Prepares for compression. The +bz_stream structure holds all +data pertaining to the compression activity. A +bz_stream structure should be +allocated and initialised prior to the call. The fields of +bz_stream comprise the entirety +of the user-visible data. state +is a pointer to the private data structures required for +compression.

+

Custom memory allocators are supported, via fields +bzalloc, +bzfree, and +opaque. The value +opaque is passed to as the first +argument to all calls to bzalloc +and bzfree, but is otherwise +ignored by the library. The call bzalloc ( +opaque, n, m ) is expected to return a pointer +p to n * +m bytes of memory, and bzfree ( +opaque, p ) should free that memory.

+

If you don't want to use a custom memory allocator, set +bzalloc, +bzfree and +opaque to +NULL, and the library will then +use the standard malloc / +free routines.

+

Before calling +BZ2_bzCompressInit, fields +bzalloc, +bzfree and +opaque should be filled +appropriately, as just described. Upon return, the internal +state will have been allocated and initialised, and +total_in_lo32, +total_in_hi32, +total_out_lo32 and +total_out_hi32 will have been +set to zero. These four fields are used by the library to inform +the caller of the total amount of data passed into and out of the +library, respectively. You should not try to change them. As of +version 1.0, 64-bit counts are maintained, even on 32-bit +platforms, using the _hi32 +fields to store the upper 32 bits of the count. So, for example, +the total amount of data in is (total_in_hi32 +<< 32) + total_in_lo32.

+

Parameter blockSize100k +specifies the block size to be used for compression. It should +be a value between 1 and 9 inclusive, and the actual block size +used is 100000 x this figure. 9 gives the best compression but +takes most memory.

+

Parameter verbosity should +be set to a number between 0 and 4 inclusive. 0 is silent, and +greater numbers give increasingly verbose monitoring/debugging +output. If the library has been compiled with +-DBZ_NO_STDIO, no such output +will appear for any verbosity setting.

+

Parameter workFactor +controls how the compression phase behaves when presented with +worst case, highly repetitive, input data. If compression runs +into difficulties caused by repetitive data, the library switches +from the standard sorting algorithm to a fallback algorithm. The +fallback is slower than the standard algorithm by perhaps a +factor of three, but always behaves reasonably, no matter how bad +the input.

+

Lower values of workFactor +reduce the amount of effort the standard algorithm will expend +before resorting to the fallback. You should set this parameter +carefully; too low, and many inputs will be handled by the +fallback algorithm and so compress rather slowly, too high, and +your average-to-worst case compression times can become very +large. The default value of 30 gives reasonable behaviour over a +wide range of circumstances.

+

Allowable values range from 0 to 250 inclusive. 0 is a +special case, equivalent to using the default value of 30.

+

Note that the compressed output generated is the same +regardless of whether or not the fallback algorithm is +used.

+

Be aware also that this parameter may disappear entirely in +future versions of the library. In principle it should be +possible to devise a good way to automatically choose which +algorithm to use. Such a mechanism would render the parameter +obsolete.

+

Possible return values:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if strm is NULL 
+  or blockSize < 1 or blockSize > 9
+  or verbosity < 0 or verbosity > 4
+  or workFactor < 0 or workFactor > 250
+BZ_MEM_ERROR 
+  if not enough memory is available
+BZ_OK 
+  otherwise
+

Allowable next actions:

+
BZ2_bzCompress
+  if BZ_OK is returned
+  no specific action needed in case of error
+
+
+

+3.3.2. BZ2_bzCompress

+
int BZ2_bzCompress ( bz_stream *strm, int action );
+

Provides more input and/or output buffer space for the +library. The caller maintains input and output buffers, and +calls BZ2_bzCompress to transfer +data between them.

+

Before each call to +BZ2_bzCompress, +next_in should point at the data +to be compressed, and avail_in +should indicate how many bytes the library may read. +BZ2_bzCompress updates +next_in, +avail_in and +total_in to reflect the number +of bytes it has read.

+

Similarly, next_out should +point to a buffer in which the compressed data is to be placed, +with avail_out indicating how +much output space is available. +BZ2_bzCompress updates +next_out, +avail_out and +total_out to reflect the number +of bytes output.

+

You may provide and remove as little or as much data as you +like on each call of +BZ2_bzCompress. In the limit, +it is acceptable to supply and remove data one byte at a time, +although this would be terribly inefficient. You should always +ensure that at least one byte of output space is available at +each call.

+

A second purpose of +BZ2_bzCompress is to request a +change of mode of the compressed stream.

+

Conceptually, a compressed stream can be in one of four +states: IDLE, RUNNING, FLUSHING and FINISHING. Before +initialisation +(BZ2_bzCompressInit) and after +termination (BZ2_bzCompressEnd), +a stream is regarded as IDLE.

+

Upon initialisation +(BZ2_bzCompressInit), the stream +is placed in the RUNNING state. Subsequent calls to +BZ2_bzCompress should pass +BZ_RUN as the requested action; +other actions are illegal and will result in +BZ_SEQUENCE_ERROR.

+

At some point, the calling program will have provided all +the input data it wants to. It will then want to finish up -- in +effect, asking the library to process any data it might have +buffered internally. In this state, +BZ2_bzCompress will no longer +attempt to read data from +next_in, but it will want to +write data to next_out. Because +the output buffer supplied by the user can be arbitrarily small, +the finishing-up operation cannot necessarily be done with a +single call of +BZ2_bzCompress.

+

Instead, the calling program passes +BZ_FINISH as an action to +BZ2_bzCompress. This changes +the stream's state to FINISHING. Any remaining input (ie, +next_in[0 .. avail_in-1]) is +compressed and transferred to the output buffer. To do this, +BZ2_bzCompress must be called +repeatedly until all the output has been consumed. At that +point, BZ2_bzCompress returns +BZ_STREAM_END, and the stream's +state is set back to IDLE. +BZ2_bzCompressEnd should then be +called.

+

Just to make sure the calling program does not cheat, the +library makes a note of avail_in +at the time of the first call to +BZ2_bzCompress which has +BZ_FINISH as an action (ie, at +the time the program has announced its intention to not supply +any more input). By comparing this value with that of +avail_in over subsequent calls +to BZ2_bzCompress, the library +can detect any attempts to slip in more data to compress. Any +calls for which this is detected will return +BZ_SEQUENCE_ERROR. This +indicates a programming mistake which should be corrected.

+

Instead of asking to finish, the calling program may ask +BZ2_bzCompress to take all the +remaining input, compress it and terminate the current +(Burrows-Wheeler) compression block. This could be useful for +error control purposes. The mechanism is analogous to that for +finishing: call BZ2_bzCompress +with an action of BZ_FLUSH, +remove output data, and persist with the +BZ_FLUSH action until the value +BZ_RUN is returned. As with +finishing, BZ2_bzCompress +detects any attempt to provide more input data once the flush has +begun.

+

Once the flush is complete, the stream returns to the +normal RUNNING state.

+

This all sounds pretty complex, but isn't really. Here's a +table which shows which actions are allowable in each state, what +action will be taken, what the next state is, and what the +non-error return values are. Note that you can't explicitly ask +what state the stream is in, but nor do you need to -- it can be +inferred from the values returned by +BZ2_bzCompress.

+
IDLE/any
+  Illegal.  IDLE state only exists after BZ2_bzCompressEnd or
+  before BZ2_bzCompressInit.
+  Return value = BZ_SEQUENCE_ERROR
+
+RUNNING/BZ_RUN
+  Compress from next_in to next_out as much as possible.
+  Next state = RUNNING
+  Return value = BZ_RUN_OK
+
+RUNNING/BZ_FLUSH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FLUSHING
+  Return value = BZ_FLUSH_OK
+
+RUNNING/BZ_FINISH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FINISHING
+  Return value = BZ_FINISH_OK
+
+FLUSHING/BZ_FLUSH
+  Compress from next_in to next_out as much as possible, 
+  but do not accept any more input.
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = RUNNING; Return value = BZ_RUN_OK
+  else
+    Next state = FLUSHING; Return value = BZ_FLUSH_OK
+
+FLUSHING/other     
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+
+FINISHING/BZ_FINISH
+  Compress from next_in to next_out as much as possible,
+  but to not accept any more input.  
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = IDLE; Return value = BZ_STREAM_END
+  else
+    Next state = FINISHING; Return value = BZ_FINISH_OK
+
+FINISHING/other
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+

That still looks complicated? Well, fair enough. The +usual sequence of calls for compressing a load of data is:

+
    +
  1. Get started with + BZ2_bzCompressInit.

  2. +
  3. Shovel data in and shlurp out its compressed form + using zero or more calls of + BZ2_bzCompress with action = + BZ_RUN.

  4. +
  5. Finish up. Repeatedly call + BZ2_bzCompress with action = + BZ_FINISH, copying out the + compressed output, until + BZ_STREAM_END is + returned.

  6. +
  7. Close up and go home. Call + BZ2_bzCompressEnd.

  8. +
+

If the data you want to compress fits into your input +buffer all at once, you can skip the calls of +BZ2_bzCompress ( ..., BZ_RUN ) +and just do the BZ2_bzCompress ( ..., BZ_FINISH +) calls.

+

All required memory is allocated by +BZ2_bzCompressInit. The +compression library can accept any data at all (obviously). So +you shouldn't get any error return values from the +BZ2_bzCompress calls. If you +do, they will be +BZ_SEQUENCE_ERROR, and indicate +a bug in your programming.

+

Trivial other possible return values:

+
BZ_PARAM_ERROR
+  if strm is NULL, or strm->s is NULL
+
+
+

+3.3.3. BZ2_bzCompressEnd

+
int BZ2_bzCompressEnd ( bz_stream *strm );
+

Releases all memory associated with a compression +stream.

+

Possible return values:

+
BZ_PARAM_ERROR  if strm is NULL or strm->s is NULL
+BZ_OK           otherwise
+
+
+

+3.3.4. BZ2_bzDecompressInit

+
int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );
+

Prepares for decompression. As with +BZ2_bzCompressInit, a +bz_stream record should be +allocated and initialised before the call. Fields +bzalloc, +bzfree and +opaque should be set if a custom +memory allocator is required, or made +NULL for the normal +malloc / +free routines. Upon return, the +internal state will have been initialised, and +total_in and +total_out will be zero.

+

For the meaning of parameter +verbosity, see +BZ2_bzCompressInit.

+

If small is nonzero, the +library will use an alternative decompression algorithm which +uses less memory but at the cost of decompressing more slowly +(roughly speaking, half the speed, but the maximum memory +requirement drops to around 2300k). See How to use bzip2 +for more information on memory management.

+

Note that the amount of memory needed to decompress a +stream cannot be determined until the stream's header has been +read, so even if +BZ2_bzDecompressInit succeeds, a +subsequent BZ2_bzDecompress +could fail with +BZ_MEM_ERROR.

+

Possible return values:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if ( small != 0 && small != 1 )
+  or (verbosity <; 0 || verbosity > 4)
+BZ_MEM_ERROR
+  if insufficient memory is available
+

Allowable next actions:

+
BZ2_bzDecompress
+  if BZ_OK was returned
+  no specific action required in case of error
+
+
+

+3.3.5. BZ2_bzDecompress

+
int BZ2_bzDecompress ( bz_stream *strm );
+

Provides more input and/out output buffer space for the +library. The caller maintains input and output buffers, and uses +BZ2_bzDecompress to transfer +data between them.

+

Before each call to +BZ2_bzDecompress, +next_in should point at the +compressed data, and avail_in +should indicate how many bytes the library may read. +BZ2_bzDecompress updates +next_in, +avail_in and +total_in to reflect the number +of bytes it has read.

+

Similarly, next_out should +point to a buffer in which the uncompressed output is to be +placed, with avail_out +indicating how much output space is available. +BZ2_bzCompress updates +next_out, +avail_out and +total_out to reflect the number +of bytes output.

+

You may provide and remove as little or as much data as you +like on each call of +BZ2_bzDecompress. In the limit, +it is acceptable to supply and remove data one byte at a time, +although this would be terribly inefficient. You should always +ensure that at least one byte of output space is available at +each call.

+

Use of BZ2_bzDecompress is +simpler than +BZ2_bzCompress.

+

You should provide input and remove output as described +above, and repeatedly call +BZ2_bzDecompress until +BZ_STREAM_END is returned. +Appearance of BZ_STREAM_END +denotes that BZ2_bzDecompress +has detected the logical end of the compressed stream. +BZ2_bzDecompress will not +produce BZ_STREAM_END until all +output data has been placed into the output buffer, so once +BZ_STREAM_END appears, you are +guaranteed to have available all the decompressed output, and +BZ2_bzDecompressEnd can safely +be called.

+

If case of an error return value, you should call +BZ2_bzDecompressEnd to clean up +and release memory.

+

Possible return values:

+
BZ_PARAM_ERROR
+  if strm is NULL or strm->s is NULL
+  or strm->avail_out < 1
+BZ_DATA_ERROR
+  if a data integrity error is detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the compressed stream doesn't begin with the right magic bytes
+BZ_MEM_ERROR
+  if there wasn't enough memory available
+BZ_STREAM_END
+  if the logical end of the data stream was detected and all
+  output in has been consumed, eg s-->avail_out > 0
+BZ_OK
+  otherwise
+

Allowable next actions:

+
BZ2_bzDecompress
+  if BZ_OK was returned
+BZ2_bzDecompressEnd
+  otherwise
+
+
+

+3.3.6. BZ2_bzDecompressEnd

+
int BZ2_bzDecompressEnd ( bz_stream *strm );
+

Releases all memory associated with a decompression +stream.

+

Possible return values:

+
BZ_PARAM_ERROR
+  if strm is NULL or strm->s is NULL
+BZ_OK
+  otherwise
+

Allowable next actions:

+
  None.
+
+
+
+

+3.4. High-level interface

+

This interface provides functions for reading and writing +bzip2 format files. First, some +general points.

+
    +
  • All of the functions take an + int* first argument, + bzerror. After each call, + bzerror should be consulted + first to determine the outcome of the call. If + bzerror is + BZ_OK, the call completed + successfully, and only then should the return value of the + function (if any) be consulted. If + bzerror is + BZ_IO_ERROR, there was an + error reading/writing the underlying compressed file, and you + should then consult errno / + perror to determine the cause + of the difficulty. bzerror + may also be set to various other values; precise details are + given on a per-function basis below.

  • +
  • If bzerror indicates + an error (ie, anything except + BZ_OK and + BZ_STREAM_END), you should + immediately call + BZ2_bzReadClose (or + BZ2_bzWriteClose, depending on + whether you are attempting to read or to write) to free up all + resources associated with the stream. Once an error has been + indicated, behaviour of all calls except + BZ2_bzReadClose + (BZ2_bzWriteClose) is + undefined. The implication is that (1) + bzerror should be checked + after each call, and (2) if + bzerror indicates an error, + BZ2_bzReadClose + (BZ2_bzWriteClose) should then + be called to clean up.

  • +
  • The FILE* arguments + passed to BZ2_bzReadOpen / + BZ2_bzWriteOpen should be set + to binary mode. Most Unix systems will do this by default, but + other platforms, including Windows and Mac, will not. If you + omit this, you may encounter problems when moving code to new + platforms.

  • +
  • Memory allocation requests are handled by + malloc / + free. At present there is no + facility for user-defined memory allocators in the file I/O + functions (could easily be added, though).

  • +
+
+

+3.4.1. BZ2_bzReadOpen

+
typedef void BZFILE;
+
+BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f, 
+                        int verbosity, int small,
+                        void *unused, int nUnused );
+

Prepare to read compressed data from file handle +f. +f should refer to a file which +has been opened for reading, and for which the error indicator +(ferror(f))is not set. If +small is 1, the library will try +to decompress using less memory, at the expense of speed.

+

For reasons explained below, +BZ2_bzRead will decompress the +nUnused bytes starting at +unused, before starting to read +from the file f. At most +BZ_MAX_UNUSED bytes may be +supplied like this. If this facility is not required, you should +pass NULL and +0 for +unused and +nUnused respectively.

+

For the meaning of parameters +small and +verbosity, see +BZ2_bzDecompressInit.

+

The amount of memory needed to decompress a file cannot be +determined until the file's header has been read. So it is +possible that BZ2_bzReadOpen +returns BZ_OK but a subsequent +call of BZ2_bzRead will return +BZ_MEM_ERROR.

+

Possible assignments to +bzerror:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or small is neither 0 nor 1
+  or ( unused == NULL && nUnused != 0 )
+  or ( unused != NULL && !(0 <= nUnused <= BZ_MAX_UNUSED) )
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise.
+

Possible return values:

+
Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise
+

Allowable next actions:

+
BZ2_bzRead
+  if bzerror is BZ_OK
+BZ2_bzClose
+  otherwise
+
+
+

+3.4.2. BZ2_bzRead

+
int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );
+

Reads up to len +(uncompressed) bytes from the compressed file +b into the buffer +buf. If the read was +successful, bzerror is set to +BZ_OK and the number of bytes +read is returned. If the logical end-of-stream was detected, +bzerror will be set to +BZ_STREAM_END, and the number of +bytes read is returned. All other +bzerror values denote an +error.

+

BZ2_bzRead will supply +len bytes, unless the logical +stream end is detected or an error occurs. Because of this, it +is possible to detect the stream end by observing when the number +of bytes returned is less than the number requested. +Nevertheless, this is regarded as inadvisable; you should instead +check bzerror after every call +and watch out for +BZ_STREAM_END.

+

Internally, BZ2_bzRead +copies data from the compressed file in chunks of size +BZ_MAX_UNUSED bytes before +decompressing it. If the file contains more bytes than strictly +needed to reach the logical end-of-stream, +BZ2_bzRead will almost certainly +read some of the trailing data before signalling +BZ_SEQUENCE_END. To collect the +read but unused data once +BZ_SEQUENCE_END has appeared, +call BZ2_bzReadGetUnused +immediately before +BZ2_bzReadClose.

+

Possible assignments to +bzerror:

+
BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len < 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzWriteOpen
+BZ_IO_ERROR
+  if there is an error reading from the compressed file
+BZ_UNEXPECTED_EOF
+  if the compressed file ended before 
+  the logical end-of-stream was detected
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the stream does not begin with the requisite header bytes 
+  (ie, is not a bzip2 data file).  This is really 
+  a special case of BZ_DATA_ERROR.
+BZ_MEM_ERROR
+  if insufficient memory was available
+BZ_STREAM_END
+  if the logical end of stream was detected.
+BZ_OK
+  otherwise.
+

Possible return values:

+
number of bytes read
+  if bzerror is BZ_OK or BZ_STREAM_END
+undefined
+  otherwise
+

Allowable next actions:

+
collect data from buf, then BZ2_bzRead or BZ2_bzReadClose
+  if bzerror is BZ_OK
+collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused
+  if bzerror is BZ_SEQUENCE_END
+BZ2_bzReadClose
+  otherwise
+
+
+

+3.4.3. BZ2_bzReadGetUnused

+
void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b, 
+                          void** unused, int* nUnused );
+

Returns data which was read from the compressed file but +was not needed to get to the logical end-of-stream. +*unused is set to the address of +the data, and *nUnused to the +number of bytes. *nUnused will +be set to a value between 0 and +BZ_MAX_UNUSED inclusive.

+

This function may only be called once +BZ2_bzRead has signalled +BZ_STREAM_END but before +BZ2_bzReadClose.

+

Possible assignments to +bzerror:

+
BZ_PARAM_ERROR
+  if b is NULL
+  or unused is NULL or nUnused is NULL
+BZ_SEQUENCE_ERROR
+  if BZ_STREAM_END has not been signalled
+  or if b was opened with BZ2_bzWriteOpen
+BZ_OK
+  otherwise
+

Allowable next actions:

+
BZ2_bzReadClose
+
+
+

+3.4.4. BZ2_bzReadClose

+
void BZ2_bzReadClose ( int *bzerror, BZFILE *b );
+

Releases all memory pertaining to the compressed file +b. +BZ2_bzReadClose does not call +fclose on the underlying file +handle, so you should do that yourself if appropriate. +BZ2_bzReadClose should be called +to clean up after all error situations.

+

Possible assignments to +bzerror:

+
BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzOpenWrite
+BZ_OK
+  otherwise
+

Allowable next actions:

+
none
+
+
+

+3.4.5. BZ2_bzWriteOpen

+
BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f, 
+                         int blockSize100k, int verbosity,
+                         int workFactor );
+

Prepare to write compressed data to file handle +f. +f should refer to a file which +has been opened for writing, and for which the error indicator +(ferror(f))is not set.

+

For the meaning of parameters +blockSize100k, +verbosity and +workFactor, see +BZ2_bzCompressInit.

+

All required memory is allocated at this stage, so if the +call completes successfully, +BZ_MEM_ERROR cannot be signalled +by a subsequent call to +BZ2_bzWrite.

+

Possible assignments to +bzerror:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or blockSize100k < 1 or blockSize100k > 9
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise
+

Possible return values:

+
Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise
+

Allowable next actions:

+
BZ2_bzWrite
+  if bzerror is BZ_OK
+  (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless)
+BZ2_bzWriteClose
+  otherwise
+
+
+

+3.4.6. BZ2_bzWrite

+
void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );
+

Absorbs len bytes from the +buffer buf, eventually to be +compressed and written to the file.

+

Possible assignments to +bzerror:

+
BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len < 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file.
+BZ_OK
+  otherwise
+
+
+

+3.4.7. BZ2_bzWriteClose

+
void BZ2_bzWriteClose( int *bzerror, BZFILE* f,
+                       int abandon,
+                       unsigned int* nbytes_in,
+                       unsigned int* nbytes_out );
+
+void BZ2_bzWriteClose64( int *bzerror, BZFILE* f,
+                         int abandon,
+                         unsigned int* nbytes_in_lo32,
+                         unsigned int* nbytes_in_hi32,
+                         unsigned int* nbytes_out_lo32,
+                         unsigned int* nbytes_out_hi32 );
+

Compresses and flushes to the compressed file all data so +far supplied by BZ2_bzWrite. +The logical end-of-stream markers are also written, so subsequent +calls to BZ2_bzWrite are +illegal. All memory associated with the compressed file +b is released. +fflush is called on the +compressed file, but it is not +fclose'd.

+

If BZ2_bzWriteClose is +called to clean up after an error, the only action is to release +the memory. The library records the error codes issued by +previous calls, so this situation will be detected automatically. +There is no attempt to complete the compression operation, nor to +fflush the compressed file. You +can force this behaviour to happen even in the case of no error, +by passing a nonzero value to +abandon.

+

If nbytes_in is non-null, +*nbytes_in will be set to be the +total volume of uncompressed data handled. Similarly, +nbytes_out will be set to the +total volume of compressed data written. For compatibility with +older versions of the library, +BZ2_bzWriteClose only yields the +lower 32 bits of these counts. Use +BZ2_bzWriteClose64 if you want +the full 64 bit counts. These two functions are otherwise +absolutely identical.

+

Possible assignments to +bzerror:

+
BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file
+BZ_OK
+  otherwise
+
+
+

+3.4.8. Handling embedded compressed data streams

+

The high-level library facilitates use of +bzip2 data streams which form +some part of a surrounding, larger data stream.

+
    +
  • For writing, the library takes an open file handle, + writes compressed data to it, + fflushes it but does not + fclose it. The calling + application can write its own data before and after the + compressed data stream, using that same file handle.

  • +
  • Reading is more complex, and the facilities are not as + general as they could be since generality is hard to reconcile + with efficiency. BZ2_bzRead + reads from the compressed file in blocks of size + BZ_MAX_UNUSED bytes, and in + doing so probably will overshoot the logical end of compressed + stream. To recover this data once decompression has ended, + call BZ2_bzReadGetUnused after + the last call of BZ2_bzRead + (the one returning + BZ_STREAM_END) but before + calling + BZ2_bzReadClose.

  • +
+

This mechanism makes it easy to decompress multiple +bzip2 streams placed end-to-end. +As the end of one stream, when +BZ2_bzRead returns +BZ_STREAM_END, call +BZ2_bzReadGetUnused to collect +the unused data (copy it into your own buffer somewhere). That +data forms the start of the next compressed stream. To start +uncompressing that next stream, call +BZ2_bzReadOpen again, feeding in +the unused data via the unused / +nUnused parameters. Keep doing +this until BZ_STREAM_END return +coincides with the physical end of file +(feof(f)). In this situation +BZ2_bzReadGetUnused will of +course return no data.

+

This should give some feel for how the high-level interface +can be used. If you require extra flexibility, you'll have to +bite the bullet and get to grips with the low-level +interface.

+
+
+

+3.4.9. Standard file-reading/writing code

+

Here's how you'd write data to a compressed file:

+
FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "w" );
+if ( !f ) {
+ /* handle error */
+}
+b = BZ2_bzWriteOpen( &bzerror, f, 9 );
+if (bzerror != BZ_OK) {
+ BZ2_bzWriteClose ( b );
+ /* handle error */
+}
+
+while ( /* condition */ ) {
+ /* get data to write into buf, and set nBuf appropriately */
+ nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf );
+ if (bzerror == BZ_IO_ERROR) { 
+   BZ2_bzWriteClose ( &bzerror, b );
+   /* handle error */
+ }
+}
+
+BZ2_bzWriteClose( &bzerror, b );
+if (bzerror == BZ_IO_ERROR) {
+ /* handle error */
+}
+

And to read from a compressed file:

+
FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "r" );
+if ( !f ) {
+  /* handle error */
+}
+b = BZ2_bzReadOpen ( &bzerror, f, 0, NULL, 0 );
+if ( bzerror != BZ_OK ) {
+  BZ2_bzReadClose ( &bzerror, b );
+  /* handle error */
+}
+
+bzerror = BZ_OK;
+while ( bzerror == BZ_OK && /* arbitrary other conditions */) {
+  nBuf = BZ2_bzRead ( &bzerror, b, buf, /* size of buf */ );
+  if ( bzerror == BZ_OK ) {
+    /* do something with buf[0 .. nBuf-1] */
+  }
+}
+if ( bzerror != BZ_STREAM_END ) {
+   BZ2_bzReadClose ( &bzerror, b );
+   /* handle error */
+} else {
+   BZ2_bzReadClose ( &bzerror, b );
+}
+
+
+
+

+3.5. Utility functions

+
+

+3.5.1. BZ2_bzBuffToBuffCompress

+
int BZ2_bzBuffToBuffCompress( char*         dest,
+                              unsigned int* destLen,
+                              char*         source,
+                              unsigned int  sourceLen,
+                              int           blockSize100k,
+                              int           verbosity,
+                              int           workFactor );
+

Attempts to compress the data in source[0 +.. sourceLen-1] into the destination buffer, +dest[0 .. *destLen-1]. If the +destination buffer is big enough, +*destLen is set to the size of +the compressed data, and BZ_OK +is returned. If the compressed data won't fit, +*destLen is unchanged, and +BZ_OUTBUFF_FULL is +returned.

+

Compression in this manner is a one-shot event, done with a +single call to this function. The resulting compressed data is a +complete bzip2 format data +stream. There is no mechanism for making additional calls to +provide extra input data. If you want that kind of mechanism, +use the low-level interface.

+

For the meaning of parameters +blockSize100k, +verbosity and +workFactor, see +BZ2_bzCompressInit.

+

To guarantee that the compressed data will fit in its +buffer, allocate an output buffer of size 1% larger than the +uncompressed data, plus six hundred extra bytes.

+

BZ2_bzBuffToBuffDecompress +will not write data at or beyond +dest[*destLen], even in case of +buffer overflow.

+

Possible return values:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or blockSize100k < 1 or blockSize100k > 9
+  or verbosity < 0 or verbosity > 4
+  or workFactor < 0 or workFactor > 250
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_OK
+  otherwise
+
+
+

+3.5.2. BZ2_bzBuffToBuffDecompress

+
int BZ2_bzBuffToBuffDecompress( char*         dest,
+                                unsigned int* destLen,
+                                char*         source,
+                                unsigned int  sourceLen,
+                                int           small,
+                                int           verbosity );
+

Attempts to decompress the data in source[0 +.. sourceLen-1] into the destination buffer, +dest[0 .. *destLen-1]. If the +destination buffer is big enough, +*destLen is set to the size of +the uncompressed data, and BZ_OK +is returned. If the compressed data won't fit, +*destLen is unchanged, and +BZ_OUTBUFF_FULL is +returned.

+

source is assumed to hold +a complete bzip2 format data +stream. +BZ2_bzBuffToBuffDecompress tries +to decompress the entirety of the stream into the output +buffer.

+

For the meaning of parameters +small and +verbosity, see +BZ2_bzDecompressInit.

+

Because the compression ratio of the compressed data cannot +be known in advance, there is no easy way to guarantee that the +output buffer will be big enough. You may of course make +arrangements in your code to record the size of the uncompressed +data, but such a mechanism is beyond the scope of this +library.

+

BZ2_bzBuffToBuffDecompress +will not write data at or beyond +dest[*destLen], even in case of +buffer overflow.

+

Possible return values:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or small != 0 && small != 1
+  or verbosity < 0 or verbosity > 4
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed data
+BZ_DATA_ERROR_MAGIC
+  if the compressed data doesn't begin with the right magic bytes
+BZ_UNEXPECTED_EOF
+  if the compressed data ends unexpectedly
+BZ_OK
+  otherwise
+
+
+
+

+3.6. zlib compatibility functions

+

Yoshioka Tsuneo has contributed some functions to give +better zlib compatibility. +These functions are BZ2_bzopen, +BZ2_bzread, +BZ2_bzwrite, +BZ2_bzflush, +BZ2_bzclose, +BZ2_bzerror and +BZ2_bzlibVersion. These +functions are not (yet) officially part of the library. If they +break, you get to keep all the pieces. Nevertheless, I think +they work ok.

+
typedef void BZFILE;
+
+const char * BZ2_bzlibVersion ( void );
+

Returns a string indicating the library version.

+
BZFILE * BZ2_bzopen  ( const char *path, const char *mode );
+BZFILE * BZ2_bzdopen ( int        fd,    const char *mode );
+

Opens a .bz2 file for +reading or writing, using either its name or a pre-existing file +descriptor. Analogous to fopen +and fdopen.

+
int BZ2_bzread  ( BZFILE* b, void* buf, int len );
+int BZ2_bzwrite ( BZFILE* b, void* buf, int len );
+

Reads/writes data from/to a previously opened +BZFILE. Analogous to +fread and +fwrite.

+
int  BZ2_bzflush ( BZFILE* b );
+void BZ2_bzclose ( BZFILE* b );
+

Flushes/closes a BZFILE. +BZ2_bzflush doesn't actually do +anything. Analogous to fflush +and fclose.

+
const char * BZ2_bzerror ( BZFILE *b, int *errnum )
+

Returns a string describing the more recent error status of +b, and also sets +*errnum to its numerical +value.

+
+
+

+3.7. Using the library in a stdio-free environment

+
+

+3.7.1. Getting rid of stdio

+

In a deeply embedded application, you might want to use +just the memory-to-memory functions. You can do this +conveniently by compiling the library with preprocessor symbol +BZ_NO_STDIO defined. Doing this +gives you a library containing only the following eight +functions:

+

BZ2_bzCompressInit, +BZ2_bzCompress, +BZ2_bzCompressEnd +BZ2_bzDecompressInit, +BZ2_bzDecompress, +BZ2_bzDecompressEnd +BZ2_bzBuffToBuffCompress, +BZ2_bzBuffToBuffDecompress

+

When compiled like this, all functions will ignore +verbosity settings.

+
+
+

+3.7.2. Critical error handling

+

libbzip2 contains a number +of internal assertion checks which should, needless to say, never +be activated. Nevertheless, if an assertion should fail, +behaviour depends on whether or not the library was compiled with +BZ_NO_STDIO set.

+

For a normal compile, an assertion failure yields the +message:

+
+

bzip2/libbzip2: internal error number N.

+

This is a bug in bzip2/libbzip2, 1.0.5 of 10 December 2007. +Please report it to me at: jseward@bzip.org. If this happened +when you were using some program which uses libbzip2 as a +component, you should also report this bug to the author(s) +of that program. Please make an effort to report this bug; +timely and accurate bug reports eventually lead to higher +quality software. Thanks. Julian Seward, 10 December 2007. +

+
+

where N is some error code +number. If N == 1007, it also +prints some extra text advising the reader that unreliable memory +is often associated with internal error 1007. (This is a +frequently-observed-phenomenon with versions 1.0.0/1.0.1).

+

exit(3) is then +called.

+

For a stdio-free library, +assertion failures result in a call to a function declared +as:

+
extern void bz_internal_error ( int errcode );
+

The relevant code is passed as a parameter. You should +supply such a function.

+

In either case, once an assertion failure has occurred, any +bz_stream records involved can +be regarded as invalid. You should not attempt to resume normal +operation with them.

+

You may, of course, change critical error handling to suit +your needs. As I said above, critical errors indicate bugs in +the library and should not occur. All "normal" error situations +are indicated via error return codes from functions, and can be +recovered from.

+
+
+
+

+3.8. Making a Windows DLL

+

Everything related to Windows has been contributed by +Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp), so +you should send your queries to him (but perhaps Cc: me, +jseward@bzip.org).

+

My vague understanding of what to do is: using Visual C++ +5.0, open the project file +libbz2.dsp, and build. That's +all.

+

If you can't open the project file for some reason, make a +new one, naming these files: +blocksort.c, +bzlib.c, +compress.c, +crctable.c, +decompress.c, +huffman.c, +randtable.c and +libbz2.def. You will also need +to name the header files bzlib.h +and bzlib_private.h.

+

If you don't use VC++, you may need to define the +proprocessor symbol +_WIN32.

+

Finally, dlltest.c is a +sample program using the DLL. It has a project file, +dlltest.dsp.

+

If you just want a makefile for Visual C, have a look at +makefile.msc.

+

Be aware that if you compile +bzip2 itself on Win32, you must +set BZ_UNIX to 0 and +BZ_LCCWIN32 to 1, in the file +bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly.

+

I haven't tried any of this stuff myself, but it all looks +plausible.

+
+
+
+

+4. Miscellanea

+ +

These are just some random thoughts of mine. Your mileage +may vary.

+
+

+4.1. Limitations of the compressed file format

+

bzip2-1.0.X, +0.9.5 and +0.9.0 use exactly the same file +format as the original version, +bzip2-0.1. This decision was +made in the interests of stability. Creating yet another +incompatible compressed file format would create further +confusion and disruption for users.

+

Nevertheless, this is not a painless decision. Development +work since the release of +bzip2-0.1 in August 1997 has +shown complexities in the file format which slow down +decompression and, in retrospect, are unnecessary. These +are:

+
    +
  • The run-length encoder, which is the first of the + compression transformations, is entirely irrelevant. The + original purpose was to protect the sorting algorithm from the + very worst case input: a string of repeated symbols. But + algorithm steps Q6a and Q6b in the original Burrows-Wheeler + technical report (SRC-124) show how repeats can be handled + without difficulty in block sorting.

  • +
  • +

    The randomisation mechanism doesn't really need to be + there. Udi Manber and Gene Myers published a suffix array + construction algorithm a few years back, which can be employed + to sort any block, no matter how repetitive, in O(N log N) + time. Subsequent work by Kunihiko Sadakane has produced a + derivative O(N (log N)^2) algorithm which usually outperforms + the Manber-Myers algorithm.

    +

    I could have changed to Sadakane's algorithm, but I find + it to be slower than bzip2's + existing algorithm for most inputs, and the randomisation + mechanism protects adequately against bad cases. I didn't + think it was a good tradeoff to make. Partly this is due to + the fact that I was not flooded with email complaints about + bzip2-0.1's performance on + repetitive data, so perhaps it isn't a problem for real + inputs.

    +

    Probably the best long-term solution, and the one I have + incorporated into 0.9.5 and above, is to use the existing + sorting algorithm initially, and fall back to a O(N (log N)^2) + algorithm if the standard algorithm gets into + difficulties.

    +
  • +
  • The compressed file format was never designed to be + handled by a library, and I have had to jump though some hoops + to produce an efficient implementation of decompression. It's + a bit hairy. Try passing + decompress.c through the C + preprocessor and you'll see what I mean. Much of this + complexity could have been avoided if the compressed size of + each block of data was recorded in the data stream.

  • +
  • An Adler-32 checksum, rather than a CRC32 checksum, + would be faster to compute.

  • +
+

It would be fair to say that the +bzip2 format was frozen before I +properly and fully understood the performance consequences of +doing so.

+

Improvements which I was able to incorporate into 0.9.0, +despite using the same file format, are:

+
    +
  • Single array implementation of the inverse BWT. This + significantly speeds up decompression, presumably because it + reduces the number of cache misses.

  • +
  • Faster inverse MTF transform for large MTF values. + The new implementation is based on the notion of sliding blocks + of values.

  • +
  • bzip2-0.9.0 now reads + and writes files with fread + and fwrite; version 0.1 used + putc and + getc. Duh! Well, you live + and learn.

  • +
+

Further ahead, it would be nice to be able to do random +access into files. This will require some careful design of +compressed file formats.

+
+
+

+4.2. Portability issues

+

After some consideration, I have decided not to use GNU +autoconf to configure 0.9.5 or +1.0.

+

autoconf, admirable and +wonderful though it is, mainly assists with portability problems +between Unix-like platforms. But +bzip2 doesn't have much in the +way of portability problems on Unix; most of the difficulties +appear when porting to the Mac, or to Microsoft's operating +systems. autoconf doesn't help +in those cases, and brings in a whole load of new +complexity.

+

Most people should be able to compile the library and +program under Unix straight out-of-the-box, so to speak, +especially if you have a version of GNU C available.

+

There are a couple of +__inline__ directives in the +code. GNU C (gcc) should be +able to handle them. If you're not using GNU C, your C compiler +shouldn't see them at all. If your compiler does, for some +reason, see them and doesn't like them, just +#define +__inline__ to be +/* */. One easy way to do this +is to compile with the flag +-D__inline__=, which should be +understood by most Unix compilers.

+

If you still have difficulties, try compiling with the +macro BZ_STRICT_ANSI defined. +This should enable you to build the library in a strictly ANSI +compliant environment. Building the program itself like this is +dangerous and not supported, since you remove +bzip2's checks against +compressing directories, symbolic links, devices, and other +not-really-a-file entities. This could cause filesystem +corruption!

+

One other thing: if you create a +bzip2 binary for public distribution, +please consider linking it statically (gcc +-static). This avoids all sorts of library-version +issues that others may encounter later on.

+

If you build bzip2 on +Win32, you must set BZ_UNIX to 0 +and BZ_LCCWIN32 to 1, in the +file bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly.

+
+
+

+4.3. Reporting bugs

+

I tried pretty hard to make sure +bzip2 is bug free, both by +design and by testing. Hopefully you'll never need to read this +section for real.

+

Nevertheless, if bzip2 dies +with a segmentation fault, a bus error or an internal assertion +failure, it will ask you to email me a bug report. Experience from +years of feedback of bzip2 users indicates that almost all these +problems can be traced to either compiler bugs or hardware +problems.

+
    +
  • +

    Recompile the program with no optimisation, and + see if it works. And/or try a different compiler. I heard all + sorts of stories about various flavours of GNU C (and other + compilers) generating bad code for + bzip2, and I've run across two + such examples myself.

    +

    2.7.X versions of GNU C are known to generate bad code + from time to time, at high optimisation levels. If you get + problems, try using the flags + -O2 + -fomit-frame-pointer + -fno-strength-reduce. You + should specifically not use + -funroll-loops.

    +

    You may notice that the Makefile runs six tests as part + of the build process. If the program passes all of these, it's + a pretty good (but not 100%) indication that the compiler has + done its job correctly.

    +
  • +
  • +

    If bzip2 + crashes randomly, and the crashes are not repeatable, you may + have a flaky memory subsystem. + bzip2 really hammers your + memory hierarchy, and if it's a bit marginal, you may get these + problems. Ditto if your disk or I/O subsystem is slowly + failing. Yup, this really does happen.

    +

    Try using a different machine of the same type, and see + if you can repeat the problem.

    +
  • +
  • This isn't really a bug, but ... If + bzip2 tells you your file is + corrupted on decompression, and you obtained the file via FTP, + there is a possibility that you forgot to tell FTP to do a + binary mode transfer. That absolutely will cause the file to + be non-decompressible. You'll have to transfer it + again.

  • +
+

If you've incorporated +libbzip2 into your own program +and are getting problems, please, please, please, check that the +parameters you are passing in calls to the library, are correct, +and in accordance with what the documentation says is allowable. +I have tried to make the library robust against such problems, +but I'm sure I haven't succeeded.

+

Finally, if the above comments don't help, you'll have to +send me a bug report. Now, it's just amazing how many people +will send me a bug report saying something like:

+
bzip2 crashed with segmentation fault on my machine
+

and absolutely nothing else. Needless to say, a such a +report is totally, utterly, completely and +comprehensively 100% useless; a waste of your time, my time, and +net bandwidth. With no details at all, there's no way +I can possibly begin to figure out what the problem is.

+

The rules of the game are: facts, facts, facts. Don't omit +them because "oh, they won't be relevant". At the bare +minimum:

+
Machine type.  Operating system version.  
+Exact version of bzip2 (do bzip2 -V).  
+Exact version of the compiler used.  
+Flags passed to the compiler.
+

However, the most important single thing that will help me +is the file that you were trying to compress or decompress at the +time the problem happened. Without that, my ability to do +anything more than speculate about the cause, is limited.

+
+
+

+4.4. Did you get the right package?

+

bzip2 is a resource hog. +It soaks up large amounts of CPU cycles and memory. Also, it +gives very large latencies. In the worst case, you can feed many +megabytes of uncompressed data into the library before getting +any compressed output, so this probably rules out applications +requiring interactive behaviour.

+

These aren't faults of my implementation, I hope, but more +an intrinsic property of the Burrows-Wheeler transform +(unfortunately). Maybe this isn't what you want.

+

If you want a compressor and/or library which is faster, +uses less memory but gets pretty good compression, and has +minimal latency, consider Jean-loup Gailly's and Mark Adler's +work, zlib-1.2.1 and +gzip-1.2.4. Look for them at +http://www.zlib.org and +http://www.gzip.org +respectively.

+

For something faster and lighter still, you might try Markus F +X J Oberhumer's LZO real-time +compression/decompression library, at +http://www.oberhumer.com/opensource.

+
+
+

+4.5. Further Reading

+

bzip2 is not research +work, in the sense that it doesn't present any new ideas. +Rather, it's an engineering exercise based on existing +ideas.

+

Four documents describe essentially all the ideas behind +bzip2:

+

Michael Burrows and D. J. Wheeler:
+  "A block-sorting lossless data compression algorithm"
+   10th May 1994. 
+   Digital SRC Research Report 124.
+   ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz
+   If you have trouble finding it, try searching at the
+   New Zealand Digital Library, http://www.nzdl.org.
+
+Daniel S. Hirschberg and Debra A. LeLewer
+  "Efficient Decoding of Prefix Codes"
+   Communications of the ACM, April 1990, Vol 33, Number 4.
+   You might be able to get an electronic copy of this
+   from the ACM Digital Library.
+
+David J. Wheeler
+   Program bred3.c and accompanying document bred3.ps.
+   This contains the idea behind the multi-table Huffman coding scheme.
+   ftp://ftp.cl.cam.ac.uk/users/djw3/
+
+Jon L. Bentley and Robert Sedgewick
+  "Fast Algorithms for Sorting and Searching Strings"
+   Available from Sedgewick's web page,
+   www.cs.princeton.edu/~rs
+

+

The following paper gives valuable additional insights into +the algorithm, but is not immediately the basis of any code used +in bzip2.

+

Peter Fenwick:
+   Block Sorting Text Compression
+   Proceedings of the 19th Australasian Computer Science Conference,
+     Melbourne, Australia.  Jan 31 - Feb 2, 1996.
+   ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps

+

Kunihiko Sadakane's sorting algorithm, mentioned above, is +available from:

+

http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz
+

+

The Manber-Myers suffix array construction algorithm is +described in a paper available from:

+

http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps
+

+

Finally, the following papers document some +investigations I made into the performance of sorting +and decompression algorithms:

+

Julian Seward
+   On the Performance of BWT Sorting Algorithms
+   Proceedings of the IEEE Data Compression Conference 2000
+     Snowbird, Utah.  28-30 March 2000.
+
+Julian Seward
+   Space-time Tradeoffs in the Inverse B-W Transform
+   Proceedings of the IEEE Data Compression Conference 2001
+     Snowbird, Utah.  27-29 March 2001.
+

+
+
+
+ diff --git a/Utilities/cmbzip2/manual.pdf b/Utilities/cmbzip2/manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..10c10de7ac44717ee2d7245cc73331deb2a32501 GIT binary patch literal 289422 zcmb?^c|6qL_dg;%lqC_0Op&EBW}hK@_I(#p+4p^4qf|m!Q?^2pvhVxSf`rIgB&8?` zB}>WjyMvi}r#?U5c>nR9%*^Y)p7Xrto^$TG=bYC;RY_?+I21*NhQJ{9MpjfpLJ)op z2)~TIragpT62jx^Z0cldXa|M!LPSKUOzlkYU&5_^na9Y>(g6W6v@?O&SQ;(=aRlOK z>f~%`ZwG-xVNf(L;SzzrjBjb@;$#m+{5m=uK^R^R|DlPiu?rZFI1(KBm!VvpE$z&I z8wx`hO4i;T;$ja0KL@gm^XG8bzYJ$*Xln{Z{t65MBaEgjt|Ubq0RjKZ2+p2%_72XL z&cBU!^R5FJnVDQ$v^E_(c)t z>X^8;l(^9fOhORCa_D=u({b=GeiEC-fs;Cp0ME`A;z}j?hvj1&qpowz>Q3W45 z8QR(csv+){E*8Ya4EZ_s-)70h-ht1?)Xmi9zaTNhNzx>I0pjf91eUU^lPPgj%-?3k z)X9m@0;m<6HM5T)PK%V2lf4s!@U5R?{%uZd?A`x}lsGGjgfBpVQUYROX#5M(zs-<^ z4IlB_|D^y+oF`dJbBmQ*|6ye8-)7C##nOh)%j(&T<*>gNkzqfkg9qgT4_$-~BT}^)z7dVVK zv#Q`bhO1M$@>SvwfW!Vap+>IeYepo_rMfBpzIcN1U;AaWzs;6|p|LeE6#rc(a2RpA zBrQ!Kp7yQ~b5oaPI-J15ae=H}CHl(^{x)+?riLbKR0jN~Lm}O0cR6hpd%MjF16~&Cj?a%U~C3dD?eQrc}6hq|rx}TQ$|` z3>MpTgu*;WggTge-Qpd~phvAW`QzO3gY{VH{P~iM1h4FLC|dlk=o5KPZcJhP9c19t z@N<_-yF*R6nHgo75>AGR`+LW=KCwME!IgYJ9`Oec*SRo#hf;JvPrzv{=XOfK+fm#0wE)4>$NuL=Z| zivO5BFadTh&XAQ^R;S`uH+8mmbuu=^zlE1?@RpLPiKU^0y$3`ezsN8^%&-Co11d0t z6Sx)vN8t5>I+$~y)0X{aIDB;hFW*lRLXgCGvl{=vR6E6SzO#XLYSF-$xp-2L1s=9)SWsAFnjk@hgTOco@bSU{UJ>ekG+L z{F?tea}$Yiek zerH-v>xrsQDgNH97o3#l53?V&g1u7p+~$1I^+YI)YaTWh7Jt{2n%POfIZUqaP|err z$R5OL%I^t9dYOIF--2@k&M|X;s+ss?G`#<5F6GVHoeiN?(Aym&f~RA}4!oTx5M6W; zL_*HEr7>BPrzKgirRpQ7^?vkgXKNe)!HsVEJ z`>LcOXZstHr6C#q$bwTjLPu1`j6b?YQnDPOk$Kc`JF0mxcYLYwrf@~b7Q57@SZ4BW zp_*$Q@74$LOuEGAR^|AE1oDx?NMVn(pj$w)DQDB@{Da6vD#P{G_n3BHOr% zrf}hZ#9Yz$8EPTOu!Zw-X=XZU~BiB$>?Sd-B6UwOJN8^i1vFk zUbQO6)V7t#y*6Y}WwKXz?WA0B<85xvm;I^Xq$d`~l*zv#Wo@qXrDRN@Nl#JQwRNi7 zcR%H#p}KzM^E=*CyskGCSd!lV*!TYN!3VF*PQ^E%eM`#3=4SzkM+_K7&XwB&q>*VcTF;H-wqvNn%6lx z&!js&94_O-BtA*4XE69Z$nqHb9gZN_c=3#OC~rB`m6^)Nso6I!Gfh3Uk)y)v@jdo7 z<*5F{S*WvKJ-s9n?;9L5xJU~t0zGWwnDhCRW}c<{Y72cjXRp^B%F&bYL{k6io+P{c z;VQB#J09F}tT}SeC$5X7r!&RV&SNjj%;&;{qH}apaZfvZNcj%!?>>2;wpsio1Tw#C zp=;VR>4OwMm2m!&uedC(w!v{^6q0$jSM0gTY?S!7a;^(D3Q>~f5tpK`ips;_V?Nqj z@Fo<(BcfSOV&O%7j4SW<)>$*&Q&(eg++zEmnAz8HmYfWpes-Du$Z*u%8<|)i-jGAc z4E^@Buf8KmLhw(=pFN~uy4tHB9l15hK^bw89Tz2jDI(@ z(TnW7<8!lUnp>okLN3Sn>5r#y8DAXpcRz(@mV4dTt#g08fY09Ja&1PVM_Mv6QHwTQ zo>vQ-y14r7BCALrAs;<)%B~2L(px;}V0=B*tItZdUMaxH#j1I5M zL()?b{U7@3*y(5ai>kKZZF1Sfu-qV>5?@{G|XX~eh z*i<~Q7rcl@Wu%gJH|@+6+lOWoOTO{KNjo~jrsC^)ml9P=@2DTB6f@n}kkGrW_}^I` zLNeEHXTmKyG1HM@E*qMkj5*afT3x}AHI@HNx9MnxunRqojjsM>$B7qpom%fynRvLT z0=H0o0oUT{8)RsC9&HaF-SRp$-Y(_&xKTsV;4`hs`)>PtX6uvV)D^C{VvCb&FWab& z`MR*2yw?>H_A&OQ#pI0-Ra}iN7MZWkjMQCd<&QJ+xQm;);N|@7M?WqUo%n*e{}uIt zuPhuLrC7xjm`D%j!^P81EYvxzj1RZJDUx$a3Z{{f_(uLToThl|Gu!BGPX`a?_1Er6 z3}H$sq$`+isB3!K(Dm+vys-U4$EB^iZN~MhLM-SGvUi=;)PPk5M<#bFH=hK*VESFY z*UJ|#w{&ADMp70{+B%xtqrUX>bhpc%+NOOif?DLG9dG*6>kH!i<<$Ji)cZrv8j_qN z-DUL)nj+FAl7q=M@|HO6bSNS+9F(y2x+%A>M=#p{J7MTTgl{q z)xzWSJ=){Xx>-IneuI9Jnb!a2y{o=Mz7gh3<7N_c$=$s+Cr~Zw7du#3P(rpiM z-Kh@t6UE&7dLBrforyY@z$N)8At1=dGU>sKB#F$F)*BfS?JaHwK?qA3 zVg46UdP4rX^Tl}*Nz5mJ==#bAa%$!lgW2q{h_IOH6D$X)xPoguPE8KZvx&<;-dKq|2ViCJ6Y86(_=_>LnvMu+7C3-(CG zRdb6^ibTHZHM=cv40DMi>Si3nm)mDak z?ogfn&}Wm|Fx%BM=6_)P=qD529lr4_WLNy%WP){*Ra5j-{4WWXKit7uo^0Cr+VcW3 zPb51i^*cv`{JlGMREO+I8ox`6AMSIBOWnr(;*{7ERiPP?>FD6MuD+gI753CizO-$+ z)hpl1gt+M<{AE@x`55w=a!30Kx}GtsdlhQD#p9<73KK*EY8gbR_`G6;8Pd8gPc7(| zXX<}$knTG%AYpMXXvkGB?R3Pgg@whI*Z0UQA4xsB&wB37r$M!ehQ&`Q5g9(?2QC`U zx708>F6NvH{fmv8{G0N4Nc*v+AJV}>(v3X}(6^@w zI1l3e=-)he#IOG6pFQ|x*Ydv}JaA9{(St|)?!hkuP=^pbcoZCpMuTwU8jl>gy2mDZ z}Mzw~a8(y9^W-jm3){1oHpiWsD{2gI&h%hJgj%Zx+JLbqo3YM{NhwMjknKJGz_mC$iOP zvntv09&Q>dyy-`(o`>-Z*z`p6%`UC3d52=Y^Q2m;nn7gpvBB3Cylxh{UL}JZRJ~VRHGQ$7 zr!s5Hd4HZ~-VImgsLT!>-cJ{NiN9tth-yc4((wvzF}3}ZR|C6tcDhS<^SwPoxwOcl zeXaak7-hW58DtNcBI7+fn)K8DPWL`>_fSsIF2=x>&y!uZohTm|SESf^Q0R;P6I0i~ zQL~UHc0J>F)$#oiG2x3j*&p2BQx5oqS)M1a4SM!*-k1-@QwR%Rd_Pn}+saM9Pgzuv zPN?#R(v{rsi%nrI1N<=|(>8h4iSs^-Z|{Hc92Jj$El+lZbE&-7X`hgUm}-!hULKzJ zLi5|B?74VzS$?3%!O+2l za?TSOAqBE0wh1`yf8q}j)Z{O(QM^L;zU7or!GpXloK@3o zI=oQd8sXAP8ZAFn+Unb(+Izfh0HVsf_`XJWFPB`s2LKX9PC+%=7NwX^p*ZjH@HTtQ zu4bAu9Wb-c4plab)fI_oQJ-(di!7AsM$B}aazkFMR9cE>ny!2Ay)b$!csmKpLBBSR zBhu}coM;%)_ScT-Qe1GeW=j)@c0KiI{|>qi-M7NSDm1atPgz`06sHFTx4c)9W}}Sa zYx8eRQ?Ta_Wb^ZOV*O0XOS04OsU)!s{UzRz!VKp;UgCj`tc z8Zp$7I3e}gs2gP%&iTtJR@O>Kgayv!H$^cVvYdqmI!$iRoPqGX_YU)RkmSZFK1Q9j z3Ai9`@-XRI!^EkCDnIwdxhdP{I=94RwaU^aD2}BhWuze`Ni8|Em35TJPKcth_g=mteeMJft+c1(lmSYV#=eyl$g*P`2)tblR8b!6SdT zXZ)s;xxA(EBwz9^nsZe3xv917w6+YNWaEFZJ%p9zG^`c0YC3oRa(qckgJhbN1Y(r zhJgXmdlU>S_hrDO{SVxpPnRhZooR|{Y8?J7gItb{UaZbePKS9gi<)3ekMvfcHGHRy+?|6pv$#b>Y`f<$6HGS z^Zp6@i9lX**v=8pTg76xtn;2tSG+BlP-%6c`aD<~G2EwdtMjYs4cQS+e=5DQ?5%rJ z>r}Z(kKfuK+Mz-=MXjO8BigH$q%u0mAoyfY+PN#077`VnF7Ns$;DXH(3YRqZuoa7) zqbU<_*uKz}^Mm?~=&Rc#5&LP#u2(m^!a6+;Mfi&&Z|srmVR;iS#&dq2S*GPO2kUHy z0Grh{(JN8Dc+joCh?)XjLR8ucAjV-)n z3>`*{Ji;uUyVJQJ+L&7xRq83(+YN_gq!mo}`7H247<(S4-g7c|_d1_<-(C8zTvv{2 zD^+E`XHN-<8U1q7?uL#U+jv2Sj?kgZ!_pB!f&DCuX>&&}a)^%av73D zM*UP^lJYP~x+I~3+ETvLa1-&Vv=_G+DW3JWw75)r`|nSVQWsYn5@e$~M!)3&^JU3T z#^VB~J19!tT1cznwHIVD{A2st zzIWZ>KO4dl(D9~h-^JcO2yd;KvmCP>C6rwD*9qHzt%A4Dd^4>+-m1;sQfAf>^7wde zT2Y&eBO5JRls|Vd4Q6~_yi+8YlPnxD+#vGgds#kDU3|*!PoKFC7u8y|#7|v1;W=^c z$oH~4u9q|+wFebcq>3nxoTdBlYIo{gGS|pAy-!Mu>Nu+V8>edT-K}+Bda$(cxglhz z<$c$unVD&$YMLKbisre394$R&xx6k52`#xQ%r^lK4RcUXp=A2QN>ee?-W37N>P zv#g5mv9jXb8d3M9b6mI6%Sw}tg`U)~RfUMQN6@vto@8iz5?FXpSNl;wSDeYnS3WmJ zm1`y*rz6!!15b~z^p{kqBrk!A$F4gf1pH%XHOW;*SdYO{GH6vdkgUQN~TuN z2YE6c)mpJ%akH7H?cefCGIkW@II0e=uO}Iiy-`_B zs!beMU!scaZi@sbkvu-)JuSgz`MI!ULBBfsl9@tQ=IJdN=%V(cy>3?E zx-9DCx!1ji8lxlz@`M^Q#G<$pThgxGxoIBqZvJF7*SXdSih%m}vz4+k-9iJ7_aye) zzKCITJY8g_?`7~kd(iXsKK7mEi_vNCXM4$FOh&F!WoI3Tq^Q2d>3lf%pzgOA8q(ar z(mT7)C35(a4hKn{{glArPr`V8PVEYWxuc5p!xNWc3Ipx8U@?6voO&{CFg+A-}Ff(64F$T&^Bp5*eKesT5W2SBBf4p=JC5;E$F#k{y2^DlX@rfeIn z3+6i5cJhjssxse254&BpG;hkzwA+&5`>9tAN-I2f{$TBOlVMt0((O4@UX(rBJ1fZs z)I7=<9bPjkE7SY8j3U2wG247o&^gP)a48=-Uq_0yzFY;9858~bCWm402}7~e3GM!X zu04(;)It?hqX88$<#X2+61WohPJ`vm-5%&{!?+XhcQ8Sp^rFL;>QsY^aXC$GqpIg* z-;Sz+->51S;+lRw<%PuI!_UE@D0GW%+%n6%ze`!pOuc<~Zd*S8&AIzGEVTIF$MySM zH#qqe8h_@6R?5u4wT|gR;b0$36}ZptD&u4l<6)@aG>esaQYV{f@PXL}G9m4}ypqi| z9Jd5(UXk5PNqhZRpf7q$Mo~h?#O@zhT;kfS7K}VuOtuT^BM-;R4r!m}A>C!#4gVrLRekpE({s3pMPcTH z-*DCaO?$d`Q+ggG*S2Q8J%CA^T?{(OfA%0b!{8M8abQBpn{I~gJwk2dZ!CSdr$zNx z=?Qb;@DSP1#E5Xgqmx_MTyfc3p6vJ@gEprW(Y;EcZT;;wc6hi-G^Ork`5AH^#u1jx zV*m3hUhop@43i+vDYm@_z8q@X5#i%L`{nKT_IXiPn_X$Ddj|{eC?88b7ELO3J}B_h zonzB`3lzUP8Sm50&sj)*u(ifiRoez=;H_iN3)ww-0ei@7t#ch6%C@8m2~#Q7KnNUx z5Db}RU|QE<_SHnl665aKM;KPD+0>`ULd{ZG&$GCe~5>roO#^CtV9*moC5=zY0QCAX5MvWL$c}~zGcnmtnIG$Jf@d!79TPN{+y53=X zbhvU6W$oAYSTD8&W=pfvV(~`(E1pXXLsv%yD@M*}h^XsK9DEgEpz*eEddP>x`#d)K z`c>^@z5(Y7iHbBT8Frn57PdG(;4?1@p5kM|7D#z?CWebSmrixRoaknhBN5N5co}PT ztfegIWDrL~b?^3Ddv+wZr}f56Sl&zS7pXQ~5KU8a+YwL=iM7P(*V4CE3(t1hR3%#K zw_rOQo5J469;LXR^kh2P_l1UrkUBEV-XKG+GWM+sUF5wxWarpSlbS==jNGf8qXWog zbDu7-Kl>cbuVU(C`rw6`ldc@4wsm`IE9|)znzpKvM81~dN%KCS8LejwJouZb&W4N( zPu8CYIY#CV5SCDrq%^Bkg9F--s$MnOB$EoD3}S^qy$K+Dkm(f#jXOI_eF3 zpbANjj;K8vxSvErV&St)gb4S8Xml%|;iNiM<_sOzL{$Rp<9!I^miLjfx27~t>({>A z>FqbvI6q_L<|}N_{6L&5#Tl1+sOPilH^>eLh#cpknwncT15kGpnflUe9rHS>LN8n^ z^0}y}3)!kYYCksxfpB_GgpEkW4=L-auu^sV3*2L!AX|aiA;+=hi<|{s((Yr_8MQW<5;-z+*Du^*$y*g^1EA@h$ zj(S8kJW=WevzX1ku$8{uk=uA#xb1zX}XpOR&uZQ3av-&N7J!}045qxlg^s-U7& zM6u_2IJM1FvzutU-n!@%- z*Zjwh;eytVkW*TB8ww`*|?pHS$PiO*M;VU~jgnnc96=?Ykw zWSFh`c{Bc;QIlGwd*SKF1MhQbJ=po>Eh~jU8c*4xs+zZ(Y!svJ=^`$rxksUu;3%4X zvQ)jNyt*y=vtJ|JKPd9KeZ)V1+aLiXfx1nkf8(&Zr8f8(V{d^W-QGamTG z?d4qow5LHz6TNDw%BC58uI&SnJfFDEbJUsu9;aP)GH1^64E7l3~s zACJVpu8xCV9cMYw5WK&fN{D}5NjiXImUAz_->c(cR>#Avj)z$t53@QR$lF;SAG?YR zi;vcV@s`u`@UN@mEa%_h|6aWwyLvr#_4?&ZI`H{&iX8rR6%TF|&vGUl{{2-vxYco% zbJpW##tl|<_84t0X2c`}|z*g`e zK+G5a`w*~|aS*VTaS*T-eh{#gaS+SNS@`d*jssu8g@CW%LM-Q2fzOu{sPM0=ZhGU^H9A*<>;b)d`8nB|N{_ku7+OSw4^FY5q zk#I0+7#sqM!J^>nVQaad;CHr`C-xs<{bY-Pi^$f7Vd3TVA7K$?3j>GZuwVtk5ilTa zK!sqiFenx-upYATd2>%F*$P`KdDgXxwdvGKUNIOt! z7&H!w#UOF(p^8u!vW70aZuv)KKj|VsBhs}Q$ne_kACVC`Lt>!=6)L8735 zK=gWuTdnk2L)r$E>rc`M$cU_M92lW+{A%L_2w;2Ka3ls|YH5g#)1yIO!na-cZTWjds z6q`T*N2G6aux)~AKnnnm2nF0>ILNKQp@7SVPqGlet;;g}QjNBTx6LpPL~sP&HVNA% zmtjmzD7E%6A*m9iUAAu3A0TCIIuuTBA0X<7Fq-YcjiooDgt}tl4zY9U5;ZQgR zyDmdYtPEX4*#@-iPs#|;h?H##w9Qat2pkj%192ZX&}c|32(+M)0zmK(>oS}+Hhj*m zwzi-!at&>pqRR;2h_r1Ew#`sya12Rc?iWC4*ND$G3VlW_<18gUdKlr-LCZWdoZ{!gQeg6gF&!tL$ zNMvs_5pII3ixNNp4;LR(1AAu_41`$GfJ`I`vo1sWYpwe4Yj!#6`>)mkhK7PvR~&>0 zkI3IdN!xTlKeHiZN%9n@$0mxUW6)f(0RbpWes&3P{n8>b*li0%xxmR z4d`Pce`qWeE&$?_;CKbUX#i^kgN33%ID9=)XXJHkwaor^?v@W-HoRO3;E3dH4mSMZ zz&~Om@`ge~5h!qE0gi*f)&ZOyp+GPWjX`xTz2~ zpqPnLhyWG>2@cl4AtpXlA^-tFB`5|Q^{#LA{$z2D3~s=E|4ASL9+AM!Lbn-~1113W z6yPuz>?gohA1r0SAMpEN>$121k-$H#;Z3m}1c*fbHWT3{SP!HC{@ei{p#uj=!14kP zVOS^@hF+KX{k7rGZ}PWt$iC49OoT_|Z?n*CKtmJOE)pC+qc9*@foOS=0^m3Y4O^$> z#W!fNcQCbE!`ue6GjZh-!4a6-By5}DCL^&(C>9B}X&`|Giok-b6eJG3BY;|`<;C;1 zhO-Um;-8!mfDt*{IIaz7VWOOYLtl{Q0FH17dJYLb!XX9LX=(9%fi6O>cA(+kTH-dK zh<_4CKu9ER69H~O4-**#ds&bt0xBeNAg~U~Lm@~scn61CrM1hSkVxnYiDz9HBGUKZT$O`&lFb7?HG1 z0Ja%s0ghbBi6D5wNCY^#h6}9Inl2Oe$3?oFez##!TSZ4CZL`2_hJk?LPa+@)5G+Qc zK{6;3ZznLwb(vFBTcfo`;Xkdp{*UQqKNsf;Dk5PU2DJ%>0Bl&HAk7m*h=I(5UpPJKjT!lzOx&H;EXxfz;zYWL(1?U>0y09E-hWXT1QUS3f};l%*cpILDM+pa zvVp+c0yJ`6#*+|L|D7{Jqu_r*_LDOLGy-Rvf@}lsH<7cIGeS5%hZe8Yz~aP$18Q(E zy*{&PIpZpPE68YO~lpAo%iCltoReY`-0{;rm5g`b?K}8|) z-39-@Nxnv2KdCe!Mx54=xdA2olgw3|L@qZU<_3IqBAY-UkvNdqjlgFsgUvqR6{G^- zaO*O&zckHV!{G+h^G^;5=!hh461WX$Xd-h6a4rE->=7XTk3@nR00cO8M z`u@(_ah`-7K>fa@?D|L$aBrc zi_nFAW9EZ^jY!+3K-++3CdwLc*3rN}0jy!6XaTT$0L3Ff`Vi}~xu8A1i>0xl4Iem; zwO`|{ELVSQSl|c%iPUW#z6~g20)L=12pquTTOxrBL>vN$AMpA>unxN}`@7mmd(BGS zfchnBI3hA4ahm{a1FDzE7zlM?FrdN=pFoEZz~`QTOaL^<2wTrO#dir`L)Qj$?oYZ1 zun2T*6xDyaUi}}pHbkz#i7*BYvT{I14isO7g-_E#gDzm}p=zZM`tM{dmso9dQNjth zh-7UX*Csf_pk5J36h7Pw45t7H{NU3gFkolD9=d+%=Dvor4Jg{50=5c{NZBS~+XTlK z4i12^C{Wx72kCqQ_}u;F9T?DJ>mhEr4L!c$^v~)x#B!nDhNX-Ei%1!MU$_xe8_=u7 zB?(S?u{cnW3W_g*!33P4Kqa66d|mc(wW6${#MmU;)*@+OBQ;NO(}nvS0g$EAb5@L0vKK4_E%GasG5A z*jj<)mOnJc1a9WfY??n@i2^nlbn#r<#uGt!RL0-Xf@Dl^t_N1-@9ixS%l+{G2dxN@ zFAVC7*ERq}tZ5zk+f*Wu;2<09Y1iKKKjr>^_?>VZP#Ks%w(`>)IpX0n?lJq>B8uc8Ew~Q@H3PToHs!O^egWtB zg3jpC&Bi4i*Pwnlllc8^aRA%AS7%C)btc(^o$n=Xb}x8E(pYEGJqu1ab~J?jjL0O- zmWCip^xixRN; zbEk(7JORIQW_vdIV5BvFBU25ZU)kw|!(!ST-w?f`1-tcTPWtA*c(w}qf$kL~$ zqVUtl<=E}!KXY3si4{ZE@p?F$k3%t>OJXZFzArq%5lfYtGiF5FZP7Z?fNvBS%SOI8q2u{a{StlABVC=3oj^zADQ=uw=6tNej1#` zhNVe##ws@70s@aNyd}IpFd~Hp>;PqU*W6%?e1P!u;T5rLC?A`2Z_<(XJ1?oTh0Ew{z!A^_Ujk> z3S~1mTiLTb40gK~lQuq4(6;O-g!(%baK6bl=n(o8S$~gn)F5V$*qOcV?U&=fSxnEE zUUjR##(FgC!EJ}gKCI|ca;L(#T{0QBi?@0(h2`HnRd~a2VwbIN{u?@+;`l@cy;xx% zS*siWX@{HI?xqxKdPl`QvF#p9i-~M6`S5s{d(E@@gj>qx;xg^>UAHrm3u}Imq>v}I zd7LXGg|2q$e6K}A*%TiC{_sUd$=fkKnpbqH%ALG+DQjI3J5G9olsw94$2Tie+0pQ! zaK6wFZ6--Ou|rjCV(AUItCGR0PH5$vGi2tXvKkdz&2MBWONWqgZ!X^d=}S> z=1Hn&(J(YJCPO_uB4CmsRD`J2J=k^Y@_~0nS0#k)CS%l^HDq-5{-~6Td!+o>=lT9= znJZ4&YKo7#ET4_E26|h~+L*=dI$`MMnt5~~_W0N95?ifB0^1@bwlo~NuXquA^l@j5 zfWUoi?^3 z7m%1Zf13GjrbyYH=IqWF>I**MxmC68F^{?}M_DW?50BPYV_Y!TU%Edj3%e*&U$0hv zw~fnH)4EodtcCT37lZnB225m%O}&s!mD>cn+Y2xAi?1FRAL%EPvT9YHeUaY0Qd}=ySROqhw@{m%(ZBwpGiHL2BLWQ@< zQ({V^QdpE1G)oPvRQ3e(KG^!>^=$z=lQ1iV4@Oa3Rgv96-9eSzw0E4(n6uG&9c?x`Wbvslrs*KJPtlZ* z$F;6eRBO}$B`&G^ulKP$Y!2W*rM>IbJJW4;YdgzzlIOAdx^Bf5t?a~qd*0BBA^cDG9mGlxmvujH z=x6sGppy}GM^yOE1E3HW{R=GMl!8n)e68t5acy8j zM`R0s5&){6mP?26Jye$K0zpy5diK75u1{Q<>3`)5Buav67{C_+7(N>d--2ipfNdmG zhe#O6EJYzf;VT>okYYjaBsB1Zkx1OS!YqFX;H@l#f29i)E`wPE>=0oAfdft~V#BbO zyEYME0XKd{k*s4c2OcQ!i^loWm4DjH{i>zbc@1*8q169?xcsOAkiWNPkAhroIrYD; zM1vAH7}(DKzN5k)Nd0FQ_d6|Uu!~0GK(giUSFWg3!ae`CyZQNaf&V;rU|o+I0L_Me z!A5wX88{8cJCN(y(2SkXx9=;Z$3M{Q7ImhF2fNdNmwHLO)UH|FE3yzf_Lq+=LojX_ zw*uV4v^kGF730U4_{4q8;?@fLsLd}7_^_%O7X%KnEBJFmSk&b6-%S~bMX7kqP5TeA zBaM!fe8c=`UNG>LpN}88%)s5QE_nP%3pKyjwWI_ z4Mf;2?YM1Hrn?(nJZ^h4|2F8^n-U?54Cf`UTs^zpO)ce6Kl-4-q>?Sv??pHuyrXYx zRB=TCOA?&lh2D)bk?oV-5y08@<86fMLnfKGeXkH^5L1bR$%8+fPD(Sev?%Q!>0Ay*0JMVKdj3P}fAic$BnD7)m3oOj-+N6~12~zdUVbxra6f zu!-I+c)?!(&F!f@4)C<@dkuz`?@p$=u*W^<#GGw1i#tRvr1T{rO?gr1My0TT&?O6b zlJZ-c^oL&UR+3XrcVj&EPU~tK!@(yGYSXqiN4(?8`-U!Sc5a{B&sfA|m|1czSnuM5 zij-HM=A-=J2&{(M{?~V9-)T-c`8dIZeU2VYV3o1Co$CaG7h0lJEaF%eUImi$%r6=8 z(!F#yl=MIJi`<+wVPHqoEAx9?4D5)r$~#FZ_e>F&^>89>CSYISts`^I@!!+Fz3jN$ zJYp6JS5kU&uI^$5nx;^sFl9smojpwEA~2c$1f~84<*4z+`eufAN?Fg4(uvOPi==pn zx4Xo(G4yJq&s%5rDYA%#71?s7NYo-Dp2U8z@Il31DcrLtAYb<2EtB6@3(k?x)88z7 zgeus0l>?ZqmFQ{84#o_I?lNZ1_);RFk$^nFQlOPHdv~$m)GJx$sw8HFv~~F-FE$@d zq!*$tG7@}7<__e}y#zSs!~3;B&*dYft-%EVFs+yRqMHehz= zlv4lqMl~Ln=z^xE6YoB^;0~QHWt5cPB4_co_;~%E15!#Jhgdn%9aRcU(6T>JRjosp zJ^QUEA6D8)xn%Yz#o9d`?S6Cfi_)d~H&^Za>@=yqRbCLv8MtyMhfCuKDNVfyI*c2t zVeaUK2$Aw9j}1I#YZ(%wafGZiV2@~q6v@`+L%CY^vp_)RmRvnKT&Kv)WZAOhc8!iD zUBQp*8#wrZ+uAQigUaJ0Ou&`(b$i$>^+dfV1fp6{vOma)(Gyl%T }e{i{N=i>_f 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

)RAwy~(Od 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 literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/manual.ps b/Utilities/cmbzip2/manual.ps new file mode 100644 index 000000000..b8b610c81 --- /dev/null +++ b/Utilities/cmbzip2/manual.ps @@ -0,0 +1,82900 @@ +%!PS-Adobe-3.0 +%%Creator: xpdf/pdftops 3.01 +%%LanguageLevel: 2 +%%DocumentSuppliedResources: (atend) +%%DocumentMedia: plain 612 792 0 () () +%%BoundingBox: 0 0 612 792 +%%Pages: 38 +%%EndComments +%%BeginDefaults +%%PageMedia: plain +%%EndDefaults +%%BeginProlog +%%BeginResource: procset xpdf 3.01 0 +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + 3 1 roll 2 array astore + /setpagedevice where { + pop 3 dict begin + /PageSize exch def + /ImagingBBox null def + /Policies 1 dict dup begin /PageSize 3 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/cshow where { + pop + /cshow2 { + dup { + pop pop + 1 string dup 0 3 index put 3 index exec + } exch cshow + pop pop + } def +}{ + /cshow2 { + currentfont /FontType get 0 eq { + 0 2 2 index length 1 sub { + 2 copy get exch 1 add 2 index exch get + 2 copy exch 256 mul add + 2 string dup 0 6 5 roll put dup 1 5 4 roll put + 3 index exec + } for + } { + dup { + 1 string dup 0 3 index put 3 index exec + } forall + } ifelse + pop pop + } def +} ifelse +/awcp { + exch { + false charpath + 5 index 5 index rmoveto + 6 index eq { 7 index 7 index rmoveto } if + } exch cshow2 + 6 {pop} repeat +} def +/Tj { + fCol + 1 index stringwidth pdfTextMat idtransform pop + sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse + pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj16 { + fCol + 2 index stringwidth pdfTextMat idtransform pop + sub exch div + pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj16V { + fCol + 2 index stringwidth pdfTextMat idtransform exch pop + sub exch div + 0 pdfWordSpacing pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing add 0 exch + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj1 { + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 8 2 roll + pdfTextRender 1 and 0 eq { + 6 copy awidthshow + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 7 index 7 index moveto + 6 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + false awcp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 8 6 roll moveto + false awcp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + 8 {pop} repeat + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { pdfFontSize 0.001 mul mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { pdfFontSize 0.001 mul mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +% Level 2 image operators +/pdfImBuf 100 string def +/pdfIm { + image + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfImM { + fCol imagemask + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add axialCol sc + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h f* + } ifelse +} def +end +%%EndResource +%%EndProlog +%%BeginSetup +xpdf begin +%%BeginResource: font DTUUHP+NimbusSanL-Bold +%!PS-AdobeFont-1.0: NimbusSanL-Bold 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Sans L Bold) readonly def +/FamilyName (Nimbus Sans L) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -155 def +/UnderlineThickness 69 def +end readonly def +/FontName /DTUUHP+NimbusSanL-Bold def +/PaintType 0 def +/WMode 0 def +/FontBBox {-173 -307 1003 949} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8d62a63193c4ae94c086c1 +552833ddd8f116b5df33205ae709b3aa63da7bebb165b67281827b48fb5edbed +02a1a5c0784fc57d3487daa59520bada1be3fb9795669924321ce4f466cd8e3f +7e8ec2494aee80e2dd7a48a6861af5b9f0ccaa4a2fe2b03498eacacd6b9c39c6 +a8f2e39e06bbb061cf2ec380a32efad0b790974bb5cc3daf0992471456967362 +77de34813f27abe99302f86bb4d293a37f84667e7f3dfee4cfe9d1a676a5728c +aeb5222ff50da97e74b2cdebf725fbca7015a188891c8a376b9dd8a642c4b184 +b1bbf3f376a6d6e31ef1c8354ddf8039cb20faabcb34d4749b3c8c8d6972ceb1 +06b8a5aae3ae40a91f1f2b1155681a9cc933f87528c99a2b0268b43a3e829e7f +3bd863cb52950773bd9b0731dc4992541d7de7a055ca65ddd2317f1705c20d1f +93291bcc254cbaba425c032b3b15050d41da14ffe1b3d684eea428095a01e931 +98d4f849b239ad9d79f4502f0271affb0c297f2f347bfb9c137782646f648f77 +0076b85f5a929fcdea2703333f6918b8f125627f8b505c688e30f258ded1aecf +2c86edcd88c29249a8081731737195fab7adbb54743bd66511194dee2516959b +a20701e2d97342248297425491f6c9471ec9a98e630d734dac19721f0b324432 +c8d7a0b751453f89f7008ba37bc48e0831ee3ecbd8a0a292d63cfc890b28f695 +9e29ac3b4ddb78a6883b9272ce34a012a82adec0b6b641e3940a438a098ccfbf +c50544b94facfd9d7ae09ad0632015f81d2f77fc6d80a42ec11d67d8a91c376c +13c8e3444cdfde4d2a1ed021410f4d6a4e97804ae949bd913094d23108c9d384 +56f11025e2d24939114b6bcf579a0315c52f3ca1bcc2860fc1a0b9fb8a37ae2f +c20c0fd44d215fc2af737fd0339b070d54e664021240071c665de4170dfa182d +4e385685fb41a2d85888b1149e9a766cb4f309b4e2baa28cf1f8cc12c4b19e33 +f046ce97b53deb549fea96cf6ce66357c4904b7932f5b1ce03cfe3a10c976b9c +c9ad11d7a02816f8e11666ca8b3ee1411df2ca94172659bad929e3e3e5248f48 +0690cec6d8f7061608cf2672f65abdc96b4fca84d5c847440cf9523d3bf23f6b +d4365582e4b187b6a1a0282ed323bf221edd0a4ce11ce7eda738d1af48b2e19f +eb3da1664de99c447c35dfd45069fded1fcd70b4a6855e91ffbd7146efe88012 +0bff1d6d1acb53d5e07fb5795f561a4a3e953bba7c03a9762adae18e58dce6b3 +b1a703122ef3b16963ac7cb9682ce60e17947e7e675d19901c7e8272ce4c9fdf +536abdffa429b820a82aee9a73d7dcf77dde4d8e251cb3b3a5b0a91c0fcd7fbb +ead7a812ff194fd049f28b82f4c2d73e41cc73c1c9f668931a2c7eba5400a1b9 +0902efe6792f207136e1e16b41794e6cbf7316889a602d35c37ef36dec95af26 +e9bb0900456f2ebf2705ecce7b2ed90343d23e006ecb282d4b3629bb0c3892f3 +ff9c17fe6c5fab68358e1cd44aff021948ac9fb8410a3de22e0a01e367c52470 +2a8cfd284cf9e8f505d5dbd7bbe242fe071fea0094a55ed1cd7c9be6b7c56c98 +16ad1985fb7624f5e48cf6c0c2ed85b466f64c52f017b20cdabb85d24452e086 +3942362e764a2bda0f6c1b24426e302ddc4403a087efb2850cf3275c7b24275a +ae270f212831f4c4a5d95deab61923ca126e587e8f5ed4f2d5738f06e8c4f911 +b346b8ecdac481dedd2f546305a7cd63cb67d40093c618fbbdf498c8d7ead8c7 +1f5f022d0bbcfaa8670e3b3b999a1697c947af38d7e1a360e3f0825a9aa77840 +d7a9dfd575ce2f04d308f7c553ebf569ac84f2c12aa0869ce107c713a3cce624 +5059bfb3f5aa27d10e337086144ab09286be3825a3482c5422454c6a9cbbf205 +833316780eb88302796fc427a0fb9e53a7bf24577feb3fa5d85cb6344f908007 +183522d3c760c11fc7da8d14bb5dd800576a6b4d1b991c1bf3db0f9ca2ac5d22 +91079a199f2f6e6dc68213d33ea893b74f6aff30ed1b51f8b53a015ffd4d2076 +b71f73225b151cfcf11e2a2917cf1b3f60e2b4d442307c394e1625f7e60eb12a +f2eb9ca7b17b082f1664d09cb7a3f38aea99a13f659089426126f47fad5b6dc7 +64101cd437da3c22bc43e7a8de07253eb371470ee1e4e42a5d1fa2c4db5565ad +79d6271ae28e8fde5d4cb24064c145de44ed486a1e7df2df921f2b1be5fdb120 +d8b781c3655ea72dc22a2a2d37579f0af60b42320ab25c8d769124352448a154 +7a381b388a4d9a54e82f199ba35f1a3981823ab698e3f87d38d32addd4f13832 +77fcc9acee7fbd3285f689a85b76d0feb9e70f09bad0ce144770a6cc203ce40e +15912de0e3465dbc7918e3ea49ade57ee8c48c75937f5d25498c45170693067e +6902937c9b43ab6080111663d5dc6d88f72a39c5e7bad677229498323a3e7a22 +2fe2552b00cb91ce2848a1a53538b7af2503a3671903e10df0e9641dbb70577a +e828dd3cae98fa9e1a74f4377f908d3cd79461408ed29832bc4c9865550ccb00 +45359282255057a4bd4859915cf1e45ecdb7329f90bbf63e0a22a54b05c5acd1 +9c7c4dfc25482a27a20c7ab908546c3577e87ade93ea46436314a0a7c524b892 +4b012239e77cd65ae2949bbf7e46a5a2269b7ffb1cf8a5bc7eea1944d2b0bf37 +bfc36adad9a599fa133f77935f24ef518819d054345df144731dd2332b0f7f5e +84c46af486941cf1293e86ee719c9bab6263470c7009c3933f1857b0a863e36c +288d37e6ac85e6a1b4e6e91c0a9fe367bec427ea3713e8d1f0523ecff6067717 +244ca21c177968583815f023420a660f7aa4cdc8bf25ac3b3e429942b9f5123d +84234c186d9226487c76dfef5d26165771c0e75f0ace7e3882e49de831b46c12 +e30dc37395241d7619c05abc40f5a36f8042b461fb6c3a5181f77b14e9e6d978 +37356b4b31fac3850df1869063724316104c799b6a2f42c361a375e4d29eba7f +850fe29efbc2cef627a25db549a4d4c48f9fc9a2f32fa50c1ce6b5a545a95f7e +bf2e9ed710ae91ace1281a44e49aee4133ccc04926a6dba24b721c21188c89a5 +2a49745501cfaa4364cf49e3ec2a59d9ee46f33362634f9758827b199fd07dba +939bd7387124656831862f70a97c5a05959572c74865f5902e95093fecdbea3b +bba9b47dace807262de0c7ef04843259f58a323471237cd573298c5d0a0650ad +2acabd71cb44c63675192845e3d01b3b28af871f347d4a460cc28d9e94409443 +30e893d27b06132063ab727a38f447a2a4633d29adac01bdccc7634e64dfdc55 +9141f69e1202c4a0fd48479b0ed95a7605c94901373e1100a6cbfc113fcce445 +e0317cc94a8507dd637c37676954b9d34c6727aacf17285876db16dd0e11384c +2b996e85e82fd8fd2b8f9b83bccb398b997364f0ddb71e60ccc50cdd5d122eec +c36b86a89fbbb5bfb227fba3a7b7de7c907e58780fc276c24ff066982691a97a +50d14362d27d790375a47162decc53c5c11e8a7499788dfd86aefffe7e674aed +26706e2d079e9a571c6a32accc8c0dcf23508f58477d05f9a1fc679c0da64254 +27ae33293d02c9eca01daf2d0a1b07e5515d36e18caa3ab1b6c5736dfdefe384 +dbcd244f0c11087a873c4501c6de2a5a57e346fd3f92a0451e63fff6b99c6dfc +64ed8673dc54ef6509d0d043925bce39072fc64ddf2c49b8602d1a51ee822f19 +d7b2135aa84626bfe3ff321a6bec3a003ad97e7699cfa34bf41f9c2b38df4794 +cb5ae36c95f42b44212de67a96ca9d047587998636673a031c4eb03cf1a55326 +f5d94dde75086b44f095ede0068fb6b9d256759041cda04ecacbd8d7784159af +ae31a9c637d9a5c0c6840dd9e30eacc66d4d6fd6f12a603aa2db3e9866693070 +0d69cddc416d4b76cf6b835c7bebf914816b87edcd5a24e346eba2dded30f5a0 +dc033e93b040a6ee7f8ab3c44c61017c758c11c2e2fe3c4f18996287a48fa9f8 +fd068c42d0d3384ff27c5a88ef630125562663ee95a66b7b588b417b20d3ae84 +6ecf2693940d4733f9e70b0455b6097e73553eed34df8da712c29d76326670b7 +13f19d4b5ada1833d46fd6cfb92b85eb946cc74252718cc5e605cd6c3c5a46e8 +51536cddcc3cb244c78e629fab784fd76372ca9417fa67f292a7e780b78186d7 +f391cd91b6222e88c0bcff66208814965511967b2ed0d075c77b57701608b647 +b4e462d3e56e06c0403f858582a754dcbf8841fe81d39359d8c5a77c8ae6b795 +c11b84f702de09f22498a189a4c69d726a63260784066562a50544e5d07aebb5 +8265c1c6607bfc6008f2edfc9d0de71646548e59bb374996a4412ac22ab47dc8 +357153c7c9061e95952a729a80fb45f3650fb0c84a07c1956dcc0856d7b0fa71 +3f09c1b995b0c48c57c9367c0601a46cdaefd0460735682d5aafe8545cba587b +ca6e8144ff14a25b2fce9b23d8ebf715c5a544bd646d5460d2f8cbd44b6d8203 +54e4b7377db351ff26b7b9336a7dca3a610d3a92541054c544064447ac6d1a15 +cf1d1a3797cfe85fb55b56ac01fbb6f47e9c8e5c2929bdc7ee14f6d868464493 +df4759cc80405ef270a816607f248c5c1d5c56035a8ffc1fc1b5f69aabe2f964 +cba4c0ed5416a20f102c82bdfe59ddb4a16140c85d55af2aa52c92ee85c37881 +9c95865704b3cc39da6270dfaca8c3611edbb6da767bb50a03d6a06ed9890104 +da2a575ea45e16da2e1fdcd603c91af6beb934ea33023152c25c27c3c771b553 +1a9aa1ae684e1539e549972c97321fa0710759b6d4b9e55ef1b41bda01d77786 +87c22cb79310a9000bade74a8ac97b3eb2ff024bfd60c0ad7fdedb23c805f64e +fd139e015e0d1d3591be5930c356e6b8c1a4f0ad9af94eded4ee9aaa436d4cf9 +58c5897d06b7c97cdec22745c46e7b37695a8c66140f7f8421138892f4851c3f +d355b1de1d32145d39243d0590a90f1c4ec2c246d3f3779b319c38d4221576be +fd17d8bc8819cf8ec30075305f8637d1ddf0f7255ad456cc290f10ec39ddc2f5 +290092718e7d268531aaeb377701dafa933b94ce763c1954ef0cce19d77c9208 +157c38b279c578c56b7e523afccc91fe6819483de18ceebbe74b81844ddb84c6 +22d4f29661e89e5417ce43c28028e9e1c54063afd716088b6e8fe0cd1702c2c3 +31273573f5c3d760c8a2c7cbb362ed650ea8ff54f19e097f14af9739885af15b +46ed31cdef73db671b22efd41ff3f6bbd29625fae7571f9542fc06c77e28d2f6 +3ba2c9cf89da564de3a6fb3f0ff981c5c482a1e1de730041b7f1c890c4528bf1 +8e79f2fa4ed8a738f09a68a5b53edf6cbcf8861003917a89989146af7ab2e5a2 +836279643900c27a90463679a22f0ca5077728f6ae8a28324f9adcc19fa493b5 +e2465c6d98cb608f8dc52cdd6c52bad1a1502779b638df9336e12f035b3c310c +b92b3add047365f2d25b0ec7e05cc46f31c0575eaf4ebea0b660aa20d9e7edf9 +0aa077e3000e25176038ccc92d4f9fdbae6b05aa2e17ad004e13308464a20cdd +0271ed0f964e73cb11f18c2b795dba31c3ffd5648c63dab395238ba7c0cc7db6 +b206e6179c6ad7c2534c46a2b9c1d7fe6bc693df35118b708933677ab3a76cee +9ac0303c2c0967d718a1691f6a922abb6b37625fc01908c10242731b79a1a82c +fce9efbd1c6bd483fd867bc2938609ee52c0271a7ed1fde1b8667b98e22fd450 +86f515fd2ac2c11c50fce95f3e506ac6518dd4e532ddb100d87a9240bdcdafc2 +0c8bec467d76261165e9d8bdac9197ec798c81cfe80e3619f432674cadf44ff4 +3f61089abeb13d665e7901f4a1ba84115333210009d55e051b692aebee9d9bf3 +d0219c290191c17f7317aaf402b88ba353c25f126e2d32bef73d528c65af0840 +3ed4086daff574762531794fdbf637b765273911297b75338691e9ef4d2ad452 +22454c6a9cbbf205039d6d35c09a0ce284e9a776773a98e09e6a816dd71d80c3 +d80abcb006353b4b7c48c76bd9c1ed9db78bf62e9ad2222e5bee9fde0281f0e6 +11fd6f899938cee729a184be7cbdb0b84fc9c380d6c69cdd6e0f3f6780af684b +cec6361673853b400f47e00177ff1ee7f9eb8c285a49e137e08d5d7663df71ab +71ca71adc0857055686a04777a2e1408ce629e018c97524af5588991be92e4fa +4a27745aa950a72d479c48d6f8c30d4258a882f199b4359f92a963fc650230c5 +79edf743f2cfe86a197296dd675bf05f25ed969de77bfdd0b518cbb5c30b4e42 +27c5117f235b34f7fc32413a980a38968ff9b8151280a0259214790e421d0f39 +eeebe98adba820401c2d47d4132cc68cae0f59b049d7489f62259bfc55091c81 +89e2480dcb77f689965151b7f6706af675a871370d2195b07457af8809f7abfe +7d3672d76a74f55ec749ef40f755a3eed96cce000644ca0c497afaab7294afdc +13c3239f54f3eeee809bcd936ff447277d2f3613936e7b39e683f25b60505f2b +f4343ed0902badeb62495cef53789b9e74baf866be33efe66c1c5faa95f60ac9 +156a26bb9f72cb73e891ee4b905f72845b3ae05e025879f07a7b91fd06204148 +60832d64b6bd5abe0472aa7aff07fa05d23a01238b6f624ae8db25bb71ddd893 +1fc6003f23292a428a5a99df5861e0ae858c398d66d027a32a71d6e62d62b6a1 +a1db86b1ea3005a201618f22899cb1e7d70f65fdcfbf7962ee0d0d15412d006c +cfebd0e0892888f26238bd1f7f090de03c41ee4ba53548f469fda2d94f6b3da8 +a606fcc3554e3f261b8490a3b8cde3ee846542668ce3b371318f9864c45a4223 +fa2a86e12034bba867c4abeb461c609c8d47e184703bd6c891f39076ee06bfd3 +bffa679de07d8c8eed9b4b24ff74c6db2cf84108f28e4f0fdb78e0e726a9bd3f +2a1b94daee18fd20f2c902cbeba13c1b281d0a11a96b20800e4cf939dd32bda8 +25aa63d9f86f380af4dd379d80441dc4fbc0719a69ebc16e1617940a19eb0b44 +96581982d45b08e512000e3915490a1a79b908e1e63ae129750fa45dd33c0e9e +2e767a89c6f11e33f193da18dc6c820dbed8d370492c19ad9d6407e50cb62446 +d3ab009d9e8f3c51eac2139ab64ffa19b70405813652fbbe33fbe5bc95d40b5f +9ef833a4b1b51e56065abfef1036eeab8e04f096aac0d2813c2e721e0db97368 +c17f0cc971c9ca18a2db11745f67d42ce5148e2e8b2c0e13e4bb16a2789f0c4c +e7b65be454ea623212bb2ce5afc6b5b3ad5bfed65063354becbc1531389977e4 +6599896d9ddbdf3ad6fdd8a44b14ec8cc9f131d73cba91e28cb54b37655e4b44 +db0457ae7bfd3c6b73bacf09861a7fe4b664928230fa03cb99ebb763703ff8d2 +68877c3a3b1cf915891578aec60c1f7d1e447fc777d8eb3573ba2a9ce47c99ca +a9d52f2f12b101fe48658edc7543ef85dfe01b72dc4dda597951ea4298fd444a +ee33b14ff2f91b7297922daa7e346493080868f56aaa2176c9f2c1284e4b2672 +a3b75face39df1c8b7a825a3a5c25871d190e48574e1d03a5fb094d418c47ac1 +687e8347036cc44fed3d84fe5d4b84a61fac9968b8d004c28539a3681476ac45 +56538901ff2764c1c46f5ffe048cd3a7eafc6a9fe98ff9b3cfdf3ac035a9d3f6 +8d75440d43a1842cc1e8b6b9b6d49a9bd093620735c9c7c11c21652a5262a86f +c10413a373a9e02a488bd9a16a51fb51b027b2c5cde35cb1aed91ce58703e1e9 +ebdc1a161d754ee437412182f7d532426841e2455add22c031a2171426881bbe +4090d1cbfc498ef46749308b73ebf4dc5a06adde6f83bfb368388bf7c2d900cf +57932ba4c9db0f15faff7cbd701050a1db98bdc9a5f9f428980ecfb1e999f460 +231e59b5c62c7879278f10f6a61f79cc9da24d35a2d26996d8a4a106e081b8c8 +3fcc015b775acb00f78953a834018c146c65cd715bfb5f90c03feac01839c6ba +156e327c97350d2851dd77e8263b967742472dc1e3b8f0e980de9f1815007cea +51619d84375b777d5cf32a144affd8ef0f4fee2df1f839b2a5d900ec8e76363d +c829f1d03d211175ab982226616b19c51800e4b5d4b28aba82980eaac6131940 +026e3c2297e197fb8f130fb15d2c4098b97c84074d4e50b5c6606bb0f3230931 +52b39a58964b4ca44caf45f63af49b330ab3dd863f5ebfa8ab0db6cc37838a64 +72c601c215037e94ac89420fea13d52174ed5c933e8c8525f88e6ce482661861 +58b904ba7fdb864cfe04bd7ce6070fc5ef576b1de985a8c4eeca7fe32b90d320 +9091d8931bc21c6f969288b1cab44bc53755d8d8f257466803dfd5725dbb5830 +4be6c784fb6f8c5e66802028759c0597246fc103eb63b58f361b144668713570 +8c6be071b51fde425a0aa5724986ca67e87eacb8f517fb3103e52595ba002e02 +82e54cb82b04c993d991d70b5eaac7a639213ec0f82a1d7750f3f6e94d8ac7a0 +8a586b816a9fbe78ff96bf1e3cd52798089f279a0a0d93e0314883988bba0f78 +7ce5745f8b07eb3b750c1d0a13fa4b0338346220ff9ff10cfe04f29e2c24aef0 +f77f6748b63b0c6d53461536034450820c73116cc66feb9c7f7d08e0a47d4c92 +ec61c5342099c27d93a79d9c9f278142ba03b51d6e1e03944abe063baac32629 +1b5dc30de8512f0cb3a973cc43afc2be532ed012c3eb58266cbeebf611f91aa1 +489d0174e713b976f3a0b36c575df597a3d8b12d4c5441e3a478f0933eb129ea +e44484e084bdde7d2d9ba23a6bf1bbdd51d96ba4a5207af1044e917186b7e66d +accde1295b615f37f1395827e29e3a1711fb2b6c50374df468be421cc531eae4 +b3cd2473c979d11c11beaf14aa9b6cce4acc8208f22f9fbb6713bb8306e5b5a4 +d46d11e604114d9a5a4be0615a843d10de54ad62d582302fffcfab7f785b11c4 +83081286cfa04302f7b92f64dbb42f3f97cde0c047662be6a3e58986c54b7c3e +2ac1b0d19bc1490311150931aed3497abaa74303d3f0a3f3af8667c4b0b91385 +cdc9bd2ae98ac32a2d943e0583a0f3c74fcb803559fea211098b48385d3d8d32 +9e2cda61d7589e5383fa32abfcac50355549f1e819eb31531dadc47f5e759790 +d355444f1efa6b1dfc7713d446008225808fffbdc81a3b1b374c7f2901e27e2c +41c477de0e52e9005288b7175117b32c326b3ad2b9f9342865d0bdd0ba6044ac +395c2c69bf82a7aa9b77842a3bc7b4a675b0c32a4e4504d2a9fe8762170f54c3 +4dc3620cdea9d1877f274559ac6d37aa83f90346130472775858c18746db4558 +4f2fa7698926c4fb2eef0951579dae63c2d3c7b9e1fc811ee5dda4dc5b5e61fd +c0ed21724902532087dbef11b1fd0d71eca9f271a3d1bf8ded5df19db6761547 +97d0a12f94147d64bade52704f880d0fcb89f4958547c6839c9e111892797f29 +4e65f7a54e14ea3d3f50712979f84852e57b9c1d70474a3593d53f21603e00e0 +e79ff355914f9a3d4ab1e14410eac9926928e714248535b178d6fe9e0e84ce99 +59f66fb52f37a4e3dfa5488b76d9ae2f62d4495bca11cc148dc20e29a694fabd +e65c7629ebc40ff0c0fa109631655d3ef9848e16aa7c73cfd4aed02f8f125ab5 +0d628ce52fcae577c7ef0ab688a2f4fa9a0e2a9b10b93130f0b357f4679c1f7c +9bd270f34f0bfd86459b402c74224a621dfad6ed316d05e15d31707fae7a9b62 +f8f75537326742f1e9d0c7483489f4f4fa38e0f327f24fbfb26307ead2720bd9 +678f45875eb05036341ba38660630b7d005304d4388ff7eb3be9c2635c21af0a +02d12fd19a4e52181a9c7f2356b2a16eae4e8ed5b1ea0c01565c26856787fdfc +2aaaf11958ff3414ab62ca19e947db6b78030e2c528f3d1c0215cadbb0c34f72 +6751da03c604bae7b97f379864bb54be9799bd387e88d6c7053f83dbae1cfb04 +f2ac87d12dcbe17a5183780fab4589e8b0d70934e856f11629a91e6d13da7704 +73cc80e0b80bdd42a71eee5f43a4dab994ee7cfeff83d08169aa298c98a85477 +dfc729ed6db098b4ae47a25b8ae7587b8cb2d59cc0989c06129fc201e7c9b763 +f8b3f651a5c735edc975cec4ce461e81ac9d5e3b08a708fc536b46b9566a58c3 +0402aafd2b6018dd063877b880f85e09895dd4c9d89b5f264ad72cbea438c153 +054e1a5ece2091e1d4105f46b047b75ff3be86491e694c1e2e03bff36812d148 +d9923f5d89a28fbc4f45fbc3db74cc37bf3cf41b070d72a4cd571524fa6df788 +3153e77818641287ae22b1c72331fbff019ccecbc1709615ad749dc77cb6b331 +30ca3d0fa05cc47447c17d96cf6ded782ff6b505193915aebe31f1f7b95dc9fd +91a124f9551224117174ae1e05754dedcec813a8aa4934b73de1b20d7c10a20d +83a8b085cc2d431b87397e5f8286c0a80704101475ec9845b2bf7ecb9ae457fd +abad09e4e8ee411d4a20518597b08d5dd66afebba03f632ff2ed520270893f00 +35cf0716f4a092faf8a0c2a3f73ca46afd2a825eee041bbc2b649330fe821807 +707a06ed91847b434d34742844947d54e80422f5b5b56f6dbda934089c32ad12 +375b31af9aa91329c253fafd3cff4858c39ae5efbed4d590819d2f5963b7e08a +99e157ca1c18b20c62a8f7bd278f560e871b6126d9cdcec52c6839417bc70dd2 +49fa373ca6dd557540906729f2fc5476c38595d958ab2b6c14629f9e16a2a9ce +9f6e2dd760e55a38a3432e74126135364cec00a7b6dbf0cd48555df9f31e71aa +9d573bb077085030aa3146d0693fe683884ab380f052c38b31b0e3483d122c4d +d15a6a93eafec3523f4b2744935de9d1660fb4d8a76d82045862b59ea2183961 +f9868bf03e4a71db61e03fae93bea1092ac5ec83d71dad123d5663149d4bd0be +e643435aabc919942bbc60d4ab56ecdecad30d270589775a3ff718cef0e2ea46 +b8c75fa911752ef13410185e5cea25aee6fae74489355d3328e0cbe8d4c55d46 +4114b4a4c85309dff4f2a5c2b14fc4f4779f4e3a8bd29076baec35cd59ecadca +09e93d8dd4786052d970484ea3cb45b37c4a6f74249e9f5eb7583b018dcdabfe +67259769ae1a904f20b3ef352cd191bbed998f4b2c06465d7355e82ffa718e08 +9dfa5c8fdaac95d8e05cf8b5a899b8484c5ea104eef3e5b21436ed396662222c +8cfd00b5a854ba9338da205f16e5c0f451bc1c6cf34f0da069af5ccfb460cccb +b6f393a99f6138e0ece299e0c0f7f1d0c83e0b936cac2dc38f08292245e7afdc +6538c4fecc7d712ef83997088f73ae6ff0ab83d0ae76a7811cc07b41a57d1d34 +04681526d327b489094dd961f2f60a0c6c275f09f0a171e88056f58735d2f502 +65a167d12ff3395df58c3b901a68f0d96f8ef54ac5548086229adac495fbc256 +afe832991f1839aeddf1a87abc217835e58af4199823165fb9899fc831b47bfe +4c3c1f5a2696e9a5f310afb8138eea06fda0688e0d0d7cd1ceff93a72c57289d +332525c3bc60e51ab25526a4876affb2c64657caf14b34fca46a78e41b0c1955 +01fa1a0c0d77d5f7026234af489b316872e64b4d449efc540fb0da553063a71b +d8ee44b0f9a20adb9f60b99803f1760c0cde357784e87042133aa085e9a37a5b +b5685e73354ca0e9a48d886fd12841674bc0713d43301883f1c2f6190b47a4b9 +996c0e528b6572c96232ecbc57c57073463ae36b5b2974163cff75828a20c47f +926e99faab51f19fdbe0f89bb71ffba9eb95a82b3a712b54578f665a89edf193 +d575ed95bb883f9d6797029ff0cc8a75459fac0cca4530e17d93c9834a8d9c9b +376d3e40f3e44e6e895f25c90a803cf8b0f3056037809e3ed618475c199f43cb +a7eeff84d38f49aafa4e469aa78cddb87ea76a87da1b888c38e225499d1bb089 +32d599918227c97b1e4de521460f1a175ff2fc500bb95574d9eac64cd00896f6 +27589fe5351f46a46d1fe8ae16fdc945decb08c0b7d841c5516535ab65b84724 +04796bd7b7083a606977316dffaeec0e8681c10df4deef6335403e5b08889558 +48bfb1b8708a5c41c5147fbed3942ac26ce66357c4904b79147dca55f039b648 +ae18d0d6d330a621301e3c1d6e478fc6fcee4c3382d463491a167596ff51f17d +1afdd4ee7ab8f1b27b4ef2b665cb6818637b5e982447f6d7ab2806f769d254f9 +f5981812a9458a39f51366773a8980c7c6dced448d878af3bc088237815d2727 +40093cb7c3a4e6e86ec6cd61fa8ad13b20e270f97ee5be1799f2966a0ca2a7c9 +32de08bb021adf9466f1b88ffef315b818954057877d3d59f173c1b1874fffdd +e3749a0dba7d62d70483b1a7c7720c1e95c59faeed0c8be1913177c6dbaa6905 +a6bd1a153906aa1b6919ebd1befb9a54d9b84cd9d548b1abe83933670ea719b8 +6337d01283b95306db92fe059da52d107ec47819bd163b3830c989df4052614a +9866b057aeaed455fc9864df1960e97806cf95011394e2052861152024969836 +77be8008c246f14aea1c26e620fb331f96cd32a23b1c87d534d678181a198758 +4bffe069fb5a0c6b63ca8a9cfb6c3fd6ecf07c5bc59712ec7d02a5b988c3fbbf +695fc7068a644d8885ccd88987532539e5cefc64fb97ec1376ef0a97970db510 +4c19b7a64a1b4f7eedfec2515996238dadbbfa8afd8004f12867de20912c2774 +1ceca6f2956b340ccb5e30f2b1f5f6376e6d3a272be05c29125f6d74bbee7879 +8836ee673971ab724dc89867d5a939da0cb41678fbb8d8ed35efa28de86728f7 +953c9c5896b867e4b7df3322563aff8a31cca8901b5542af2c7254547c7c09d0 +15baa7cbdc7352960ac650a543f05e290341d245ddd331a556ac7fc0ee7eb246 +718b71073b9a32776f6215fd8fa2297a2e9be23728cbb24c53ea10a4544ddfb5 +7d6292640840c77bf03728c3e5d2665ed7db7410c9ecb32c249a45664f72f8f4 +2e81a2e086b535f6473b1a3319d134317edbd1864cba7b79f89ef99d16c8871a +28fbc4cb45f982bac6de81ef637a7e1022a5579f73867e40e31ec8903632e33f +b24abe53b1f3a3097779b977bbeb41c21857909d3e25f7bc88e6d3fe6f183da0 +0133a99ae39080012df8498b9ce322ea9b76343c2e8be3676f08602470da2761 +ed9de407fba38be82de624e1552be40a0e10b55ad74367b91c80b8bc5cf59f64 +b79072369d9e492ee6b9f9df0b91ae608a44020ed6874038974ccc9afa88d6b7 +8114af4de09e77e4b0a1a1fb27e226a62385b969bbebb657ea927fd86e050ff1 +3ebd001a022333f8caca13c54f9b345cd5b6553c90b4f7fb949d7d65d9bf9fd9 +46a3c7c531f6a6479aab0d5a7015b56959777892feea7990edbd2b423f6e9ce4 +583caac124c268628a9cb703dd96aacd35b1031e08a741d02adfd579267df790 +5ef26af14b2bbdc22a1eb33b58719a1e8463f28784f4c15cb3c25cfb2e20a508 +7854a53f4ab398b02177de500a049d6c9faa13fd40c19178e878f1cc26221c59 +b40545f5f4442abba06656ead5afd938adeb3ea50c699862d48e767c223c1f22 +246e58c5694d1e23511710817a9fd18a1620cc651345e6d3302d85139f7a5734 +7e423be145e165baf46019fe831f97602ec87b3cdfb8fea12869c98f115d1b66 +5aa588fa82484acded7ca2c13a17bda305f63ee226ee1f37cf247f1aea9ff92e +2fa4c1e0448a5dde45294699a9490a5ea94cf81c53491fc19e2ade5af005c300 +a5fc99b893ed1d469788e94de823006f8848dc9d021f19b934278d44e8c73da9 +3728f389563e10ae6017c5caf3b4b340be1d7d2b7f24a8cfcc1ed1eb920cd366 +6fa12f35e45673fb12b45a6ed7e84937576e5327c82d7f27f6c0255f75ef4b02 +cd492b23ec1f346bdf8e007042a82ab730ab2805569d7b978a4b114577514548 +0d426dc4a8ad86de85b23ab5aa8a50a30bbdd8ef5e9ff8e7954a69987fb5401e +a9d039d5e05ef245e3c70a85236969f32bd1e5d29d71a2013493945e803838dc +7241a73c4c1f14548eaadcba64aebc29fd2253fa59b6b039bb2edc9e4a7c8e83 +317ec39a07b8c8297e4b08d4e6f01a53e3d690f1d1db49f19640c16441be6ae8 +d1cbdf853394cf665f741938733fbc700e8d82c4cf1d72456008a0fe55c8b677 +a4f3e197aac9b976343923dd4c5a181454319fc509d499bf14740ef1387f354d +d71c3bc5b9d4d2d9e0e7a3bc60c79c8e6d344bebeb3b2dc2c3605fdf1002f061 +d52f718b57d1f6c1406b1fdf2ce37ee45693ba72284c5652b2d88b29ad55d9bd +78032a76ae6427c19749ca1503fdfa6eda4861f0b0c72684589efe6c01d9c964 +1201b79c5ce03520510e13bc5461fa3d2897e2b7c65ebb571e2d0ce319248d4a +fcde6d70c38d25f6bbf0c09b64553c3fdadc64c293deda6e2ed8c191d7f432ac +5bcc1ac3183c92d545abbd4da7e768140b9f5a5077b08dc8eae64727eade3e5c +05e07036b08c31ba5ae366c642f816b5fa60e148795d3d4ce050f09c443d6fe0 +d44f8859d43da39643d4fb8c5e2e34f1b32142ddef07b1c02c09f4cc9509eabe +99350ccd3a9d2d6fb809016dbe0c1a29fd1d25cc83125ba7d0143e09203f9e34 +99c6d07cc78bfdb82f72c577aff1045cd2ce2e3de0300283ae5ac540d498e467 +0e3718e3dac6dcdf1c7ab2d5f75c5b6e56bc32d8ddace4ce7f9272aae188f3b7 +d6d31b380592cfc0de45eabdd87cfaa15143cce738ede40bd9a06db0b3d5f570 +be5b21b328b3ac4ff46abb190ec17e73d31af389dc8e887280f84caf7b317c27 +38593005aa586b3c4918fa95a9435e45db40bb52d2f6034686463c87280b8085 +877297a871dd11fa1d782568fe813cbdab6daba828c1c264c3db809cb9da6635 +640c3e991dc41cb1841ea1556b7560d47526bdc012a8f1dacb30f38ed0f4721b +b98b107526258d66804fb0dd4c52d827850d8f0a764a53cd81f66269a8cc114c +06482a5b2b752416707d28e88291bca02b7746161794437f61e7e3353ecc92c4 +151af9a2f0b0e0e7b8be3106fa8b455e60d1b8e7a30a45922fe00f7ac9031be3 +b9e1dcae83017ffa27f196e1b8da6cff1bc25c0d776dbf675838c24c57a3078c +d2f6dad8722aa8997078f22bfab7e8f995538174d577c28d1660e5484270e63b +90ff29111a71bcfdda204034ad6df026ba9fe61c02bc99e0553cae82fc1f84a6 +f8c744cf34a92b3fa239b23fa2aa469c5765c02abeea272fc928d24714c14ea1 +2dc6871a82973f1b57a2063379dc471f0dd0684ab5ce9ab8088512b548c0e96c +59f314ee81f9ba0a793072325d5b2a478eca04739746 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F122_0 /DTUUHP+NimbusSanL-Bold 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +%%BeginResource: font VXAMRV+NimbusRomNo9L-Regu +%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Roman No9 L Regular) readonly def +/FamilyName (Nimbus Roman No9 L) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /VXAMRV+NimbusRomNo9L-Regu def +/PaintType 0 def +/WMode 0 def +/FontBBox {-168 -281 1000 924} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8e152a40e590419249f2e4 +c36159f8e54b532468e36965a38646781ab0b7f6a3e851fd10caa49adfc1e546 +2fd2ec6150dc6e19523050f6148348a561ad8d2e2721eff8a570cb33460a745b +926c889304c09753c2d78fb0ca95dc6de5b8c524752c83601e7e9f73df660674 +f05ad83a166da9be89f22feabd4b2665960f6fb5bc32928e1230c212e5d69cee +0b3311a1738a11747ae263106916d8e95f25b25b4bc6afb03b79abb95dda518b +41a49458111d2a1433c043627ef9460d324ffe22935f4f6da88b8b91ae95b34e +08408a34ec8eac3f65b6ae3e3e2524867ee9d29068f81e4372f4470beeb4d6be +ee4df956becc0cb77f8490117b22b2fb75c938ed0a5e208d88bc38b2ab8b9cfb +f1d53084b6f43df336481eca0aa2d5317bc83fc0e1d4db01d0b7707eef217e94 +a7f985102ded27d8e8b009f7ef6db91b91e78bfae7bd688e10b3dc9ac77cdee8 +47aa4dc8ec78241e593d26ec7a60696151a2ae5325d736e99e01bdcbde69579f +92eeec224b6757eedc64a75455bb665df42a0e4ce7b99bf3e7d66f8ffc8c13f9 +d7a1ff7a9d5ff7ac43396779f11c9b008c33a2043d48b61b88b03104b1425f09 +675b559ca4302c001ee80d2b739cc0fd1023bf4f1ff9c01e892e59cca7c26011 +b8e0b6d29cc29fc72792fda5e7d5d88ef98f9dba960c96534c399c54865eab86 +0fa2e0d6c7c44b553eac1574d55e7970744d4792fffbdce6fb4365bdbc2965bb +2e9edad9e0ebf0b620db415ad98297f5ae83d9c710436657e74d26e83957c745 +89834337035a7501803947f6880b70e56a3a404c62d57b849d28804cbe0f5884 +435a0e12dcc9ba414abb732bfbae237001f557dea5e972ba0838a3c7c9eb75aa +4a050da0a529bdffbf9011c360564fd17a02c18860af6b86efd4e2c125686c9a +5e114e95c71fc89a5de9c589bfe5ac0480cff716345265d2435edae67cfc4801 +5bc08e7a48d683acdb91e05f469c0c8919d73a5d07a1ccb173e30e76680acb09 +02a40a3e11916198bd69f1a26e88330f50692d0d5917e99e7a01b327413e24aa +e98ea484e45897e6ae4d6997b6e8bbf61c9406e916d56985cb2bd297e8acfc6e +cf2d2281ad84696b7c6cb584bd85cc20ba14add3bc3e25db91124c0acf22e902 +3cfbf04cc40de331991e9075d22ab5ee0e849b340050e6c417c664a782d05549 +db2ef572f193b1c12b4635c2b358747046de5858ec32b3b2e79d42750657977f +acdd2ee5a7c9320d907438dba63aa05ed410fc7000f53549091be71be45da4ab +a315f95b724a60f17c70833e889cfe7ea206a7abc4393cb6ef47be3700ba5638 +6831391809ef8384aea8c22735e8062a9f9101add125a321fb65399cbcd9c9e6 +0f46fbf271b2b1ec80832cc054bab5ca80d4561da0a380d56d5cb3d90ae89a19 +48cd824eb1e7ac6127a6dba3e8ea40f00add89749d77ec0eebe26fd6ea5d8cce +f7239681b3d94898236ae92ff3912e0afe84b6c7e08134c158b640b4aecab5f2 +a90028e67d33df31b461a2846f83d90979bb22618e2a17c5d159fb59d5177e12 +edf1320f596e7a4c379329adb367f92bf2869a9a97398e0c20f5f017ca9db7ba +b3bab72b87a7b6bf4febd03132f9075c271f2054078396df8403dc91461325f6 +12cf1421f3099ccd799c2c099492c4f071336d985c0c360b2f5a5877fd00b6f9 +2e5911dddfb31d17a60124ee8da6cbda94196d7ed42804610e4f730daf2f2d5a +b767c320c62543e26534314facae006ba2064623902c8ac479eeebb609e8c3e4 +1516ce412cb410bd026231e22a9cd0f664d769e4e45cbb75b7341f06d8e37285 +beaa9ab71aabe3cbfe5a348681aa246047ca29ca6b442feade254c7582d32d3c +71b5e645c82e92f057eb5f859bee23daa95c575edaaf9896d6c10980a09db34e +084c8a754e31b618c6991baa856cb86877044e10c2f189b284e3195a2db6b910 +2574e2461d2fae65b7321c0093a2a34996c0b77123503e9edc623dd02c44fb76 +3c550840bdf969582d226510ebf89944e59684eb2e2c463e69702266fbcf8d1d +4c0be400495e227b9cb21c8086f328782ca7294dcf3ecdc1a62714143a4c1b98 +e5de1dd554fba60571188a58f0354a6b9ef580689b78a0c8515ca05a35832616 +7e0a90f68f3c306ab60aab20872fb167673f41e8e87ff0111f579cbd0da68b56 +3e35d2ebf9f28b104082e36187373efc7a33f62d3fe4a390b63a76e9b2531871 +6bd59861f51b561dcc115192a6fc22d15a5af03ba09cdfa66b660cf4288e9d79 +26e797256659b0ff64bb5d900990c3cb588e1e18810bcb009a91e5f4f8d9db1a +f2a063bdabd9c3332f4bdb701bb94b4fd24570b440ae74b8d924e48e7c2defb0 +53a19e5b4df39abf4f6fc6160b5fcca00608422a3091cd03e726b1ea1d203b3f +c44173460b490498eda3121881ebd21cb5b571d21a6228cc0a1b035ebe97f26b +0b58179bd22ac950ec3a98458051a874297cd6bfe731c5b413819503111f1f6e +ebfb5628c955f5fcaed76f2402ce351f77e471d1c9821dad627ff25131590577 +5ff9335dd28d85a11bf155765632b34a3aa1df9c01134bd8fe927e0064319951 +e2c1d374c9acfc30932712a5c3e0fe3c7e355e3356e9135a143f1b4e2738e208 +8f44633dd9300bafc770625a64b2bd20d4f672701310e5d1d5b2dd502802539a +65344601924c473b7618f9b87bf6eb49474fe62891097b9b381dfc9dd22f6ceb +340efd950b74e614a2908eea7b0d395e15943d0a9072e2c0e6c91d9141c84281 +6a59f02111333723db78c2c287675d73152ee3c63397f5ea6203c707568137e0 +12438b86ead16d71a0a56d00e6ace9d80aff646b05d829dcf08dce2fed1a17d3 +83a7c9e7c2a5caeb38bda802e6696bab17a5d1e5d6c51b6371c642d5588a2945 +1f3c8b0cd56806531579f7c0d10a9fbe254ea910522d955c86ddd693b8660bbd +17b2b23fea57af15b1720e42c6de537074c071c50c114ac54c45ba2fee00d13a +2573bb9243648a1be2569cf68ff78e4cacacdb34dad918a30005c31f17781633 +6b74af8b9931bec0c1892780020c1a92470e3ad7f1bb6ef26c835f13a9c56ded +51df4a7847c993b88b9fda9a8955d8bdbf6ba773d06645e292ce26d9df4bbd4f +3d20f52161853827837c837f33425990818b958adcc3ae79b5791ff04daa32fe +54050aa9d34606f16c7763de770cc33c9acb60e5354d5a27a687ca6e0fd74a4b +5cffeadf6ad0ba87b906c09201ff65ce6c3f620bbfaaccbe54da884b87e906b5 +f5285d3841ecf78f0a1ee4a80724da3a4fd49ffbaa66be3402a2480a6f8fc164 +343a369e2b8947fd5f58a4697234c742685421ce3d57398c5ed6f6b049fdf39f +6870236751d9ef2210e680b4d8a6daab758bd7fa7da9680604e5bf85d1826611 +2ca08e8922a1d46ac853f4bdca37f7fe80d2d27854012e4a8f70bd854ea4c189 +ea6939096b56168aeb971aaafe1bca667137a76761cba2fbffceafe3e98d5590 +db3dbc44b3f9d4ef0419cae23086898bb25a222eea19c1a760389672933ea7c2 +8b31025619bd108b79d51d54e23f401f42165f0d513bb2409ce66ba3e83fc000 +4372873eb8b4405a8f5bd88cc2f21d2d60fa4024707869c5fd40d94028ed13b2 +5762cc7924d100d3ce0dd32cfca124ec1fce4cce8c137070a18f05cd73809449 +bcdeb0ac24dcf63679d46aa8b3a4a5d0dbfa9342716619cd3683dfa7a9d6683e +5a7a03ddb47833fdff8935f2f004f58ede6447adce4fda1b734c75c52d16c406 +9428cdf68855946014584f7fe49b03f896e0054cffff5da4728bf4ce1d892052 +701b48b81f58f5ea344e8ebfe13baa70cb43ce4a979d8225ed78417648672e61 +07eb7b31f81cf52b4136288200e640654e83534eadf05301faf2f3a859772c3a +545fc20429119ff00c259aa582af4e3cde1c99769f4e433d9b178edcecf142ad +ffaa6da004a90f53e70048aa8d15a26bfcf7b02ed70bc262d165e99f87ca7424 +0eb98f3d7fc0d4926ae43c8d322bb9eca24a4c45f7dbb0feaa9a900e3521d6b3 +87b52a30acb29c914b06793f19a1efbe3be7d0b8e20cad99d292c315b12376d5 +655121189a833132715762ca7118685814f71aaa08b89e466c7468bca01bd98b +63ec7cc3ac41dd06c5bbda86227afcc1f7796b5f878946c135bfa75a98db1b57 +0f38c49770ae23986ffaedbf6644df58a252c29ac821f4584b96b5ddafa9b3a1 +aa0ef6d17fc1e75916753bc8c799497e1279ec783ea86df307cd54b58c2b3ebb +fd722006d127834b089670e5f1e7ba8bc4a0f6181bb4efbb8f99e4475181449f +2fcb255da4233f7ab097ef0108ba3fc12cda0618870eacb9fe4195dfab182242 +bae0956d09e388d10da2f940186e25c9926886e9806c70105dc75259fb1e5da2 +675e4e114f84862e6b822a10a9d364b1cd13dca3d385b83499c715ecd7598766 +b215910f002358d592fc36d0bd482ee9cc338378ea1566839526a5783f250818 +078b97d73b1d62a1aad3d5a9753bfef23f7b3e6d5bd318c463aa04490b9063a0 +e83e3e68109b182720d2b1c13b498f8f495661c0f4e6455b96a6a92ff806f1cb +3b1c6eac82d9a687b83c572c42df22beae31d1239719186f14ef637fe4e7c7b1 +fe8f4f1bd8367d76d467be95c394a818198d922bcaeeee371fe17e396b27cec5 +f0554778587fc7d78acdf317a8efdfc82c2f57b6411b3ab68f96e3e7cd321a6d +4783435056ab5a0095726435be6885bf2784fb2cbeffc0f8248dcd594d34b21c +98e67de50b6876c3d6d4d4ca7ce0b9013ebe754b104dcfc0719a10cdd9985e19 +2cdf4e88876c2dd4e79e23afa70ab5b4758af32ee87b8415b881ac15c5c3e1bc +d17a5b961efb3a8dc987deded6f28a240d66f004ad05ce1c551e29b45668db2b +305c9b1af5cd5388a0802d80f18e0f4bc8065baf393ffab9a4d674312c2033d2 +7c78b5e9461fb09b9b2caaab70ceb3afa574c89bc620328211c85656f63a8ddd +97c827297327b7980c2fe0acb1c34866aa3c5d7408e257eba3c53de8338bdf96 +cb7ba55fe31bddbf7807148c0a132bdbbe8a2c21a23e11889da13e429914f7f5 +7132936359a0cc65e5993caf52902f76f75d6cb46dd20a3c0be80d45f2c746bf +236733462080fbdc8c5c1dbe9781f45aba74af8033a6ef2bdb16f7b0930d6b6e +7ca7fac8cfb2dfab8c063d961077585d24e8fbb5e0b0bee9c4509b23361dd06a +dd25767833b9a770780b311f608cae7adde000297a2672211f0de8cf7f5fbc62 +78faba25d035fe3a7cc3a4743c0efe1c4a5e9cadf1e05bc7982648d5c9fb2992 +4a9ee1570ba2ab068cce168552299361d62a2bc2c0da48ee94d1cedf1e2d29bb +43864ab5b770a14c98a432ab76c17998904f052a50ef845100533ba5cfb24c84 +da53581ec4f2201ca9fdae76ef365515188ace4cfc939ad6d193413ca7ee225b +0137f4637f09952213be725cc7aec579b2fe85f7c6af18d70c4fda0557567e64 +d430f09aca7bf28984977ba0f5849a5a86729d5640bbe4c30b17ab03262a02bd +8ee077ead7fdaefd37af16007d83714aca07fcf882adc4792583aabb279579df +6741f637cdf8598fb5827528771444b0aa82dd5e00e70edefa7405a1d8a7797b +ef021a53ba68c7ff6780c94f1393d1745ab1fd7c728c6112766a3c2e21dff002 +9e45a5c5668f8b084f22cd6a6cfb056cf0f402a73b2c02118259352eff6d680b +877ce3024c37d532c186f3d4a97603704cc0ddb25cac00aeb4cf601f6fb45655 +8939ab962cb9e16a2400938d226056535ebe5707cf0a8678b54e6e3a103b2eff +0bb7306d7c7c3f523b2aec267a5f1e3f99208d8ec9ab27d658c26f635c2984ab +5a4d214768c6dc775bcc616838159aa10d5bd93cfc8b2d836eae5ed480fb6ddb +24253a62a1b798bfa51b068b6888b76d2233b6fb11794f166254cb3ac8cfb650 +429866dbeb8d09e6d03889899a4e8bfc9a855ea4660f928d0aae8247eec1668c +8e798398d53e52a5684caa59c47cb38c8f1009a8aa12a269a587593874c2dc78 +0ba989078910f3d70211147751e9f7264d6e64f1b05410ed3427bb7d0704443e +f2baeb0fb9e3f1c1c14b178e716feb4644240447a3f02211350e36e1a586a042 +9ab336c6b44c0d2977294e704e8695b6daf079bca033b6bd3485eb7a78582fb9 +373716136c63eadbab3a2577738f553f81135829f9118f4bfe20cd51190bd7c5 +17035ebe97f26b0b58973ea9b5e0d111d9eacf2fa54b223c4f40c139ab891a41 +c7d5ba5338bfd58090ea727c3fd9d0c0217c05798787881d07cefe019518ccdd +a7ad72305f06a98717cda80c5daaafc50e3c6d78d2b5d851beec46731a6c29ed +ddcb9089de5cc2ddb696d3b7de3b67f066527ae22cc1ae6285dd1ad42e0809ee +65812268d28e7105859262e9368a3aa7fd0207d47de5ea5591927f5e568386d3 +a61fcbe872945a272c75384be1e85b26aa094704715f1957de37a2fde2577ba3 +85000d0708fc918d52360cda828cedd17cb7d625155ceb6931a29025b44ec8fc +3678fa08027b20fb9649d07f01484f2fd2e1746f290e32434fcd4d15acf0708b +ee3fe9948d3ae141749b47810558d71d592735c1c86ee375be7413b2cf462660 +0b115cd043ede5612ab895cee0909da8d165408cd5c4c34114ee4d7fab4c37b6 +a31cb829c4bab2dd04b1a7097dec24c6429c13482667116522f94edc99de551c +a693362be4d277e12829bc466e13d09841b5d9af504be4ea59e9c2459eea5ac2 +c678e3fa30cdfc5ab855d56c1ad8374f9769a6b575a1dee5aaaab4f716dcebe0 +0fab8b0b5522294ce3164f8446679fcc7aff5bf49062cea58f5c661a895ae753 +8891536066f8416ff5e357fc34cc34d6b68abe2fb2c540a7123bbf90d2671f65 +90515b96cdd1bd2c1396bc15503caa4ccd3ce28e0361801bdc5da98887b2c39d +b84a0a4de7859c7da394acc497641ece12ad8a7d62ac5f8e6bda0577fe64d581 +35390a37a1570cb25b23b747b236f3f2606a3ff6e487a78069a068e7af13a8e9 +315016ebb2552f644065408a69f1bb6fed50486b2a05d403cd56ec5d3671c9ce +091995d384491b65eeaf33078529238342c32a4b81788c31e62ba0614bafcf9c +3c1cd422c605740a8939487e26bb9233d4cde68afe7a0cadc3aecd739c9c425d +09cb50b4b4be28115ba7fc59b541513cd6fd08039cf40a1f5b90a8bd1263806f +ec35aaa4100ecc05416ece2f061cfdbc321cf3324f1eda91976cabb8d2d9acc9 +b93c575c363fa691e18215311431841de8187a20d6664348c7a8adb06e867d02 +07bd48fe8067168c4412fc80cdba62f8b9209f5407670a26db1f7f5d67c4d227 +90bcd0f1e8640e5f9288c410487290808b88f9421d506386ac95cd959fd1ed07 +778de2f62958ff409d37332aa4ba88c735f2a56e4e746ee98b9667072874b21a +5f98225aeecabf5cc818f3fa54edde178b40a1b1d6e2f900365e2b503346b213 +ddb43a269c5a973d303dbf615ac3caabfc39fe2144681e7cd633056bc77d95a9 +16f54291575aff7a3a4c13eca61a8d261b3a74307aac38b50c0e55222626e717 +db6e122547b3b8a766fb877deeea52ece2e74ba02ca7676f0e037cffaf287340 +c19bbfd9378d8e898225eda3fbf814ad51f976241a7285dbcc62610fe998ebc9 +7dc5961af9d70a6786e8922e7932a539f1606101440c6855f2284eb34a895cae +44637b6a0b1c6386c21f11f2e7ee2adf012ea6ff35314981226505bd4b0ea25d +371be9fb6fc0425d8f374cc51fcb15600ff7a49a4104bc29a369c8336438bd4a +45b7c8fd52577a49acdb394cbbc16c844ad99f85b5af1e8018900d50862d7c7b +045ee4bf7972eb05aa5696a004f3ec9be95c4c14180c7c8098a3a0443c0dfaad +91e9c3a37509b29066af112db77107b9daf2e45e72dcd78660d5d56018cdf1e4 +ca787593c31a2d6ef925e37e4ee77e687e149bf506664975ccbf5fdc20b5c306 +984208ffb9ec2f79e76a7a029cf5981fd2d07176083d7fa0d9fa7b1e6c6da9fe +423bf29011478ba39fbdc7e77ba230ee7b89728c9312602dda359f1ee65ba362 +d1f36657943255d62f0c84fe8a630204a8e64d8f940e9ddaf3c2ddc16fd131c7 +f302a2f9fb65ecccad4616977b2ec724fc6a4c39417962e0de1dcfa69aec8a02 +07179266935b655d20af3d45228ac3796fd2b7b6e0580904a27fe0c8023f4fa0 +fd70e469e5f309690c6ab737e9e0dd1db57fb312362b64ff1955401395b42086 +07e7f9449a8953149f324b4d5785c2a0a4c28eb487fd0bfd65462a1a4a741be1 +b1876330912edefcace1dfacea7628d16a4716d3989e1b31830cbc2bf9fce144 +9f0e80bdcbcfcf477a2c30a72ec227b20a0af16fcb8356bc205f18c6088c1d6d +c579f1dcd23ffa147d72821b7a63fc011d5718fed41b16ea1d83ecd8d2ade289 +54eaa105f82f777b6635c160d0e3d67fbff2080db2a99d489a070d865c39ac9d +2a88ab5fbce010919edc0ab213a09038fac6d3c81a4972e3c5683f49480fa5fe +b8cd3279398028dab63ef7e8e1df85a63f93273f187f8f8619c14ab824c97c3c +70d06fbc0a1b4be1b2b7f11ef469adef71617b304b51c462ab3c6c0e831c9ad3 +cb80c5e0d0fafd079d7f4f245d542ea892c6fe3c3d6d1ac2c92371b7a33aab5a +ab8375b4cae9661c9d314999093b2a04ea1cb671c9f07ecefba615e023cb0f72 +b6eed231ad31b1f4d03e807e56c1e1663986eed65e3ee47a2dd11c1211236973 +4b4607a6570f534debc72ac06dbb2149f9efb793a917b3b604271fb764fab871 +f7aa5a5fcc54533951454fe7afa29cddef96e951aaa9b8eeb3f9b418bd132974 +c601b6fa29471dc34814fc81a1e1a5155951c12022aadce5826302220b18dfc3 +d30b2277d08e7cc7a87bf1b8ec4507b43cefb117119d86de3be51bf870390ea3 +d8daa3f74ccd3712d1c00261e853dc3078dd411189872a50d85d58cee8fffb1f +0288029490412f3e58f83dada08fa695b18efd0a4f289705385a411fcb2d7a47 +ffe38977fce18188c0043c448d27e160ee752be0d44d0f83b6bf642c694aa530 +e223aefa3fdb17ee7aeaba75b9a86d7cb0f50ad4d5ce68d4ed48cb0c188f9dc4 +34548b48403078f63079bce8529f910ab280ebcae7df9f824dca756f9d647dc4 +d42da412230a6231307e7495424f98c9f129cc4a326a3dd8e476e18d666f94fe +53edc87e47f6d84abb643ff3b4084437da26b4a298f819f4b6823eddac11bc85 +b9f5c5d0aa1e7b0ddca82c8e01944b3ea48978c1b8f4ff47779a5523f600d33b +896b659c31f4f6f7decbae0fe1f83dde18f77f53db140a36b0f6f4b883ebcbb2 +b6d353bf2ca6102173b6dfba0f452d011f6cf7d661a470c3c5dd189c1e83fc4b +9372ed67ef4ed9a5b98f85c8d73d490133b7362ab976a385cec705a2eb89d7f3 +2fbd60c08b86a30219aa2988f79e6386062be839c1f9d30affde82cade3494ee +13041755e76cc07ccb3a4a701461290b5b79728eddfc63b2ed5cd4bbe0c4c365 +75488d590258ce2084f898d7c58b3f65b09dea2f8d4f71e80b2a2f8f31d5fcef +7a7744b64d7baa701e473b85c65814b0a93e3ffbd7b2af85e00ffbfab9bb7766 +f444709a47902c919bd2a4becdce07b64053aea1058e26024b46153d6bb92c0b +59861b2ddaf3d38dbea5bfedcc49938eb98188a3c4dceefa1f308559f7712ccf +288219c6a3d4eefb81a2c5f154990fd8f09713a0531017d74b47e1f97aa6f0f3 +92ce5bb7475c676247d57bb14ff676f11a4b5b564ac26bfa9d85c9cb0414fafb +c35b46eacf74dd964fbddab28fd7bb304b9bf4e12cd15b3bbb163dd66e89f24e +6485c6ea63365d29907f6ba96d313f9b2ab7d175d549f4235653ef979a5c63cb +6ee50cc333387a0ed88d30d9fd2197d31a0894ed0a47b15d92dca463a8c84b3a +986d396e6530b2e9ba127bb5662ca948a8f0c563b9c868644b8d01064db6aa72 +090dda0521e6d778192a8c6d4d4639e80e309194cb76fc5d4615f396dd85b06f +71dfc7f39a259e322c5e7d28646310eac92e5f6afdd6071b21e6664e1cdd3848 +c864ce0e380fdc48b251d52b5094ead64d380b6818e2c8b1a4eb8f9c18adde6d +6e4ce1def2ae8f2649f1e5aaa05720a358a74e181568a10b536f68b7a0292787 +12c34acfa5bbafc4aa3eaa4d8ebb26e20bb00d228b4eac4a163e0b72899874a3 +f85e82c396d9e2891d8e0d6e5571d4ef116879cd2f5485dde4b9d40f638a3a95 +de5ddd14adbe72f5bbadf0d9950a195f64fd3209c6d47b46b7708f855da96cb5 +e9e1260f6699d945a611a7ea348db3c86be4b32fc2687f15c4c86957018d428d +f6244a1fb6a99122bf89d7add01c80f2b2bb2c7168b02c400bfc98d65394948d +c736741f9e0244fe096571f087c5d6d7d022c726a4cecf37cf2ddeb1e9d77098 +60c5d43121bc2e4b72a2d895a5ad2f449196aefe8c01784323de3804363b88c9 +1c86124f431e6dd0744c3d073fff4bbc2b98bdef713bdefc2da4e0e22eda76d0 +34424ce13529bc04c078dfbf8b3efd96cf662c4e151f15d4f8ea52641689d4a0 +5f7c9ec4efa5119db9e3a61e4a669c29348a1e71382c093499cd35d7d1227a5f +5bc3db96823c167100074c70040a55142148196567c20c7eecbb25ed6e31f563 +9add24d52aceea4b88114eb6dba9461c2e5262fb9529e9f6f0bde20d3e209a8f +0c9fd81b99b00d268f764593baa894f7ae50634766c922f751ed183aacaec03d +b7d96d012cd0d111904245be9537edb0f8769ad1a8abbd8d1cbbe5e79c53c00d +983c69d8865e93b6495a2f15ad9ab1da7503bd5b85ebe27aba01f71e56482be9 +d4342ac2562d8e6d1e4146447561ef5068d17306d66a52fa41644897a9b161c8 +5dd4161aa3d956e7961aa8020467e76a833e01c974e32aa2b8cf27d62fc81ee4 +d74649bf9530306481f430a539a95dcc2502f712947f6a68dda00589ef404132 +1dbc8b94afd827bbd5f77820353fddec5d98fdd256e858581054789781ab090a +816e65ad3dc4a68b4ef2356e7cd2f906a859dad680d649457bae159f91805d52 +fb6dcfa5d0ac6373fa8325a817563bc9ed89a17d8cdee9b7516f38908e426f05 +1517eec7941cbadb22390e3e2e17d62ca67f37d01377c5a1e09bef5b795b4446 +54b383193351e05ed8bbd8b0b138cf62a428c78744582eec90a41c3bd44a4e73 +c9b32ea4936c211269ba5f883d45b16681f8afa0646a4031ef69cf4936305336 +5758f50534e6974342f4d232b5024dba0eb297e3aa3e9ef0935bd47998370420 +ead844c7e336288356715ceb8cb8492ecdc8fd8f1183360fa32850051442f4d7 +c0250d658c633de21048f4676a1875df6a8a61f0fc7c25dd5acd0220798ca70e +f09a72b19595172afb9085b9a5971ad1b9a3a2508884a3bce88c984f58389620 +95584866c59f89120c7f491cde35b9d179f11db0d3c30370138852050cf14b18 +c06dadc218335bb465dd88304f1c1cd11062ca72649491fdc62d571c082cc816 +261444906d399760159f6b1e6df4b42a7a84750aa61c034b11a6e7eddcdeb54d +e1f5151042a8e9f6a23a81a235fbc3908a85a6b05d8162bbdf3a672715b6fcce +554e98df1f4583e03e456469890f07f83bc0a8954fc5edc7898f21f6917d30fa +36faee98f622ef313cc8431931d83d271cef880dba07b832a01384994e964233 +f2e29de305c3863191f877dfba44214da68bdbfbde1e3b8b9659d7800df5bd19 +28bb1425a51abc317efdda09d29e04ec8b17bd3b78085595120b58fb421916c6 +af4b92776ef8a8211cc376a37566422bf2e2a840be57a357ab9b9adaa20600d5 +c49f228d2f7bb606fcfa867342884fcd426a72ca4c5d09612bbe26a2d9d3c8fe +15a55e095b6705f2a2f2a00c9f1cbae16b91e13798b96d5ae66b5a8d1cd751cc +9747bd951a55ec3fcc11f58f8afb40913166ab60a01b697507fe0753d085e5a8 +8153cfcbb70e29b7073ab33f7be2b6bd070ed974d0cfe4d41f7f57f05cef38c4 +251aa826e4a1d37459212c1b411b6b51faa564da0ff48ee6402b3c9fb77d502f +61feeb32602da2b5fa880c537f60e1394571392c3fba4d110ff47a42d923c153 +f7a83bc1ffe67cd11ff1a763950f2d7b6d9575f45562c3a9de6d4ebf59482d7a +716f39eca97fd68be71aa73987d570ce2ddf953c6ec97cbb76b147ceb8973564 +7ee159434e3af6588f47ff9722b7e90f4d9fd0c5b9e9f3a14f9bfba60ca6556b +0473dc073a961731d322161500e15ada373d503552c0b76fc6576088e630cf29 +b9b0c82cb348259edd482520a84965a53cd673138aa57c32e41fcf50fe24a447 +4ed23401f43f5206de7fb3b6d1750223115919d85b54eae8298a19212e5c66e0 +c05c6dd7d7f8dd877123205b7e391a189e11fc30fdc6532fca87770985b357a4 +fbf9c5d261a4c998e2fe8eb96e27dac9daf1d3f0ec7422a85d9c7b241857209c +f372c03c1100d8ebf3ce4ab3c0efc1f979c5999bac6d4abb6abab1d059c53f7e +34f972f56df329bdb8485e39cc98cbf20ccb70a2a3cfdad4deb3267578b02f0b +0340f42bac749465951198d2ea2bf7995852a50b5876597e55e1a1977b9e2f0b +8a8fb0f03839dcf6bd5542827208d443ed4b9c0145e4522274a02e4420f738e7 +962c6d9fee17520ecf6d6772e5e77d6ed395304699dd65d7a610d793e38ce3dc +e461843d5af1e27bed5652bb84d5e85622b48bec72e1622ab11506ade702cb2e +8ca3ffb8add5c2470207bed74f2b34faf8cb61dd5e0bf54f2b8e1c7ea1fee81e +0e0a16747443630b04990ee1be9db5764a580222b27332072e74a60ab7b789da +aee741eb538e3ac7e38b333c7f6dadcad5b9383ab433359862dcb30ba53a413b +5e9947eb637e78eedc4b8b17cec6b82f4cb8d2d71a37921e69d428723823ec95 +0f683a6bfb55d22dfb161e1d6b6db49dacece6e43ad2c51a70e6342a85169fde +f8060d7da7e20b4db176bb862c29749077d7104bcb313e5c886a01cb16f11f62 +984c5f853516c1419df929d29eaf4490a3aebd24358eac006a594afcb839778f +d0925e2daabe74c7ddcce9a4f454633b52b445fea99105fb0699485956fc737f +25625d53dcf0b9e2386bbf0900e0e011e8adfe162d5876a850a6507512690d2d +d1f00992f4dbbca2c63cd70b16dce15d1c128b9d6881f3f7ffeb68d7174ae769 +3b6f5e02523c7f046de294e18255b689d2ef529e6dfe489956afc909284a4d43 +b0ca1d9f8b9be4e4da535522cd9b6e64841c81138ee358ef6768e7f78af8033a +6885457da6ba42cb4bdd4f35233b8e5ac02b7d8fbf2092bb8ce890decb6e99ca +152d2aa56c5ab4179ba7936c74dd6c342a392131fb96c14c3b24d9f0e4d8b1cb +862ea5e7b13e204c914bf95f55ff32e4308fe5b2949fa454560e8dec474ef52b +65bbbed017d5eaed0d89a3c86fc63bf01d3a6a10a5fe389b1af013ebcbff2a17 +7f6e854dfec5dbf19d4e977a07a42287a2dbd42a78e589a002cca47eb865bd5e +601a98bb3a8572f20ef1c0a2b3500f615b1b8f9b04215f91acec454312ec1dce +08f413b9e2ddddcfd2bd85125dc5a043a45c0b9d3c86ac30b21f34cae2d347a1 +e93586eb95fdd3d1db7157b21b7ed1702d31876a1cfce58d619a66df8ccc3116 +319854a57965fe23d2d2d7e02f4d95d810e8a13d29872274fa6f48b7333b743c +7af418c1fdaf467acd5483a47c5e99a7bd81e18ef98763ecc08820176a109145 +af183870faf171a3c24f603654896e2d1b0ac6224cfc765bf747e194cd18c740 +6c61fd10b6b7dce9c0a6577a87ae840e88f99cbf1c1d6cc83623d2fe80bd710c +ec79256f89f26b45f75281d3de9636a134f63e244df4a623c63a895fe66e1464 +1959655f235bd056d65e3a50f55a041447594422eeffacce6af7cc9768f72158 +18ed408e47358ad45fce20e4848cc38f70943755e9233ac711e663f2c7d77b46 +c878e70669ad30ed18b6f832e4d7f54a23c837ed440ae97883348a0b5fe95232 +779187e429b6f855ed7cffccc8d6784d8bcd92548e3257ac87231c36f119ddfb +f28ab8dc8b253a1fa09f016887fc29b6659b40bf3dd9db6ead8c8c3e504b10f8 +37dac82a816e06722397867df32fa25da0713e92ede9e4d41577ef58ac70b402 +a4427a7c86f7c1d7f378b62db43ca4bc3a8669f6e924d719f18799d1a9e5969d +76bde4fc976074f2d623721d38e3f5c73428d6824049dea9416a450be02dcb55 +908e37faf4a56a36519311ddb3d1cb66837c2964a2dd0d34a23dde43eb30c88d +b6ea541956b904db911d009f0b209bfdc139f48878c811ec38a21692f9b866c0 +a59d9d736d429de0db4b0526463d0348157019a262b2c3e0bf54095d06110593 +3646fcd24134d6b3a2a906a891187692967e93f69a54ff3ab8050418585ed1f5 +9822b134f8841589fe146d05ab00c8e22651c43723216c053851a5d1f9bdfaf8 +59c55523acf1e394d27500a1cdd551c773c9a6d7b3882f31f29c281fb6c6250d +8a1c3c8dd110c1910014da6fd1d57b8ae102b261fb65a3019bd75e81ccebde3f +3e23764e9a5dbe640ca98585da2a4af9de5a5045598a905ee7b82bbaabdd0d92 +bb5351d3a0b3071e8666fce45202af6000790c1c1d0a5bf0c4623b9815b8d3b7 +7c39970a509db6a4a0fface38a60e2dccab7f5b7ad1c0f42a74da16147589a2d +3dadde9bb1a63a4047ea20dde1109f8856bb81184f4256994b5005d654e49086 +7bb8396fc8d807ebdefbb74e9894bf0ec793699f0e68263885581a17c87d7082 +371d3d4884b50e1295c517fc56b91ebb6b4c23b150d542cd0768924232a5ac00 +8a98f5ce9adc8dd3e65f085b35640919767237d0f9703cbd691a987a0aa0444a +5ea0d887837482a7248865cd78b6f665301cb67cceb1f689198821227c1acd81 +3d0a50674832bd33b2672756d5186c89528180e190d1525c3e806caddc1e4157 +46055910cee4f60f40b1065f435be8a39eb454d88f5bc45ba818e5b006e5a38d +29974f68ee1962448f7a9fd83c7f107c7788eb8975dedee759a2bbca40c811b9 +d857cf8e510376d48abd60567f307d6ec471f99b03cc7b5e8140dc0450af3832 +242a353515b5b347774f32b8b6c033adc43b2bf7185480e47c868308f3906bee +e44131b11b2b14e77f33686307842337cd1f9695491bbbdf271b5345c44d6a75 +58c59d6d5bf8b24af38248368644e331a88cf73d0eba9dfa6f80f11af0293bb8 +40d9755540afd18fb03e0b26b6432277434166123d80044808f6f1115ca55b87 +60f82520eb81166f8363b150bac7f45983d1f4ea0b503fa8d041261e2fd14caa +c7db8e5b1bdb04a65cbb660526d8b21eeff68105486474803acc96e7b882bc9f +5a1d5f1e333b2b2aacf4272a05a41aea04b2c18a82b1c66a40753a3690aef089 +b9fe83dd0d86fb7b7045f041b690928b7b2b67162a1f5564117652fa7899a444 +bccc231189c60ceb72abb4038d7d0ab5a027bea7ee75542416b12a16ee00900c +db94b2c89b2345d209cd68307e101cd06dbb79e76c725dc7180becca0eab9f8c +ae1714c57bee7e7f54c84e7a2ab9a2b1ddd4d160cb4825b69c1bf5ee26b18391 +acd6fab3f890d8cbff5ba3666b8d7853652da2bd5db79ad8de358e55a5e02270 +e1a2d09adfed75088a71593ff0f54d5c527518cc767584e4380b8fce58b04ca2 +05a69ee280da655169029a16a3df3b86fc4ab635300397767c7d9ec3b3fbd60a +bbf51ad4a3cb348539fb9b7eb072ece9afb2b3c00e2b91bb40a82d2ddfa58e9d +f40699038c9a7bf930a83996afe9580c5338405108ac04fd713bb22ca2024475 +f540fe14290ab1818d9bb19483aba2f39a958ea417ec73792233ab538cb70e0a +455c6b7e0bc86eab1df73eec1e16a6f95cd23b8f695fd2b919dd282bd1129baa +93fb68080d90c29776bf27fa42dc0721e380ecf88286484417664e41c5b257ca +bd4835c1d64318507de5dc2f1060644b2b125f17aff1b95a37b9b667906d48c0 +9fa7d875d59cb6f7fef2e37ec418540f8f13c2d70cbe9566299dfb80c06df99e +b045dd3baefd87b24316700fa1c9f72157b927052cda3fd2b480df750298d645 +7c412ca39f6325d66c77be38bd8e491d8f710c5f91f432e13f89056940029532 +db065329782579b79d9f6ba60552dbd6a302e628f75e0d3582d25eb03e7deb33 +54790b02521553eb0c286cb415cde225b5d65cb79db060d13afe862d5885b567 +2430481620475f50546ac782370e3ea1c95600a524d288b5d4028be7cfbea855 +528953e607721b7488f7d7f9dd5ad14332b32bbef72240036a3e1646fe5418a7 +1fd206ad3fc75b7dcd9813caf5d29ddbb12d7ff94e37bccd72ba1086dc431b5b +713ed14ab7e9f1bff7dddfa9bf22624e4caf3cc0d4194f0b6a36b1c67e43f117 +4bb23054ed01209d28bc55224028648a4a3073d56835afa9e004fb999372f29a +d76db663c2a29b5638567058904a4933be88e75ca1f365739a65c27bdc195e7e +09cfb2426fa829ca3859306b556d1bfadb5d9493c66e34dd7f63583e4532a075 +532cee2d8976f785d7909093787e8aa5fc7912ca8fa89d346634ef71f98c9fa3 +cdfd931ccc699caa314c402ebcd6bbcfcd3ef7ede19e6c8b5ea9bbe73ae35b72 +e214974b2bbb26a115750327d20732b6f6795c25e4c0b1a63b5054383d428d2b +85ac1f719ce35a18de6f4753cb615aec6212a272d89b3750863536fcf5f791db +3b7b39a66ebbe9fb1876bb089ec2cba092d291aac88f09c720aac4dd8fdc22d6 +4367c4c5330d4e0ed7d454728af2b4801618edada4fa3e5357fb91458dc13288 +7650401bbca16d73bea8cd5127797f92c8b5314663e02cefabd1edd89e4486ba +4d371138ea6a07ce358d31bc9ecae64f409546e9101fff7ec710b45f910510aa +b51eb2374992009a28262a370d42109a0aa5ebbc16d2ec5d58e0a5e7e6f80a02 +5cf8a581f3bbf98752edf64feba585fbeb56b27a79384a22c868693c05084423 +f7cd396cb48e68f76bab6512f76da2772f3d137881ebaf1d3ca6e1c98d54732a +fc24bfe29efcd703c489dd8dcc69da4b86b5650788bfeab8bf66c5c1df7697af +ab33d0c14caf16b9810ea74c32ccb5bbac2613c6a3d946436ccf934a20b81cfe +5e712765d1983bd77cc45612a31c893a5583238c944f91f2d6d1069386621108 +108b0e65b4f6d76bfd0e1158005e8ba53ab48e865e9f6d07835d4e9e124b01b6 +41baaa6cff413e7ef8eed73f1cccaef55a87d71afb309ba162d3e15dda6f04da +2de8db583beabac1e5680df43bc063095de043b2ad4c8600ef63a8090b64785e +5288892b63a87d8c805d1000b6524109a41e05e517e07f0a76466125650b3d97 +008057de3d3380b0c352e70ac04fcc21108e619a707fbf7f59869cc9a2d571c9 +f77114250c1c41dcd527323edb2fb883dabf371dccf42389a260fbf53464bd24 +d5ae5be48163f142733b205e110d77de5cc07117d7d6d347cc8b035fa387b249 +fde3beeeac843c89bbb871114f5313437a784c051e021da4f80adb2d5e392f0e +46068df67f46afeca052378d97597f21c39db6a2ca7c10c57421499da8d5bdec +128109432f86a0ce63ca2be7fd64e29e8392bdd0013d4990884f7cf49e7b88ad +846af39a3aa1ec3c85f21db07952d1b45cfc20d6848536b63d2572f44ff718ad +c2cfacaf395cc64b34290bf19a19d756b38142c6a7471ab436c6b81abed86fbf +8553dd8d5a052f4d53d6124ea4ddf235f4a792f8aa485fb068d39c682eda37c3 +2fcc58da51f74c24bac8db5cf825407f88daba78f41d8ba078fceb0236c2deff +e61cc0abbdbec3bfa099b49cd1218dbff85cc705730ea545cdff4421ee5a5355 +9ccea2cf6257b757e4c6b853a476f0c97ece80a41fee4994b05eec575f87bba6 +9066eceb28ac92e1f4483f8744ede06a05ea038565096458785453b2462d103f +300aff3783f7a2ee1a27cb223e7145b6b74fb5a95a5445b5800d0b7e4451be83 +8a7679e3a29c9bd79be0ce900f8cede4f5fbfcf46b6354268087bb020914f246 +fe06d18cc7e9cb1003bc96fb5961043d919c9298e61dc5c7cb39886e65939fc9 +037e0484b62d1ee35842b3ddb879a7fe175f07451c4456361bb646e5dd87ad6d +ded8388fa78806f8c993bf16f539a4526503d8baf83d1f0a594db7fb1a11e7da +d2f9db98c5d8206ea4a44ed134d784b05ac0ca245b2a5adbd93efa4a566e93c4 +84fac7ef0ad46254101b308dc4e39c549942af85c96a5dd31e5d9a99149f49ff +99cfc5783d2cf9c320640a5029bbd61c86d4a6ae9fee690c5ac5e92d6b07aea0 +31c6110df41e63bd7039d6ba8ea9ef33beb3cdb415f4497245606963da60194a +8383663ba3f3be2d6e0b4865ddddb484f625beb57eadfc694125ee35480efadd +70248037bf40187f54cb53a51fd0a916d0b1a54311f43cb39856b5e4e17ddf0e +54466ad34cdbed8fee17c87f00bfe4832eea2acaf9e93aa5091b62febfba9b01 +5960618d7135ad546cf4d00c8c725c6da697406891b75361c81cfc2d13a03836 +8f2bc045495a1d24628606990f351b6f6f197ec7b52169495bc0047335c4a3d6 +1a7aaa63fba1aca730ba1fa90ca04a0fab27b145b2dd0b4c03f01c79bb77758b +fa630d02a5200c48499964fdac705d1f6b0aaddc58b47a35077f5ee2fbcab957 +919e5bf614a1468207592bfc36bdd62ea9389142350d0835243f485c99a49ee0 +b6fce33e9f1ca586f704d27c59621206abe70ac31608ca67a512dd60f07510cc +e0ab7715f3a662f824a011ec47e60f84664e474a255712aad0bbb1c7c1488a49 +0a75447e9feaba451fcd1106d7da535ad82757494620a195b2f0b1622c62351d +89b62f4f9bb812fed256952928d864147176ff0e03bdd2ba75977cbd0b5ec371 +4478c47d97601280566d937243a0c8b0b33450773897ed5535bea6d7eafd5413 +5c4a4976ee0153f4eb913aed8a1497b743e5e1ace625936b3da74119b49bb536 +1a6fefc0eb959394bd745cea919b1e62c8cac77754c59b725a26c606a7c5b3c1 +45fa3e24e5fd96e230497a0178f21cdd53c733a6bf29605879f61cd4b7ad1117 +1412b03ef42e4f8261df1544138958b3e96ac45e3a45c1bbd0a6d3f1fc4df057 +d0013bd3dea861453e54eb4721124ee277fa0eed1bdb6ca37e30dff04e91b88f +308edd43cb7dd7e9722e57dcc7f3633209505409a1f98a133874895e00b32c01 +85baefdb0b4e97f75488ea0f76424d9196a2437fc9f67fe2933ff34232768eac +722a84a7fc52fdf3ad248c69fd7d4c45fc33ffc6a04b562ce367d96b03c0ff8d +75174dbdc09bdb35a9f4840a6adc555f42d20bf5e2d3da34a991f63648ebe86f +3e155514afb82c1b3e37fcdcf8c594acf65fdfcf5965f42cb35543ffb1a1e40f +622e6ed20b4979a37835cf08e40b8bcb015db8eb1a044dced8f6bf6360d0fa20 +e656d90efbf461da451852f58439db9281f60edf5de4af016f8715eee83eb666 +d48784d39764e33008e5d9195ef62439f3af1b989bd952fe0a0d30a85708bb1b +a353efd6594a3ca201115b3659dc1a80619f155c6649f944dfa3e543971f8dd2 +b0a30afe77658ab82e630bcd4fcc33af8810da1360730055255aacc77fbe09dd +9b13d44a41e0a1d3789d94bd78494a33ae60b9ad7290e4d1ed6924820140e2a8 +ae5137fe7c2570af124263b99d11ece45cf80a6e11f56dc6d77e50fab50608fa +09eb1520f22ec16571e92a193f1699f81e352bcd9e0c838a8c1d5bfe80d76957 +7129c9c46fda7235dcc34f604171a75f069f9e00adf56e84ab1f74f093bb6995 +743f9e027fc4d9e6bcd647b2ec7f0d7af2e2efd2dbbb68c83ceb1c760fa71ed5 +0394d38963fdcbf3891934a4cbdab80107778a63f1101017becd233ba0c2e602 +e9075c5e509f2ace7b7d5c346dfb58d0ba3e005e38ea7428dfd0100b7e1fddb2 +7fe8cca96b04f9b349693acba904d44e143e03e82d16158beb36dfa21f57a039 +d6bb9bdd1a787fb9df968004388f8655e9d8b6f435117836bc910697aa1737d0 +55c73fcf23f8b56b58b09195b7cbff574a2418b1ab9f74dc607066fcb798b880 +5fb0d761cd5cca51f9ff0d2e67cabdb026f2a9b292fa472b97ab89af60cba974 +71fdef1417b14e6ff5440867aced2ff9837c1cd1e1aea23bc3cf3444e35f7cb5 +97c2f8d5576ffeaa83e06a9e6383e9225ffe0db4b1575e1f87f28b373716b668 +4f3e9e694d6d56495d21673d165cfae5c6ca112d16a40247216da4debabb7e8d +34fcb858707d82cb8868dcd8e956d1ddf8bbf6cd57c293f8e3427f14c99e910d +a7bef26c09e31ca66550496574c0c8f70e7efc9f74bb45fb1ff13b31d8982b44 +038c1218b874ac95ab907d01bca78f00fdec53773064be453a82efa3ce336c46 +69345e172763413f021d75570ddb0a16c806e444d8b9895af997ee7425d2ae29 +1d57d9aa91a5d9e992a7275381ac332a2396900e4d821f69a349d48a5197f98f +3534ab2a47926edacfc5281c09ea8ddff7ccbdec5b95857c9b2d82829376bec9 +79a6ed53c42f6be0c80a9fe6b90c06624a29adc0e268241e145b18dea609cf8e +e79720d031691f5912c7b4c1fd4358a6ed07abe23973f5b296ea3e36d8081d64 +50835e84fe95a56764117785baf8b08ac40dcf7453f4c67100445ea6a77ab755 +e3b4882dd0a9d74332f72322d36ab9dbf2199028eb6c6d0f43e79065e0fa47a7 +68bfe8609fe6ad82e7a1fadbe827d86ab6f3db8d0650c31e80c7b5ae24c703da +104ebb4cbf0d63b0248ac1c47a8ef14a095d902bb390c48760ba7da6fe56fb44 +df02ee166b522a550efab2006e814f4053d0f21f3ee790ca6d17e8ea5ae31083 +5889c2ca6b3fcd267131d33f3f71bbaa5d414479fd6c9e84ae481defa4eacf99 +93a6fe4ff57f5e09fb99b8fce71b958080971e61bf0ccbdd2a86448782aa9871 +0cb686013548fb3f691436501545d2ddb46a3424b643590da9b3069d76eefeda +946b6ae4a531f7d8b3bf98ab35d37ca5b36729548c06d230b597ab2cfd12dd01 +7fd2398830db4b4f2dd298e945659a564470b22656e28a2defb63714b5dcec1a +5cca4f9f3a07077c87c06bcc145edea8424d9f44ef8e73fa98fd216cf3fd8408 +52ec5988a7749f0d6923f6c0ef50e9b2a7a61c006316b49c51a0127004566d81 +066e7f1ed02f5f570cef07df070ee98d836ad6048fa77c8888dadea64b72d4ef +1404634b59cb590e5113d384e43ddcea459dec60c3f1cbec10e33100bc7eb8bc +7e339177105ad6a478ed9e096477601347e97c3916a3981920b16bf4d64d8fb8 +694341db499b9ca3cf34e140d7db4d6c5c291f100c2d419752e89ba7fac3e8f7 +5b4a63616197bcacae3e0170b7467670f67acd1acab2e0502f02f416b851a5cf +6f83c3cd9992dc925b388cf75b423edf1d5d234a341adf12cff88bec1da95ad5 +dcff92b3cca7418cc86ab1f1969ea85824d243bc5cf4fafd8f426556dd9017ee +0242046f909acaed3ff2a91564303d13c8df20ff52e25e60cb7168902daac679 +b794ef58e0ec9a5b5a97a1143b09157c97f9946d98077de28e8908b84f73a018 +e0c3bc6f4a6ee088edde6f1e0f568799d86765d843965381467a99c8b91632e5 +eed53fdeb8673bd6c9b3757773febbf86ee428d4b386985e810db8124f5bf974 +df99afad632f03e338642c9312787ac47a9d2f4a10fc5399b6ae9029a0336d89 +2aabb090e581b749473ff20815277881f985146a028f6dfb0acd19954a0bdbb8 +b4ed1a65d3b9866dac29c6aa8aed39d956433ba649f283aaea848f6cf8f96268 +cc669613981e4705d9220970608e67028de79d0b3668b4a3db70f61c9fc01078 +37ec51eab70d92a017d96cd8893eccbe23081dafeaf81ca2c9d45d38cf554c84 +99a6b479ebfbd96be8f7f4599b10dd45b4ac860ea6aa410f161df2b33c08586d +87218a790509800164b41e3cd0a7d30d9584813c42fe3935ee56c6f22cde9fd4 +05615ab2abac9dfcac550140c4540d6dff9ed67f530570744d0be3e56041e1d8 +ceb5a6925b3bc52c206f6dd87f2c4de70ec19487d2ddaf20ef6b26fcd60631ba +b1677d0ab695dd68b2a3b27a70b0b48fcc872991bd0b9688a966e72239b58d3b +2e58862eb4db390e169100e539c238299449bda356a0968c866ba0e0bf3b88f7 +6cfd39fe10ae30eb6ca7149b41e412cf556969b4c816a1945c0878e2a79e7ece +7e52754c8dfa755d79fb15e5576a8846307527460b6d9182154e23b84ea9d443 +7fcbb470e9833d2f3f90aa88d0e44b175a9358ad0d846ae6744c4b69a5e24692 +eb37b5b9678729be88cb9f84d2773ba99b29ad2056420328116840ccb475ab76 +27bc7efd2dbe6dcdf596e94c09aa959f2d43d48a80ce2faa7c30be324d18b8f8 +70f77be72199e931d5d5f3acf48ff8060e168b48d066b2354fea58713c1a5367 +330c9491fdb6fe9654a8fd66803fdb1990bcf5bf2d8665980d162f1be17663f6 +857563371b1056144cf54ad30f1fae5707f7bbe87fae41d2c683e8a02931de24 +29e66f35188ff3594f37f7ec5021e8ccf00248be459f80ef9a46d0344e153789 +69729194731a49135ae771aac663c0037db67200c9677bf1f39abbbc54802741 +23d36a35f128c1c35dfac1a29a9c1a488f6d7df23933488c858667bfe24948db +86bd0087f94b0c6325a403de4a434bf767c137f248c85257a72e39b51351d401 +8b530913ea8be8bfbeb039233bc3432db0b61aa281a0ce2f01b0399b066fde7e +abcafdd46c4d6bcf2924de2ed3972c01ae0213dc1553928895c2b541b1b254e7 +a1ae46069a110c55de12f66358815cfb07cf0de59865be85f1a8f2b61d0ebae2 +7d341bdc37eab342af148a05d0fa415b86cda706746c75e0fb71a610e455a64a +d8515705ec8d265f3e4ed9c0203744c86a1fe55ff52b6c8f4ba71e0a26651cd5 +fc38d93b2370b1e38c29343c96dd9b3d4a39b78f7bc7f2eed735f46bb46f96b1 +becbcaa7cd99ef23d16bcb3f38a605dbb908b28b1039d2ea1fc5d7afc11f1aa3 +798b407ec236421ccca18fc1f27a12d7e0b253039827104461c51ccb2283c9e2 +6fcb819b656a1aaf1b29821bcecc50b911d1a05330c43a0c6025ec90dc134042 +77ad9424c2d2e642a1223dc74ff16f70b54c0ff578157f0c701279facaeb2563 +cb3855872d3933c0a7be7b633e7e3ef053e1213e4cd7e1c57804eccd8026e581 +beb4c2fc59cacb4c1e7696d165316d7f3391ede443873c7ac48277e47eebc64e +3023d06ffccb05a1a71b64b7da4ce1b6256c4970b179c91e1b5d6ade81c151d4 +dc3cccff1d6ebd118285d56ff7631f2c7e2b89cd70b2ef7a3894366fd177c06a +39e3971747f671898a0109008e3190b0aef909597ffe91d7c7c2069b5680298e +eee7c04e58cd328c1bafac2a8bcb63f6d9a6a56f29f3551ce1d2512b5885d1b7 +8397e464b5f81f4803eebfc0cc632fb653f52fc7ebe2f64ab5ce16e840bd0577 +cdfa24a928e2888ef6171e43aedaf88616344cd64b3a2c0873dbbf8eb1fdc08c +cd86f324775672bc550241d139bdeca9e6ee36d49fbb117eb5eb456d99258067 +94ba27cc50585d2544b2f1f16c19ba41b0cb308c4f50039a843e66b20e04db1e +b0e99faa3556d8e95f4526f0a105d4b761df415148051c604077ce2025732152 +e6db72d810bb8d81c733ba78c0deb8799abaa20d3d77152b2dd109d70efb2bdd +7f17c1b79bcecf6b30cf0f852ac61197e0f601d2602205bc37708fb4306a782b +1f2a39bb03554a1d10100221f99ccb45b538bf2a94ddf8c4e0b10c62f4af712c +a44387b0038bf2474dbd2242c735db0d79246d73a43137d535eee525502ee440 +9021ae2414e9f443740cdacdaabcfaa0084a60ac34303dd559269eb088e2925c +632bdaae44dae0ae57f3080be448c56aa549b620d1729b6cc2974e571a5697b0 +4ff3e6f6542c4fcb2abc9261d97d6e6e60538d69b36c8189491a978a7d00b9b6 +3e62a1f51d6002e12d0604d53af0188e565ceec8ba572bfde122249dacc9d9d7 +75047c69ef0485adf9f0dcec0f0c926ab91b551ebd9b8f4aa03817c25ca92395 +518304be94b5d56bbdb833cee92c32b792c6a31f37448b319880e4cac35d2edf +dff530d0f7773e5148d41ae56e02633781cb2abb15ec2d94ae52d3c8fcfd3097 +45d95f67b560165f57393a42fc7474b5284c7cc0b893f84f8733768264ffa8dd +0bed83d99c035bd1a83597f0d614797c583ec8c5b96b9739f304edfe1e00ab42 +38f353a82e7c71d74877d8519add9b8c78f611174599512f11c22c10cb360307 +b262f1f78c7f9a85f1fd21e94d72abd413650ea6a69b057e021ada9787d06185 +c57c0947f9a2a81822054e855f802160649e25ddc82969d94c052c289f35bb57 +c77de5dfc63716c5b0a87bc7ed859663c457f080089e3d729b9bb1299050788a +79ada19db21011b01a47b278615be5359e71ecec7c06a67c4943e6106e152824 +ccb1fd39c485e90efebb1b2192d93c8bc52e356e51e5fc805cd7e43543e9c500 +d0ac85b7230350f9f403340a16bbdbbc3bdf0f7a571aaec4d6fdbecb288c210f +b7c244f1908305a0b1632a8123001175e36124b543ff92c16576d373b9bdece7 +67889128ffa3497ff846f8befaf5de3b7c339f049adc9116c9a7bb8bae435798 +08dca2d9c151d9329c345919930e8437054501bba38c2bd5102a20e4291203f6 +eece2f70bff3df08aeb8ddf1806e9657ee4a5e3fd5a8fd979d90d45734f14f71 +5d339ac91b7fa18a17be81583c08544a8a32729c17975014d629b139c0b3c236 +bc9a99231ffb339b7761a2586eac564be734ef37992cec6c06c2c93de2b340fb +3a27a52dabe69d9178d9a544430cff229335edd6f817bc52c690917fbf322852 +d4a7a709a593704568cf142b45eff164d817880cc93782c223247c65fa99aca3 +5c66a26093f9ffbc25ca9b3cf6b8ba478695c68212e80e3868a0db1a1c84bcdc +df05fe054733a1b794ed1cc483a57b97ca2e97fcb1ceb9cc2ae7d5e0e064cc8e +01cc628180359749622ac1cfbb57d51b25974ecb15dc83f99dbfba2d779adaf9 +6a9307bf3faef5d2ba5135a15d13c4215570e772376a4a4a3a5ec4028ef11004 +b93acaf38128de94531c23f114fec41cb2e2027e8ee138aef6ad017f5d97a600 +1063be706b65da0eda2234e7e9a9c27c084c4564b362ffa93ec9127cbc9366ce +7b74805943c9961be5a5b5ec87675b02f756af1b70074d03374ae931cff31757 +4145af416a9098bba84ed2d3ed44019257c0f34e7f94dbd10fd04fd15ffd1b64 +f65b2c02e581175436150a074de43f8e11fbc56e806486665cedbcf387504d6f +0687a13d668c69dddbc37adf91ad0091a770ee23850ae2fcbd6b9de9d8a8c8b8 +eccde66b7122c7b9602dbd0f6b7f7e4890933451c7a3904382d7801bcd992f76 +4cd41d74bc8723eba2647db7f813b465d11052e0f4ef593049942915c614ede3 +4f8f2b77bedec635eb3461d66cbfd4be1689a839b1feaa41c0f0fa23669806bb +52fea1fa5ab524a447ef3cfea4583a7790baa418ff8917388daadc5a3d1a9fcc +7f4a826c912eba5d4b82d4c29b639d56532b37ee9aed6bf06137a3af899c70a1 +ce4c9940e6ea87b6e274696c4a15d6aa3c17f9334aa84fcf1edb48e306640e57 +892b25e67c6f87e4e4cdf1a9cf12f69c0028b5fb768e839e1b8f75f3ab2d9763 +6e1be8c5a73bfa8675853695ee32887dd6df5f03f88e637d45f752d22f6c76b3 +71b9a514078c3200ddd2e998f33f1ae5c0a5fdc932f7c4727512caec232a681f +bbdec1a919bddaebf5efbd06869bcfe0637b72cefaac13f915f25cd3a926c0a5 +4875435ee6a413e2554fe4ecfcb96c1b5d8719e84dd34939dfd7795eedecbceb +786df32b6360bffed553a74b444a35e0ab0517cf7aa9c4e420e5bea4a5aac950 +54cfb55d1a1e57b58b8fb382e8ea2acbfb9b43d1ab67e0c1450ed3091758c1b3 +8155fd6996500a55fa5d134f17e55978d930425e0c03748364c46d3bef68a390 +649e09e48c2fab92108eef8603c70a977a388d4d24971296aaabcb932bc96033 +f648a6ada265aca938a6512f456fdc194f7186808deb3c16769d3faa850f78fb +58610c776c2ef3f208404def2940e484a801cdc45aeac88fa9852d1319159340 +3478b1b7f204ff297b67bddf1d38e256f864d3a83d6919ca7db1bbb1f5b8f6e7 +8ba272d1fb28d760618dac6f5633b9481645c9b8eb3a3384518103cc68aceb05 +5a91dd8def04b49d363b0c6daf63aef5d85b1e79504c23b3bb50a4b7194838d6 +b417b0ccbcd95a46834f9bbb2ac30fb2d9b9c31cf4b608e1379399a95f8dfa94 +53998a743c5a5bf33ed1e10177dc4a2a347f5fa4d09470cb5d71b07bf459c800 +0119a2164b143f03fce36c19384a01cec5b9080491b82b9ff115f795d969f480 +b7232d0375a9d46faff31fecc9351b42923e9ab6207d2723915d7843db279505 +280d70d9c80a1821a257aec764b7e85a1e8da7c40d42a0f77385ea66a7643435 +e20af708470f645046bbeac12d840fe3260ce75e20563014d9e2ebdaa57ef06c +0ddb55fdf6ec3e064312d13e25299b153169788e8a4decc095eb37eaf8e8ce2c +cd7174f44ee8f3875c5a3de3c7ce22296e99c44628f52cd3d18eb9215c34e563 +0ba85b5fcf3a211021a19945510c7e39ab56d977f74fd50ba8a70def82fa6777 +6930390700b4636330a998b535126d610e8a1cb63f618d69896fb47576857f5f +8926ddb4833966695a26402aecc48bbcadc04c2833afcedeee14254a9e77603a +5bb7b9de3c97007901143a7901c00b77a13e72940a6507a76164989e71d91eb2 +3080c585be2f8734909fa1efa7fc6a2464d95e4c5051fb8d6065a7d9a453cbdd +033626544b72108e4c4c087b4e4dd972893371ba7b8e8291ea4f98d03c61ce6d +d56734f17a66697f2260af9b3f8b9a36717b490e1ce649d839a66133da7742d2 +dbcaa22ff915fcadffa0383cf34c2290fa42fe23128e29e7bb1c59e55b7ac347 +fe66481f485d7bd09f55cb51d208d0765a510d5f6958fcd3ff5a5ed27d06a02a +f7ecadce4b4ac5f1d0210c5637f07382193d77945e249d2c4973aa43dea41dc0 +51cd72643bda4f749dd5846a9d3a7346d39f78eaad738d2d255df0f0cab5fb10 +96a0ac86bb013980dedfc84ddfef081700fc3c66b6d5a125c9e83df17d92658c +10d79a8aaa222004c20aaae6128132c64f96a7a7c869489a63860c15d53f958b +d6fb81cd165bf253d996c15295f7c2fc52c13b51aded1c774cb35a0ab258bca3 +ab438786ff7e648f42ab568fdd9cd598c52b5748b0c44458d4e0b8080ad19cbc +55d8aa1a78cafed7bd41a864488d8ab0bc12f6689027c65c70a2b26bd2590026 +3e80ba6189672adfe377e9fb516cc6bbb0f2e341dc9e2f34a8bb00b4079ea28f +7c8138c415306e00bdd8e71176faf06fac92e38e8e15dc6ec6cdb389d1a15310 +ca67408a9686f21bf6fbbfa7ce032974e2b860a3a72561508bcf22ede4122185 +b83532444134af2bac5ced1932c9cc06b70160d0cefc8f76ed1108b629e81060 +ce6c30e0bc9ac232fef7ab1c99e21792921bddc20f2afd3b083dba29641458a1 +1ba80613610b01543d336ebc45ae15c276c9ff18fecdc0cde3be18e044497217 +b9a812d926538fc42871f439282c1717833170bdbffbd7e2034d794eee9177ed +28045b2dc45959426e35d30fde +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F130_0 /VXAMRV+NimbusRomNo9L-Regu 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +%%BeginResource: font MFECUR+NimbusMonL-Regu +%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Mono L Regular) readonly def +/FamilyName (Nimbus Mono L) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /MFECUR+NimbusMonL-Regu def +/PaintType 0 def +/WMode 0 def +/FontBBox {-12 -237 650 811} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b89290699b50c1bf1baeffe +1f57be7b5ea025241a248a6d4cfa5067a1da6eba4cfc940599ba3f3c934d7248 +b8e4ac5816f0d2ce8b3c4193ce39d19fffdb75254573173cb51ccd83c2f2d06b +2483cf9b07b21ec6f502f028c273887bb06dae2afac10e9fd3c7cf51bca7b277 +b706e425302dc78975ac0e43b87073257a5cd7424b6865fca89d886e8f95c4f6 +d457623dbbc0d16bafeb4c649f5d72b09b18502eeab687e915e9b536a361b4f1 +44c3cd4cc683b5f05a4ecb4823a5eb5179bb7eee8b76c21b2491a97808f6318b +585b0bad98f42fb4a755bcb74cd354f794c8bea5b90fb9681bd5849d45247e39 +930c882490230e1662d39cca875bffeac3e79a78de6e1298abe9817ae98675c4 +16220ad0d3a36580ee2f2a17aaa1246c416d58a4c52fbb26aaf3b6f75833af8e +3aa996218dafa571fbc7cad90ece9c883c813d8f168c5e86bbfa0f0a5cb36e35 +2de4caa0f8d3227f72c5056bfb5bca6bf9c60e037a0e44670a8d3cbc9a19f379 +ca8db30b711f518a8c7569211ac70c46eed2af62a37f238bd0bd12d60332e673 +c6e784b3eba3f2e71e9993b97e8a38f85048937e958f1cd8fc6e661048546135 +56b810fa1ff611b96495081c04542df7fef085dec619dc8c84cc57683d212813 +9d14728aa32723e1d15f2af8f03422cfafd8ea4c92dabfe00e6110bca39fc555 +bc066ef848e437b50688daf26d001aed7e74605ddf9c0ed36be45455aef92689 +8cf32baf2418e02118593f54fe1857807bfa0b93b5cdccd81d28bede22cda6ee +2e32422c1e8da8866e526300f9059e85ca54122ecbffdc011460913e0d28f7f5 +fbc9d7f9f6934b3d8efc1a91cba4128f6bbc5eb55e5e7b73647bff70662bafbb +145cfa65df3db858bc3fc577b1bd8bc74fb8a61bfa71b8304aeeb36d8efe12fa +6f5eee0eae0830e5177dc745250fc362f78231fc3ac9864559dba92dda2feb96 +2629293435bf4a89f913fd15702cf325981ca3a08b327f7ee35794a9e88326e0 +24559b547fc6da61b7a3b9357f72c767baa9c79c4e7b77f70ec01ac0b8596425 +5f7346dc8cedc702d3d57b09ef89cdd33756619af59acb9d17a3abeaa6c65218 +6d6855348a1095746b34af15df313091c59e5bf9e79b156cd7903c1c42e115e9 +c5203037c808bd295195e074fc4a46fbb1ff01c814878f0c177f552bdc9bb698 +349d73aec17997374ec90b69293a064442141a44c6fe8e3c283c02a4655c579b +f21b53d1fd37996c682745600785c7b52c4eeb47fa5fd640739e1f09d5c5dd2b +b7515a4cce0a21281d315563895972bee88bbc7401be9e20cb160b6bc81ed469 +6d66169bdc648aaae8a9495b072911cc814c19d53b95de0071e3a439d3c09c3c +1cd422c605740a8939487e26bb9233d4cdefcca49bbeb1b913570a51b2f96d30 +2ef8913c6bb60b54f7ea4b8ca16ad3b4194dcba28439eb31a9443caf061c4d88 +c22cec8d9d8d85d7aa225fd64bfae7376abd40f822ba1ecc9339e09403195752 +fc03a5c4742ad93064d975906ed63acb495aae324403d3bca118179e10256543 +1bc84d47e0c016234eec0c52255ae783417941cc884efadb63f8269876f00a8e +1e1f19eafffa00453203a0752750f8c876aaf87826baf77b81d336ffc29249c9 +a6a44f40381294447840632ee59a3c4530391f35da45c16a001f793782be488b +5e01d7f75dbd53fb31f956f16202d3d94a300866814ba44c79764cc25acb57f2 +333dfcf3d97a98fca949b1da71ab27885183d8baafc9bc743143f2f1002ad752 +1e55d207de23e97d1760cd918a55148e37e05f6347e8cc299eed28d7319abcdf +a4a279d5f64cc2151f91a0be9e8382a35b535a6b5f41f3708169881c243391c6 +67d9121ba21f6bb22be1ec9933d9af1dde9693d7704c1141ce2b977ff5181299 +6a57f7806814440a28b1dfb62c4dedb82f0ebaabef3367bebcd43246d54d8eb6 +7af07b164374998f06a0b7e271ad6ea974698a806002374d270c6dd5c9dfd5db +e056fe1b3d58482a0cc98d4d5603c59ec2e13b446023692b9ac2dd7cf767d2dc +a7c62bb3578847085cab79f139bd312cb07ce13e38c3fb8f695bcf4021c282b0 +9b20ba67f378cbb8832751b8f3eed370a572139431b9187893b592529fb1b6c5 +19f51798bce9e56ca50185d42fbd85819c3a1153d65997511b19acf87e69c07d +2ca1a7401c2b23f99c19f95da0df136472f9fb574b21aebbf0c2f892b9260001 +9a9173f108e72c3eb4a93719293e8be026b833cd709c7c05c1a2e7250cad2586 +ca70fb7d927e36a2e4a6f34e754c8dd8ea2571cd82054700d386cdf3420f37bc +b6a70b9a92e46cebee13f6641c67bc40979f9b86e052164612d3dce7be67fa71 +b26ee9f425b54b3577cb4acf3dad02f2e55d2986dea88a5a1955b78c0cd5decd +213c55c9c57183a7dd5832d49ee81724a19abb7da0779f1aa6a77d5d31434a09 +c6f53b7e27123dac042f58dc27653d940358bb8100b416b920aee20672559f62 +8b20c687d77ff83cca449e94fcf4f06614fc539802340619e3a791a18581ffb6 +9bb5961d1e70e55615cce5c9e1466d77435e486f15175cf87fff65e58127b5c3 +024b93c1c296aab24f29483aeba00736ed30be5bb5284d7afc43294b927bec1b +86814a5ac25a3b9cd1f25c813cae791f937375e013159624a360955a58e8fa94 +e49593a97150702c71dd8dbfc3774094df930414ffc68cbd4b4a25041cb3b657 +a54c9bf780142d2586eb5dd9ecc1eb5ea69245d5d9c2af868974ae5d46e3a544 +74e96780ae66023778659d9a45853c24da18dd5ca0489ccceff253b009c06cf5 +826adbd0e8fcf23edd75c3d3de8a4c789a895e06d20606e4f8e3c1bd77976e71 +de409203ef1342bdbf2c11bbab4af5a709f0462aa8fa3a02cbed6f23fb4d5e3d +1751acbd41eecd8571518a9e13889c221ba5568cadf730f9da026fb38e30a25e +87ef6a13484d6ee31c174bfa4b80cc38134d7b18c85c83b4f14d3c7b0a0b7069 +7baa1a397252ac47b67306e45d64061535d05540c86b9599df909e105bb55100 +3a0271c25bc5d596da2a446e35c019b5dead7b289614bd5085d49ecd0464b494 +cd1ab564a93ac9cbf438fa558bbef71c2fe003573a03979a10fe8bd54a053724 +a529f46ffe55cec8d6bbaf1f57d16185595c82a1ef42e3c81cbc55bf50587630 +404b2090df6d9d25468c1eb7a4b2b3da7f5b718157ef8b5f23af088301e46411 +b51e6e0d464096ce22bbc2028488d9af49792b4a17cbbba8ace8fc51e1de01b0 +97e6db05466bf66978305642b6790c08e59a7055f9442cc2cfc23095df2c27ea +decc1ba54d6b81ecc873a9c71796a1ece75765b878d12e4da9e19d026ac44dfa +2dc7e540506546aac70e7b82ae7fa98bf36549f4d540fffd53abaf7ed9044ca5 +6b4e9044a2b23c3e7c70152e96f4e64f6b1918946789d4f703675f3dd6e8e5a8 +f0add5f7e442c35cc782c92db2007596ec1a76d2d22ca5b00f7f9aa9819327a4 +db8d0b03369a05de96b8c4eaec254cba0f39ef6ca005c53afd0ec32f1c092367 +efd9f773bd00b95a60523bc0392b050b15ad70f7cb42f6d36587144cae2447ab +aa4b4d9377a7e86ac489685833e1c14c3e17638b00884a46c1efa2b158f6239b +1bbed6fc68ff606278fd4216c2a6d7888f0f0e5dfc9950962d4964901a47d6cc +2e3243e1dde9ce7f435a7dfb19349a3017ce44b87dc6baec18354a2042c87ed6 +c1e3a1a505cc679e32789f75780f84082cc653a010d14dba84da0191a510359c +1d24d700c58e54718f1d85396e7c5d3a365637085b6f79c061df17bfcd260ea0 +6b8416c9042c2831eb041346a22bc54f9d7ba43f8c4487fc240baec20ad4aaa8 +c03f180b614c59db6e5ec1531aefc908c46b93419b9f5b2d4eba0a67ba43d685 +1ad44d4b43b7796de5c9a11f726a90fb1a389a342143f98f49237fb451c43eb5 +981562d923d684923dcaee71b52ab4ce6269169a35f545e74584fa440c41eb82 +41ab194c78a5b980d021b3eb7994846d963b78eb6e149cca7713c12f77023002 +b8a797c9ccd0c2bd70dbe44f81f9d274a5ff3824ee34cb4317fa4971d67d90a2 +f3d1b1b84960f0fbee40e6341c5271b5b945b9098f3095986ab7db2e0714cca0 +301f6b8378559d86f0b0d95c2dfe94ac8e10df0c8c16dba12505a0d467dccb84 +16bfeb18784bdc10624f15da1a880ffbcbafbed0e1c7360962478006db59c78b +ddcee524b6f9b15a8849ee19aa00fa3f71a3c2c96e68dd0248a94ecc43a60ac3 +88e49e005250706880485df109ce1506c0a4edc40f5ae5fe347d52ff63b26c7c +185a698e171244aa1095620494949d526276175a7e120340d3247cbca4e3df53 +641d6d392abc61c85a22e06cdbc89cf37bffdf8a79361c6dd69e6774772f699b +92f7a7184a00fdd7f36fb8a08ccde5bbcab3731366c3b74072044d3ef2ebc1cb +33118b8c09c04174baef8df1bb4a1e1f848c1a5178ec58ea621f6f8a63d0fcf3 +13db79f885ac659c881ab7e40798a4339e6a78ba27cd9e6803c3d4df196c462b +d08555bed51d7cf5821204728356cf813f554517ac5e28e6c4047c0100610635 +7d25c33330758f71bd1043365bda5d1d9214c8b159d0f8fb69e40e6fb4ef4668 +a228938436dd209dda5925597151f8633297862799152b0317bf21f9572f503b +b10826aa7f8d15f5d780ea27f1b8ca0ba3dd732d3e3effcfad6e6ad8769db6c1 +df22ace8467481d16e8af6f56032c90c8f2500ce66afb94d378d893e84208048 +ec0cf900507f02e40da3e99386f939e05d9737b0b11b7dfae473496d056be5e0 +7f1cd25454f4b290cc43d936450c3d675ceef5da533db25ec07addc7e8355d8b +8abb095ddd61c91da2dbeac0574e9ec9d316ed13df03c997d7a4a9c7a6a3a165 +ec1ce316e820e13291132ae91660d5d1812146abfa137726e8700395b4274502 +7d53b1e5cba817beb577bddcb956e89aa2d1ab24128b9ae8e06d9f0a6dab93bd +f7ee8e2ff918255c3722a8b0e8520dd02ba7c92aba13ebad9ce0ad0f16f728d0 +ad49bcb12b429811d8ca1b5ae29b7d5393401eb5802db4d4497cad43ead218ec +c674f42143bc174c525bd736b77dc28bfc7e107366eb9091eeda60664a771782 +cb41506406dfd29c974c5a18da88b473ae58a2f1fbe5680a40138a9d2fb7955b +3fdda23b2cbe7e27c1dc4aea3069b1e7e25068c9051672b8c9a3a37d6e6fdb24 +3bc20d303198f9b8ad8154b3f4a4f2acb17c31a0489c1366eb8a13012c6b8cca +4d416b911de781563e26c08538e038dd8ef92435a054348add815687ddb99dda +88f1e2c5887707cd4be47f71ab81a3d6cc3e039bd09697734840f8bd0b88aac6 +191c6db089943f99ee4174e5fab3baf3a8429e273c4d1a5140e0073f86105402 +3f60df69e65809b7a1a5a8aee4d25bdde9fd6d05a3fcf4be5f253e41fc49e121 +df89f259ba981d2617209b53ebd92e430a69668995961177b159933501771905 +08f625b26b5085c04b325e7fb6bb45eebe3bc9f5c5114eb37f19937635d71a72 +39a0039003764d10cb403b58c61bf411aa8f5d717bcff23fb338da58d13ca81f +acb3316d2b5b675e86a95cfb525199a21af248a1245c92ee37688c6e76a95187 +3b411697a1ea6694e6ccaddef3d57114cfde70609de67972edd1db95d923e077 +4bce7cc77605f9ba5226fb792829b1b8eaa15361ff78f190a0563fd61aac4452 +ee1b0d293e695416c667735dd886d10e4467b613dd9bb899f2bd75f2f13193f0 +481fcd3b4e2aaec6cf2829b1521dd4b6471ba31aa0aa4d63a6456203896a111b +89c106f1ea85bfe0c0104b1292a1f8d49334578375b55deae2d7381f5cfcc023 +5ddfb3d8546054a0e6d5d81e4254383385ba593a7d3a8e0beb34285dd95d97ca +3eb598b643834644b611e6db4b8b4360c847120038768e218031e097ba0bdea7 +732f7e460155a496b91b3241c74f9ee0c99ec7adf6a87b701a0ceb07fef5fa44 +44e127de3e777c23a8d938f9879df1dabb7adb31247a53174f919a2a5a4f920c +9415f3976a8f4b739e114b2c49d67bcedc1852686cb041e3ee94ef94d9f2096e +76f1c558f40812444c6f0f4dac3a4bd22b82e32d8bbf1504f8232ef00dd2f3ff +5c4b8349a9d1becb8c59a9f4763f2566a7a513a6c11f54d1fdc1867ab741f3c6 +e2b44aa95479e4e9813350473bc7897b9ec592f01f97697a17967d344a4bc9a5 +62786f28f87e3639d091922f4994671b22efd41ff3f6b8a651117d0a2a97ccfc +80a69c974fb2ccb36dd6a4897bf88ebc67bfd892e35e6940e94893e1cdfd2799 +8cfcf2b3737a6232e4783eb4a8ae56b83ed7661377b30225a75a1b90b73079e2 +6aa33fd37b81f7d60de62931b6be9d16367a5fab1d14d281d3e8d09dc525f549 +ed03a449df4655802bc3265010f286df86602740d8a86aaa228b9c47e3e78c0b +22d2600d5cd55a3116058daa7e34174144f78a8f72e0dcb8cc64addcc52df0df +3f8c21d9cc04e187be53f8fed4f33633ba03afa178fa5ce769a7eb0e1b9bf5bd +de0ea74dc99598a66696bf6d5071da995a30b8144acdea116cfc447255a99cce +4ec01bc8a0b355c0881f6e9eb48725d61ee0b245e0f7cc35b9e76fe11f681017 +f794ed8d4c4c7a02e17bd16a02347f28318ccaafe0575734058121e3ad8064ec +a0086a58f216020a2dca29376981a2595bfac2a0394d448949b52ffb47e5c5e0 +d6371cb4a417ac834d6c9fa0018c5efb16e39e32c85088b266d74af5630b2544 +d4cf403482c490f86d35f81cc44b34200400c10c6dff035423e725d41d2b5ee0 +c3f03a603a161713216af97036ed38ff8d9b09f189ad191a0d03369c3fcd5a3a +f88a57338971d7bcb5f3fbf8735ad8459524d93a92eac1c2bf5f0e6e1cf675f1 +6d72b35ceaf34d8fac178a1dd823ca0448ee1fa2f616b803c38b89238aaa1ae7 +cb057ecdbad28147da46a34b8a1f1d389e082cc3e8eb1a7e5c0c932341824c21 +570e003d8c11c87d7082371d3d4804da32fde118c6c5b5b08828e5783200c6ea +0a7ab73343f5fd681a3116fd818c7054a5199212eb0f3a9a0d87bc364670ee2f +7a5081a1e48a58748d297e014dd5db7faaf7a27459f115741bf4facfa1b395e3 +e97452bdaff906af9c52c5908748f1e13cc85d165bc893c1eba728458b708f8a +9e8990a6f258bda0989aad0959e7326d1d6bccb50c4fab15a6ea3cbe94724fc2 +8f174df93fbff41adbb9d4fac0124d33151d06753d4d879ac4f15aec5d1cc0b7 +a9e861f790a16eb0821b2a7b7b42d6f3e389c51a1d7c652859ffbe66646d4199 +a62ed28a30c8932dc4d2855e7e6311d79cedba8beefe2cd529f4b45382f3e6e6 +a7659da9b786fe7bc2e431ee3f11873ab2709200b715343cc25c5365d06be9ac +829458ff77f4d509d9c3917237d759da6775e09c2eaf4ce966a14157ea2780bc +e3249446573c82b33ec5ca150022a83301f00f41eea3694059b14b2a9abcea30 +65cfd06b9dce3823477bf80938d355427666a8287a65e231a2357aed80d27a61 +58140c2cdb1f44caefd6b629fa661440c361dde7817154052436a36bbc1bf382 +e30285979c4568b180417740a17150952e3eb4091f583083d75a05a2d91009de +46da396794dbb5288e2a2e6191d3f22e335f0275f33e9af2154cddbcc99b149c +6d7aad7fdedb23c805f09725b60b5ec77e8ac9953a3578b23c6023a196f35333 +a36fab2ca195e397fc82318434e9f2844d17bbdc177989fd8af61ddb46512d2c +f5d7821941b18b7c1f1be16df6e6bed4a1655edcaf6300fa8765e903b03a95a7 +0a7e6d55457f451a8177e0e9c9f3aec8d174843e3a99ed698689019e96cb4683 +bb24c71e22f4895656acc67ecd671963abeffef53724a645b98e5d2680297fe5 +2d43ddfdfd5536f7c239a5092076512a2a9821f12338e388bd5115ff4f4d2c01 +d741f821874380838988c17bd975fc388a253c8c006c67963ce3c4404baa0750 +c56760e367b566ed129911eb056bee42f12bec9980177f1b3713068073cf34c3 +70d6ee202c49b42809afd1f8786e14a6c63794eb2ddf49d5a06f34de23356260 +96ea26d57b94a928e5312147ecc40bbc6a204c4b3ee9d4f4361f8df9e1c1ae68 +ef60fbeb99339842e652479362b19d33de080f9625b5c167bf2b11775929b12c +fa9e9a89cf84f249a1078f5584425e2ad8ac82adc298867ebea1ec6c0428fdc5 +01dccde39e5fc147959ea254217153c0b550ef96c229664c22286a7827ebbf15 +c7fcdc57dbb5914bb0460b6e0c0f58c98b264925d9996d9e0d31fb70e66eb9e4 +d928015f2c12acdb7d77a66408f2767c05f93292fae45492e5dcea337cbab346 +da82c905ddb016bba5d31e740b813c3d709d78d7ac50326f90d2e4af4c1dd893 +e26f9767db437b52a758d6237e52c4a2a71624d2b1f79dbe83b6b7839deb413b +f34b91b3dfbc88b7b0b78ab579594ac3d57471074f78e59a64d75b4e6ed3cf22 +33f6ebc86e289402dea3907b0a2406188246e8e44054f81854dae0fedaef8952 +c05c8f5c4591673102a0f24f7deea7e19e27863a27c00b510690b331413df839 +5ae5a37f8c6b25082073bcede7c8ecdbbba2c09467afcebb48f4a4e25cb069c2 +b7acc265f988955a79ba95b3f4d8c6cf94164941723601923409e9d81ba8aeea +64e8f1f09794779a1262020bc301b1966a789fa2f37d7521db536c0c8da36b7d +906398a8a41230cda975088fa5a6070d88882dd8dee7af696ef5ba2c5a525d61 +d35a6834907c4846cfc69b17edf77c58e501a0600a04ab4b36d9007ac54ccfb5 +14a47193ed01d4fd5e3c8cf04b3e38c4895de3eee14dfbe6351bbbea6530046f +89e913d022c0cafe528a33c4e84d465fe6fb031b48d904c5120d452a6c1fdfb9 +08e242a05d015a9ab2536dbadf0ffd0190d355edcd3174cfdda0974e2a33cbfb +2a3d557ed2f6f284cb3c990c3071b7efc678a5d27518ec1912cbaa890dd6bbc8 +824eb1e7ac6127a67e68428ffd67e650fd44c9ec448a309056ce45e4a4a2b769 +8183ac418981f617dc469a566e713aedce2bbc7cdddf1f7affc6d11e94757130 +c4ec7b55dba7356b21e5267c5ed99f427a19daf476e48993e856c852d35ca1bb +b32d59ce688ed184fa9ea1622c306cd788d6372c5b4a94b001f198e33209bb59 +46af1ef7b066d049825bb78318a38ca23ec9a93bc4b4b12806c1a0e5be179e3d +0c0e5bda654e506e74e0ef1a8b12c18bc3f041d5e61a8f03436f146e4daae3b9 +6b8c7ae139f42e8dcf772cb5742104aaf776f3dd19bad920df77b42aac654d32 +2de3779c42639b50059d13b81c3904df76a0ab47046a0132378f9201359f71c8 +12eb4837bcbf3f1498bf8c7b2298e6b2e528f9898ddfaf75b5358a73a67e6307 +707fb13b2360ffdc5659ed8e70ecbab711d89f8c6558622d67737b1108ad5139 +b126a6c7be8b25709fa7cc2a625a0796b7d08b11f098edb80f8aa08a5668ae91 +4ff1c470dbcc7775a73fbd857cdb9a5d0c122d4765caa8d9d35514390c9b339a +c04a78342e186e5c49dba4cd9ab165b4c139e76b88c807cc4b5db7b5063c2f81 +16721670497a0183c643c5a70ab2405d5d8b6773a4a2d39b3cd0d763c12ec296 +9b3c3ab916656fcca5d715e7dac796937b2b6d4adb251fb79b183e6eab23796a +0bd0bf5bcab03529467a265781716b0186573b862b2a2057c427d85d7b547c7a +9e7fdf7a674587df709ffd0a63d0852ea0d02c13e8038762de82362739de9ede +0db4296421d462d8286e2152aa67298c9ff511e8de1a26089d383bdbbf27066b +f322738cd2cf198bdefe566ced1808dafc015c8ae972117776594e9c506a3223 +d4ced495d6229c9bec17c47071415f80482f9ecaaeba6a135d2173254dde6be3 +f0ce9a7a81ec2e9af4add855b08309d34e780adf0f7c9029d2ce0d5f807ef0ee +531217450c82b7f3643456772549acc2ba6a5938c517fd775114ed44ec69a45f +d9110c969edd9e6f8b4bfb953aed79a1daf47c7238871e4d537100c4d8981d82 +a2344eb7df5baebad28e34870d52d97a66dfc75740cda6b403c1964c0feb034d +d3e5c8b4a37acb9f5718f7b6a3d267694df8baaabd38154d16c162ebe43b473f +ec1f060846ee8402d67942ee080dac9b18eb8b09d384ac24f85d287ea3e2c59a +0f2c1d6bad36e262e031acd399a2b9a7940908d65f142fb209416e891a6abeeb +389e2df002436d43fa1161b71382d1842788af1a9e6f39ed56e8bf63991fa790 +a52ce312aaede90df1be57e3c1151dd0350ffe7e476cac5f34cf8505bcbd25f3 +29aeed3a52bfe1f10366dfc4a15fe212b1cc9da76c8272d7ce85c2930d797b82 +4a67de55c50d45cb3640db2a79ecb647a2fd2d948114eea9bad6312319f8db5a +a29d60b22439d45760751904f5de5d8c5c9d0211ac9d30b9459dd05eeea240f0 +97f0c239068c514b8213609014e6bc50633d0ecf774c210aee7c75a5bac24e62 +813181e4d040ad1bd4bd4ec7b99b8a37abd694cb67483d1c5dd5c17f54ea7f20 +50d0ea8ce1cbfa5395e62e10c5d17a423ac76bfba25a38fd474b5b4117ccfccd +30a2ffa484af429168b1b5679b67542755e989b39387fcd9b1d8f8ba313a758c +58641f34ccbc8f2556ad1b17c33f601ea76ac75ee6b681aef12c0712a14e7b8e +a8a5bd316223d5142e8b53a6f81a8a608a3dc32f20c5e417a6aff0f725dd7867 +429fdcdc16a22ef6112fdfc5282c61a1aa9b134c1b420de7b359be8373cf3716 +d7b3ae832ec15e305ff6c8e9d4197f8b0150b30e1b9e7f15275b4b7a65dfc611 +97c0e5f91561f3e6203950edfd6cea20d0649071442b2916ebce5f4d3da73914 +5a2bfe6d055580af134b7dddbb9baf9477454eee8abc7b33eea500102e395212 +78d08c08ae455bc0fc5bf5a0a577e5f5fc71490add5a623ccca134b62c19d3a6 +4019415ecee0168621be2b4856ef3b3944c0db9aef7d3e933a034184934bfd4e +3fe21d4d2625e6464e9ff9cc25e793eb7b8701d3fa07ff9a3020f76d668d083f +59c6f6751179d60eb17b9c4e35f3815aa5ed3793a2030d317f1610215fa920a5 +5ff29a67e8e6f186f00b5ce164677eb1961eeee35b5a7891d4296967a9d096bc +76b0d072eabab7ea758da89fbdc25b8261d9fa08099b6e84494fe034c3edd5f0 +c45e67ffe588b2532efb3dd1c34be9ce299712eac0e4c4cbee6f30e958c9dea0 +15c5c4fef7cd440ea982f91c07928463807fe07f27ef61a5deefa47879847835 +d4e50aa1dd0ad2b3d01069cc7b4741b3f680131f7d5cafc6b3978c3c1d608ac9 +d24342092746628cb71fa01e3c675f14463f9edd4c339ada41ba4b6a0faa5117 +204463bc7b94d01edc1b3d5781898c85516617f29b4dce2d32c2686ddbfdb838 +f67b097be600f6aeefb6eca5f729b45be307232f92731c10c3330672c9584141 +7192e62a0ebae828fadd77bfc2ecdc1e562daf5660354e0edd5b7177bd8e9d24 +f77e526e649044cfd49633d48cea64de714e59438ad980e0b1ffd51ee19692ed +665e2ff332bb54bdbf75316c4b1a39c538312fd649e8c462994dc8f14bf056ff +0804de76474d0ee084e363c8b7081b1c08e252e05e49679e6c7ac81f42e9372d +e5af64f59c4fb62f3e2e7b16ff53bbbc006e3d9b0f29434db5a63210944053da +ab56b1075a0c3832220752d104fa1770d3acfbc31704a1b7852c077058f616e0 +a4373c1c92c7b60566691573502e9a92d583a3163bf31fc100c92e6405ee4d54 +09d23a83225bf6d1de2c7bead011ad64547d6835ac9a7378033c85592a0c3497 +a03c16190ebdabb792ca0bf803dcbc3bdf0f7a571aae00f596ee01eb476bad97 +3a27a219aafcc0fa245c6731a2e8e561c63b7bc3147b9433a8203fddb7138b0c +1611c7e62375f2a114f7bfab36cb1a94b9e10ca63833ab245af595217779bc7f +d12e68a65919eca4fae72f755669580ab0009452bf086ea835f91a0d5b384b40 +82bd515f006865bbee2c50db43b4457a793693806b86f68a2b2419fc3e937a72 +c6f414de148d2a62a71ee9fcab710d6dc08ad6c4ac443365e7a78843f80cd769 +c56efecc2d63487b5fcead1aaaf9481a7361723388f5b51c2d9cea90486cb9f9 +79f6f5ee718d4a49ed91cb091adcbd0e7b3ad963368c9cde877666a742cf5073 +aaf79428b3095f989fc1fa6f5ab1d724d92c33c1325c05a39423b8a83bba9359 +97793fda280740aeb6be3193be5f4feeca2a8f28efa9c8e016f0fc87c8f3392d +5715b9b9a7aa3c61ac84461e2c3220372568aaed851f1cc40481e326197ecab1 +f3cd792fbeb27a58a5f889a5f6321473148c6d311ca89be96039ac9423700d87 +ab0d7e8b89717d1a62ca14e01f51bd77832bb6dbf76b201a04d222852050cc5c +c6a4996789a0bfd6ce364592300282f102e66f4ae9e50d60d886cacb099df960 +c42e2213017c567f27326e677bbd04a239631950b566eb39e4f675d2e989f56f +74da3a0469d988ea0122ecc3670d458ad82bcf7ad04bf3ca9b00d76ee569f98b +a375285a1abbff253b8f179f71f496286330e364049c72ecad4d82a933af0189 +03de5e4abcfc637803167e56911f826735a7c41e7936f4bea148397bcfb18cda +fb03182ed7c511aa9de0c6e6c80b24cb535f03ee16bbcb514d65ca9ac2ef15c1 +aa1825759fc4ecafc7c0d9401f139b3f20ee915955268578a933b184a86f2017 +03cbf4db79be18c09c8cb07d85739b8653ad37b8c0b647161e5cac746b3c0b94 +2ae2a0540f38dbee122cad0cf739ef1b49b6dbbd5d08c97c04dca33030f18718 +583337a015395e1fa932df0328c7ddd9546b7812ba06d82a35f8110d55fa377d +fa6880f52645890d58478e4ee3b72f08b2d7113b2453729b37e4fffad13c5f62 +06b3c767a45c80bd479d1e24df660e46c83c48166fccec13b9cc4e62a6aaa813 +7c424885f83d7647b80849c0a77bed562f134034cda9fd6e8d7dec9e43f0c018 +9287de759676f20005556cedc67c31509a8bf56a5c972b5d247f21d8b6a58953 +7d92101841166d7781d4d80cdc35ca382d8c2dac3ea3a34f93dce0ff8c76ef12 +390d5d57d88f3bc00d46513f0358c43a22c413d9a6ba6b3e13913474b9e53bf5 +31136a5edf9192965aca98e06316c05fd3d6e88fe09cc08e327ed027b81eb146 +63e3073ea5d1d59b74149c5f5242d3cb253c36a84cc837d76b2ba36104aef0d8 +f9f4404d63c42f3d635dc9195ea582b589cb5b54ab01af9ae53f3ec95992c09f +a5bfe86e6ef6948bc387730a9cff0cdd365650aeaa5e1d52d8f88dd49d36e6f0 +786c7f4ef8c2a5a242e84cfd4dc50adfea0c2ac27839699b92fa8feb6436f2aa +d02710777083723ca7e481f83b637f19ffb7511de223a0a261324189edb38d88 +6ff5cb1356e8d567afe76f96cb72f88016e39e99af6aad499ac60c8a3205f253 +82c0312e1f2b6ee7b37d178bd4e67550276a7421b4f514fd293ad32bb1121234 +bff93d2297dd32dfdd7e7ba91c0544f79dfea965f4f67494f3ddd97d7881fcfb +20ed71f6b5cd27b12d04098a9293e273148590fbb65f6fba63e7bcf14dfe6f0b +51f870be20174f991329a5ef3d3c9fce206799a01ca102ee7999c2a97a19e796 +bb5f88922b76f922d302dd833ec532022b13ec573b375cf75e49718b2278f2b2 +4ce9865f20902d6358440efc9eab6e0e069ac7c193c88a044cf33f6a39388f6a +296f42c637533cc503adfc71c5f898c408a7e5479868ebd29c9ed02939ffd49a +2812baa355be429858e0c6aac60817d684778b71fb9a73e7ac4fcb078bb1a75a +b425ea09ad8585ab3fad79429321a8f96e2e1f02ad70e2fdbeee625bb434b0be +f8eb957f817c5699c7293e47daa4ead6d47f00fbb6c8674ef1f7729cdb19749a +ca9cd399a4abcf28ff71edececb2a955ffbe9ebf4bdab56256e7cd66304ed4ab +1b3fddf6431296aa641a8795a4006a049fd3b35074a865c901636b70619ec26d +aaaa8c8c9060938337144209f3e3de01e92293ca89583cbb4c2edec074bb4c05 +15130c3ebfd78dc687f0ad0981c0d27fcaeb28f470193ca13d98277dbfcfbf38 +f8353dbd04380abef7176b0b4199d7319ebfd88ece219ba6edec59fd158987e8 +9adc035b8fb2141be0e0f25d56e077e5992e4f95640abca7aeac3d929be02d40 +9a86dbcc043637c5e0f1a5a12579e57b042b386be96c9a8b3c4e79c8dd28a52b +a1159728785a75f2e579b8669a36a9f9e7807ff9d5aa0d8652609a47264a2003 +fd202bc8fe9cf80e2ef05ea5e5fbae676a77bbdc4308ab92eb0dd9a960f4865b +8305eef47abc2353287f52c766ea1c1b86fdacf0986e56a87462ac820e61051e +7f22cd8ea7dcc7838a45a08ea3fec105d80fe5ee5e87732bfc2e9d664a7ab43b +05321557d69ceed6b679797a67a0c38b9d101bbe870d746568325c52d4ca255b +b23f9672ce2b4e3fe944f5dbc388e575abd897d969ac2a81915e3fec3d7409ed +14de1e4cf7737b6e46f6c71142db06a799a7208539c649244ce73a58f2247e81 +4f241aba74d6ae593d47c227137ccddcf1f523a730a234c91ac3ae8a456cad1e +91a9480c438b047be40bb2e4038f8ebc34ecc3a8037454b7342c317871fc1d97 +42f26e3d956da7679a072cab96b27fb2ddf480d2f40ed88b2e5b0b82892c8314 +cec9bdc12433159714891b8591a051cf2cce7580af74d5096f53a65347488bcb +948fb028f310575d3429123ebecd9b09d83f30ab8c8ab65d49d691fac27e3612 +66ea08634f4c7d3a648ec068c2cf31f116951934864dca2755daacb6d22803f0 +9488117ef66e9b12663da9d00a3eb0280ba412e4b6f6397ee7800f250fbfa023 +3162addcca4dc23190a52397cda3285291842a2b269c4e07f17a0035fcbe785b +6a570e4b75692658ed47b6dbf297adf1b3b164740d1e851f08deca9c05a263a8 +3364c544cece706e77a32f6d5d10f8d4170d5246d92c2c9fae457e0f5e4ecd4d +08b4edfd42a1791cca41078d5e520807817206193d8a649eb39b64c80e126feb +240e1784da3c66378196828104c49e5fb86475a80c21de71e0aa36ac5e529ade +427c03c2236db0deca99c7c486ff463a72723efb519263916e73c25da625d0fb +e45258ad2abf3445b72cbf3e7e64d507198f666edec002e233cc0af6a8c1095c +3cd232e2ec50b2ede3e09b61e25996b4a64c0eec9d55025b1f47e53e0b128bef +a34646b4e2c13699d112c958590058e6b606cbd978cbb0ef69eee350bbf71ff1 +8213a42d135e77e2c53a8121aa3dd1e903dc0e961810d103bd70a2b448f29ec5 +c3d907d7243d76c6ae04c22a8fbc6c1a05f9b9ec97cbb0e76928f4aa26c913e0 +3f8c371efb61f370751eea6af25a3df4ab3da3e4aa263c2477343e4b19915219 +c4c52cf43dbf373c316b80619f479d9b531e62f26ef9fc6da13e9cf0bce74d13 +c2832f1c9d9432437d253dccf73cd699342521a3cfe8f85ccdcd23e9b240c961 +fce15ef77fad8438674b55da638df2492b29fc1a003859f382a776260ae5067f +93dd176181c10c4a45e8f237c5c9781e01d2e1e0890e1a6e75e2bbfda4d29613 +efdcdfb21317d770fa6c1ac3800f328bdb82b48b7320ddcf64add23374971af1 +50470fd002c01ef412c5bb4984737840da5c9e0e4d4b2b7747056a3865af6db4 +f4b9cd84d27dd2e45aa0d9f32d0cf58a5f1baa374359223cfdd07c18017660a2 +9227404eef0abbd0e29bd8698752e85448a5c3cf596dc805a87ff903ff890e48 +b7971764fcd8f921eefcc55b2d20cd5908a6fa35d56bea96a39ab521d985c50c +4e0213b30325d295a00d32d97e95646867122dbef37a3c866fd72e2f29ed8758 +a362a4f17875cba8be23d04a35714d4c27c4417039fc8bcd25365c8a4bb41815 +ce1f74949d6b6aa58fef0c4cbb8d54ce92d65d0a65f13ac6063de4a55ba5561d +509f2fec155b2181a169ecf14f1fab587569f260c0cacded8021ed8d7cae5ad1 +332f1061e166686b41277495597c16e728d6a8ff49f824df503a63322b442182 +665a12900dd48d1361342575fdd5c9d9ddd7bc73a937b2ac6257255414029a65 +9001199e9e1f16cf3cf876bee000302935493ae997e3f112420d7d3f06739b79 +eddc1bf7ecfc5316549d2ff228a4e28b522d6cfaae3148bea2755a45bc27dfc5 +128a9a38777cd3b07f91edacedba2565b55218d7891da863243cf68e7800b82f +0341740a1f5dc6dcf0125cda844867fe4945326f13a954430753a28ea8491bdd +c545e71e4d52cabc3f05dce434101d36a62328c5fe6b5df3864f9f5aec22f399 +43f72fed081d3724306477a06eb9b6fcc9faeb77e62ee4e20cc51600b1bb081a +1c5a00e064d5755838b251807ae57c85675cf04b69a66bef0c19c364969d3547 +55efcf31f8ae346582462e986e3a1d653c205e5d58d21de4553832c885e543bd +11eea2d3c08f883000966c99281251fbc2920917700037278d4934f3441dd535 +bdd3c52111ed0b282ca23cfa97ab25c8726acb13d50599245e532432572c35ac +b9391685d9e1deed1f95fcb151594cd63e79691b5972ba2c3a0c0a2ffaf3c9fa +5ac47d9177a691742e4634db6631c8696d0a30bce1d86a4fb737ab85296ea479 +fe90c51cce54d64087bfc80ae56abb5d04f5516bffb681e6b39f480767f2120e +97d1e8488f1f540e2ebf63eb74596670f5892f4c327971f697c7530778c3676f +2792289cb12486935c447d4eaf4afec65fe6c6962306449e33fb19fb9806f87a +8b91874ddf3e3138481fdc711f0954d73f11fba39efdeb55ed13b16b932525e9 +9f3c86ae60f9096efd4968759def8d629ff2838decbe4c68833ba0d64d1d3330 +b84cfe8ceb23f4b5d55aa5a9b51ee595aee0cd668b20c687d77ff83c803ab994 +c743b43d9882837c42a58cf704490fddcb5646d48cfd2e30464d710c1440513f +4417dfd66d39e0fa6c596e17d07964ebf2caecd0a9fd78e003541ba53468e719 +b7dac2685ccb9b7d857aff1d4432a72f61829010924781f5d15ffcf8d504e361 +6f86c6638469db4ad281d8ec365848b6f7ae1047114a2cd3cf3d1e46e0b4f40e +1a8d3e1df1c1b677702d7fbd5a5924f91c726de2e37b436250eb71610dd82cd5 +5c049fd044b4407784fd83387eb6a788103430fab4f682294b287dac43f3061e +d99c74309ae973bb998bbb2a691402843a1a28ee62ae8e8baf4d645d156b94ab +34680095425ad8b4dc27289e3c6818d6032f91535459d7595b2b9bfc2f44e782 +30f0af49c0a2223e1cee9e1289f682ed5e8ea7db99663a234719667bcffa8077 +e0118b0b9702538421dfada01d97d7a8f232464b9fc209cf278bd5fef80c14be +011a9f6fc78dd20ab012a30780db2507f4d5e1e493f30814ab1c70cda75ce959 +b5d515b2ee8640dd4bcda6710703a9e5670abadae856b86ef8e4143a5f03fc16 +a6c57ac7c3a96c50e45191b0b1c4f6acd622c400cd0f2ae9e9d51236f1b945d3 +71adc5feab8aa8422a28755b63978aaff787158a68c26fd29ab6e849b076b852 +2190caef1a86663f4e12cdf25ba7bf882ef2e0e21c77c14fdf940792d7bb28f8 +892a9ca0bbabe1c70c152f30f366bc86b5bb1eb3b54425617682a5463238c999 +aba3a7bf788a297d2a555dbb218b19ce501aac43d94a0bb6ae290628821efb0c +84ceecb30c140917a458db6fd011f3cbfb4a1cb5ea019db628c106e2a55f1c13 +448edd4a9a159ebb369d509da296da724f729fc7560c00c41f4309e32ea6fb71 +16f62325a5af317f106a8d8c2c01ecce6775d45fdbefdf6925e9a44604dda13b +27cc9a960a21eea2af9bdf6b3cd357d6097ad40df7403005746a30833e814eac +8db72c383fa42ba9fd007a263ce3b74c1356bd522d2611e4e960c9ff5204d46f +ee332f9f134e75c791a6d20923ece8d4dfedcf96ab45dfd751739dbd47b4863a +f0fda172848cd279afd9fac3cc5744c1fa8a5fb4955c6c1c952f56da06430aee +084507664f93c71d881b63041cdec58306100a0e8c77421d75679ce33e2a0a63 +ac2f813006cea69e00352ffd5f5914b63dbad5905a590ce0903ed9b9679779e2 +d9da62f478768776a173832a8f3cd66b6b62484d190baf2d834241000b0eec79 +f1e53b42a74b159bf781ee4415ab6acff86c5b0593cf463bf95d8fa82293a548 +84bb226f40f24591e5ad463ae4b672905e7a4222edf976e8ad889e71986b3818 +bd3eeb6a0c96787c6fdf3a4faed94f0ba0269fd082ac451531e3b0c01f996090 +3f821dcd64642868f07aa0feada34088a85e6644ef07f4402b4b293073e9d308 +bb298b0e44be36bdda218259b4f48f1b638f5007d3aa8ece802b485e7e9075d2 +6ec881fbdecb3cf58c8a3afe0d9835e7b468c648e52b2eddb81dcba4e9678bf4 +b173541dbec382423e80877ba2df94a605bbc2cdca2b76f74d2eb425d8191958 +804617f21172f397bb762aa7dfd0485cd020397a5d3e9fc9405ec7edccbcbdf4 +295a0057b7684a701bb7ea01e8978fb3367ecd089be19aab2828f6825d275d3f +60662c1e2ec5e98ecb99a96d6fe379e2fd158a7106b2190902f0ed71969b6daf +3f9e460f16f1b40cc2aa08330b9fc2e24802bed034b71de445a14bb33f642989 +4f76319eddee328319ee9577740fc803b81714a99bf0a5722981427ba0858546 +c0f77f3919070060704c3bd991d94909d2012146b88c0d35fba7c2de864e35b7 +caf0099c4630443625be3769b01526f3f0c8c821da9d546bc258c004a4d2b46b +886f1ef916f50d3f5fd139e0570b4151dd41f1f1b5dab0db7787105c77b86901 +73c562d3eef6ef741078659467f333450d7d80c67c91a26ba8c77adcee6f4c56 +c7f248dd92520db35768e703f7bd171f9e663b9daebeb9611cf48425b6b35c1e +8bc7a0b45441ad3854ac9b37061839f578256a8e41766d1a6b29a99a0195620f +a090d0ef4120667902b0587946206f294b78775d60ebec668f6e4fb9ca897e85 +76151b245aff8232a90f97a5a93e935c88579dc0f2e9da7cbd02426b3b15ed50 +30acf50107f7b4d4e2c32dd75d6d8c4539176a2244e761ebf1ffbf97d336fdd6 +ef9cf138326e10bdb57638235348eef8ffd33c84b426ec1c81fd8d4a3907d52d +1ba7e9b64dd56b8fbc2362e30f2451b69b0d7cbea1f3101afcd44242d3ff5b66 +89a7c05449b281035e983c6b8c68859734b232a73996a19d116ac4a94f7b482e +1f984371e7e9919c312250c35f6f7fee25ec23e562dcc25cb29ea79dff0e7c8c +fa19280288c26dd5c32f4aeb98c85afda533191809267f0555498da5688b7c20 +219a058efaa597125535871922ff9b20cfbf4c4b35bdfa4bde73ca8ce6abf14c +510ed2072a01c8adfada0064777509d4f97bd2baf66e7151ade76e407066efdd +2e08a15790c81d545b340019bd350c7b90b36adc8658c1848020a77f918e1527 +b3974710af503a79d7947dce93bd81161cd7e0b1125d2fe0edaeb91baf1279e7 +312fbed646472b352310fdfbefdcc4c20ccfed0d6626083b0261d7c47d966984 +8dca4298b9ddb58fe21bb391c7d45d9b562d38c4dc23acb5aa87e3ddf59ee238 +c91318db2491a24110af90539a16940141d1efdf4a13d202f9b9401bc89d7297 +5269cd5515f9a6186a6ef866cfa03730f726d7a4075e0bc6f094e9584a84cf1e +78489bb68dc09ee3f1356f4e45b8621e06078a6727eb72c36fca805213c1675d +4365255d90164f33ce6b2231113f64fdcf5a789cd61002b2a38d2ca5bf1f5361 +c9ae0f4efb51337e344fb7ce15f8edbdc9ec82a9435175f59b6c19ae2dd0b10a +944565e4b14bd1dcda02d42be27fb9f0330636091228e3b89709c8148932a5f8 +c5ba5bfecfef6de83eb414adc613d8534c4e4528d934c37e768d08e103b8ed2a +e1e49bb1b3e6cbcdc3ff63dac7994b8c09203d82a99710449277c20a34e01538 +67c5d5e6abebba650c441d3fe56de997e928193682e5f1faa93a5bc800862132 +ed3b6c005cc0e604231e3e61d17214ca38148c875c268a861a14b54e659dd932 +cbe6ea7109b273975d6ceed351f0b0876a0b647946d29097dd98b5f6bda7b43a +e6481f17743fda503b34a120c8c06f4798c1fcd4e521a30d76f2340df562b63d +dd4b27da8b583547d285f3848bb9fddb60d0ed22a4cb27a2784e8d7662e84ffa +eea50afc03b0815b72bbe9558c8959d0ccc00a8c8c9f740f95b671a66dfdfc68 +77fac12c1995d977495c9ccacd924e45a66f8739de156ee6962c7930f8aac374 +894f8bc396ff69f2249392c7c4248f9cf9ffff9eaf635e66a34511f39a066b88 +4866e776b8d6eca0319f23ca604ead742bb6f6f3b046454a1c0fc242551112b5 +c745e9b8f12723867b2b895c0f93c99df1d542b86c1c9db47390f2d6c3b57ecc +66b1a6ab514a47fd9aa6240b46c54a92fdf80fc44eeed4b8a136fb88b1fa5b9c +a2fe682cca4d0c5a3e994cfebdc270f48e3af91ae6bc9172bd9c73053a761364 +6ef9e68ef58c718a478e7d81e57f34a791c26269819c78574d7cc12632684219 +a1f8e1c5ce8b358d6fbf23984e59d9533ad310d158ab5baa9feda08717a7f5e0 +57684c455a7e3d833f82b4e13e9a92b0b8fba5cdd72a7e46709074ddc82e449a +c906474441066fdd9cb7f341f3a2ee9f2fbf5e4e1a350a45fcad6b2e05825b6c +89077d742619cf1f8434a3b5cc44998176667cfd5c5f4ee51326d1ee3e449915 +00bdaf57c88a107ac49c14cebf18d010c5b3206ec88fd06e3c5114581ee5a5e8 +c4ee5a5c3d48653fb23d28f26862c433ed083af01ed3df8e147548f9cdd882f8 +ca3088106b9c73b9e28786ffa643c343a940bf850f312666e635b8db95c6f70b +83d645fd947f6df322d26f8f9081cae71ba8b9d0de67d535b61146c956801d6b +ff9a69365bda9bc97d8d93142d4c367d5255587ada25e4fb061f8e430f73d2a9 +7142d9e4c17435b78805946e4fde624ea5d9b5c511c9afe2cfaf447cf08235b8 +575ddab8af93588e0c8206f08f883170ed4463da31a53cef67f01aab8f645acc +c2c764f24bf831dcf005833ccd1296025368b3d51a04efd095fd1355e93de563 +e71dd047ef49f5bf8c17b01b2884872257d743ac6fdd8f54e27a241d7c75b387 +a8841d8cede676e35d4f01acba2acebd8b22113bfbef80d5eab1e8cf56f649a4 +516ec097872a597e83519fc1397c7d4a4f6db7daf044835b17d085578f5a3776 +fd5ed9235c018354e801fac338aa7ee581e97d91df0196ea4bcb09f0e6f2e2bf +b5470827f1b6bb0b7133c19bf43bbe824ebdaf9526ab15ff8ae8848bf0decb3f +cfa7d3f5ed71191894c705a27cd9aa30fd384ce6a5f0bc51c5651dd2510a3481 +d086aa87595f885c4c0afcb02b1837cedf85c5e64d440e36581874a117043b75 +78da94a069cf2bd57ae70c230e8d1a0d4637223d14a9868835d8923feb404323 +43c22d0f0e8201c20247c78abf9267915069d6471862c2a0c51ee3ce3153e305 +4a4ec6ea52dcb55df358d1a0d8aafa79fe08ebe4d22e9ecb9d2e50a7f367cded +7169f84285c482fc1effbde6feea424ecdda2494127c7b896dd05f5e62f5fd1c +031de960d6ec59954e8405081601df741edd97f227fd426e0998ca7b9b498beb +4cda9a16715cb699c46d1386469958079ddf5ff174d70338206208f0b9ade386 +03e8dcf31e09f44976c1ad762896a615d9bfe54978b7c3914458c8af4d33dc62 +9f9af5171df3b9e548b24011ec5f02e31dc379582e16f3c999f047b82e7f27f0 +4bfdd827c9a1d19e4230695d4ec499afdb6147146cb6f5a8a26efbd6d0c5f205 +34cb9c37fa4c4b6122f55bacb756173282abd6a2e5219c25b86a5181021f0bac +6f17f89f3b8f74c281aeea7c1d4ffac602c2364c9e1ec8b0a623bd3541765cf7 +aa5febbb6e857810a564850259ac4ce6d641f7b765dd46584c43c8113c8583f9 +e7763d3f4f83649e12e15557f48dcb0a637140b2f7479f78f1f64bcf8a07acc0 +43b9d9ac1f8b2c3b00c36b46d8e514c998fcd47354b364e8c2434e774ac7098b +24c3bfadbaab5bdb8ab0a6b9773aea4175615241249a2a58222df8c53c32d01d +6adc5fb4a933605fff98c7d011266380b305403a79867936156240a5c555105b +95cec3873530fa6d37e8cfc286118a9618c60d6282412d0ccc5a8e3af47a42ec +29cee0176d1c4802144619a5bf1cdf9ec5b8d6f87c379c476ab941da24420a86 +04a0b1ad7884b5e05136139afccf0b7101cae4b8f0bfdbe276aad1b95e2c0d57 +3902bfdee651a202b99189cada176a22facd053bbc73af1c90cbda10635798e9 +8de05c338e90b3dc4afb8d29010590b641db4a9ab707294e55e44c97e275b52f +b88f52a6c7e545cdc73de46da699c8c3d895880368aa035a137fa8686ef4f64e +09167b9e523312b175a166de5e1297c60db361d9505c12b48c1780a00be2a9a1 +43bc6362c731eb26a61097c62c28d2cc8d75ba3c63e31a49b9cb5b8b7fe1fbbb +6153bc87b4538ef5cd4919811329ae933d86ef556883323ed5a6db5c98c11b2c +cc04c4f937289590e5f7ee8d57940f21373a81b8b92eb7ca978c1a07af7b1065 +3e6498a6e2fa734269d61cf0dedd647eddbbe395e1e8190552f9a4332082bee0 +87f28fd6bb19e48de8ad662f41b4a5de657511f2329fe6b541f50ec43be24d5e +e7336712535ece6a590426e10422d130f4fd8b0fe314c9fe068c6a45835994ae +7bfda8ae49fab23905e4d8b374fc654f336b36b2080df61abc288b26b9ca7b42 +68e46f120b82cdcb74715e6d09aac096fd117ace3383beaca52aa248cfe307ca +8930a34b7062fb153d968c93169dd223449ca68765480cfdc5df39be45055d37 +8ba14daa5a4745a9f7b76ab664ef3d5b2fba29c60a06d1a088c05eec6d95c080 +1974ec344b24dfd892db7874e3e9df0fd61ef8f59b525f92f2b374999f923f34 +668e55cc90ff2890107a7528853f44177fa52a071f0ce997ae94b590289411e4 +c0669c936d4b885de8427b60b2f8820bc9d6781bf275a95921d8cf4f55cc8cc7 +73ff7d001f4fc5c41ea1c755ee48c5550677755aee061a3ac85bc0d9c1e5b410 +f38ddb877fef4ad4142c87c42b6fead87f1daa99ee0fbe7e7eee948672373a3f +7ace2444607921c61cefa7360f3194685acf836165e19395c2b2c9cb5778d9a2 +6f35f91d61e5e4838aa23909b46a899a1e02e27ebfb5368f1080272f6ae9adc5 +44f512191bf17dba3eb22d98b9b934f359fc86c9e451d2d4194632a7db5b1270 +6a58cea47392fa8cc24f6b4ec5d172e9e5601617d8e22e837c0b35b4281364e5 +81757e2fccb98fa88879d7ccc568fa9b183504b491329320c968b5611eb1f337 +a6e50d6faac591da994aa47761865ab84651c328bf259be59bd752f110f89081 +7553823cc67e36721e95f1c4e2e372e020f2b2ffb045aa70ca4dd6d55d88e32d +c8a17492ef28a44d4a536fca8bd75b3dc392fc296377b2c4743897c32eb65283 +e776e8f8fd97c661c67c3f0d97343af141bf6b77499a13af4605e36d3f4c3fab +12bc5daa5db1d12dfe5915acf14409e9302b1bbc8c5861948eae329ea31132df +8494560e564bc16073c7a777fefb30cac6f4b8943c70195289946a60f06d4306 +4536c2740995b7247451c9e1619f7e277af4bcbfff6b68553ae23eef7b179c16 +cab6aae7b6f5fc72e0d7cac34611d1353716580948ba69dc534a3fa592984244 +c1bbd0a6d3f1fc4d9c8ff48e770f5c65be3b5a961e2ab8931e73c8222e6eb481 +86e92906bf2b44fef5a59b460bc88ad1837730515d82c337c349cd087329ffff +0718e22bd3f09fede7042992a191575008890c5966f1230ab186f019f1794671 +8e619ce8706fd94bf0fb1d6ec22513150c1b9496742a94e048df079bde5d7bf3 +9db82668e5f5453962990f4e3e0245cd2e767c5cf3754c1371bb37bb7e14db75 +a90fcd5de1a7d75748289177ebe65a397762b5b1dbd468e7cbb3fec66a6b3f2e +8e9a1802bb2cc4506b3ad1632d674f1d54a0c1c08787f274b48d60e9111d8035 +be3af44a3a12e16175ebbafdee5cfce2a9a26cb9826c86207f8ea895e5c2fd66 +216be83f81fa47f39dbaff3789865b1bef63bae463b7d166dfba5e3e9967697d +f6c91c7dbb765bdb91f4ee5920567a94199416484e75cb6b1c0d1bdd62e831f2 +4b6d7b1009bea14c78ca6b8f1020cb05c9bfd13076d5f335d0b8ae417fa26c75 +d04a28a778d8858e64736fa0a5ba789b58b4d05540ecdf28ee044ea18704076f +c3c92090d119bc67594021aaa4e89a063ac0e64f2198c5cdb3951c7681ababbf +6e96666f467a0fdc729efcd2f1d94e193d8fd56802063840696f3eca394c2841 +6b7e6bd4759aaceebdf82bb473d49256e653943469db71794ae96b3d130bf97d +752a9b3bc4449bb756039609a4f9fcc63c637d8672f2f24dbd49a5f9f5139c54 +23c4a1cba345784f28b7933dd3d2c9938b35e63678b045ec314fd9e9188f1b18 +ca034a26f5d7e2e779cfe4d16560ed2e4f3ac2bf1b5324c6b342e29b5ba3c9e0 +7bf1bff519f91bd9cbd4c198f0b98431d83d7309d0a4b62bcd450d62649e5b41 +335d87c297d288942a637999c2dbdaaaeda4f68d166265a37df001b1a4a5f561 +64a9a7af810851d98af3e01b0e4bbcdf33d3035b98118b48c6452da0caecca10 +228a308a0a3844d57628b2dfd7189f1fd252ea1ce3cbbab7e71329b886cc36ef +b40f642aa54698e87f4ce8b310f0ee29968ae04de003fbaff84d866e4220b607 +3b3c5fdfef88354a54d4318dd852ffeb9be81630c673e425fd3bb6ddec9f298f +a9982f8a5859b983bcc09b989f4a71ee4a54d38a220c3ce7491e7d996d8b0e11 +b085acb8f217be35f3eb7fa08bd8ea8c66df8ad00e329ae732ce12801aa8b1a9 +40db1a7b303967c185b90229a1188eeda3a1565dad1c08181fb35ba03667d513 +9f2b6a71dd27e11c7db9a7eced6404cb09250fa0ae2f0fe7fa61147039cb8685 +e7a1566e25b40b1f23ffda5515c107e3487ede0a148f2d8500f102b4f517c956 +87b2e0399387f4a9067ecc725bcb327ba5e98d5c68fb54ac99834146bbd7e91c +b04d9576bb16e39608c14c25aae446d250b388610b2714757631c18feb700057 +c0022456c9ea28140a150dc6fea0333ecf9c291d95505de3c053c1f957f76a06 +a5e96f792200eb5f1811e86d70c9bf1e0d28da28b8c6042555a27ddd0aa168b0 +0f3c113217d990f6ead0a6ecc4ff4c92c577121d2b1dcbff547c03184360a6b6 +3788919d20302f0c35541b48cb6e926be087b1f7308041dc8cb8f161d8a8bd32 +ecc861efd6ebe16568dd47b82fd1a02200733fef4176a7477185d79e44c128fd +c54f4f28cee76dcded7399bcfebbfa620a6f5e4df5350fe6005f84541a6e77cd +97ddcf704455f96435edb3666d9cb57521f35e258eeb2163944c90cbdb3d4a70 +c94b9d3905fff429f16560c6bc44aa27bb481e24d03f29f135eef38d973d12e9 +c251de1d9b976d4d7bb7b4f62dc7a6093d186d240db797432dfb5e71f8fa09d1 +b9b6cbde7b4674bb3f38967091b8b375c0e7dfddc0a206b0d8908707521254a3 +35be48528674c8597822a0a9e9ca84f0b3d2a44ec9deca0db51fa2ef3db16851 +7939ebef52b5af799ff6fe86b0cc459be94187af479e95651233f2515e01ccc9 +57130b01e6e97df375396f8499535a1fcc0dae920db25db41477263a847b578e +8ac94e59fcb69b97a1ebf8d84e2fab6925bd16077d5a58403539acb40adbb89a +55623d7e09a8481e71b47416751f01881ece4d94ea9cff6dabb3546ff2cde4cf +1ba77ecadcd4499637e26c5064a342d71cf50d725c40286ad352bf97e0da521d +58055ff97c68768b4435db372f0b3d23845d7709ac47b2a965327f62573a8fe9 +e9c5c435ddf12478bcdfde41c0e4303b03949446ec9291c553eebd9add6bfb9a +45165ce3820af4264dd3b54ac41e4b2df6ede1286973660e37281c7540beb69d +16a86ae03b8c5ce7ac142585f72a0cba8cfa3c71a54db60d1305790ffbaeee1f +f31774926a1da96a37574c9a5b66daad0a68adf9f104123941ac4d3342c13bac +b9b124ec9db917032e3f495107f3cab93d57751e88a5369e27358ecf4f9348ea +543fb55c0492862ce28cfb1f28e0e5ffaa32df8fdca241db555619583fad76d5 +04ef599f233c424359768f6e8f0cea95774901577277dfd8f90418598e +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F134_0 /MFECUR+NimbusMonL-Regu 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +%%BeginResource: font ZOVMRD+CMMI10 +%!PS-AdobeFont-1.1: CMMI10 1.100 +%%CreationDate: 1996 Jul 23 07:53:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /ZOVMRD+CMMI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 45 /arrowhookright put +dup 58 /period put +readonly def +/FontBBox{-32 -250 1048 750}readonly def +currentdict end +currentfile eexec +d9d66f633b846a97b686a97e45a3d0aa0529731c99a784ccbe85b4993b2eebde +3b12d472b7cf54651ef21185116a69ab1096ed4bad2f646635e019b6417cc77b +532f85d811c70d1429a19a5307ef63eb5c5e02c89fc6c20f6d9d89e7d91fe470 +b72befda23f5df76be05af4ce93137a219ed8a04a9d7d6fdf37e6b7fcde0d90b +986423e5960a5d9fbb4c956556e8df90cbfaec476fa36fd9a5c8175c9af513fe +d919c2ddd26bdc0d99398b9f4d03d5993dfc0930297866e1cd0a319b6b1fd958 +9e394a533a081c36d456a09920001a3d2199583eb9b84b4dee08e3d12939e321 +990cd249827d9648574955f61baaa11263a91b6c3d47a5190165b0c25abf6d3e +6ec187e4b05182126bb0d0323d943170b795255260f9fd25f2248d04f45dfbfb +def7ff8b19bfef637b210018ae02572b389b3f76282beb29cc301905d388c721 +59616893e774413f48de0b408bc66dce3fe17cb9f84d205839d58014d6a88823 +d9320ae93af96d97a02c4d5a2bb2b8c7925c4578003959c46e3ce1a2f0eac4bf +8b9b325e46435bde60bc54d72bc8acb5c0a34413ac87045dc7b84646a324b808 +6fd8e34217213e131c3b1510415ce45420688ed9c1d27890ec68bd7c1235faf9 +1dab3a369dd2fc3be5cf9655c7b7eda7361d7e05e5831b6b8e2eec542a7b38ee +03be4bac6079d038acb3c7c916279764547c2d51976baba94ba9866d79f13909 +95aa39b0f03103a07cbdf441b8c5669f729020af284b7ff52a29c6255fcaacf1 +74109050fba2602e72593fbcbfc26e726ee4aef97b7632bc4f5f353b5c67fed2 +3ea752a4a57b8f7feff1d7341d895f0a3a0be1d8e3391970457a967eff84f6d8 +47750b1145b8cc5bd96ee7aa99ddc9e06939e383bda41175233d58ad263ebf19 +afc0e2f840512d321166547b306c592b8a01e1fa2564b9a26dac14256414e4c8 +42616728d918c74d13c349f4186ec7b9708b86467425a6fdb3a396562f7ee4d8 +40b43621744cf8a23a6e532649b66c2a0002dd04f8f39618e4f572819dd34837 +b5a08e643fdca1505af6a1fa3ddfd1fa758013caed8acddbbb334d664dff5b53 +95601766777978d01677b8d19e1b10a078432d2884bb42d1f224976325883657 +05acb022d1e9cb556e37af91917c78e98229e3a4dbf03ae741998542977ad6df +1760fc1f1a479464922afda2cba7961e9da696b71205e19c542c97f25419c43c +fa1a042ba0cf5622ffbd3e775d0d564135d99b9ffba011eebc4066b003ce2f88 +825936d7393d05d3804601cee9d123120fdf73624a9d4e361a28e998acec53f8 +7a62a0aee33be2e96542534a8af24497d1c377cd7f723767b44857d94c6cda7a +c3d6f0087fa36655dd2b81eaecb31fe4f4a2fb1ea9fbe8b83d35826ac93fbb4f +2bee014f41f8f276510cf5ce35c3954e8cafc521d0c3ab80ea8c7fc29427a1d4 +42d6f6c1800919e58de9ae12304d718ad80febbb412da54153469cd51a288628 +ad109baa77981525b3d9b0efe593537fcbb8520d38cccbd5db171a0385a432c1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F147_0 /ZOVMRD+CMMI10 1 1 +[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/arrowhookright/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/period/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef] +pdfMakeFont +%%BeginResource: font ERVBFT+NimbusMonL-Bold +%!PS-AdobeFont-1.0: NimbusMonL-Bold 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Mono L Bold) readonly def +/FamilyName (Nimbus Mono L) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /ERVBFT+NimbusMonL-Bold def +/PaintType 0 def +/WMode 0 def +/FontBBox {-43 -278 681 871} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b892ad5e69acacc6c1640eb +3067bfc64938f41636db8831883bddabc6777dee17f2e84f1d530bc76f51c621 +75ec6b727a82c193d1c0801ac492bbe281b46626bd21f2adbbfd144793ef754a +ea5f1cda3310e83d78a098160c66d6b0c68d4976898d9dc1a08d01740ac3e7f6 +8d3ce0a7e109104248cb86318400bd82ef894efd9c9456e97055286c144d3efc +d2625110f1ae76241079bec19939ac962e0ba813359c15b07c74d5e9868e2167 +ea1199d21ca8827cddf1be8357261bd32e79fea6bc475577c5f6848345bce58d +f5435281572ae6b33b53607ebee6f862d4c752aee43c00cdbfd258c7765b1358 +5d6165ee034e5815de79cc26c4a720607bafa6049710ee3782bc2cd84fe2473f +1335d20a3b6e9e8355af36673cdbe63c27d4f0e183fedab10031b1ee33b9573a +2e1961b7c6baa41f7c3ee707fe86071ede5756a00d7b3bf0a21b7c3cf41093cd +66eccccc22f4534912cb900b08e69574b07f246305dcbc238780278aeb8c9e55 +3d096a944ec7aa9f697f354aa137df90a9547efec1cbd568cb999979f5aec6af +a84edaee1564d178541cf4631081781608fd38964257cf89b1c8e0120b3f6af0 +793597ad553cee5cccd5c4f09cb0b4e998e6e76243191af7e93833d067833f0e +53670d7e996ed67cfe6699a6e3815932ad272af4829c2ee08a30d3938c928d1c +e89af71192ec1247ca233093aafa54ffa58f4aaf3fe9c62302e598f4ff8cc32c +4d318391f7a36d0d8b416dd36d776b301425cbaf82d520141238781111a14cce +7927e2af21ef837558002539aaeb170fa7e7e37efd447c37db455d2f08533155 +53f3c5c3be4817680efd0ba3a114db6aaba6c4d0d57b09ef8baad463996718c1 +9d155a62d7ae82eae4c82760c594a6ba3c7ee4290f0d898bb3e404ccaa91fea4 +eaa2146ac6a23f6c5a8aae834a0587d990024bbe8de485c71b916ad96dd66792 +a732a188e6a57c459ebbd7756cfd54770e2a8d81bd4618d916a30ec7084b2492 +5f77ab14169547eedfefb6f03c7d5365cef512df194628d5fbea6cf56d0f5346 +b6b6c1da1dd8d8321b88807b579bb6a0c8f69cd919e311b6ade903b470f4e0a3 +dd5015c6432452ecec048dcd14814e47def4a53c5ca6fa9e91d8a28c719f9348 +509c0e17d632f8cb3f7468bb0e7f7f6525c086dc7efb997a60e059d3d4938489 +23e60f7c67fa6aa8062594f122a48c54aa7c049859928a3dfc72752acad074aa +416c667fcd176da4d7d31a9f6be6f146d4a9dc78f419fab7c9e6c74d40ea659c +24098088bea26bf5a725fe56025d1fcf8465ed7103702aef74973f6fb697e645 +e902d65354a44bb3489007c555a6a08bb057eca27c93bfcee9de42e2782fed4d +664ad7f2d238b7eda1ca4ad473bb9559e11a9f214e258ce1a2a60512975b112b +336864238a36732c3adacbfd52c85a0dc809ff955f9c81401f72107f3d263999 +a69836d76d228ab4f954b00da07bc4a4e165f2dc5ecd8138cc408ac22217b15d +8baf04408d4b47e55129b0e596c93d10cd42372292e1ff483868e8510076f7f1 +ed8ead1bdee2b49533f87ddbef2abdcbca432307f7ad0b3c3d4721f3e67e609b +b06f8b7e66af7c843aa1f71bdadf0f4fb6baac84815c8154a0023cfb68282b4c +8e24e478f81f8d26ef82d6d0e1da4a65478f4a1f65a7dfb4d1700207850c33f8 +148158a784b452ac6874080039e2259431c05c4522f1d67522e273b443ae9820 +adb5303cd0d839ffd17eb1fc6957159a569f64873b4b3bf99349c486a3af2b20 +b6b9c41263300ab0844d24daf780b4f324eda854d4e210daedc0e34f4b67fca2 +1265ea3764f8f755007b62e9e18e80bd30f3b96124065198c0a5985ba2172550 +8c8eabe77b26df4451f5068956fce111041a7d23f681ff2c1b93344fe688708b +61a47674c318d078fc4bf79217659987dcd1bda1e1b74068960036c472906152 +cafe4a8a702d271a02c790ea3e440e4f415556ec703a23b7aaf7bc50c5a32f7f +fee6426433e945c28be038cbe5ee0e7933945f052757d480c58d4d7dc4ab924f +985e054fd553d1c037beaba29b14e823a4091b08ed602a69d1c3eb0fd63faa93 +36db22e6588d3d2fa727916163030958cc89b3ce99ddeda6190f97e039f9821d +ab4e4d9a15cb5094041790b995d8950412bbf049bd1d8afeb8bddafc6aef748a +f2523b8313e13f90f966c134e39d52e10b63e30aadca42bbac5962e4e3f71337 +bc2fd40679beb44e111250352f04cb0404158bad9f74416c94003bd12c88d9e9 +5cac3a3eb575733eb44a3c32946dacdb3405f5b4a2513fdf9e6bb2e6e21c5385 +6c527ccc120eaf95d400847dfc9e6a40806330442e1895b53a6188e57c65b466 +da203785fc322efd64f2e6f66f996bf7ca035bb2117648a8857f1b10469aee10 +dd22d785de27f01f1d725b56b380917004a06afc0046335f97a2ff20ea44f794 +c1dfd6b107549e39247a5cb3f9c37af849e9c5f06214a570113d91ad4e14d9cb +aadf8ef93a933795c0cbfb7204dc605b4b3b95b9fed0372d8df634f7293298a3 +6aa4abd1f212ecd5d4ac49d467567385f80e163b9464f6554e48ff78d45aa402 +b5ee093a8f96da45504e41bfb1a72f579031efa801690a32f4e248a5f773027d +da3f3721d4fb481fd1b8e81054aa4a700e9964a87871e01f03fe80ac4215cdf2 +7a4944cf89a893638730631261114f8aab967fe29e280124fa8d51fc94b1c552 +db58e038097172d5f634ceafb877d7caca03436cf6bf40afe4dc99ce08d3605a +78e2c90ffe766fd3ac0e8b2ab247c3f689a55e350cbe80a9a452bf8666d5710a +6fbbc45e4690afc625bb7a8a29bc17aa582b6e200bd5123e26b2d445992a3a5f +7aa128c3f6230588c41c6c456655961b823e65d7471ad16f9aea07c2b3d39c45 +726f023ea4780719a3656ae18670daa3bc084e60fdf2ba1ff0204f285d72d9a8 +269430e406cd36741bb227a1aa28cedf9484689a78dd5495337bde66b5a790fe +4af761c0b505ff974e4c7f67348eb1887b5b9315a7b3455d3677bc77b61d48ec +f5ebdc73b25eeaf12a6c896a54b499ba5f2897b7da9465c34561b23e0e740eec +fc7adf944329e003f5266b94a425f3864b167a34d0b9d259fcd8d741c9dc0fb5 +bffb8c8cef470f923d7962cb5806c67763358a9f6ccf78220f28e45a84b0ff35 +c585c18b19c61b51cbe58007fb852e0a92ed6d704f15ff0f863528db72ea3dd4 +3ea0af466fa5b60ac4490aa5db18a649c442a60b4f824e914915376a127dbe30 +85a3c56ef4233579b756eb62e04fea0a55503f88bfdf011436d9d5088e027c26 +daa8165842a4ddd43fc3ab8dadbb4d53c5ba9a5b51f33d505fe3ed168109f1f3 +9ac5c3357e48cd9e3adccf2daaad831000e27307d6cb2aa6ecf5f92cff39b266 +73b1d3587e029313101a9075ab35de260f23f3d3bab5f7a6134fd07c076dcd99 +7bf2e7c40ff0c0fa1096312b791d638b0038138ed5c578e51309444691c1b182 +8b346fe0286e13e3907beda13044177c788b4948a4dd398aa9fc317665b250a1 +3570a783821db58159b825b14c2a639f62995a049eeeb8904226a8f8e14a7959 +731a74dc4b215d7ec095ebe86a3bf07080cdb0dce6d06fcc2e3a57bb04944f90 +8f395bd65117984c1596303c2781e3997bbfb6ab9f354ebcea7404785d8dfb04 +b19a3a6792807fe5debd6eeec1ba9ba9a37473d6c435bdefd5b2ea9c21d9ec79 +0043b5ad1b0a50f9a24594d00f8fd155681c33df8f0c0b3cd5a4fc275da65dfc +6c65ed8713956bb94b6281a4f39c8ef72b932adf3f6ecfa697ff7d84f93e7a29 +8fab7b48172e32ba7b3135f4a2501961f4a1c50403fc38c715743b55095ecc1a +38f11f1475521fa00f950776279e8a377fb4ca4870c8daa4fc67efe4db8e37c0 +d56ad93cd334ebe18dd6d92a3ea48b29e7e76eec5e8aa0db20ad690869053422 +8567c4b72be2093426677988f8ac9f7fcde0dac8bae175066a485f3b1d0c2129 +9e38a93996a0eb7a3357ee43bcdf8749bcfd7e7e0a23c7d9e118c4da7fff5661 +07454fc1ab28a875af7e512b2432256c401ea462d9aeb0a2f97270cf2aa8ec53 +1e5248ad52b1b74a376faaf7772e948f433cea2f0ed4dabec00855a394fedb83 +1daff1d977e9b816ebd27801505dcaa51f9ab531e6c1358b275d3a6ba38f4f4c +528f2dceea3a404a6362e3cfef9d904b573571a4e634d4852f3b922495af19c3 +c63c736d1e8a5b15cfc4da58f26f22be233b4579377227110f8fe5b0df57b495 +2c14d2011b6215b855c36d901f001e24261089f5edd39f7e5bbb2bf90c6f5c5e +7ba8928434f52689365ed48123414ead2e00f8860e60afb5f59d2715c4ee2b3b +2b10399ca1c3f70259c63762f64a5a1cb6b1995030a7d775a04cd77a95436e4b +c3b1f3d1959ded9f35fdd7fcde9b051245446dcac11fb3d0228ce4c012a2f201 +81ec3dd2aa1bd66ec02c93e4784268f754c9f0eba42d27b755bc58ad00e09e04 +e05fd21ed0c160353d2f5467b5903b4e1d1b8666acce06ada99c063c684d8738 +3d338c579595d1e2ab301c4236183cf2c3be0320ee83cde4ea050160b58787f2 +bad8154825c9b29cc14682e15db5f53aba109799c10f25fa2e54560fdafe6c91 +c246ae56edebe0aa30e152b61fa64e517f6cc41ac7b3c25ecada33e3f6d6ee5f +562542e0e66d9c07aa9889505d51452cc2ee73e3683e3fabe26f003b87d9fbdc +a376e85ad9547c23e463fa073429d32ca0e58326385a89106d5b72cde3c00c11 +c5f40d1e8b61e6cb1cc6416e28afa6caa469682ec8365081a21d77a8b1df7167 +6344226bb9a7533c0fdfe153878a3af3088e520b94933d0099c2ff89974bf795 +d871b9e5d40cd7aac72a99f351d824f86d33cc89bd70dd41f1a866657bac3a58 +a4eedf997eb49f8d967e148f381e753d5e67080d2843d44a3585e078615bea47 +6c882773d995f4154fdb773a7d9e29fe46e464e602cd206063c96fc51c30ffed +cecdfa28a951dd5211acd684ed3efd9feaa5aa98b091aece8681999d7c8ce708 +1c64f09e18e64198b841d7824e03de11101493975ecb1b7d556714725a14bdb4 +5d9237ecf693202198964c1554a04ab3485bbf9ff863441da3511d8fe6363e32 +a38a11f4dc6a1ee18bfa3a1c2c93a90675b0c21959054b17b1af4d533c87ac69 +08d0c344fe817d6817a74fdb46f35d3b48b9128784f43a68d809425c6570c600 +9a76199111e88a1c9802de558332000dbb9d1211929d509af5915b7ae8ea1c3d +d2598f5007de8e7383f7453fc6a9c0b91c80e9b1742bf6418dca69450785fb73 +12dd228889cfbc3f6711a26022b29f9295ee1ca8459305fbf2b93cb3fff5b6e7 +2b5c1d2c4d453f0b9a53b6f361136b1048b30e7c90e0de8edda423e55ccb2e2e +ee7b502af2baf30a92af542869b8f26ee28509dc01492095e0c27ccaa30e0db6 +3f02f11dc0ce8a94b8a8a7ef735e4fab04830ef077a8d788b224c184339274fd +5f7b547b77f81bad985c73b05a79d3c8661a9c2b71c7313d8b9cb50ae03aee95 +2dbf1afc9ddfc00d59e6f99021dffbb66acddaedf48df5462fc528dfdafa5e5b +a039d6bb9bdd1a78e47684a3c53ca307abd566093c2a4f6b9f0be52d4f1f2758 +ec48370eab4e1e6ab393a23358bae52fed3b270124639dd0a56ca6afce77494b +34f46433cac90eb63e7e0d25de6c8a0670b14e83d08a531cf2148002f9a6df19 +7f87c989b831c509df23057b3ec569eb5f5f530edd047a53b5b59f483703bdcf +b578fdc44ca7487e3d39479ca4760457e7018af01116b29bbdf7c3e0f5c07a8f +7f502c15059d9635b7ce630194962e4183c3838d9401260a743d8ebae1665ce8 +73bcfe5d090a8984e98030fe6b21dbcb49398b6905ec04ed310e37cd069a85d3 +7cd9e3a02dd8e036b2a79192ec036cf7e10653e08928cb8bf4911122d27e195f +48d3dfaa34122ef2df8e023c9ea1f246af2879f5df632719bf7a91f266d823aa +caefce067bf74ee0d625cf128c3930ab83521380e0ceb5daa2384da4ab23c34d +0db8a4acce1a33b6deea3581efe521279147ac1b36e4f6b2c08df2b2dbab051d +264a250a06ed06aa906c2682ad2ecdccbfd880941bd824d021f086560bfbb359 +e2519a2708a4976f42913465e18872a93cda809a85730a4930ef1e3e733292c8 +06c80c8865645c6a69b128b1333c3ac8c616d3e3a0163aba54c7a51a063fbce1 +4018cabe1b1ebdafaefc27d2b22afc96449cd515cced671baa88d51c5c778bfe +00208127f1fc35db9c6afe4fc91dd0bb1277181508d7b9868a055025c65394e9 +ab7a95494118d20fbdd7ce0b5f11492df5e8c54c1ce1ecd2e7279e07fe6a62d5 +63d7ffd38f04ba75057cf190319634f57aa246f03f5f904ff952d7b1006d43bc +ce88d89ade52e861aefad538b644942b6b97e778000de2f2ac2b2280d85a823a +176d8387ca420a441980d3e866604325917f78572ec9ba14a0944e37480ad3ff +9c10590c0705840d09c8bb076a5aae81b5e315ca901e262b773143a554360fda +3dc799fd07482666f47c17d8a5bad6efa53f20707869c5fd40d940a885310cd6 +d5ca9c351731fa69fdf0bfb148e17ac26ff43bfbb38c101867ed95d789ed2b0f +61820249b398fac0c5eee32032984302eb1804b82bad515d721213732ad43b95 +d4a02e17b22159ca29e300042804b75807782b9bda49255cccf4e35c461ff59b +65e36f6c6345dbb2e8c2f5445031999c2d8f0444cf4198ac17db48199c3b3fec +02a130d230aba456406e1070178bdaafc422343ed9edbf471c965d2b891586db +a34bb2d66f98f716e605799f3800c68000941a52d691640583cce11b94cb5599 +29fd0d5e8a9307831fe15fcd232eb361721d0da9e7ce111ff1ebc256a407372a +253180e51f1800ffb0313c2c3f3c4fcddd59f824dcd0eaa1e59837487288b558 +7f8e6d27954208fb815ed1d54a36476a95c660751a2ce7d475c72ff1784c363f +a641595eb92e65d9e7bfe18eeffeddfe82d9f6f0cee37e6a9e60b44939263272 +4816df40ed24551f0d07d813aba49a80bd3560188e5d0170385fd15c34b45465 +3d5d59bf7624ab116452ac28dc9217b11c75a08d68e55b10e9567a9d3d8d5da8 +89116318aff25efab611da69e132ba2ff888d68c84c056544c0fe9137faa8344 +4008487c34ff2c2376558ce20108f76582965fb06c2129e607a0e60889d97fac +2c71a026299b071ea7f9995a542b7e31efede8a4d341210a37f7b4bb96aa7c31 +c873cc0c3edff7b23d8a22e7e601ffbbab0f671b02ba487cf6b588ebecd26f9b +b7e8de0cbda870662bcca90716c0ff768a9c7c69c1dcb4086f1e881c6dd5b3f5 +0ac517ca096f28b1c7ac9195f99e44d444017a3bd54a68f4588f0a7562553053 +8bfaf7788a7243c30446213bc987e3383913f24b36b33e4b082e507cae63358c +9675599f6d746305a417fe8848f37bf85f4535e28ddbc5868dd6dbd3148cdc1f +2c2d224f00c3af4c1ddbfd88bf79eec76e45ef546cae548825a0bca6bf93b0b1 +373af60a7b24a75079d6645d0908a9f55ed0fe7397100a730a6f4e55678714bd +90c887e46a2c7703b13b1dda74a819b97abfe6275a24e73901540168737a8b32 +ca1902b7577b8761b3c4a6b60dfad490e35d71c5f35d8ef382fe66433336951d +e4ee981f980168853438755f135c333b8723d5778e2e3067dc73b7fd99aafbe1 +d5a2d1cf443905fb45730ce8fff14674abded9f94b45756a646b4cb1f789c7e8 +0748f3641a22c01b10adbdc77760c0e2a0b9055c4f9107d935f5c2fb2fdd2845 +6d6d2d2096e4baf14bcc8d716adf053bfe40845f02c0d18fccc453f3f8e45458 +69f802f506ca21d0fab24d7f3d6d6c219637a2dcbc58614c1456a9c6b0b0f57d +09cce675fff4f626b1b68c0a63fb9a16145d58176cf27ff5d3513dbec6014f3a +2b5de7ce69c8ac2fc184bad23950b28cf0414801764967ff97022cd4865d994e +585ff2c992d480de31f549f26a18e4721133f3d88316976bdae41431d44ec8d7 +4eacb29aeb132ff49e3c646ef025eb541dcc54f38b8aeb562887ed6cdd07ffa6 +cf3b2f89e4b0fbb5226702068b8043b6e2f284e4350c97a7498e6440bc3c8d2d +27d8aa1eac980e960613180ae4224624b2c6f92ed4666e391ae5e159c0ce207a +7433e462cd92aeb67eb89fdcd20e46f17f3d15ee679c064176a2db0ad5c38eed +7595cf6ab9750fca76e8e5ea2443b9d13da375ca2a2dc87fbd3d81ed58e366ef +94952cbd918134ea08f90516854207a2fd92799c410ed1fb6a9c36877d0b777e +ef59b03f19bc6b8fda91ab8ae21c89d117825a1595466da10f20b86d6d223cdb +6976312c7fb7bffb58feadfcd019bacedce96ec239b5a799005e94bdefb9ec40 +e717a597326b5330f38fbf708d002c9eb8d8ea0834241a35e3a07a58a030e678 +5812bb5de1cb511426cf49ff39647db65d8a7f2f87ca5e903eb1478984abcc17 +c7ee0b1f7d1e9e3b81c663abcce77a90f1cff1b01f116d2995e65cba0b3f1a3e +80079ece2fc25e0f5cf24507c99e5b6e87a417cdf29a1a8c58aa747afa962c25 +14671fbe467e22931a723a236aedff5676acde6ee71dc9eec11301af96927274 +a732813a49a473edb7e9886b6c45605681a563f32745d60cb4a26a7064406756 +c9add724e9b400097377258e81cfe085b1abdb3a00354353b50c9bd11a6e655a +d264a203708f739a46e4322a1a8204e32ae385d4f7694d6ad63f975986ffd869 +355b7ea9c0feef8f6d7bcce3128a0e45853de0a5f442bb805166c7906c9f1023 +df70bca683907a0bbc11249670f81c522441aa6fc4e7889a38d15ead8cad4ccf +e95ff5438d0edc450e6399f0228ea318dc2979e7e5a36eb76f9d81061ec8c615 +217d9dc7a1d0924dd953ad2b741e48357953d43186da75f340c58b7d2a6c7eaa +3038fa4b66b0ccea51af9610e5558d82bf79a301d73d57b6feaef32d6f19e801 +e37a3c1ea341bee088e322faf9ab5ab1934b70f894853984abd5f34c4d3fea05 +5ab4fc70179cc9f1379f98b3d1f529f3c2aa4ae63b8d2bfd46afdbcda8ea11be +f32c93eb4d435fc37486a1cbaadc3c98de581ebad18f35175d7b3e67c9194d5b +bb3cd1918e86daacb86055a548fab07ce7c933bd984eb713405d2b3f48124432 +a88e10b97f7be3a270405594d3e06c17b47719e2678f0f069ff1abfe7d3672d7 +6a748a9e277ffdd25f5477d0c9d60d7e8da9e0ef30e5fd6c70d47d31637bc0cd +4d67f5ed2b103889a61fd11075aabce9f2517ec9b53d7db5b27790d9bb1e19c3 +d7c3a7e1b95516ee38062d4ea759151e4de0449e6aae79500c42b4efe4936d0d +000fb3391330c035d9d6b9e25671f9ac599a40c37b2439c06fdfd988abcbaf77 +0e42d324e8ca78613f35ea64aa88c3c43e51cebe8ed1067cad94ea0387783e03 +e76af474f739b9249d1e95eef85ab528e8cd2da99e33c7ef0ee9df694db43f3d +fe467e6fd1b5291ecbf6b1ac7a25c002dee8be0727ec5439715bfd8f854843ea +1d080677f64889d70165f1bad110a8baf3885629f8ddbc3d3b09c57dea28b4f6 +7a3c042ce64d636d0bdef920ab5ef9544f52ad533837867c4930fd4dd3213e18 +ae2ca622e0e218b1bd54bd60e01d4cddfc2e9b64c6c99e79ab2c3e52cbefa598 +434213d475b6292190b89be95b3c6660133e1b498bd7ff2fd14aab2aca0dffaf +62d9df30c19ca0e949007dcf8453e70e60a519674d305523d33bfc3119037236 +19cc4ab1707db2c4984c6d4fb4310932e9ede7808cfc7d343a7fda08068966d4 +7877d7de7c0f5ffbfaae5666be3bdb48de31c5ab6bcfa7d35816e5862bc4a13c +ecf2355935040fac37141f7bef7e58f7b025e187df3950edfd6cea20d0649071 +442b2916ebce5f4d3ce055efdabf1c2dc348ac0ae6777f679e2f62a0a3ee9124 +7fc855bfc6f0c337a74c44ea1f5dd32ce6183a4c80a6b967861f6101c28b72da +d6aa1128f196627e24179c18f384e27cf7f81f43138381d177f93f8082cc9d56 +1b3c99f1bea073a1a81f8bcea131e3587b397937c4029d486fe6842a709558f7 +43cd16c8f0a5e4fbb3e522663b82e2544a6fecefd3d8a2b222301fd4988c0136 +859e86087fad63292bc4187412731a966710ca9ccb86329560d64be31ca4b526 +82245c1a487046ad21dd9a270e3fae72fecdcf9608784f649a25474034ac744d +44e14e72d02ff17b2252aa5273de3ba3cd71a95070a9fed0dff80653b3d346c7 +56119529e5bcb6011d341e368827cddf22d4f99f1781829df808507e2b4ceb13 +211b08f55444e75a005639a20c33706f8985f3308c08f77e72dbfbe049ae8177 +c2da2e62eb58f0fbb369f5bab0fff49f9d4765f931fe66f8aa107d8116becdfb +466d282527bab6fa29721678837cb46d60148a7fd9cae63d6aa634d23ee21161 +ef9e834520f367903a65bef7996ab77d37ba97aeb2a7a8c3502aac988e7a0430 +9d67a06db4a90714fd1a933402df0830026920bf1f71cb0379bda8714415c9bc +e7795fa4ebc37e819b3d8ee65375bfdd6b36bda41b7791864389e9b589919ee6 +2872bac2e221b28150d3024a984033899e5372ab474b9b4494f7bb4331b6213e +7953565f35d2ea6da212956dab01571cbeeef86293c58a259860e294f69730e6 +f141680cf75d40e829f9679e98341fd1e0817cb8e40cd6c4fa691ac691fb59df +b78e87add951eac41ad1b4f4fa45d2e346e0fa73157a7d2b2df89ea56a80e885 +9e0d0331d216db4f1b95d662bad40e472f21bbe05576ce4a2d27af01880f438a +30c17bc65fb460ac1b3e01aa43aa3677ba05a437fcca3ce4c2864d99c701d79e +3a199dbc7e2f00be8d4347f96b61ba0f88e90b49d412d0ed162e82715ea04c27 +af3feb0a7b3e4dd17c875a51e9bbed3c9e10eaabeec0f029d94fa90d60605b52 +2dcff539fbc323e7f0e1cbfc1a192a44345efc070bd5d5939d9f4383897704f0 +e785126abd9f582f1afe88a727784afdac3dca49892c6beb52cb1adee18034e8 +e88a441890175575951fd87594b63751e69165496d566bd23c8db4b9239bbaa9 +ef5058f5b51c74cf70632f88f1a05e1b40078c183ea8433427f63a5f68a1b81c +bd46625b8ba2cf713c001cca4c74a186f93aaa3869a517dd64f1e81c71823239 +1934faea604cf4d9ddf974fb09c5786bde05978bb25209b5c7648602dd62c32c +61ec4b5ce1177185354dd5cdf15540121b6d82457ff3111db1aab1889fb0e3c8 +38cbc7a671ba16a4bc567d9cdd427205e8f4de7edc64c00bb6080071130b43d3 +6e7919a5b7c29c68ac505ff107d1e2ab66a3417612ba2f461548f1e72c702a19 +7a6311dae649e46768d85d759281429b97a35379b84c763d35cfd434a4e3bbb8 +4c6e5ee8dff3a7449bec14c785bce1d4c617217ee6315fda000f0c54d1054e80 +c8f9f452daaa465f633ffc3eeda9c76e7a77024eaf39bd5bc9562fa44f3da9ae +7e665a33bd22aae6dbc1d9efab63741e30775eeffb819ff933342c8e6b978f8a +2aa20c2f2810072c4f2437e7cc13861002ab6d5ee84a6f80549683a34da3cec9 +e3471d112332ea260153836fa24e22eec0cdb0a5b3b0773cfd237daa67c55aa4 +cbf1cc30f43183a93bf7d7068ead32ac8064bb1f0a8bb61cf5472bcab360cf71 +b61c3443eae4f1ec7fc0d883559f8a2ff2522dcd7dad5f395e9ab2454cca6dad +07bb58bdeb1e54f75816dabea8d170974909b2fad53f9a69d97eb11ff20c6aef +eb6d76e9fa93c317115602db90359be638da383d9e01f6bdacb5ac5bd7c77d42 +d80646ace9f2384774610f63f97d70c4e81a2871be0a5b028c88afd82a3b6376 +5d5064a6786a829a6e6320120395b1541bfd6e3ec182d50982d7bec4140f146a +06890a79b85a6f20f9bf616f5f56e02752c5d177a48aa2f8ecb67e42e2314850 +d2109c0965a55d1e0f470371443991f9b8859ac70bd6f049dbf57ccc8e2e3c67 +eb8d1b4f36c660746008460ebc0f7284c802925206b968477a503dfa6879794e +7ed82fcc58443fa1d95fd561bc9d3a2ccb2bfa19916d8a88e6f7eff0ce0a7d4d +90c77f63bc75f3368f7a97dea9d9392e3f499ae4b8e53602636cd53ebdb42213 +c2668a3c618a76f6f5a96fc33c0e41ef620a63e3c52512c66b59f810c6b85923 +d81ff8618f42ee19b10d4d088bd6b784e4f9bd6bffe083161181b2f79b374fd4 +b846650d4b95b6c3e58449d8f0a201aec72d87588c54fbb3112045040109a3d2 +d98c778ed3fe07f54010773b628baf29ad3b91072fbdef7cde0b969d0b695bf2 +5d386c6b8647bfd55c169374c57d5bd8fb29af5c5a6718d7cee318a06ad35d96 +fbf879929e28bd43b583aff2769688e087b00ea95b28629a71c6ea847f988357 +da9e23422fe2ebc4c33f183679233e0d1d8150ec58ca6ca0bda2a529e6f6d146 +92010b1eda6360aac940ed23410455209383b68c3a1fd68a0ef92d16cd4deda9 +9dbedb1ce18a79817fb3d043f919f1b98c62ecc70dc27886b258428ae2d1075e +ef8c1225f96be5ee3c1b4e127d26bc2abc6d457333a0d5cce99dff00f3f41e0b +a9fd7bac9e96691cd316abe913a6edf95c6c5d37086cf3cb960b82684ce473ed +574fd8c6ca059bd679441c22e6c39376d3a33c8011361c834bbd7b87c345a9f0 +c6cc1328b5af926f763bebc13be92238da171124de119a097d65e5d623cbf157 +a4e93e250a6bc34bc54feb2889da3f5993eff0bf38ef6e440d0bdb405746aa70 +4e5de570b0347d52b25ae9e0ffd758b8d6da1a57e47289a26d0ed30e31474273 +c2315c74a39e6b26f558dec140d384cd3bbd7246bf46a0f7becce45fe0c343ce +78016204e814dccc58061d48ffc808423452985b12d28c94eaba89eda793f7b2 +8d9fde11f30434bdf73c48484a814ebe541f4e6eb817de43146ae4e04fa7129a +ec0e4b92ae22a1d2344375f68314d839aade59c4ac1d556538fd7a9f7ee9a139 +f3620952c6c45f7181a6448a807a1bf62cb59f440199297cbc8a360d0168c153 +7c6b3ba56dd0f7f104271138846a6f305f2c8a7536512c54a1c46232606a6649 +81a8083d59a4b5e8ca2cd0b70dd0b44bef1c2ae9ebcbaeecbc7c4bfb2ce309f7 +830ba06f3c8e79fddf737451a67d8c4425c51e11f832d99198c16dee864b4c9a +e48863f5a3cd0e6f3c5b31a6bff527bce260aefbc40b1d8065d2f88f97dd9ff4 +8b21d069ae8cebaa511f0d00c1da76207821859bb191d5f9261adff3e6417788 +5b493db49420f472496a8207d3f2d64fa3304de0e78d6259a626d8fdf81c51d0 +f81ef8c619507f0544ebd3aa8d1f200a5ce240a1171441438d6bbb19c0850bdf +4a0147baf4787513752e4e052a09d6b94bec96107e64f6b2692bedf2a38863e1 +15ac2564c0eb10fb923ef3d505f750bfb6407856406cc92e9b2a3a810fb49ef8 +e8f445c2e32b30d352fba6fe345c8af241307e76c13ed376554b857b23f2b10e +9f4f1d6b25ee850d744332fb73349790426bc3adf811998f84f4721247ed9dc2 +cb33d343ed9fcbdd001d97708408a4885ef05908333546167859788124f50eaf +7f9cd5b7a9f4a77b2337f51569fe3fb45e41dc50394ec963851fef76ed67592c +bac68e378043d77137974cb61772228d63d46d92821662203dcc0dd1db375bd6 +95c9153c7226202ee545aa36b0bfba49bba59e918e3bcad377cb461d52442b9c +d159764090efaa0a887a12b0c9884d4eb0cbae8b2b5fe1d68b8b13abcde73223 +234063907a8012134dc42337f131ce012a98e582fcc50c9507c1f87b83d62dfc +bb951dd48c3fb078aaebfa25ae1908f87d97915d86bea53e23c2c4fd426210cb +a517ee3681183d327a5ab42c02977c3221213e76ed5f986ad6bcc14f50651367 +f142a4dc6379213974fb90a7be +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F392_0 /ERVBFT+NimbusMonL-Bold 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +%%BeginResource: font BZXIEB+CMSY10 +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /BZXIEB+CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 32 /arrowleft put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +currentdict end +currentfile eexec +d9d66f633b846a97b686a97e45a3d0aa052f09f9c8ade9d907c058b87e9b6964 +7d53359e51216774a4eaa1e2b58ec3176bd1184a633b951372b4198d4e8c5ef4 +a213acb58aa0a658908035bf2ed8531779838a960dfe2b27ea49c37156989c85 +e21b3abf72e39a89232cd9f4237fc80c9e64e8425aa3bef7ded60b122a52922a +221a37d9a807dd01161779dde7d31ff2b87f97c73d63eecdda4c49501773468a +27d1663e0b62f461f6e40a5d6676d1d12b51e641c1d4e8e2771864fc104f8cbf +5b78ec1d88228725f1c453a678f58a7e1b7bd7ca700717d288eb8da1f57c4f09 +0abf1d42c5ddd0c384c7e22f8f8047be1d4c1cc8e33368fb1ac82b4e96146730 +de3302b2e6b819cb6ae455b1af3187ffe8071aa57ef8a6616b9cb7941d44ec7a +71a7bb3df755178d7d2e4bb69859efa4bbc30bd6bb1531133fd4d9438ff99f09 +4ecc068a324d75b5f696b8688eeb2f17e5ed34ccd6d047a4e3806d000c199d7c +515db70a8d4f6146fe068dc1e5de8bc5703711da090312ba3fc00a08c453c609 +c627a8bd98d9e826f964721e92bbdc978e88eea0a9c14802ebcc41f810428fa8 +b9972032a01769a7c72d1a65276f414deedaf1d22be23f4705bf5ef31b6a3b69 +0c896320f09e9875b50220a5bdbbd57c041b5ea97f421685a7256b0d9755edbe +d05190dabf1c3dbf558258163c8231d89167a816bba55fb1f14ad04320ae381d +f783a9eacee8ae5c1838775fe2380bdd1f3afcccc96d2a2dfc999b52a6689c51 +af82b8d63205b339103134dac7e3c45e6693940276041bb07ebdb9b729e8ef0d +ee8bf450fa42551be65217fea902e28decc09580b504f0f52f1e8fc5ce7ac28d +c4e47f908fdaeba23827a97a0aa741aa7708f7bbfec6fa69cc4f7c3bd4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F564_0 /BZXIEB+CMSY10 1 1 +[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /arrowleft/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef] +pdfMakeFont +%%BeginResource: font WWWUTU+NimbusRomNo9L-ReguItal +%!PS-AdobeFont-1.0: NimbusRomNo9L-ReguItal 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Roman No9 L Regular Italic) readonly def +/FamilyName (Nimbus Roman No9 L) readonly def +/Weight (Regular) readonly def +/ItalicAngle -15.5 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /WWWUTU+NimbusRomNo9L-ReguItal def +/PaintType 0 def +/WMode 0 def +/FontBBox {-169 -270 1010 924} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8e134d4cb5abced39ac635 +da001e9934c198a7f9b9ed0028a85e9ae00421dfd8eaa3bb3b4b4ce45d209303 +237bd51809fe4d880900b1eeb236aca87b9ff6ebe6b994a60af5d67ccc42bd56 +77295c346eb4c62bdc1ef22ee07daad928dfb73455f091f32408ed6430b97417 +683af27a03718a156e3f6e7b6e4f2e8177503cd82ddbf4557a3ccff4c858ae7a +f7efed6cc521a28342436b953e4650b5792be85ea2f989eb6d986905a61fa38b +96e1bbc830b74469150fb0b598a794fd80d10870084a877273a9502c3456e5ef +74350e6e3be5863e8ba185eb59fb87b36566af71200b6ed389d1287d4e925e33 +b2383ed05d87d48586e698fbc5d562ed9d8a09ec3eaa1b1f300224af20c23f26 +a2eadc74562571da84b3914d1d80b127c6ff4706c7046bbb372a0013e0ab94f0 +c27946583871d272bf4f20fa84e89d745de7bba885cc09ba72e0f530ed4ef7d1 +864b3c67007ed98800284235372f0a70c912e21e851afbf812165b8df912cd1a +013e271f0b347967876c68ae4c4107ef8ad1f170916210034c66394a9d971b68 +fbfc1131e37fc178eb97c1b2a0f573add9d7c0bf944e6529734df8a7ef54485b +a3375cc30e9e328943733cbd352bc15b06c85bfb4a96994291c72a0eae84fb01 +0f1b24d0125fb8c16d60561df8bb7aa7ddfe9549afb70c1e89424214609fde41 +9a142892e30f02754fd234ceb3c59a2a04c06bab7ae40e8fdec50559b8347684 +391c750987802d5452c47c1e0b5f222de9a0eeafee19d796ff375a1e1ef0aeed +1bcac4f485fcaee18aec585d1a9d80f41871dda45fef1eae82c5893118987beb +4d9e345c27c7419fe65e4853b40537d822e34ff1e0bd2819d21ef607981259e8 +9f1040a2d708d7463858aa5381759ac49df4dddeb209a278fe60bd2508aca0f4 +6a249a05b652e4c7bf1b676943cdc4602910fa3ea7636985a10f637832a5abab +9c7a580d605929d6d7154506217252a755beb8462d30a798ffa9b26e500eab24 +7e9fd612c776ae60423995dc1852686cb041e66357a9acd4b6a4e9846b1dc803 +23dab6b7765205d82b50cc6394e725c19df00f7db427341d514047e4bc594efb +a262eb2c414e43d8acc9cb195d12f3b2a9748f38edb3ac3447d27d20d1e62bbe +22f6378e508f0cd6f17ef1c500407f6d442e92ef2e00b8de78660d87fd1c7209 +ea67cdb37076e1eaaed128814a948e27e1f2fa81fe54be6c57ef8c2b2e460f08 +6ff1bb529c9100b1d878dc9a077d21805e89d8b0fbc2a074e4b55a869c96fca7 +8117347b9cfa480ff4a37b34b040a99fba99942bd86ce4b46ff5c69babca7a3a +f5018da05556bff71ecc844b2b718598f0825cda3d19d714fb66472621113ad7 +bb240de7dfbd1f17ffd8f2ef4b85a8eb6e1bfdf26c7f98168197c02c4aa535c2 +0f9ef9b7cb7f1d174b2e94953f541c3b84d43366e0e00a028b98f990b4d01515 +3ccc2e1853473bb9b25857e4b8f9d6695ef332bd3baa9ee551a4b142defb7f03 +97cd075ef9cd41082ccbf63e849c48835e105923e725d41d2b5ee0c3f03a603a +161713216af97bd21aa87e3a80d75383603152011530b8abd2294d041e90a040 +f61baf86be97f8daa8326eb1a2b4511425785f35f75835683515af6cd0e73194 +2b25d5fa8c7e12ccde33aa193d61a35eba7f7e101843e35dfdf3e07a1442b0eb +f2a9084634736a21128843df49c84b1061d0826777a754076c4c3d0a68b32dba +ed4b5c0746ddecdd79fbcc7a4425eddaa7f49257148f05ff52ff6bac71cb65ca +8ad5869cc9fd7c4c194ae8d5d20a730a035234d8f9a6363e7a49fc22bbd34d08 +eb7fd43a678be52b95eccf029a6b18a512d30ceb0b6adf80ff1232dfda1a5752 +b5222edd9012b45cf0df0644b2e713afef21255a08232efbd5d5f7506bfd050a +f0daf55b5db595d29361f8253c26c37e09b4f87056edd8c90e0df4fc74072541 +8ad8ccea562e4ce72acc8e9f39284fca274c572ffec24ba30ef9db07054965bd +2205d717c9b3b0723061cd74ec688b915ab6689904d5762629c891f2fc0cdfb1 +8d8a4d2260dc93d7ac1107b197d7e8418bbacfc660d888697296b7cc6581024c +e583b0114ffe3b3a960d601ff23c0f633e2b85300042f717c4718c0547fd9b19 +e74d0e18f6908e4528065888c136dc8767b74025ef5faf470a272f57f548d738 +c5d2ff6def4366c1c08e0b09855e04ec3bbd8cb6b770f638ac7d852b7b2250f6 +cfbb5669c9112fbf73546a9c1e968a1e1a06128efee6422e41df1519c7346635 +31fea419bba8067c6d0e964143a0906762197b8de95502ae9bb54ced17de5ce8 +9d628716bf1e306aad09bd7f8cb2b7dae5bfa9ef53e716d5aa2ca014eae837c6 +c0f2d5f535ae93682e855b1bdd6ce955627284a4712f67c1d6de9f80d4dda43a +9fe34fe4fab544459a1dfa0d1383c50bb3e6c3df078acb88db37ecb38aaabbb3 +cc59d3fbe6a84f1f9521b6e05d0a0b2e0fceae8eeea4f41976945501f32bb383 +455467d21777796688e57ae9b7b392d167b63bfdc1102565649b53694f1eb3e8 +5ec2f094ab06d427b5e1e7412b3369336c766a7fc778190dd5aeebef9b6a034e +133314cb512667f1a4eef90a1251ca9e8aaf7966ec96004c09c4dfacbb0d4c45 +60d8df4183d3598fb9584a4433c9131f8602474f27e4916b43de80ed1d02f6e4 +d208b014c0a44d94ef709930eca646b2f07d8358d48d0a768b6f13492e3cb877 +fe38c58a7f5468af52ffc11b8c02bd91484cdc022abe678a7f2e298a7fad967a +2ea7dc427e6ac154766ca4ae15fd414a76064823f3145724184e30ec4f1494c8 +78f7f63edea60daf2448de8a79801ecfd86a06ef122451dd2380bb1a4256a7ea +806d131e66d5a6e3079f7c2d7c143e2879f5316ffebb1bfa166a088b8fa9cb7f +4a5f0875a8ff5d378e9e8205c6155ea85756475ca5149eb72643b4ae1f907c0c +fc8f63150cdc6209b1951af23ff68188360939501770eac39ed55dadc4dfb1c5 +b2ef39c93d0326a804f62e8f187a224444098835ff670ad55b49f3cd0aba2901 +293ae04427916ee14c81f4044a05d9c8ad14ad4b5567e8e0147780a0bd294c5a +10a50a5cc7656f901588419108d2570e804a5e590004008776c8cf20b56d5ef1 +fa32538c480bcc1955321f954008871ba180177dea952fefec536f6522582647 +bc205dd139a18d2a41956baa4b002169cf042ab2ebf91ff203dc2e2559171910 +2119e94673a275d73f3909d0834b170e2b62beedcca27afb44a35ac51dcb5719 +82706f101b216b4af3523974378a05c327702b132335ff288adf62578f30cdcc +cf826898361bd49238f368ae2182fbb631e375e903ed9efb911a047119b40830 +a39909494e86aee21694223df1a57ac8e5b4f0465d0868939ac77ccb448d3f58 +36631cebdc06bf2865c58437568cd734efbfa870214853232ccb48cc57c8c32e +97cdeb89cf5e0c032e81de377b368f7d57187f0828675a52382d41de6cd9fb52 +2a1ccfde3192c650fcd7d1f86db03c401e6eebd0d40bf23c10e021ed66bc5b7c +ae57d0905bd24925c8573f069139883bbde13df3ae05bec1771eddb9b003555f +9d69657ac718c065a32ef7ca8a1ff5880fc66196e8123050a47ebe4dd5c1a4a7 +40ce1cf340bf08021fceef8172d9cdeb063f4e4c2205ae4503c71aec1836f9bf +96ccd0a712e33407446ceab96221d7b3f4342fc74aafa802481acecee7243807 +390b2d12c844193560738e576d27b0f5a90b25e1b5a27de8a2c74b3303526191 +5ee0251065475f26bf0bbca5549f13e1357797a5728b46ba9570c095d938112c +b3ba212c26cd6bb569ea276e1d8397569f8d4c78528490187a172d2e30dd0228 +d69fdaa25fbdb477c88d52f0ba137280d68656036c17b8852b03c21621d0b21c +6c016f18cacfa9a998e972f40eda07278da54fe5119babf0145d6824f051cd63 +91bc93472f780f00e261dc74d6673da37d8d9291e25af279829f8d47bb524c19 +8b598ce1c576ac8542b5ead99b039ac2996a6d791a22a5d5bb0fa3eb65d1fa01 +401d5c7d44a9cfe082e9314ada6f4ac8ecea5be8e5a1cb6a1dba1c615e69ec9b +0f231b64ac31c545859f0195bb9b403121df7be1ea1488b413825d8e1d7afbfc +e5a8e1e52d9c3ea6de3ce75d013cb7396e825bac3a50d0bffd2d30c6f1c5dc0d +83c1b68dd8b6042382285812093db4c5d7f6eaa8a4acbeba794f63610456a641 +42fdfd0c4c5f0c4486a6170b7701ca64cd1408f686fbd2afb56ba307722b2bba +c542123f766171b43aae5ac053094a04ac4faa3cbdadcec81ab5aaac58d3a7b7 +1dbedcfe63d062b11dbcacefea89c6f8916389d3f7d93da89ebd8c37414c7db6 +d6512a4e8c76145ac170faf136a023b3c31cbae9775e436d6cb2835b77b56458 +6905d558a3cfab0f1f3426557a66bf775292df056cfaaca8c087b4c0bcc2aae1 +fa49f346602384f743be6b1aa26134ba2872366c17f1dd356221838a40be3a4d +0b8502a964d360ea9bc58e4ffbf283c8294679197faf5d23aad1c89c3da84902 +c95619fa0ab76ca0c7ae725a1c5d9c40e84cc84eba8fc95361f3a738ddbcb593 +b3110db2f69ecf9da21d788d36a1bf986e2dd78c9e62f643e6677f80991f90a0 +8bd35484fc4aef3243bc3b460f57bf6f0a503b57f84723738e1b94c3029520c1 +f8d787f99305ef87fe64293b5fbf0a378306459c022f4127f2e2207ba818aac4 +1c860b70833b92cb7228ab2c8f68d03b6ecb67d4f83cb160c170298e1bff339f +306505ea4fe86929f115b3c55c7fbdb7f09eb38f7c8ca86c9c89d9b92dae37a9 +5839a181e6e55835da3e81c8846980ec5c16646a31bbffe54a8505e005c9200c +cb2b476083d7e55e63648146e8e615d349ed779b787232605beb38346e3578bf +d043797edc00f6df91c9a02958ea01f55f00d576c8a8d236e81b59eaf96bdfe3 +4de4125a3893acea97aa8d6373b736d4cc0166095bbb75b7341f06d8e3fb732a +5539fa8a27abc1d82f1a86a76870450fdebbe889dd048cbf2f184dcca5377649 +9ca0053aa9a88ab4d6f279f8a3ba704ed057dc2a361d07e5af6c9c8ce4b08c05 +d06635afce1cd7fb1288df9ca1f9a556d1a120691297d8134214da14db45cdbf +5545abb75134d45257b1e373eaf23fb600370cf8e7de02e7211639b11f8fa0d5 +6627c5718f554ca3351ac95c04dbe894e20692065af2c7a9e239449df4a65917 +2e0fa2bd3ebffbffd9093569851a31db46c8c30c1fb8339a7f742a2c89212831 +15459844298972b8b06e2c699d6acaaf331a023047e5b2041fc39d830b0851a5 +8ef1e329b688034f9c91927cbaae2ec2c84f8502127055ade448d6dd7eea3aae +392dce03347141b3b85f3018b3396b9fb1e4a59c50d9e8b82610088575eec663 +5686e7234e72e4690ce386fcf9d16b54c9c692e9324427dee7e096b6d4c45501 +da2d0eda66a1f29e90c00fd2c62ae43a97f611794c4704d179ce0bd63ffc4f50 +ab3ca7086bf942283fb0d175888a13e5278aaaa25a26e3df4fbf13e64519ad94 +44af171207f3f89b369ccd6162c0ba1320d30d3a596d9f58976f94434c1fb773 +e70be87528a9bd5fb7e494e6cdba0a3cabab8dc2073ea7f5b956bf5d5ca1b258 +25a73e0824ce8d00f4c945c0afdc4b57f7c0162a14b30154b61ab030a73679af +d43e322a04fc7b3c814f3b2d07585eae6a5254b43bc836c6000bf23a56fbfbfe +8478f1cd00150ee39f0aad2c7ae3313b8d619b84ddd8cd3878a4b306950873da +9a592f520b7d7e0cf9b9c97d35139eef9c329763869e64d89a52fed016e1cd40 +4497359d9d4d6bb70222418282cd9ed7f12c16cc1aa6b3eea9c812b7c3910209 +2831b0f05e644f58e878c1eaa3d587c89b26db8b9952e0bead12c7db6aa5a042 +9e33012db0551fe6a589baa800905a7cb35d220efbb675a96444edd18ad89dbc +ebc4087162e977b4cc680a0e3490bfaf28a556c3bb9299935097e3e048679849 +a85ce906f55bdf564f3cca2b0a70b404d02520b77614e577231cb2310dde1ba5 +cea1ef926ad191c98a21ed76ebb8f407ea2ae2ff56014216abb118c0218590f5 +f3284f9a187a85b3f5091f05b21d747f6fe7384a27ae6a8ddb923df4f61900e9 +adb8be5d338613e1486d710e892b5b733061951d164ae233023a69e02457e90d +dfb6d8a53ea0a57f3c9e27614633ace3c6cf57dc8c81d0c079642c4a0745d281 +2bc6ac4587a56e65d6955e50f4380d94f9628c130102e2a3325d694865a0dd90 +01ab118f393fd86d01aedb5612fcb49e8b81fa6fadf7b69650fcef45a0a724d9 +ecf8ced5cf56913fb68a39c71350acd855433cc25b25ade198cda46bfccf1fac +f1c841a1e6058a73e26e580cb46384885c417799d92822689c2f58bc1e0a040a +9d7d3d73de3c18688d62581d54a0eadf9deffb3db34a9f052bce33d5fe8e8ae9 +78e4b0bdcc2a8ffdcaa5b4c0f4a0256d94364e70e1749dbc2b147d69ec539b47 +ef868ac4807f7ac1f01c93b3361942915581efc754453f221f4a70bb903ec310 +62cca7ac392f6f70b61f49822cfd65c668070babc1102322e4cf224902f0cc6e +26bb2c119c3c66434f4a85164c49ed51084a1f0795eb631f6d38123619cc5ced +c8c6908f380a4a3f7939d0b03187e448fa44333ed8d8c2504c3fce0235795d86 +f7a7bb423d1a7ca81b27b4f81c93ac95ba336a0d8e6bb90c96ae775ee34c07da +5cd019a73b7944424d242dd7d96ea0349307ed426fe0c7fb8b5cbe3d295a3069 +b975fafbe78109cab35ac2fa5154f66af9b9ea522cd4847408d1ce24cf7fc770 +4f222fedc962ff21d09aa2ae6cc1b14cfbcab5d0016607362d3c8f6347f7a54e +821327ddd475396b465b1bf5894703c6de1e9947e64867e68efb2620c7f46367 +c0c345f294b781943f0c96500688a08347b0272c60e5d6a7810a44c4e5654d09 +05931a57e1fe6ff7edd1e77a1e1c39070b49e4d72a62f06340f9a76d0553905b +35e5711434d25cc3b14557bbaf66a82a6ef543bbfd14c314ddee0ee99090482f +c1dd06eecf203ec9511a3ad6ccecdd1139ccf31dc72e407853d159c1622131df +f560bd84c30c58439b06aef79bf53ffaa90ab3727e59f164271a69c5bf36f0d8 +3f9c0099933b6bdfc2f613d4f3565dfbd0c85e8723491ead13697f8945f63a6a +612990613b54bb7a19c1d3a13c14f19694e3b1293293a51c64ebe436738eb61e +2ccef09ca77eeb35c7bf10db2a9b1eabbe4fb88ccefeae6359bf5e136ee974ea +a1a5c7152d54de8dfab89422943ad50e5884f330ad4078763ea071c6265e555d +a610d246133435db11c37e786302e3e8889ece1d9ec3670d82babfed7be2fb7e +fdb78e1b6e1c682b930f48bf0a28301b463a5ca77c368f7d57187f0828675a52 +382d41de6cd9fb522cf52d8792796fccac48d9528d6ba65cca775eea0d9e272c +084f8017bb4ff779b615a46518b256b2c43b27e28b988bf6b60d783d56905a5d +7794904c0cb95e2aa83512f47d2c393b778b7611053d31bbc4670c6ffe45ff25 +2b7064e4740e8895169607d57c89956b526a664b28a2a9f7c42d6a40c4a95aa6 +6be98967f52a855db02c498f141fd6afffc0a69b14bbd009a0c0f023d4d6706c +cc05401aa96d550b6ce0190281ba4cebf16acfa4fd94730cd977d6c120c124ba +ef8489e22a13c30552196e99046201ccff11cb3aff92a63e47a10a3a6433bfc0 +e77047453b71527f209c939d8516182ca5f0966ccbf971fede25e3fefd92cf8b +fd11ac59dff36c25aaa8c771a83d9cbb7dccb37f4f7572f11f702bc27ea9510b +a2d4baa94f5953beb927aaf2426421f0093c603bd63827e28f17d57cef476577 +c1f13eb8beeada42a1eb221cac3dccd5d84a6f74fa2b289c3cab6e2fc94dd92b +d96a015b218ca7facbe18f9c7a580610905847a649e4477773b87686f7f28b33 +24148f4213ccaac483b43be2a9763fdbbdbbd50a0f9d59fc31f5b7b2ac0f915a +89abd64d84faa62a4c3167fbbf651a6236ead6ad931c11435921cbdc4ed66f67 +fe83bc059fa0c625001ad5b3bf638293646d33076f3afafa8b8fd7307da5c53b +5845999c1624e9ed30cd48483403f9afdabbcbe80fa5025bea2cbc081e2b32c7 +42685421ce3d574a414b340075cb02e80d7427d4cc503ee02f5b33e509d76e0b +21b5d5a252757c4b7893dd9870f9371eca57ae78ac688ee28c31d597bc018496 +3fa54a8e160a77dc8b0627d7319885fb2ae0e2e2c9fbcde4b5a7acb04bf1e611 +b73b0dee3ac8f44c4ca15dbeca20c35a7a8805f3c22e6fba8e9b22722dd25ae3 +ba2dec2a0c9a13509f4c9fd3dba03ef6e49a632bf7de5ec45b64a1f4e3a36976 +1b7a9c7b95bd29b09b930b0d82f2c39f9bc3c24d99c58a664d4adedf7b74e13e +6d85e03e615a60a2aee9f790c6d0a2e6e82e6840e51b38c4579fb95337423fba +437d97ab42bafb1097b2e2952e86c88e94ba7020e83163b5d810de8f57625819 +d86d7ae834d7135e30f2e21dd061ff15f22de6c9243d2caaa5abf67abee3a6f5 +306273037adcd10e8f00818ee88ad2ea98d6b7f1ee7e3d1db49a57fa350664d6 +021078ee1ebfbdbe5aee9efab2acd9809ccfb180f8017a84ba6bfc1ba5940eca +3076c863f8d9df3e4afb32361acab13bacd3e465d094b64bece987be66fa501d +5deba893368ea3fdd3b3a4201d3bd68b3464ead10c6f0ddf513a630e0133fec8 +08630e4b3c8b0aad1bbeed508e7e03d41b3d060a92b1958407843e4cabd78d79 +ff72fc0e92f4903cfd05856f457dd15b1aab99c1d29804d2f3134c9817f45fd2 +efebb92545f056f4ca76ea74ad464cd041b7cbb8892f2dba833118b83e20c039 +99939ffc6cc50503bb871565797ec537e26eb622fd30303273748af2afd97e07 +a9c2a96f4ef8754dc3ea8f3348cb30d76bdaa84d2e933c94c99d13e74f19970f +5d2bd19712926e230dd02aeae6461edd83ac935ec2f420649f82d4160a072700 +10141602c3a6572740d8e97fd08e56b987062bb57237bbb3056a36e97e399a7a +cf9653743a9984ef36254d60772a0eedca800923461a3e4443a5ef469aefceec +aa1831e56b0d8ea6ccb76bb9dbb6ab7584ee268bdd0f5f0d57eddba9b97d74a2 +910f178f388a50fa32aad7b87b3235efcabd4b5009190d12e8c770f6e70dbe10 +e747e1984a1c41d701e6220b001fe25b9a677c996f8fd91bd40fa7e07f57e8bd +5d2381442b337924e56de4d18cdc352314caebf065f610b00b50302bae3ad612 +dad9059a3d7f3bd63827e28f17d57cef4a8cb8af1f080a993c3c74871e4b7bdb +2602d07587aed02aa783d80234b6eecc77d163847e63d3c9aa412d10acea7a5c +5ece5b893bb3031facee72701acd225d6b6a752cb2f84de3ceab2b97b606a0bf +c6874869a86e3a55a4e1d7abd94719f604ea68b1108ebb5bebc3ef465bdd2cdb +864ecfe0d6959d5114eaaf1612c970caa2c94729178e6af130a1df211a3795a9 +b5fb934e47f6c48155a19acce788036b4867f90d40c1e4ff7460399f1f08f98a +0aa3e0d8e354195a2563759dfe0183c8d67b449516ed8f5cf3288f7298d62092 +922f07027352bc7c9612cfca46f1cf2ed1417ab863c2615f2d26ee13d7a04a18 +8336ec9961e76af2f506e3db3d67a2a4fb2dbbb0ca34be6db9789a1cda607d9b +35f0eac47f488bbe74f8f04b49dc492ec8f096e6710ad59d248a0c98497541d8 +5f9134d5215b0a05fc29db1aa71e432a2c0b00106bf3124df0b72c144375a280 +9cc5ed8335b3e970eaad9178f43011b55d7f3e11d89be1058361893016254440 +353b88162a4e7913721092e05573497ed693f3120176dc08253d2356559041d8 +741a6b9c41f8eb695369633632ffc35a1e2e4ed6258f0a8eef0bf6bb028efed8 +a679be4bc197cc868255f748ca953312eef556d8fdae4e9706c3116e76140587 +db18492730a14e96c211fcd0aeb0d4324b1b4abd0150637c6c135fcca1823fde +20482dbbab536f87e1d3f0ac4b5154e33bfaade3ac4af8b8d2082658d35a251e +a0d718f702ed8d957555331c9593abbf64b2194dac9f098773ef4313cd8a48e7 +4d60513d6ee1c132e59ebf5dce2359b61efd16fb4cce810172abb3939e874792 +a862462c72895461ed4dd265abbf52c11c50e607fd3bebeff0397398f656066c +5f64fc4e67cf5f984fe818c9500cb10beadc1ac513c0c8e60701144b949ce67d +08cec1adeb70fb01f48abfea22412f4b07b710a8d774228ae156bfdd556c0f49 +bda072c0926a08150f77ee338b3b4303bd2186da21b89df804cd531c499ef953 +9b1ed325e5ef952af05cf67a9fe64b1af975c18348809161ad382debfde45495 +5b32472edf5098b6d1f8fc8807f81ee5be3659bd0f47542ee81e20cbaef168dd +4b991069cda2f850b1faa40e74fad79ed5f74a0fde1c060996a2280e9c9d21f5 +d23174d3ef4d9eb6e337d443cfccaeab8b0015e6427f9439c8473a1364faf782 +f58bd8bd775899092844ba570c427dff47b8cc4859fd9042ce78aa27ffea8b5a +c52be0d97cd01c7250a6eda489b5a17e23167239e0d7fd8f3429529ef02548e9 +b7bc1dcfc729600ff98d9f9b33ecdd10ff78baa313b7e35c51dfe8c6a17568fd +bfbd434860a8ef3821b336783fa328279c05b05aba37f8d26da43391c9cfbd71 +6b240148995a005448afbe45ef2c2853aa3c1cf3ba6434ec79e8dbacef443569 +8e6ef17bdf960e9a37f0b34f4aa39641492bcce95afe55d168e510f934288da7 +c61eb3e1a42f18abc608995cd8c9afcc591751bcd9759387d3924751b1a2c79a +0cf18b53d3ed8096e2c559dd001e8bf6824b3eedafedd8b89fa23f4aeed14435 +a7d05da7b0607edf2aab0816e866f6791e834bff5f5c6699edb97df199549d54 +3d039671a481d094352ec76d2f7e5119887ee3ad1117f749a85b3b6f37e3d25f +25397d1d019da9c5c6fbbfbaeb4fdf0a423f6394968f2eabc560f76e75b07b54 +a6d87328604fc86be37a1e8e5790eb845cca88bbc2e01eab28a6d6615229658b +7554a85064aacf698949e4f56f2bd61bd5af31bd6012ef0c1bb627cbeec71b52 +e99af95f699617a8462e14e144424a64e4c1cda80a13cf7b20929041b2df6686 +15c2f77a73f9cdbca33cd11188a9a608b240b27e7cfc5234fdad6db5d6565787 +d99f45709674690ee704de4ce6accc37343eaac02dd8ca368221d607c4ea24dc +05aaa5162120301a8fb4c3166ef0e813aab536200a8d54d3e0679cbad59cae0d +d9c251016336c63243b42f4a439af0f1b4d4cc3ee9c24dae5ec87c10b4b046eb +3877eae636101c3231319957690cf7cd562fb48e44abd46bfd8640de5348a01d +8389dbe26165729c3ea1023b354cc6b6928922cffb2df9ea60d853a74067b442 +a7d4938296e2ffdeee8b33dae2ecf5be2451fbe3829f9c1d45820c9849176a43 +22694f059367670d68ad12080a84603821f867ca37dc727c3c5254103af21cd9 +034f679aea5d4bc81366245725fa46cd671ac9251817e8abbe9f06f182b738e9 +05769b0d6a504170334d09bb7b809c249ca9678658b36fef98a0f8936cc9167f +31837fb2e92319b8e4df5168494fe90a12a88b93bae098fac2f3af2c087759cf +0fdc3d901e921222a19e53c654d13e52a6f272bd65e3deee14e3e59c6dd9b794 +dbd476ccd4deb50e94d207123a5bb6276e40177c13adee9227e283b51bdc8e50 +2af8d9f3d4cdf61a9bffdb5047aa305f7c61fbb49440b70993c9620020fadf15 +4b5248e8e2a6fd5638a447a593b320039eb53a709e992a481c0de5f19640c17f +cdcfacfbf7b5252c0274c53f6de78a11db640076e01a11be6a63c3a8be0e3fb0 +f0c1f40b379b80399771b0b23aa0fb934ee3184f0c18d5cb40285510a4eb92f1 +6f089ce3cf32b52add23b0f6a436637a17a71f90e8c91adeaff7eb97220a17b7 +354ea80c678e158c1ecd586f0e2e6d7ab5a179500d404e19a65db6c9568b0799 +330d69b254d29e704196964553817ab428be257c5d51aac61ee9cffcd3ec4615 +1d6e9992ad91a791d1c2465df24757dcbc64f3788b15868b905e53ccd04625c7 +f04fa267d68a6aeb59443ead9bc171f845b2b0d7ac7e788c21411a1d4b3935d6 +ef2093333ce092da5d06fcf6c1f1afc68db00cc1d0090f21046b54694f5162cc +cb07ac6e81a3b657871db0692cd70edcfb645c335167e08eb15caa6cbf6419b0 +1cb28d3beb8c5ab6c8f77663a2c258177a1feb9abb560e903b45a1d14644a08d +778a0db918b36ed5a2d6d409adf41a21b13211679094cf290c4652633d861e1e +2cf20b69ccdcf17ac7d4bc15febe037998b98c176369d225995e578f62f6e548 +049da929686caf8b58bf1baf99bfd7196c8084419d381078ad0bc6bffbe163de +15a4d0e6fb53208aff06f08967882b17c0696f060218ae037682036cb39365b7 +33d8c2b0f2414f3c919473a6abc8d419f70b541a62082602990c3c35a55217d5 +96fea82048181950779a3fc5f67bdad8df84e5433fa67bccd05ec886d857b789 +18ffbf083fa0b9f98cf5cfc9ae29d607d2ed11fa02131fd7c258431b20f7b113 +c316b7163644fdef029d33366200e9c4b5727940490a81aa139dddf9493f6b32 +0ee84950a6a549460032d0ba7fb3b2ded2e4028bd3ef456005bfc1456c681f25 +82dad6da15127a1ef14550d9557b86c2bc37440d538ee5146f320c9db07aed68 +70f6fa748a5b87fde0e3ef4cf1567e743eea26076ba668b46f3f7ad99f4df367 +fd40d87cca35267a09a3a33f8212655b747323e9d5f184cde766906f6f85ef2b +3ad0dc0edcd150e589dae9c0e19d464ad618c32e14a5dbcaa6ecbcd990cc49ad +c6de19129debd2de99b506adf4dbdea4ff1364e300447c9c0deda2cdf1d3648b +1a83bd4be46e1797fb5b6216077a54f12c7ace9c28320026a19492e58193d082 +c0b5473a5a603ce22ea377511b725ad9c23b1a1b906b465fa02d0fb620e23074 +66c9d077730916850cd2abcc2412a364f4a0efde3fb741dea91fbba138e74dcb +809627282be317d8f1dbb22220c9696bf39a27fc38aff90eaf458151a00a8a88 +9d4f5d933b1eee63054c65798ad32079ce573d53c620b6a0f81fd931b5a24707 +ebb30cf01b0c63b55ee8c08b805a9a45aea8aacf49982ce6d3e8726c6a122437 +1b9b116a56de605482449dabbb83d353ebdf355fcb8cde5658c699b8a55718a8 +6e051b42221dda48257e9f56d09f31a77630930abb0fce0d49ec9cb27c6ce480 +4c3b36d45ec195e7f78dc930370ed66cd4b6763085ec4c626693e69b39e993b1 +70b2289f29dcf94d5d2763a8211a92c40442371aa2f4297c9958c833421ee693 +a74b256e425979afe86b286bbda0983e14194250d9fecd03a8ba1fe615e93ae1 +d60d43f6858ea9cd47ddf88a1bfb5e90b60a28cdb269d9e1e43b0cf470a95b48 +aa5299e7159e7ccb18200914b93c3b0df79f181789fdfd6693613d0d42778883 +88847927f59d40f0cb5334f62eafe4f380076cfb7720174eceab1eb5050ea12c +e4293db115c4f9bd4d21910a69d566a706f5c0e1bcb344203503855e6643b125 +17b6db03c41f13a347ad39e47a46d626f8a31a163bda6d23264657b412bdec99 +c87a103d26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F637_0 /WWWUTU+NimbusRomNo9L-ReguItal 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +612 792 false pdfSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 756] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 463.019 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -36] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +117.436 701.916 Td +/F122_0 24.7902 Tf +(bzip2) 63.3638 Tj +-278 TJm +(and) 44.077 Tj +-278 TJm +(libbzip2,) 99.1856 Tj +-278 TJm +(ver) 37.2101 Tj +15 TJm +(sion) 50.9687 Tj +-278 TJm +(1.0.5) 55.1334 Tj +[1 0 0 1 72 696.784] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -15.4939] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -681.29] cm +[1 0 0 1 0 0] Tm +0 0 Td +90.4929 661.631 Td +/F122_0 20.6585 Tf +(A) 14.9154 Tj +-278 TJm +(pr) 20.6585 Tj +20 TJm +(ogram) 63.1324 Tj +-278 TJm +(and) 36.7308 Tj +-278 TJm +(librar) 51.6669 Tj +-10 TJm +(y) 11.4861 Tj +-278 TJm +(f) 6.87928 Tj +20 TJm +(or) 20.6585 Tj +-278 TJm +(data) 42.4739 Tj +-278 TJm +(compression) 128.579 Tj +[1 0 0 1 72 657.035] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -144] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -513.035] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.676 503.285 Td +/F122_0 11.9552 Tf +(J) 6.64709 Tj +20 TJm +(ulian) 27.9034 Tj +-278 TJm +(Se) 14.6212 Tj +15 TJm +(war) 20.5988 Tj +20 TJm +(d,) 10.6282 Tj +-278 TJm +(http://www) 61.103 Tj +40 TJm +(.bzip.or) 42.5127 Tj +15 TJm +(g) 7.30463 Tj +[1 0 0 1 72 500.625] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -435.826] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 463.019 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 2 2 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 709.534 Td +/F122_0 14.3462 Tf +(bzip2) 36.6689 Tj +-489 TJm +(and) 25.5075 Tj +-488 TJm +(libbzip2,) 57.3991 Tj +-542 TJm +(ver) 21.5336 Tj +15 TJm +(sion) 29.4958 Tj +-488 TJm +(1.0.5:) 36.6832 Tj +-766 TJm +(A) 10.358 Tj +-488 TJm +(pr) 14.3462 Tj +20 TJm +(ogram) 43.842 Tj +-489 TJm +(and) 25.5075 Tj +-489 TJm +(librar) 35.8798 Tj +-10 TJm +(y) 7.97649 Tj +-488 TJm +(f) 4.77728 Tj +20 TJm +(or) 14.3462 Tj +-489 TJm +(data) 29.4958 Tj +72 692.319 Td +(compression) 89.2907 Tj +[1 0 0 1 72 689.349] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -689.349] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 680.364 Td +/F130_0 9.9626 Tf +(by) 9.9626 Tj +-250 TJm +(Julian) 23.8007 Tj +-250 TJm +(Se) 9.9626 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard) 12.7222 Tj +[1 0 0 1 72 678.207] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -678.207] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 668.409 Td +/F130_0 9.9626 Tf +(Cop) 16.6077 Tj +10 TJm +(yright) 23.8007 Tj +[1 0 0 1 114.799 668.409] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -114.799 -668.409] cm +[1 0 0 1 0 0] Tm +0 0 Td +114.799 668.409 Td +/F130_0 9.9626 Tf +(\251) 7.57158 Tj +[1 0 0 1 122.371 668.409] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -122.371 -668.409] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.861 668.409 Td +/F130_0 9.9626 Tf +(1996-2007) 43.1679 Tj +-250 TJm +(Julian) 23.8007 Tj +-250 TJm +(Se) 9.9626 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard) 12.7222 Tj +[1 0 0 1 72 666.252] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -7.9701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -658.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 650.875 Td +/F130_0 7.9701 Tf +(This) 14.1708 Tj +-250 TJm +(program,) 28.9952 Tj +[1 0 0 1 119.151 650.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.151 -650.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.151 650.875 Td +/F134_0 7.9701 Tf +(bzip2) 23.9103 Tj +[1 0 0 1 143.061 650.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.061 -650.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.061 650.875 Td +/F130_0 7.9701 Tf +(,) 1.99253 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(associated) 32.7571 Tj +-250 TJm +(library) 21.2483 Tj +[1 0 0 1 216.768 650.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.768 -650.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.768 650.875 Td +/F134_0 7.9701 Tf +(libbzip2) 38.2565 Tj +[1 0 0 1 255.024 650.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -255.024 -650.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +255.024 650.875 Td +/F130_0 7.9701 Tf +(,) 1.99253 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(all) 7.9701 Tj +-250 TJm +(documentation,) 49.3668 Tj +-250 TJm +(are) 9.73149 Tj +-250 TJm +(cop) 11.5088 Tj +10 TJm +(yright) 19.0406 Tj +-250 TJm +(\251) 6.05728 Tj +-250 TJm +(1996-2007) 34.5344 Tj +-250 TJm +(Julian) 19.0406 Tj +-250 TJm +(Se) 7.9701 Tj +25 TJm +(w) 5.75441 Tj +10 TJm +(ard.) 12.1703 Tj +-310 TJm +(All) 10.1858 Tj +-250 TJm +(rights) 18.1559 Tj +-250 TJm +(reserv) 19.471 Tj +15 TJm +(ed.) 9.5163 Tj +[1 0 0 1 72 649.149] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -7.9701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -641.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 633.34 Td +/F130_0 7.9701 Tf +(Redistrib) 29.2264 Tj +20 TJm +(ution) 16.3865 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(use) 10.6241 Tj +-250 TJm +(in) 6.20074 Tj +-250 TJm +(source) 20.802 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(binary) 20.3636 Tj +-250 TJm +(forms,) 20.5868 Tj +-250 TJm +(with) 14.1708 Tj +-250 TJm +(or) 6.63909 Tj +-250 TJm +(without) 24.3566 Tj +-250 TJm +(modi\002cation,) 42.2894 Tj +-250 TJm +(are) 9.73149 Tj +-250 TJm +(permitted) 30.5494 Tj +-250 TJm +(pro) 10.6241 Tj +15 TJm +(vided) 17.7096 Tj +-250 TJm +(that) 11.9551 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(follo) 15.0555 Tj +25 TJm +(wing) 15.9402 Tj +-250 TJm +(conditions) 33.2114 Tj +-250 TJm +(are) 9.73149 Tj +-250 TJm +(met:) 14.1708 Tj +[1 0 0 1 72 631.615] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -23.7789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 5.5791 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -77.5791 -607.836] cm +[1 0 0 1 0 0] Tm +0 0 Td +77.5791 607.836 Td +/F130_0 7.9701 Tf +(\225) 2.78954 Tj +[1 0 0 1 80.3686 607.836] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9926 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.594 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -607.836] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.9552 607.836 Td +/F130_0 7.9701 Tf +(Redistrib) 29.2264 Tj +20 TJm +(utions) 19.4869 Tj +-250 TJm +(of) 6.63909 Tj +-250 TJm +(source) 20.802 Tj +-250 TJm +(code) 15.0475 Tj +-250 TJm +(must) 15.5018 Tj +-250 TJm +(retain) 18.1479 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(abo) 11.5088 Tj +15 TJm +(v) 3.98505 Tj +15 TJm +(e) 3.53872 Tj +-250 TJm +(cop) 11.5088 Tj +10 TJm +(yright) 19.0406 Tj +-250 TJm +(notice,) 21.4714 Tj +-250 TJm +(this) 11.5168 Tj +-250 TJm +(list) 9.74743 Tj +-250 TJm +(of) 6.63909 Tj +-250 TJm +(conditions) 33.2114 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(follo) 15.0555 Tj +25 TJm +(wing) 15.9402 Tj +-250 TJm +(disclaimer) 33.2034 Tj +55 TJm +(.) 1.99253 Tj +[1 0 0 1 470.908 607.836] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -398.908 -17.5343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 5.5791 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -77.5791 -590.302] cm +[1 0 0 1 0 0] Tm +0 0 Td +77.5791 590.302 Td +/F130_0 7.9701 Tf +(\225) 2.78954 Tj +[1 0 0 1 80.3686 590.302] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9926 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.594 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -590.302] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.9552 590.302 Td +/F130_0 7.9701 Tf +(The) 12.3935 Tj +-270 TJm +(origin) 19.0406 Tj +-270 TJm +(of) 6.63909 Tj +-270 TJm +(this) 11.5168 Tj +-270 TJm +(softw) 17.7096 Tj +10 TJm +(are) 9.73149 Tj +-270 TJm +(must) 15.5018 Tj +-270 TJm +(not) 10.1858 Tj +-270 TJm +(be) 7.52377 Tj +-270 TJm +(misrepresented;) 50.4667 Tj +-279 TJm +(you) 11.9551 Tj +-270 TJm +(must) 15.5018 Tj +-270 TJm +(not) 10.1858 Tj +-270 TJm +(claim) 17.7096 Tj +-270 TJm +(that) 11.9551 Tj +-270 TJm +(you) 11.9551 Tj +-270 TJm +(wrote) 18.1479 Tj +-270 TJm +(the) 9.73946 Tj +-270 TJm +(original) 24.795 Tj +-270 TJm +(softw) 17.7096 Tj +10 TJm +(are.) 11.724 Tj +-740 TJm +(If) 5.30809 Tj +-270 TJm +(you) 11.9551 Tj +-270 TJm +(use) 10.6241 Tj +-270 TJm +(this) 11.5168 Tj +-270 TJm +(softw) 17.7096 Tj +10 TJm +(are) 9.73149 Tj +-270 TJm +(in) 6.20074 Tj +-269 TJm +(a) 3.53872 Tj +83.9552 580.737 Td +(product,) 26.3412 Tj +-250 TJm +(an) 7.52377 Tj +-250 TJm +(ackno) 19.0326 Tj +25 TJm +(wledgment) 35.4191 Tj +-250 TJm +(in) 6.20074 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(product) 24.3487 Tj +-250 TJm +(documentation) 47.3743 Tj +-250 TJm +(w) 5.75441 Tj +10 TJm +(ould) 14.1708 Tj +-250 TJm +(be) 7.52377 Tj +-250 TJm +(appreciated) 36.7342 Tj +-250 TJm +(b) 3.98505 Tj +20 TJm +(ut) 6.20074 Tj +-250 TJm +(is) 5.31606 Tj +-250 TJm +(not) 10.1858 Tj +-250 TJm +(required.) 28.5489 Tj +[1 0 0 1 403.817 580.737] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.817 -17.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 5.5791 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -77.5791 -563.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +77.5791 563.203 Td +/F130_0 7.9701 Tf +(\225) 2.78954 Tj +[1 0 0 1 80.3686 563.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9926 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.594 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -563.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.9552 563.203 Td +/F130_0 7.9701 Tf +(Altered) 23.9023 Tj +-250 TJm +(source) 20.802 Tj +-250 TJm +(v) 3.98505 Tj +15 TJm +(ersions) 22.5793 Tj +-250 TJm +(must) 15.5018 Tj +-250 TJm +(be) 7.52377 Tj +-250 TJm +(plainly) 22.1409 Tj +-250 TJm +(mark) 16.3786 Tj +10 TJm +(ed) 7.52377 Tj +-250 TJm +(as) 6.63909 Tj +-250 TJm +(such,) 16.6017 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(must) 15.5018 Tj +-250 TJm +(not) 10.1858 Tj +-250 TJm +(be) 7.52377 Tj +-250 TJm +(misrepresented) 48.251 Tj +-250 TJm +(as) 6.63909 Tj +-250 TJm +(being) 17.7096 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(original) 24.795 Tj +-250 TJm +(softw) 17.7096 Tj +10 TJm +(are.) 11.724 Tj +[1 0 0 1 464.405 563.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.405 -17.5343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 5.5791 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -77.5791 -545.669] cm +[1 0 0 1 0 0] Tm +0 0 Td +77.5791 545.669 Td +/F130_0 7.9701 Tf +(\225) 2.78954 Tj +[1 0 0 1 80.3686 545.669] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9926 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.594 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -545.669] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.9552 545.669 Td +/F130_0 7.9701 Tf +(The) 12.3935 Tj +-250 TJm +(name) 17.2632 Tj +-250 TJm +(of) 6.63909 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(author) 20.3636 Tj +-250 TJm +(may) 13.7245 Tj +-250 TJm +(not) 10.1858 Tj +-250 TJm +(be) 7.52377 Tj +-250 TJm +(used) 14.6092 Tj +-250 TJm +(to) 6.20074 Tj +-250 TJm +(endorse) 24.787 Tj +-250 TJm +(or) 6.63909 Tj +-250 TJm +(promote) 26.5643 Tj +-250 TJm +(products) 27.449 Tj +-250 TJm +(deri) 12.3935 Tj +25 TJm +(v) 3.98505 Tj +15 TJm +(ed) 7.52377 Tj +-250 TJm +(from) 15.4939 Tj +-250 TJm +(this) 11.5168 Tj +-250 TJm +(softw) 17.7096 Tj +10 TJm +(are) 9.73149 Tj +-250 TJm +(without) 24.3566 Tj +-250 TJm +(speci\002c) 24.3487 Tj +-250 TJm +(prior) 15.4939 Tj +-250 TJm +(written) 22.5793 Tj +-250 TJm +(permission.) 36.9733 Tj +[1 0 0 1 533.577 545.669] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.577 -9.6956] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -535.973] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 528.135 Td +/F130_0 7.9701 Tf +(THIS) 17.7096 Tj +-401 TJm +(SOFTW) 27.0107 Tj +120 TJm +(ARE) 15.9402 Tj +-401 TJm +(IS) 7.08542 Tj +-400 TJm +(PR) 9.74743 Tj +40 TJm +(O) 5.75441 Tj +50 TJm +(VIDED) 24.787 Tj +-401 TJm +(BY) 11.0705 Tj +-401 TJm +(THE) 15.4939 Tj +-401 TJm +(A) 5.75441 Tj +55 TJm +(UTHOR) 27.449 Tj +-401 TJm +("AS) 13.4376 Tj +-401 TJm +(IS") 10.3372 Tj +-401 TJm +(AND) 17.2632 Tj +-400 TJm +(ANY) 17.2632 Tj +-401 TJm +(EXPRESS) 34.1041 Tj +-401 TJm +(OR) 11.0705 Tj +-401 TJm +(IMPLIED) 32.3188 Tj +-401 TJm +(W) 7.52377 Tj +120 TJm +(ARRANTIES,) 46.7128 Tj +-401 TJm +(INCLUDING,) 46.2585 Tj +-400 TJm +(B) 5.31606 Tj +10 TJm +(UT) 10.6241 Tj +72 518.571 Td +(NO) 11.5088 Tj +40 TJm +(T) 4.86973 Tj +-304 TJm +(LIMITED) 32.7571 Tj +-304 TJm +(T) 4.86973 Tj +18 TJm +(O,) 7.74694 Tj +-305 TJm +(THE) 15.4939 Tj +-304 TJm +(IMPLIED) 32.3188 Tj +-304 TJm +(W) 7.52377 Tj +120 TJm +(ARRANTIES) 44.7202 Tj +-304 TJm +(OF) 10.1858 Tj +-304 TJm +(MERCHANT) 44.7202 Tj +93 TJm +(ABILITY) 31.8724 Tj +-304 TJm +(AND) 17.2632 Tj +-305 TJm +(FITNESS) 31.442 Tj +-304 TJm +(FOR) 15.5018 Tj +-304 TJm +(A) 5.75441 Tj +-304 TJm +(P) 4.43138 Tj +92 TJm +(AR) 11.0705 Tj +60 TJm +(TICULAR) 34.5344 Tj +-304 TJm +(PURPOSE) 34.9887 Tj +-304 TJm +(ARE) 15.9402 Tj +-305 TJm +(DI) 8.40846 Tj +1 TJm +(S-) 7.08542 Tj +72 509.006 Td +(CLAIMED.) 38.2963 Tj +-576 TJm +(IN) 8.40846 Tj +-287 TJm +(NO) 11.5088 Tj +-288 TJm +(EVENT) 26.118 Tj +-288 TJm +(SHALL) 25.6797 Tj +-288 TJm +(THE) 15.4939 Tj +-287 TJm +(A) 5.75441 Tj +55 TJm +(UTHOR) 27.449 Tj +-288 TJm +(BE) 10.1858 Tj +-288 TJm +(LIABLE) 28.3337 Tj +-288 TJm +(FOR) 15.5018 Tj +-288 TJm +(ANY) 17.2632 Tj +-287 TJm +(DIRECT) 28.78 Tj +74 TJm +(,) 1.99253 Tj +-288 TJm +(INDIRECT) 37.1885 Tj +74 TJm +(,) 1.99253 Tj +-288 TJm +(INCIDENT) 37.6268 Tj +93 TJm +(AL,) 12.6167 Tj +-288 TJm +(SPECIAL,) 34.3193 Tj +-288 TJm +(EXEMPLAR) 42.9509 Tj +65 TJm +(Y) 5.75441 Tj +129 TJm +(,) 1.99253 Tj +72 499.442 Td +(OR) 11.0705 Tj +-299 TJm +(CONSEQ) 31.8804 Tj +10 TJm +(UENTIAL) 34.5265 Tj +-300 TJm +(D) 5.75441 Tj +40 TJm +(AMA) 18.5942 Tj +40 TJm +(GES) 15.0555 Tj +-299 TJm +(\(INCLUDING,) 48.9125 Tj +-299 TJm +(B) 5.31606 Tj +10 TJm +(UT) 10.6241 Tj +-299 TJm +(NO) 11.5088 Tj +40 TJm +(T) 4.86973 Tj +-300 TJm +(LIMITED) 32.7571 Tj +-299 TJm +(T) 4.86973 Tj +18 TJm +(O,) 7.74694 Tj +-299 TJm +(PR) 9.74743 Tj +40 TJm +(OCUREMENT) 49.59 Tj +-299 TJm +(OF) 10.1858 Tj +-300 TJm +(SUBSTITUTE) 47.8206 Tj +-299 TJm +(GOODS) 27.449 Tj +-299 TJm +(OR) 11.0705 Tj +-300 TJm +(SER) 14.6172 Tj +80 TJm +(VICES) 23.0256 Tj +1 TJm +(;) 2.21569 Tj +72 489.878 Td +(LOSS) 19.4869 Tj +-360 TJm +(OF) 10.1858 Tj +-360 TJm +(USE,) 17.048 Tj +-360 TJm +(D) 5.75441 Tj +40 TJm +(A) 5.75441 Tj +111 TJm +(T) 4.86973 Tj +93 TJm +(A,) 7.74694 Tj +-360 TJm +(OR) 11.0705 Tj +-359 TJm +(PR) 9.74743 Tj +40 TJm +(OFITS;) 24.3566 Tj +-360 TJm +(OR) 11.0705 Tj +-360 TJm +(B) 5.31606 Tj +10 TJm +(USINESS) 32.3267 Tj +-360 TJm +(INTERR) 28.78 Tj +40 TJm +(UPTION\)) 31.8724 Tj +-360 TJm +(HO) 11.5088 Tj +35 TJm +(WEVER) 28.3337 Tj +-360 TJm +(CA) 11.0705 Tj +55 TJm +(USED) 20.8099 Tj +-359 TJm +(AND) 17.2632 Tj +-360 TJm +(ON) 11.5088 Tj +-360 TJm +(ANY) 17.2632 Tj +-360 TJm +(THEOR) 26.5643 Tj +65 TJm +(Y) 5.75441 Tj +-360 TJm +(OF) 10.1858 Tj +-360 TJm +(LIAB) 18.5942 Tj +1 TJm +(ILITY) 20.802 Tj +128 TJm +(,) 1.99253 Tj +72 480.314 Td +(WHETHER) 38.9578 Tj +-247 TJm +(IN) 8.40846 Tj +-247 TJm +(CONTRA) 32.7651 Tj +40 TJm +(CT) 10.1858 Tj +74 TJm +(,) 1.99253 Tj +-247 TJm +(STRICT) 27.457 Tj +-247 TJm +(LIABILITY) 39.3962 Tj +129 TJm +(,) 1.99253 Tj +-246 TJm +(OR) 11.0705 Tj +-247 TJm +(T) 4.86973 Tj +18 TJm +(OR) 11.0705 Tj +60 TJm +(T) 4.86973 Tj +-247 TJm +(\(INCLUDING) 46.92 Tj +-247 TJm +(NEGLIGENCE) 50.4667 Tj +-247 TJm +(OR) 11.0705 Tj +-247 TJm +(O) 5.75441 Tj +40 TJm +(THER) 20.8099 Tj +55 TJm +(WISE\)) 22.133 Tj +-247 TJm +(ARISING) 32.3188 Tj +-247 TJm +(IN) 8.40846 Tj +-247 TJm +(ANY) 17.2632 Tj +-247 TJm +(W) 7.52377 Tj +120 TJm +(A) 5.75441 Tj +105 TJm +(Y) 5.75441 Tj +-247 TJm +(OUT) 16.3786 Tj +72 470.75 Td +(OF) 10.1858 Tj +-250 TJm +(THE) 15.4939 Tj +-250 TJm +(USE) 15.0555 Tj +-250 TJm +(OF) 10.1858 Tj +-250 TJm +(THIS) 17.7096 Tj +-250 TJm +(SOFTW) 27.0107 Tj +120 TJm +(ARE,) 17.9327 Tj +-250 TJm +(EVEN) 21.2483 Tj +-250 TJm +(IF) 7.08542 Tj +-250 TJm +(AD) 11.5088 Tj +40 TJm +(VISED) 23.464 Tj +-250 TJm +(OF) 10.1858 Tj +-250 TJm +(THE) 15.4939 Tj +-250 TJm +(POSSIBILITY) 47.8206 Tj +-250 TJm +(OF) 10.1858 Tj +-250 TJm +(SUCH) 21.2563 Tj +-250 TJm +(D) 5.75441 Tj +40 TJm +(AMA) 18.5942 Tj +40 TJm +(GE.) 12.6167 Tj +[1 0 0 1 72 469.598] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -7.9701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -461.628] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 453.216 Td +/F130_0 7.9701 Tf +(P) 4.43138 Tj +92 TJm +(A) 5.75441 Tj +111 TJm +(TENTS:) 27.0107 Tj +-296 TJm +(T) 4.86973 Tj +80 TJm +(o) 3.98505 Tj +-295 TJm +(the) 9.73946 Tj +-296 TJm +(best) 12.8398 Tj +-295 TJm +(of) 6.63909 Tj +-296 TJm +(my) 10.1858 Tj +-295 TJm +(kno) 11.9551 Tj +25 TJm +(wledge,) 25.0102 Tj +[1 0 0 1 208.544 453.216] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -208.544 -453.216] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.544 453.216 Td +/F134_0 7.9701 Tf +(bzip2) 23.9103 Tj +[1 0 0 1 232.454 453.216] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.454 -453.216] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.81 453.216 Td +/F130_0 7.9701 Tf +(and) 11.5088 Tj +[1 0 0 1 248.674 453.216] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -248.674 -453.216] cm +[1 0 0 1 0 0] Tm +0 0 Td +248.674 453.216 Td +/F134_0 7.9701 Tf +(libbzip2) 38.2565 Tj +[1 0 0 1 286.931 453.216] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -286.931 -453.216] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.286 453.216 Td +/F130_0 7.9701 Tf +(do) 7.9701 Tj +-296 TJm +(not) 10.1858 Tj +-295 TJm +(use) 10.6241 Tj +-296 TJm +(an) 7.52377 Tj +15 TJm +(y) 3.98505 Tj +-295 TJm +(patented) 27.0027 Tj +-296 TJm +(algorithms.) 36.0886 Tj +-893 TJm +(Ho) 9.73946 Tj +25 TJm +(we) 9.29314 Tj +25 TJm +(v) 3.98505 Tj +15 TJm +(er) 6.19277 Tj +40 TJm +(,) 1.99253 Tj +-307 TJm +(I) 2.65404 Tj +-295 TJm +(do) 7.9701 Tj +-296 TJm +(not) 10.1858 Tj +-295 TJm +(ha) 7.52377 Tj +20 TJm +(v) 3.98505 Tj +15 TJm +(e) 3.53872 Tj +-296 TJm +(the) 9.73946 Tj +-295 TJm +(resources) 30.0951 Tj +-296 TJm +(to) 6.20074 Tj +72 443.652 Td +(carry) 16.3706 Tj +-250 TJm +(out) 10.1858 Tj +-250 TJm +(a) 3.53872 Tj +-250 TJm +(patent) 19.4789 Tj +-250 TJm +(search.) 22.3482 Tj +-620 TJm +(Therefore) 31.4181 Tj +-250 TJm +(I) 2.65404 Tj +-250 TJm +(cannot) 21.2483 Tj +-250 TJm +(gi) 6.20074 Tj +25 TJm +(v) 3.98505 Tj +15 TJm +(e) 3.53872 Tj +-250 TJm +(an) 7.52377 Tj +15 TJm +(y) 3.98505 Tj +-250 TJm +(guarantee) 30.9798 Tj +-250 TJm +(of) 6.63909 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(abo) 11.5088 Tj +15 TJm +(v) 3.98505 Tj +15 TJm +(e) 3.53872 Tj +-250 TJm +(statement.) 32.5419 Tj +[1 0 0 1 72 441.926] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -391.074] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 46.7993 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -46.7993 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5986 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 3 3 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 707.441 Td +/F122_0 17.2154 Tf +(T) 10.5186 Tj +80 TJm +(ab) 20.0904 Tj +10 TJm +(le) 14.3576 Tj +-278 TJm +(of) 16.2513 Tj +-278 TJm +(Contents) 74.5943 Tj +[1 0 0 1 72 698.619] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.7401] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -686.879] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 686.879 Td +/F130_0 9.9626 Tf +(1.) 7.47195 Tj +-310 TJm +(Introduction) 49.2551 Tj +[1 0 0 1 131.815 686.879] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -136.796 -686.879] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.733 686.879 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 686.879] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -686.879] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 686.879 Td +/F130_0 9.9626 Tf +(1) 4.9813 Tj +[1 0 0 1 516.09 686.879] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -674.923] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 674.923 Td +/F130_0 9.9626 Tf +(2.) 7.47195 Tj +-310 TJm +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 152.318 674.923] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -157.3 -674.923] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.054 674.923 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 674.923] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -674.923] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 674.923 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 674.923] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -662.968] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 662.968 Td +/F130_0 9.9626 Tf +(2.1.) 14.9439 Tj +-310 TJm +(N) 7.193 Tj +35 TJm +(AME) 22.1369 Tj +[1 0 0 1 119.014 662.968] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.995 -662.968] cm +[1 0 0 1 0 0] Tm +0 0 Td +132.691 662.968 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 662.968] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -662.968] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 662.968 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 662.968] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -651.013] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 651.013 Td +/F130_0 9.9626 Tf +(2.2.) 14.9439 Tj +-310 TJm +(SYNOPSIS) 47.0534 Tj +[1 0 0 1 137.085 651.013] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -142.067 -651.013] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.582 651.013 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 651.013] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -651.013] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 651.013 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 651.013] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -639.058] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 639.058 Td +/F130_0 9.9626 Tf +(2.3.) 14.9439 Tj +-310 TJm +(DESCRIPTION) 64.7569 Tj +[1 0 0 1 154.789 639.058] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.77 -639.058] cm +[1 0 0 1 0 0] Tm +0 0 Td +168.29 639.058 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 639.058] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -639.058] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 639.058 Td +/F130_0 9.9626 Tf +(3) 4.9813 Tj +[1 0 0 1 516.09 639.058] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -627.103] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 627.103 Td +/F130_0 9.9626 Tf +(2.4.) 14.9439 Tj +-310 TJm +(OPTIONS) 42.0621 Tj +[1 0 0 1 132.094 627.103] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.076 -627.103] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.873 627.103 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 627.103] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -627.103] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 627.103 Td +/F130_0 9.9626 Tf +(4) 4.9813 Tj +[1 0 0 1 516.09 627.103] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -615.147] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 615.147 Td +/F130_0 9.9626 Tf +(2.5.) 14.9439 Tj +-310 TJm +(MEMOR) 37.6387 Tj +65 TJm +(Y) 7.193 Tj +-250 TJm +(MAN) 23.2427 Tj +35 TJm +(A) 7.193 Tj +40 TJm +(GEMENT) 41.5042 Tj +[1 0 0 1 207.9 615.147] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.881 -615.147] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.412 615.147 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 615.147] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -615.147] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 615.147 Td +/F130_0 9.9626 Tf +(5) 4.9813 Tj +[1 0 0 1 516.09 615.147] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -603.192] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 603.192 Td +/F130_0 9.9626 Tf +(2.6.) 14.9439 Tj +-310 TJm +(RECO) 26.5703 Tj +50 TJm +(VERING) 37.6287 Tj +-250 TJm +(D) 7.193 Tj +40 TJm +(A) 7.193 Tj +111 TJm +(T) 6.08715 Tj +93 TJm +(A) 7.193 Tj +-250 TJm +(FR) 12.1843 Tj +40 TJm +(OM) 16.0497 Tj +-250 TJm +(D) 7.193 Tj +40 TJm +(AMA) 23.2427 Tj +40 TJm +(GED) 20.4731 Tj +-250 TJm +(FILES) 26.5703 Tj +[1 0 0 1 293.449 603.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -298.43 -603.192] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.464 603.192 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 603.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -603.192] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 603.192 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 516.09 603.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -591.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 591.237 Td +/F130_0 9.9626 Tf +(2.7.) 14.9439 Tj +-310 TJm +(PERFORMANCE) 73.6236 Tj +-250 TJm +(NO) 14.386 Tj +40 TJm +(TES) 17.7135 Tj +[1 0 0 1 197.847 591.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.829 -591.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +211.958 591.237 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 591.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -591.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 591.237 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 516.09 591.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -579.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 579.282 Td +/F130_0 9.9626 Tf +(2.8.) 14.9439 Tj +-310 TJm +(CA) 13.8381 Tj +135 TJm +(VEA) 20.4731 Tj +111 TJm +(TS) 11.6264 Tj +[1 0 0 1 133.519 579.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.5 -579.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +148.799 579.282 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 579.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -579.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 579.282 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 516.09 579.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -567.327] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 567.327 Td +/F130_0 9.9626 Tf +(2.9.) 14.9439 Tj +-310 TJm +(A) 7.193 Tj +55 TJm +(UTHOR) 34.3112 Tj +[1 0 0 1 130.989 567.327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -135.97 -567.327] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.32 567.327 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 567.327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -567.327] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 567.327 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 516.09 567.327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.2192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.736] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -555.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 555.372 Td +/F130_0 9.9626 Tf +(3.) 7.47195 Tj +-310 TJm +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 160.049 555.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.049 -555.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +160.049 555.372 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 207.87 555.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -215.342 -555.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.856 555.372 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 555.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -555.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 555.372 Td +/F130_0 9.9626 Tf +(8) 4.9813 Tj +[1 0 0 1 516.09 555.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -543.416] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 543.416 Td +/F130_0 9.9626 Tf +(3.1.) 14.9439 Tj +-310 TJm +(T) 6.08715 Tj +80 TJm +(op-le) 20.4731 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(structure) 34.8591 Tj +[1 0 0 1 164.921 543.416] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.902 -543.416] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.997 543.416 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 543.416] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -543.416] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 543.416 Td +/F130_0 9.9626 Tf +(8) 4.9813 Tj +[1 0 0 1 516.09 543.416] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -531.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 531.461 Td +/F130_0 9.9626 Tf +(3.1.1.) 22.4159 Tj +-310 TJm +(Lo) 11.0684 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 177.374 531.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -182.355 -531.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.866 531.461 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 531.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -531.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 531.461 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 531.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -519.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 519.506 Td +/F130_0 9.9626 Tf +(3.1.2.) 22.4159 Tj +-310 TJm +(High-le) 30.4357 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 179.287 519.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -184.268 -519.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.822 519.506 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 519.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -519.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 519.506 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 519.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -507.551] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 507.551 Td +/F130_0 9.9626 Tf +(3.1.3.) 22.4159 Tj +-310 TJm +(Utility) 26.0223 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 202.669 507.551] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.65 -507.551] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.582 507.551 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 507.551] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -507.551] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 507.551 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 507.551] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -495.596] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 495.596 Td +/F130_0 9.9626 Tf +(3.2.) 14.9439 Tj +-310 TJm +(Error) 21.0211 Tj +-250 TJm +(handling) 34.8691 Tj +[1 0 0 1 148.413 495.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -153.394 -495.596] cm +[1 0 0 1 0 0] Tm +0 0 Td +162.611 495.596 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 495.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -495.596] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 495.596 Td +/F130_0 9.9626 Tf +(10) 9.9626 Tj +[1 0 0 1 516.09 495.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -483.641] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 483.641 Td +/F130_0 9.9626 Tf +(3.3.) 14.9439 Tj +-310 TJm +(Lo) 11.0684 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +[1 0 0 1 167.571 483.641] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.552 -483.641] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.045 483.641 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 483.641] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -483.641] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 483.641 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 516.09 483.641] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -471.685] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 471.685 Td +/F130_0 9.9626 Tf +(3.3.1.) 22.4159 Tj +[1 0 0 1 97.5043 471.685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -471.685] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 471.685 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 205.101 471.685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.082 -471.685] cm +[1 0 0 1 0 0] Tm +0 0 Td +219.736 471.685 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 471.685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -471.685] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 471.685 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 516.09 471.685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -459.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 459.73 Td +/F130_0 9.9626 Tf +(3.3.2.) 22.4159 Tj +[1 0 0 1 97.5043 459.73] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -459.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 459.73 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 181.19 459.73] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.172 -459.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.497 459.73 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 459.73] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -459.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 459.73 Td +/F130_0 9.9626 Tf +(13) 9.9626 Tj +[1 0 0 1 516.09 459.73] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -447.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 447.775 Td +/F130_0 9.9626 Tf +(3.3.3.) 22.4159 Tj +[1 0 0 1 97.5043 447.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -447.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 447.775 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 199.123 447.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.105 -447.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.533 447.775 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 447.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -447.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 447.775 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 516.09 447.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -435.82] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 435.82 Td +/F130_0 9.9626 Tf +(3.3.4.) 22.4159 Tj +[1 0 0 1 97.5043 435.82] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -435.82] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 435.82 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 217.056 435.82] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -222.037 -435.82] cm +[1 0 0 1 0 0] Tm +0 0 Td +232.355 435.82 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 435.82] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -435.82] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 435.82 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 516.09 435.82] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -423.865] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 423.865 Td +/F130_0 9.9626 Tf +(3.3.5.) 22.4159 Tj +[1 0 0 1 97.5043 423.865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -423.865] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 423.865 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 193.146 423.865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.127 -423.865] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.116 423.865 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 423.865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -423.865] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 423.865 Td +/F130_0 9.9626 Tf +(17) 9.9626 Tj +[1 0 0 1 516.09 423.865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -411.91] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 411.91 Td +/F130_0 9.9626 Tf +(3.3.6.) 22.4159 Tj +[1 0 0 1 97.5043 411.91] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -411.91] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 411.91 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 211.078 411.91] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.06 -411.91] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.938 411.91 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 411.91] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -411.91] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 411.91 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 516.09 411.91] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -399.954] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 399.954 Td +/F130_0 9.9626 Tf +(3.4.) 14.9439 Tj +-310 TJm +(High-le) 30.4357 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +[1 0 0 1 169.483 399.954] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.465 -399.954] cm +[1 0 0 1 0 0] Tm +0 0 Td +184.216 399.954 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 399.954] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -399.954] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 399.954 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 516.09 399.954] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -387.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 387.999 Td +/F130_0 9.9626 Tf +(3.4.1.) 22.4159 Tj +[1 0 0 1 97.5043 387.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -387.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 387.999 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 181.19 387.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.172 -387.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.497 387.999 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 387.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -387.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 387.999 Td +/F130_0 9.9626 Tf +(19) 9.9626 Tj +[1 0 0 1 516.09 387.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -376.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 376.044 Td +/F130_0 9.9626 Tf +(3.4.2.) 22.4159 Tj +[1 0 0 1 97.5043 376.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -376.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 376.044 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 157.28 376.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -162.261 -376.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +171.472 376.044 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 376.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -376.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 376.044 Td +/F130_0 9.9626 Tf +(20) 9.9626 Tj +[1 0 0 1 516.09 376.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -364.089] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 364.089 Td +/F130_0 9.9626 Tf +(3.4.3.) 22.4159 Tj +[1 0 0 1 97.5043 364.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -364.089] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 364.089 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 211.078 364.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.06 -364.089] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.938 364.089 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 364.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -364.089] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 364.089 Td +/F130_0 9.9626 Tf +(21) 9.9626 Tj +[1 0 0 1 516.09 364.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -352.134] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 352.134 Td +/F130_0 9.9626 Tf +(3.4.4.) 22.4159 Tj +[1 0 0 1 97.5043 352.134] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -352.134] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 352.134 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 187.168 352.134] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.149 -352.134] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.914 352.134 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 352.134] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -352.134] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 352.134 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 516.09 352.134] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6451] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -340.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 340.179 Td +/F130_0 9.9626 Tf +(3.4.5.) 22.4159 Tj +[1 0 0 1 97.5043 340.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -340.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 340.179 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 187.168 340.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.149 -340.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.914 340.179 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 340.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -340.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 340.179 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 516.09 340.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -328.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 328.223 Td +/F130_0 9.9626 Tf +(3.4.6.) 22.4159 Tj +[1 0 0 1 97.5043 328.223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -328.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 328.223 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 163.258 328.223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -168.239 -328.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.675 328.223 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 328.223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -328.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 328.223 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 516.09 328.223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -316.268] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 316.268 Td +/F130_0 9.9626 Tf +(3.4.7.) 22.4159 Tj +[1 0 0 1 97.5043 316.268] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -316.268] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 316.268 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 193.146 316.268] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.127 -316.268] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.116 316.268 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 316.268] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -316.268] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 316.268 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 516.09 316.268] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6451] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -304.313] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 304.313 Td +/F130_0 9.9626 Tf +(3.4.8.) 22.4159 Tj +-310 TJm +(Handling) 37.0808 Tj +-250 TJm +(embedded) 40.9463 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(streams) 30.4357 Tj +[1 0 0 1 279.56 304.313] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.541 -304.313] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.601 304.313 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 304.313] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -304.313] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 304.313 Td +/F130_0 9.9626 Tf +(24) 9.9626 Tj +[1 0 0 1 516.09 304.313] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -292.358] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 292.358 Td +/F130_0 9.9626 Tf +(3.4.9.) 22.4159 Tj +-310 TJm +(Standard) 35.417 Tj +-250 TJm +(\002le-reading/writing) 77.4791 Tj +-250 TJm +(code) 18.8094 Tj +[1 0 0 1 234.19 292.358] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -239.172 -292.358] cm +[1 0 0 1 0 0] Tm +0 0 Td +247.564 292.358 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 292.358] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -292.358] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 292.358 Td +/F130_0 9.9626 Tf +(25) 9.9626 Tj +[1 0 0 1 516.09 292.358] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -280.403] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 280.403 Td +/F130_0 9.9626 Tf +(3.5.) 14.9439 Tj +-310 TJm +(Utility) 26.0223 Tj +-250 TJm +(functions) 37.0808 Tj +[1 0 0 1 155.625 280.403] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.607 -280.403] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.645 280.403 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 280.403] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -280.403] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 280.403 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 516.09 280.403] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -268.448] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 268.448 Td +/F130_0 9.9626 Tf +(3.5.1.) 22.4159 Tj +[1 0 0 1 97.5043 268.448] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -268.448] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 268.448 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 240.966 268.448] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.948 -268.448] cm +[1 0 0 1 0 0] Tm +0 0 Td +255.38 268.448 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 268.448] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -268.448] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 268.448 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 516.09 268.448] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -256.492] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 256.492 Td +/F130_0 9.9626 Tf +(3.5.2.) 22.4159 Tj +[1 0 0 1 97.5043 256.492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -256.492] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 256.492 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 252.922 256.492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -257.903 -256.492] cm +[1 0 0 1 0 0] Tm +0 0 Td +267.999 256.492 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 256.492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -256.492] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 256.492 Td +/F130_0 9.9626 Tf +(27) 9.9626 Tj +[1 0 0 1 516.09 256.492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 244.537 Td +/F130_0 9.9626 Tf +(3.6.) 14.9439 Tj +[1 0 0 1 90.0324 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90.0324 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +90.0324 244.537 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 113.943 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.943 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.433 244.537 Td +/F130_0 9.9626 Tf +(compatibility) 53.1405 Tj +-250 TJm +(functions) 37.0808 Tj +[1 0 0 1 209.144 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -214.126 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +223.971 244.537 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 244.537 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 516.09 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 232.582 Td +/F130_0 9.9626 Tf +(3.7.) 14.9439 Tj +-310 TJm +(Using) 23.8007 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +[1 0 0 1 177.195 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.195 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +177.195 232.582 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 207.083 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.083 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.083 232.582 Td +/F130_0 9.9626 Tf +(-free) 18.7994 Tj +-250 TJm +(en) 9.40469 Tj +40 TJm +(vironment) 40.9562 Tj +[1 0 0 1 278.335 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -283.316 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +291.775 232.582 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 232.582 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 516.09 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -220.627] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 220.627 Td +/F130_0 9.9626 Tf +(3.7.1.) 22.4159 Tj +-310 TJm +(Getting) 29.8878 Tj +-250 TJm +(rid) 11.0684 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 154.231 220.627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -154.231 -220.627] cm +[1 0 0 1 0 0] Tm +0 0 Td +154.231 220.627 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 184.119 220.627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -189.1 -220.627] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.175 220.627 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 220.627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -220.627] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 220.627 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 220.627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -208.672] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 208.672 Td +/F130_0 9.9626 Tf +(3.7.2.) 22.4159 Tj +-310 TJm +(Critical) 29.8878 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(handling) 34.8691 Tj +[1 0 0 1 186.599 208.672] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.58 -208.672] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.629 208.672 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 208.672] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -208.672] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 208.672 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 208.672] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -196.717] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 196.717 Td +/F130_0 9.9626 Tf +(3.8.) 14.9439 Tj +-310 TJm +(Making) 30.9936 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(DLL) 19.3673 Tj +[1 0 0 1 189.828 196.717] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -194.809 -196.717] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.243 196.717 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 196.717] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -196.717] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 196.717 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 196.717] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -184.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 184.761 Td +/F130_0 9.9626 Tf +(4.) 7.47195 Tj +-310 TJm +(Miscellanea) 48.1393 Tj +[1 0 0 1 130.699 184.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -135.68 -184.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +144.898 184.761 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 184.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -184.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 184.761 Td +/F130_0 9.9626 Tf +(31) 9.9626 Tj +[1 0 0 1 516.09 184.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -172.806] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 172.806 Td +/F130_0 9.9626 Tf +(4.1.) 14.9439 Tj +-310 TJm +(Limitations) 45.9475 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(format) 26.5603 Tj +[1 0 0 1 255.231 172.806] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.212 -172.806] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.154 172.806 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 172.806] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -172.806] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 172.806 Td +/F130_0 9.9626 Tf +(31) 9.9626 Tj +[1 0 0 1 516.09 172.806] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -160.851] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 160.851 Td +/F130_0 9.9626 Tf +(4.2.) 14.9439 Tj +-310 TJm +(Portability) 42.0721 Tj +-250 TJm +(issues) 23.8007 Tj +[1 0 0 1 158.395 160.851] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.376 -160.851] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.03 160.851 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 160.851] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -160.851] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 160.851 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 516.09 160.851] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -148.896] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 148.896 Td +/F130_0 9.9626 Tf +(4.3.) 14.9439 Tj +-310 TJm +(Reporting) 39.8504 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +[1 0 0 1 150.993 148.896] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.975 -148.896] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.115 148.896 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 148.896] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -148.896] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 148.896 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 516.09 148.896] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -136.941] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 136.941 Td +/F130_0 9.9626 Tf +(4.4.) 14.9439 Tj +-310 TJm +(Did) 14.9439 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(get) 12.1743 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(right) 18.8194 Tj +-250 TJm +(package?) 37.0609 Tj +[1 0 0 1 212.602 136.941] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -218.778 -136.941] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.109 136.941 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 136.941] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -136.941] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 136.941 Td +/F130_0 9.9626 Tf +(33) 9.9626 Tj +[1 0 0 1 516.09 136.941] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -124.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 124.986 Td +/F130_0 9.9626 Tf +(4.5.) 14.9439 Tj +-310 TJm +(Further) 29.3299 Tj +-250 TJm +(Reading) 33.2053 Tj +[1 0 0 1 155.058 124.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.039 -124.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.361 124.986 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 124.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -124.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 124.986 Td +/F130_0 9.9626 Tf +(34) 9.9626 Tj +[1 0 0 1 516.09 124.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -62.0143] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 41.3997 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -494.668 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +536.068 50.8518 Td +/F130_0 9.9626 Tf +(iii) 8.30881 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 4 4 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 701.916 Td +/F122_0 24.7902 Tf +(1.) 20.675 Tj +-278 TJm +(Intr) 39.937 Tj +20 TJm +(oduction) 104.664 Tj +[1 0 0 1 72 701.606] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -691.643] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 679.998 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 679.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -679.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.507 679.998 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-263 TJm +(\002les) 16.6077 Tj +-263 TJm +(using) 21.589 Tj +-263 TJm +(the) 12.1743 Tj +-262 TJm +(Burro) 23.2427 Tj +25 TJm +(ws-Wheeler) 48.1293 Tj +-263 TJm +(block-sorting) 53.1305 Tj +-263 TJm +(te) 7.193 Tj +15 TJm +(xt) 7.7509 Tj +-263 TJm +(compression) 50.3609 Tj +-263 TJm +(algorithm,) 41.2352 Tj +-266 TJm +(and) 14.386 Tj +-263 TJm +(Huf) 15.4918 Tj +25 TJm +(fman) 20.4731 Tj +-263 TJm +(coding.) 29.6088 Tj +72 668.043 Td +(Compression) 52.5826 Tj +-203 TJm +(is) 6.64505 Tj +-204 TJm +(generally) 37.0708 Tj +-203 TJm +(considerably) 50.9089 Tj +-203 TJm +(better) 22.6848 Tj +-204 TJm +(t) 2.7696 Tj +1 TJm +(han) 14.386 Tj +-204 TJm +(that) 14.9439 Tj +-203 TJm +(achie) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ed) 9.40469 Tj +-203 TJm +(by) 9.9626 Tj +-204 TJm +(more) 20.4731 Tj +-203 TJm +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(entional) 32.0995 Tj +-203 TJm +(LZ77/LZ78-based) 73.0458 Tj +-204 TJm +(compressors,) 52.2937 Tj +72 656.087 Td +(and) 14.386 Tj +-250 TJm +(approaches) 44.8118 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(performance) 50.341 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(PPM) 19.9352 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(amily) 22.6948 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(statistical) 37.6387 Tj +-250 TJm +(compressors.) 52.2937 Tj +[1 0 0 1 72 653.931] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -643.968] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 634.17 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +105.073 634.17 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-320 TJm +(b) 4.9813 Tj +20 TJm +(uilt) 13.2901 Tj +-319 TJm +(on) 9.9626 Tj +-320 TJm +(top) 12.7322 Tj +-320 TJm +(of) 8.29885 Tj +[1 0 0 1 176.712 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.712 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.712 634.17 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 224.533 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -224.533 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.533 634.17 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-337 TJm +(a) 4.42339 Tj +-320 TJm +(\003e) 9.9626 Tj +15 TJm +(xible) 19.9252 Tj +-320 TJm +(library) 26.5603 Tj +-319 TJm +(for) 11.6164 Tj +-320 TJm +(handling) 34.8691 Tj +-320 TJm +(compressed) 47.0334 Tj +-320 TJm +(data) 16.5977 Tj +-319 TJm +(in) 7.7509 Tj +-320 TJm +(the) 12.1743 Tj +[1 0 0 1 449.816 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -449.816 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +449.816 634.17 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 479.704 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -479.704 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +482.889 634.17 Td +/F130_0 9.9626 Tf +(format.) 29.0509 Tj +-1039 TJm +(This) 17.7135 Tj +72 622.214 Td +(manual) 29.3299 Tj +-316 TJm +(describes) 37.0708 Tj +-316 TJm +(both) 17.7135 Tj +-317 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-316 TJm +(to) 7.7509 Tj +-316 TJm +(use) 13.2801 Tj +-316 TJm +(the) 12.1743 Tj +-316 TJm +(program) 33.7533 Tj +-316 TJm +(and) 14.386 Tj +-317 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-316 TJm +(to) 7.7509 Tj +-316 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-316 TJm +(with) 17.7135 Tj +-316 TJm +(the) 12.1743 Tj +-317 TJm +(library) 26.5603 Tj +-316 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +-1017 TJm +(Most) 20.4831 Tj +-316 TJm +(of) 8.29885 Tj +-316 TJm +(the) 12.1743 Tj +-317 TJm +(manual) 29.3299 Tj +-316 TJm +(is) 6.64505 Tj +72 610.259 Td +(de) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +20 TJm +(oted) 17.1556 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(program,) 36.2439 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(good) 19.9252 Tj +-250 TJm +(ne) 9.40469 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(if) 6.08715 Tj +-250 TJm +(your) 18.2614 Tj +-250 TJm +(interest) 29.3299 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(only) 17.7135 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(program.) 36.2439 Tj +[1 0 0 1 72 608.102] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 578.379 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 578.379] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -86.944 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 578.379 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-259 TJm +(to) 7.7509 Tj +-260 TJm +(use) 13.2801 Tj +-259 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 156.985 578.379] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -156.985 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.57 578.379 Td +/F130_0 9.9626 Tf +([2]) 11.6164 Tj +[1 0 0 1 171.186 578.379] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -171.186 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +173.771 578.379 Td +/F130_0 9.9626 Tf +(describes) 37.0708 Tj +-259 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-260 TJm +(to) 7.7509 Tj +-259 TJm +(use) 13.2801 Tj +[1 0 0 1 259.119 578.379] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.119 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +259.119 578.379 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 289.007 578.379] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -289.007 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.007 578.379 Td +/F130_0 9.9626 Tf +(;) 2.7696 Tj +-264 TJm +(this) 14.396 Tj +-260 TJm +(is) 6.64505 Tj +-259 TJm +(the) 12.1743 Tj +-260 TJm +(only) 17.7135 Tj +-259 TJm +(part) 15.4918 Tj +-259 TJm +(you) 14.9439 Tj +-260 TJm +(need) 18.8094 Tj +-259 TJm +(to) 7.7509 Tj +-260 TJm +(read) 17.1456 Tj +-259 TJm +(if) 6.08715 Tj +-260 TJm +(you) 14.9439 Tj +-259 TJm +(just) 14.396 Tj +-260 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-259 TJm +(to) 7.7509 Tj +-260 TJm +(kno) 14.9439 Tj +25 TJm +(w) 7.193 Tj +86.944 566.424 Td +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(operate) 29.3199 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(program.) 36.2439 Tj +[1 0 0 1 199.302 566.424] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -127.302 -21.9178] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -544.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 544.506 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 544.506] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -86.944 -544.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 544.506 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(libbzip2) 32.6574 Tj +[1 0 0 1 197.09 544.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -197.09 -544.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +199.58 544.506 Td +/F130_0 9.9626 Tf +([8]) 11.6164 Tj +[1 0 0 1 211.197 544.506] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -211.197 -544.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.687 544.506 Td +/F130_0 9.9626 Tf +(describes) 37.0708 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(programming) 54.2364 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(aces) 17.1456 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(detail,) 24.6275 Tj +-250 TJm +(and) 14.386 Tj +[1 0 0 1 417.501 544.506] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -345.501 -21.9178] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -522.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 522.588 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 522.588] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -86.944 -522.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 522.588 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 135.083 522.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -135.083 -522.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.573 522.588 Td +/F130_0 9.9626 Tf +([31]) 16.5977 Tj +[1 0 0 1 154.171 522.588] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -154.171 -522.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +156.662 522.588 Td +/F130_0 9.9626 Tf +(records) 29.3199 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(miscellaneous) 56.4481 Tj +-250 TJm +(notes) 21.031 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(thought) 30.4457 Tj +-250 TJm +(ought) 22.6948 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(recorded) 34.8492 Tj +-250 TJm +(some) 21.031 Tj +25 TJm +(where.) 26.8293 Tj +[1 0 0 1 492.31 522.588] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -420.31 -471.736] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.8518 Td +/F130_0 9.9626 Tf +(1) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 5 5 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 701.916 Td +/F122_0 24.7902 Tf +(2.) 20.675 Tj +-278 TJm +(Ho) 33.0453 Tj +15 TJm +(w) 19.2868 Tj +-278 TJm +(to) 23.4019 Tj +-278 TJm +(use) 42.7135 Tj +-278 TJm +(bzip2) 63.3638 Tj +[1 0 0 1 72 696.784] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -14.944] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -671.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 656.35 Td +/F122_0 17.2154 Tf +(T) 10.5186 Tj +80 TJm +(ab) 20.0904 Tj +10 TJm +(le) 14.3576 Tj +-278 TJm +(of) 16.2513 Tj +-278 TJm +(Contents) 74.5943 Tj +[1 0 0 1 72 647.528] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.7401] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 635.788 Td +/F130_0 9.9626 Tf +(2.1.) 14.9439 Tj +-310 TJm +(N) 7.193 Tj +35 TJm +(AME) 22.1369 Tj +[1 0 0 1 119.014 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.995 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +132.691 635.788 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 635.788 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 623.832 Td +/F130_0 9.9626 Tf +(2.2.) 14.9439 Tj +-310 TJm +(SYNOPSIS) 47.0534 Tj +[1 0 0 1 137.085 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -142.067 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.582 623.832 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 623.832 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 611.877 Td +/F130_0 9.9626 Tf +(2.3.) 14.9439 Tj +-310 TJm +(DESCRIPTION) 64.7569 Tj +[1 0 0 1 154.789 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.77 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +168.29 611.877 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 611.877 Td +/F130_0 9.9626 Tf +(3) 4.9813 Tj +[1 0 0 1 516.09 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 599.922 Td +/F130_0 9.9626 Tf +(2.4.) 14.9439 Tj +-310 TJm +(OPTIONS) 42.0621 Tj +[1 0 0 1 132.094 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.076 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.873 599.922 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 599.922 Td +/F130_0 9.9626 Tf +(4) 4.9813 Tj +[1 0 0 1 516.09 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 587.967 Td +/F130_0 9.9626 Tf +(2.5.) 14.9439 Tj +-310 TJm +(MEMOR) 37.6387 Tj +65 TJm +(Y) 7.193 Tj +-250 TJm +(MAN) 23.2427 Tj +35 TJm +(A) 7.193 Tj +40 TJm +(GEMENT) 41.5042 Tj +[1 0 0 1 207.9 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.881 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.412 587.967 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 587.967 Td +/F130_0 9.9626 Tf +(5) 4.9813 Tj +[1 0 0 1 516.09 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 576.012 Td +/F130_0 9.9626 Tf +(2.6.) 14.9439 Tj +-310 TJm +(RECO) 26.5703 Tj +50 TJm +(VERING) 37.6287 Tj +-250 TJm +(D) 7.193 Tj +40 TJm +(A) 7.193 Tj +111 TJm +(T) 6.08715 Tj +93 TJm +(A) 7.193 Tj +-250 TJm +(FR) 12.1843 Tj +40 TJm +(OM) 16.0497 Tj +-250 TJm +(D) 7.193 Tj +40 TJm +(AMA) 23.2427 Tj +40 TJm +(GED) 20.4731 Tj +-250 TJm +(FILES) 26.5703 Tj +[1 0 0 1 293.449 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -298.43 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.464 576.012 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 576.012 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 516.09 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 564.056 Td +/F130_0 9.9626 Tf +(2.7.) 14.9439 Tj +-310 TJm +(PERFORMANCE) 73.6236 Tj +-250 TJm +(NO) 14.386 Tj +40 TJm +(TES) 17.7135 Tj +[1 0 0 1 197.847 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.829 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +211.958 564.056 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 564.056 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 516.09 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 552.101 Td +/F130_0 9.9626 Tf +(2.8.) 14.9439 Tj +-310 TJm +(CA) 13.8381 Tj +135 TJm +(VEA) 20.4731 Tj +111 TJm +(TS) 11.6264 Tj +[1 0 0 1 133.519 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.5 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +148.799 552.101 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 552.101 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 516.09 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 540.146 Td +/F130_0 9.9626 Tf +(2.9.) 14.9439 Tj +-310 TJm +(A) 7.193 Tj +55 TJm +(UTHOR) 34.3112 Tj +[1 0 0 1 130.989 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -135.97 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.32 540.146 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 540.146 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 516.09 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.2191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -520.002] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 508.266 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-250 TJm +(chapter) 29.3199 Tj +-250 TJm +(contains) 33.2053 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(cop) 14.386 Tj +10 TJm +(y) 4.9813 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 213.837 508.266] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.837 -508.266] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.837 508.266 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 243.725 508.266] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.725 -508.266] cm +[1 0 0 1 0 0] Tm +0 0 Td +246.215 508.266 Td +/F130_0 9.9626 Tf +(man) 17.1556 Tj +-250 TJm +(page,) 21.3 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(nothing) 30.4457 Tj +-250 TJm +(else.) 17.9825 Tj +[1 0 0 1 72 506.109] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -496.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 473.513 Td +/F122_0 20.6585 Tf +(2.1.) 34.4584 Tj +-278 TJm +(NAME) 60.8186 Tj +[1 0 0 1 72 473.513] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -31.8804] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 441.632 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 441.632 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 116.832 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.832 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.832 441.632 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 121.813 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -121.813 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +121.813 441.632 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 163.656 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.656 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.147 441.632 Td +/F130_0 9.9626 Tf +(-) 3.31755 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(block-sorting) 53.1305 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(compressor) 45.9276 Tj +40 TJm +(,) 2.49065 Tj +-250 TJm +(v1.0.4) 24.9065 Tj +[1 0 0 1 325.129 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.129 -21.9179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -419.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 419.715 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 419.715] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -419.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 419.715 Td +/F134_0 9.9626 Tf +(bzcat) 29.8878 Tj +[1 0 0 1 116.832 419.715] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.832 -419.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.322 419.715 Td +/F130_0 9.9626 Tf +(-) 3.31755 Tj +-250 TJm +(decompresses) 55.3323 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(stdout) 24.3586 Tj +[1 0 0 1 236.651 419.715] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.651 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -397.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 397.797 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 397.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -397.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 397.797 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 158.675 397.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.675 -397.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.166 397.797 Td +/F130_0 9.9626 Tf +(-) 3.31755 Tj +-250 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ers) 11.6164 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(damaged) 35.965 Tj +-250 TJm +(bzip2) 22.1369 Tj +-250 TJm +(\002les) 16.6077 Tj +[1 0 0 1 323.545 397.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -251.545 -12.1195] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -375.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 353.081 Td +/F122_0 20.6585 Tf +(2.2.) 34.4584 Tj +-278 TJm +(SYNOPSIS) 105.627 Tj +[1 0 0 1 72 352.823] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -31.6223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -321.201] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 321.201 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 321.201] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -321.201] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 321.201 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 116.832 321.201] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.832 -321.201] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.322 321.201 Td +/F130_0 9.9626 Tf +([) 3.31755 Tj +-250 TJm +(-cdfkqstvzVL123456789) 100.164 Tj +-250 TJm +(]) 3.31755 Tj +-250 TJm +([) 3.31755 Tj +-250 TJm +(\002lenames) 38.1866 Tj +-250 TJm +(...) 7.47195 Tj +-620 TJm +(]) 3.31755 Tj +[1 0 0 1 297.045 321.201] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -225.045 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -299.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 299.283 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 299.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -299.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 299.283 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 128.787 299.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -128.787 -299.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.278 299.283 Td +/F130_0 9.9626 Tf +([) 3.31755 Tj +-250 TJm +(-fkvsVL) 33.7533 Tj +-250 TJm +(]) 3.31755 Tj +-250 TJm +([) 3.31755 Tj +-250 TJm +(\002lenames) 38.1866 Tj +-250 TJm +(...) 7.47195 Tj +-620 TJm +(]) 3.31755 Tj +[1 0 0 1 242.589 299.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -170.589 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -277.365] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 277.365 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 277.365] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -277.365] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 277.365 Td +/F134_0 9.9626 Tf +(bzcat) 29.8878 Tj +[1 0 0 1 116.832 277.365] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.832 -277.365] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.322 277.365 Td +/F130_0 9.9626 Tf +([) 3.31755 Tj +-250 TJm +(-s) 7.193 Tj +-250 TJm +(]) 3.31755 Tj +-250 TJm +([) 3.31755 Tj +-250 TJm +(\002lenames) 38.1866 Tj +-250 TJm +(...) 7.47195 Tj +-620 TJm +(]) 3.31755 Tj +[1 0 0 1 204.074 277.365] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -132.074 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -255.447] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 255.447 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 255.447] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -255.447] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 255.447 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 158.675 255.447] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.675 -255.447] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.166 255.447 Td +/F130_0 9.9626 Tf +(\002lename) 34.3112 Tj +[1 0 0 1 195.476 255.447] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.477 -204.596] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.8519] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.8519 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 453.269 50.8519] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 6 6 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 704.93 Td +/F122_0 20.6585 Tf +(2.3.) 34.4584 Tj +-278 TJm +(DESCRIPTION) 141.18 Tj +[1 0 0 1 72 704.672] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -694.709] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 683.012 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 683.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -683.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.56 683.012 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-268 TJm +(\002les) 16.6077 Tj +-268 TJm +(using) 21.589 Tj +-268 TJm +(the) 12.1743 Tj +-269 TJm +(Burro) 23.2427 Tj +25 TJm +(ws-Wheeler) 48.1293 Tj +-268 TJm +(block) 22.1369 Tj +-268 TJm +(sorting) 27.6761 Tj +-268 TJm +(te) 7.193 Tj +15 TJm +(xt) 7.7509 Tj +-268 TJm +(compression) 50.3609 Tj +-268 TJm +(algorithm,) 41.2352 Tj +-273 TJm +(and) 14.386 Tj +-268 TJm +(Huf) 15.4918 Tj +25 TJm +(fman) 20.4731 Tj +-269 TJm +(c) 4.42339 Tj +1 TJm +(od) 9.9626 Tj +-1 TJm +(i) 2.7696 Tj +1 TJm +(ng.) 12.4533 Tj +72 671.057 Td +(Compression) 52.5826 Tj +-203 TJm +(is) 6.64505 Tj +-204 TJm +(generally) 37.0708 Tj +-203 TJm +(considerably) 50.9089 Tj +-203 TJm +(better) 22.6848 Tj +-204 TJm +(t) 2.7696 Tj +1 TJm +(han) 14.386 Tj +-204 TJm +(that) 14.9439 Tj +-203 TJm +(achie) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ed) 9.40469 Tj +-203 TJm +(by) 9.9626 Tj +-204 TJm +(more) 20.4731 Tj +-203 TJm +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(entional) 32.0995 Tj +-203 TJm +(LZ77/LZ78-based) 73.0458 Tj +-204 TJm +(compressors,) 52.2937 Tj +72 659.101 Td +(and) 14.386 Tj +-250 TJm +(approaches) 44.8118 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(performance) 50.341 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(PPM) 19.9352 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(amily) 22.6948 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(statistical) 37.6387 Tj +-250 TJm +(compressors.) 52.2937 Tj +[1 0 0 1 72 656.945] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -646.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 637.184 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(command-line) 57.5539 Tj +-250 TJm +(options) 29.3399 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(deliberately) 47.0334 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-250 TJm +(similar) 27.6761 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(those) 21.031 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(GNU) 21.579 Tj +[1 0 0 1 364.869 637.184] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -364.869 -637.184] cm +[1 0 0 1 0 0] Tm +0 0 Td +364.869 637.184 Td +/F134_0 9.9626 Tf +(gzip) 23.9102 Tj +[1 0 0 1 388.779 637.184] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -388.779 -637.184] cm +[1 0 0 1 0 0] Tm +0 0 Td +388.779 637.184 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(identical.) 36.8018 Tj +[1 0 0 1 72 635.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -625.064] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 615.266 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 615.266] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -615.266] cm +[1 0 0 1 0 0] Tm +0 0 Td +105.175 615.266 Td +/F130_0 9.9626 Tf +(e) 4.42339 Tj +15 TJm +(xpects) 25.4544 Tj +-330 TJm +(a) 4.42339 Tj +-330 TJm +(list) 12.1843 Tj +-330 TJm +(of) 8.29885 Tj +-330 TJm +(\002le) 12.7322 Tj +-329 TJm +(names) 25.4544 Tj +-330 TJm +(to) 7.7509 Tj +-330 TJm +(accompan) 40.3884 Tj +15 TJm +(y) 4.9813 Tj +-330 TJm +(the) 12.1743 Tj +-330 TJm +(command-line) 57.5539 Tj +-330 TJm +(\003ags.) 21.31 Tj +-1099 TJm +(Each) 19.9152 Tj +-330 TJm +(\002le) 12.7322 Tj +-330 TJm +(is) 6.64505 Tj +-330 TJm +(replaced) 33.7433 Tj +-330 TJm +(by) 9.9626 Tj +-330 TJm +(a) 4.42339 Tj +-330 TJm +(compressed) 47.0334 Tj +72 603.311 Td +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-349 TJm +(of) 8.29885 Tj +-348 TJm +(itself,) 22.4159 Tj +-373 TJm +(with) 17.7135 Tj +-349 TJm +(the) 12.1743 Tj +-349 TJm +(name) 21.579 Tj +[1 0 0 1 204.444 603.311] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.444 -603.311] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.444 603.311 Td +/F134_0 9.9626 Tf +(original_name.bz2) 101.619 Tj +[1 0 0 1 306.063 603.311] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -306.063 -603.311] cm +[1 0 0 1 0 0] Tm +0 0 Td +306.063 603.311 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1212 TJm +(Each) 19.9152 Tj +-348 TJm +(compressed) 47.0334 Tj +-349 TJm +(\002le) 12.7322 Tj +-348 TJm +(has) 13.2801 Tj +-349 TJm +(the) 12.1743 Tj +-348 TJm +(same) 20.4731 Tj +-349 TJm +(modi\002cation) 50.3709 Tj +-349 TJm +(date,) 19.0883 Tj +72 591.356 Td +(permissions,) 50.092 Tj +-344 TJm +(and,) 16.8766 Tj +-344 TJm +(when) 21.579 Tj +-325 TJm +(possible,) 35.1481 Tj +-344 TJm +(o) 4.9813 Tj +25 TJm +(wnership) 36.5229 Tj +-325 TJm +(as) 8.29885 Tj +-325 TJm +(the) 12.1743 Tj +-326 TJm +(corresponding) 56.996 Tj +-325 TJm +(original,) 33.4843 Tj +-344 TJm +(so) 8.85675 Tj +-325 TJm +(that) 14.9439 Tj +-325 TJm +(these) 20.4731 Tj +-325 TJm +(properties) 39.8404 Tj +-325 TJm +(can) 13.8281 Tj +-326 TJm +(be) 9.40469 Tj +-325 TJm +(correctly) 35.4071 Tj +72 579.4 Td +(restored) 32.0895 Tj +-308 TJm +(at) 7.193 Tj +-308 TJm +(decompression) 59.7656 Tj +-307 TJm +(time.) 20.2042 Tj +-484 TJm +(File) 15.5018 Tj +-308 TJm +(name) 21.579 Tj +-308 TJm +(handling) 34.8691 Tj +-308 TJm +(is) 6.64505 Tj +-307 TJm +(nai) 12.1743 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-308 TJm +(in) 7.7509 Tj +-308 TJm +(the) 12.1743 Tj +-308 TJm +(sense) 21.579 Tj +-308 TJm +(that) 14.9439 Tj +-308 TJm +(there) 19.9152 Tj +-307 TJm +(is) 6.64505 Tj +-308 TJm +(no) 9.9626 Tj +-308 TJm +(mechanism) 45.3796 Tj +-308 TJm +(for) 11.6164 Tj +-308 TJm +(preserving) 42.0521 Tj +72 567.445 Td +(original) 30.9936 Tj +-334 TJm +(\002le) 12.7322 Tj +-333 TJm +(names,) 27.9451 Tj +-355 TJm +(permissions,) 50.092 Tj +-355 TJm +(o) 4.9813 Tj +25 TJm +(wnerships) 40.3983 Tj +-333 TJm +(or) 8.29885 Tj +-334 TJm +(dates) 20.4731 Tj +-334 TJm +(in) 7.7509 Tj +-333 TJm +(\002lesystems) 44.2838 Tj +-334 TJm +(which) 24.3486 Tj +-334 TJm +(lack) 16.5977 Tj +-333 TJm +(these) 20.4731 Tj +-334 TJm +(concepts,) 37.3498 Tj +-355 TJm +(or) 8.29885 Tj +-333 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-334 TJm +(serious) 28.224 Tj +-334 TJm +(\002le) 12.7322 Tj +72 555.49 Td +(name) 21.579 Tj +-250 TJm +(length) 24.9065 Tj +-250 TJm +(restrictions,) 46.7644 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(MS-DOS.) 40.1294 Tj +[1 0 0 1 72 553.333] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -543.371] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 533.572 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.379 533.572 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 121.255 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -121.255 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +121.255 533.572 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 163.098 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.098 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +165.589 533.572 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(erwrite) 28.2141 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +-250 TJm +(\002les.) 19.0983 Tj +-620 TJm +(If) 6.63509 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(happen,) 31.2626 Tj +-250 TJm +(specify) 28.772 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 495.977 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -495.977 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +495.977 533.572 Td +/F134_0 9.9626 Tf +(-f) 11.9551 Tj +[1 0 0 1 507.932 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -507.932 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.423 533.572 Td +/F130_0 9.9626 Tf +(\003ag.) 17.4346 Tj +[1 0 0 1 72 531.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -521.453] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 511.654 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-284 TJm +(no) 9.9626 Tj +-285 TJm +(\002le) 12.7322 Tj +-284 TJm +(names) 25.4544 Tj +-284 TJm +(are) 12.1643 Tj +-284 TJm +(speci\002ed,) 37.9077 Tj +[1 0 0 1 193.935 511.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.935 -511.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.935 511.654 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 223.823 511.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -223.823 -511.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +226.655 511.654 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-284 TJm +(from) 19.3673 Tj +-285 TJm +(standard) 33.7533 Tj +-284 TJm +(input) 20.4831 Tj +-284 TJm +(to) 7.7509 Tj +-284 TJm +(standard) 33.7533 Tj +-285 TJm +(output.) 27.9551 Tj +-825 TJm +(In) 8.29885 Tj +-285 TJm +(this) 14.396 Tj +-284 TJm +(case,) 19.6363 Tj +[1 0 0 1 491.778 511.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -491.778 -511.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +491.778 511.654 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 521.666 511.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -521.666 -511.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +524.499 511.654 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +72 499.699 Td +(decline) 28.772 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(write) 20.4731 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(terminal,) 35.696 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(entirely) 30.4357 Tj +-250 TJm +(incomprehensible) 70.8341 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(therefore) 35.955 Tj +-250 TJm +(pointless.) 37.9177 Tj +[1 0 0 1 72 497.542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -487.58] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 477.781 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 113.843 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.176 477.781 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 130.125 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -130.125 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +130.125 477.781 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(-d) 11.9551 Tj +[1 0 0 1 177.946 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.946 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +177.946 477.781 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-234 TJm +(decompresses) 55.3323 Tj +-234 TJm +(all) 9.9626 Tj +-234 TJm +(speci\002ed) 35.417 Tj +-235 TJm +(\002les.) 19.0983 Tj +-609 TJm +(Files) 19.3773 Tj +-234 TJm +(which) 24.3486 Tj +-234 TJm +(were) 19.3573 Tj +-234 TJm +(not) 12.7322 Tj +-235 TJm +(created) 28.762 Tj +-234 TJm +(by) 9.9626 Tj +[1 0 0 1 445.012 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -445.012 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +445.012 477.781 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 474.9 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -474.9 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.233 477.781 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-234 TJm +(be) 9.40469 Tj +-234 TJm +(detected) 33.1954 Tj +72 465.826 Td +(and) 14.386 Tj +-280 TJm +(i) 2.7696 Tj +1 TJm +(gnored,) 30.1568 Tj +-287 TJm +(and) 14.386 Tj +-280 TJm +(a) 4.42339 Tj +-279 TJm +(w) 7.193 Tj +10 TJm +(arning) 25.4544 Tj +-280 TJm +(issued.) 27.3972 Tj +[1 0 0 1 216.033 465.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.033 -465.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.033 465.826 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 245.921 465.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.921 -465.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +248.705 465.826 Td +/F130_0 9.9626 Tf +(attempts) 33.7633 Tj +-279 TJm +(to) 7.7509 Tj +-280 TJm +(guess) 22.1369 Tj +-279 TJm +(the) 12.1743 Tj +-280 TJm +(\002lename) 34.3112 Tj +-279 TJm +(for) 11.6164 Tj +-280 TJm +(the) 12.1743 Tj +-279 TJm +(decompressed) 56.4381 Tj +-280 TJm +(\002le) 12.7322 Tj +-279 TJm +(from) 19.3673 Tj +-280 TJm +(that) 14.9439 Tj +-279 TJm +(of) 8.29885 Tj +-280 TJm +(the) 12.1743 Tj +72 453.871 Td +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(follo) 18.8194 Tj +25 TJm +(ws:) 13.8381 Tj +[1 0 0 1 72 451.714] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -421.991] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 421.991 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 421.991] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -421.991] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 421.991 Td +/F134_0 9.9626 Tf +(filename.bz2) 71.7307 Tj +[1 0 0 1 164.653 421.991] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -421.991] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.143 421.991 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 204.493 421.991] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.493 -421.991] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.493 421.991 Td +/F134_0 9.9626 Tf +(filename) 47.8205 Tj +[1 0 0 1 252.313 421.991] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -180.313 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -400.073] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 400.073 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 400.073] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -400.073] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 400.073 Td +/F134_0 9.9626 Tf +(filename.bz) 65.7532 Tj +[1 0 0 1 158.675 400.073] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.675 -400.073] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.166 400.073 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 198.515 400.073] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.515 -400.073] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.515 400.073 Td +/F134_0 9.9626 Tf +(filename) 47.8205 Tj +[1 0 0 1 246.336 400.073] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.336 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -378.155] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 378.155 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 378.155] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -378.155] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 378.155 Td +/F134_0 9.9626 Tf +(filename.tbz2) 77.7083 Tj +[1 0 0 1 164.653 378.155] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -378.155] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.143 378.155 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 204.493 378.155] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.493 -378.155] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.493 378.155 Td +/F134_0 9.9626 Tf +(filename.tar) 71.7307 Tj +[1 0 0 1 276.224 378.155] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.224 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -356.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 356.237 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 356.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -356.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 356.237 Td +/F134_0 9.9626 Tf +(filename.tbz) 71.7307 Tj +[1 0 0 1 164.653 356.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -356.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.143 356.237 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 204.493 356.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.493 -356.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.493 356.237 Td +/F134_0 9.9626 Tf +(filename.tar) 71.7307 Tj +[1 0 0 1 276.224 356.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.224 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -334.319] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 334.319 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 334.319] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -334.319] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 334.319 Td +/F134_0 9.9626 Tf +(anyothername) 71.7307 Tj +[1 0 0 1 164.653 334.319] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -334.319] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.143 334.319 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 204.493 334.319] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.493 -334.319] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.493 334.319 Td +/F134_0 9.9626 Tf +(anyothername.out) 95.641 Tj +[1 0 0 1 300.134 334.319] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -228.134 -11.4968] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -322.823] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 312.402 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-342 TJm +(the) 12.1743 Tj +-342 TJm +(\002le) 12.7322 Tj +-342 TJm +(does) 18.2614 Tj +-342 TJm +(not) 12.7322 Tj +-343 TJm +(end) 14.386 Tj +-342 TJm +(in) 7.7509 Tj +-342 TJm +(one) 14.386 Tj +-342 TJm +(of) 8.29885 Tj +-342 TJm +(the) 12.1743 Tj +-342 TJm +(recognised) 43.158 Tj +-342 TJm +(endings,) 33.4843 Tj +[1 0 0 1 309.305 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -309.305 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +309.305 312.402 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 333.215 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -333.215 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +333.215 312.402 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 339.344 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.344 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.344 312.402 Td +/F134_0 9.9626 Tf +(.bz) 17.9327 Tj +[1 0 0 1 357.276 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -357.276 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +357.276 312.402 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 363.405 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.405 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.405 312.402 Td +/F134_0 9.9626 Tf +(.tbz2) 29.8878 Tj +[1 0 0 1 393.293 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -393.293 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +396.701 312.402 Td +/F130_0 9.9626 Tf +(or) 8.29885 Tj +[1 0 0 1 408.409 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -408.409 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +408.409 312.402 Td +/F134_0 9.9626 Tf +(.tbz) 23.9102 Tj +[1 0 0 1 432.319 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -432.319 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +432.319 312.402 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 438.448 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.448 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.448 312.402 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 468.336 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468.336 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +471.744 312.402 Td +/F130_0 9.9626 Tf +(complains) 40.9562 Tj +-342 TJm +(that) 14.9439 Tj +-342 TJm +(it) 5.53921 Tj +72 300.446 Td +(cannot) 26.5603 Tj +-250 TJm +(guess) 22.1369 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(name) 21.579 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(original) 30.9936 Tj +-250 TJm +(\002le,) 15.2229 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(uses) 17.1556 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(original) 30.9936 Tj +-250 TJm +(name) 21.579 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 370.009 300.446] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -370.009 -300.446] cm +[1 0 0 1 0 0] Tm +0 0 Td +370.009 300.446 Td +/F134_0 9.9626 Tf +(.out) 23.9102 Tj +[1 0 0 1 393.92 300.446] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -393.92 -300.446] cm +[1 0 0 1 0 0] Tm +0 0 Td +396.41 300.446 Td +/F130_0 9.9626 Tf +(appended.) 40.6673 Tj +[1 0 0 1 72 298.29] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -288.327] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 278.529 Td +/F130_0 9.9626 Tf +(As) 11.0684 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(compression,) 52.8516 Tj +-250 TJm +(supplying) 39.3025 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(\002lenames) 38.1866 Tj +-250 TJm +(causes) 26.0024 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(standard) 33.7533 Tj +-250 TJm +(input) 20.4831 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(standard) 33.7533 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 276.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -266.409] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 256.611 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 113.843 256.611] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -256.611] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.409 256.611 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-257 TJm +(correctly) 35.4071 Tj +-258 TJm +(decompress) 47.0334 Tj +-257 TJm +(a) 4.42339 Tj +-258 TJm +(\002le) 12.7322 Tj +-257 TJm +(which) 24.3486 Tj +-258 TJm +(is) 6.64505 Tj +-258 TJm +(the) 12.1743 Tj +-257 TJm +(concatenation) 55.3323 Tj +-258 TJm +(of) 8.29885 Tj +-257 TJm +(tw) 9.9626 Tj +10 TJm +(o) 4.9813 Tj +-258 TJm +(or) 8.29885 Tj +-257 TJm +(more) 20.4731 Tj +-258 TJm +(compressed) 47.0334 Tj +-257 TJm +(\002les.) 19.0983 Tj +-665 TJm +(The) 15.4918 Tj +-258 TJm +(result) 22.1369 Tj +-257 TJm +(is) 6.64505 Tj +72 244.656 Td +(the) 12.1743 Tj +-239 TJm +(concatenation) 55.3323 Tj +-238 TJm +(of) 8.29885 Tj +-239 TJm +(the) 12.1743 Tj +-239 TJm +(corresponding) 56.996 Tj +-239 TJm +(uncompressed) 56.996 Tj +-238 TJm +(\002les.) 19.0983 Tj +-613 TJm +(Inte) 15.4918 Tj +15 TJm +(grity) 18.8194 Tj +-238 TJm +(testing) 26.5703 Tj +-239 TJm +(\() 3.31755 Tj +[1 0 0 1 382.247 244.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.247 -244.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +382.247 244.656 Td +/F134_0 9.9626 Tf +(-t) 11.9551 Tj +[1 0 0 1 394.202 244.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -394.202 -244.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +394.202 244.656 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-239 TJm +(of) 8.29885 Tj +-238 TJm +(concatenated) 52.0048 Tj +-239 TJm +(compressed) 47.0334 Tj +-239 TJm +(\002les) 16.6077 Tj +-239 TJm +(is) 6.64505 Tj +72 232.7 Td +(also) 16.0497 Tj +-250 TJm +(supported.) 41.7831 Tj +[1 0 0 1 72 230.544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -220.581] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 210.783 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-399 TJm +(can) 13.8281 Tj +-399 TJm +(also) 16.0497 Tj +-399 TJm +(compress) 37.6287 Tj +-400 TJm +(or) 8.29885 Tj +-399 TJm +(decompress) 47.0334 Tj +-399 TJm +(\002les) 16.6077 Tj +-399 TJm +(to) 7.7509 Tj +-399 TJm +(the) 12.1743 Tj +-399 TJm +(standard) 33.7533 Tj +-399 TJm +(output) 25.4644 Tj +-399 TJm +(by) 9.9626 Tj +-400 TJm +(gi) 7.7509 Tj +25 TJm +(ving) 17.7135 Tj +-399 TJm +(the) 12.1743 Tj +[1 0 0 1 409.67 210.783] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.67 -210.783] cm +[1 0 0 1 0 0] Tm +0 0 Td +409.67 210.783 Td +/F134_0 9.9626 Tf +(-c) 11.9551 Tj +[1 0 0 1 421.625 210.783] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -421.625 -210.783] cm +[1 0 0 1 0 0] Tm +0 0 Td +425.602 210.783 Td +/F130_0 9.9626 Tf +(\003ag.) 17.4346 Tj +-757 TJm +(Multiple) 34.3212 Tj +-400 TJm +(\002l) 8.30881 Tj +1 TJm +(es) 8.29885 Tj +-400 TJm +(may) 17.1556 Tj +-399 TJm +(be) 9.40469 Tj +72 198.828 Td +(compressed) 47.0334 Tj +-367 TJm +(and) 14.386 Tj +-367 TJm +(decompressed) 56.4381 Tj +-367 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-367 TJm +(this.) 16.8866 Tj +-1321 TJm +(The) 15.4918 Tj +-367 TJm +(resulting) 34.8691 Tj +-367 TJm +(outputs) 29.3399 Tj +-367 TJm +(are) 12.1643 Tj +-367 TJm +(fed) 12.7222 Tj +-367 TJm +(sequentially) 48.1492 Tj +-366 TJm +(to) 7.7509 Tj +-367 TJm +(stdout.) 26.8492 Tj +-1322 TJm +(Compression) 52.5826 Tj +-367 TJm +(of) 8.29885 Tj +72 186.872 Td +(multiple) 33.2153 Tj +-289 TJm +(\002les) 16.6077 Tj +-289 TJm +(in) 7.7509 Tj +-289 TJm +(this) 14.396 Tj +-289 TJm +(manner) 29.8778 Tj +-288 TJm +(generates) 37.6188 Tj +-289 TJm +(a) 4.42339 Tj +-289 TJm +(stream) 26.5603 Tj +-289 TJm +(containing) 42.0621 Tj +-289 TJm +(multiple) 33.2153 Tj +-289 TJm +(compressed) 47.0334 Tj +-289 TJm +(\002le) 12.7322 Tj +-289 TJm +(representations.) 62.8042 Tj +-853 TJm +(Such) 19.9252 Tj +-289 TJm +(a) 4.42339 Tj +-289 TJm +(stream) 26.5603 Tj +72 174.917 Td +(can) 13.8281 Tj +-391 TJm +(be) 9.40469 Tj +-391 TJm +(decompressed) 56.4381 Tj +-390 TJm +(correctly) 35.4071 Tj +-391 TJm +(only) 17.7135 Tj +-391 TJm +(by) 9.9626 Tj +[1 0 0 1 238.116 174.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -238.116 -174.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +238.116 174.917 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 268.004 174.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -268.004 -174.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +271.897 174.917 Td +/F130_0 9.9626 Tf +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-391 TJm +(0.9.0) 19.9252 Tj +-391 TJm +(or) 8.29885 Tj +-391 TJm +(l) 2.7696 Tj +1 TJm +(ater) 14.9339 Tj +55 TJm +(.) 2.49065 Tj +-733 TJm +(Earlier) 27.1082 Tj +-391 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-391 TJm +(of) 8.29885 Tj +[1 0 0 1 448.071 174.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -448.071 -174.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +448.071 174.917 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 477.958 174.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -477.958 -174.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +481.852 174.917 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-391 TJm +(stop) 16.6077 Tj +-391 TJm +(after) 18.2515 Tj +72 162.962 Td +(decompressing) 59.7656 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002rst) 15.5018 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 160.805] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -150.843] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 141.044 Td +/F134_0 9.9626 Tf +(bzcat) 29.8878 Tj +[1 0 0 1 101.888 141.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -141.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.379 141.044 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 118.486 141.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -118.486 -141.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +118.486 141.044 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(-dc) 17.9327 Tj +[1 0 0 1 172.284 141.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.284 -141.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.284 141.044 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-250 TJm +(decompresses) 55.3323 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(speci\002ed) 35.417 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(standard) 33.7533 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 138.887] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -128.925] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 119.126 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.866 119.126 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-299 TJm +(read) 17.1456 Tj +-299 TJm +(ar) 7.74094 Tj +18 TJm +(guments) 33.7633 Tj +-299 TJm +(from) 19.3673 Tj +-299 TJm +(the) 12.1743 Tj +-299 TJm +(en) 9.40469 Tj +40 TJm +(vironment) 40.9562 Tj +-298 TJm +(v) 4.9813 Tj +25 TJm +(ariables) 30.9837 Tj +[1 0 0 1 316.903 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.903 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +316.903 119.126 Td +/F134_0 9.9626 Tf +(BZIP2) 29.8878 Tj +[1 0 0 1 346.791 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -346.791 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +349.769 119.126 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 367.133 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -367.133 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +367.133 119.126 Td +/F134_0 9.9626 Tf +(BZIP) 23.9102 Tj +[1 0 0 1 391.043 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -391.043 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +391.043 119.126 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-299 TJm +(in) 7.7509 Tj +-299 TJm +(that) 14.9439 Tj +-299 TJm +(order) 21.0211 Tj +40 TJm +(,) 2.49065 Tj +-311 TJm +(and) 14.386 Tj +-299 TJm +(will) 15.5018 Tj +-299 TJm +(process) 29.8778 Tj +-299 TJm +(them) 19.9252 Tj +72 107.171 Td +(before) 25.4445 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(ar) 7.74094 Tj +18 TJm +(guments) 33.7633 Tj +-250 TJm +(read) 17.1456 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(command) 39.2925 Tj +-250 TJm +(line.) 17.4346 Tj +-310 TJm +(This) 17.7135 Tj +-250 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(enient) 24.3486 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(supply) 26.5703 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(ar) 7.74094 Tj +18 TJm +(guments.) 36.2539 Tj +[1 0 0 1 72 105.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -95.0517] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 85.2534 Td +/F130_0 9.9626 Tf +(Compression) 52.5826 Tj +-294 TJm +(is) 6.64505 Tj +-294 TJm +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-294 TJm +(performed,) 43.9849 Tj +-305 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-294 TJm +(if) 6.08715 Tj +-294 TJm +(the) 12.1743 Tj +-294 TJm +(compressed) 47.0334 Tj +-294 TJm +(\002le) 12.7322 Tj +-293 TJm +(is) 6.64505 Tj +-294 TJm +(slightly) 29.8978 Tj +-294 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-294 TJm +(than) 17.1556 Tj +-294 TJm +(the) 12.1743 Tj +-294 TJm +(original.) 33.4843 Tj +-884 TJm +(Files) 19.3773 Tj +-294 TJm +(of) 8.29885 Tj +-294 TJm +(less) 14.9439 Tj +-294 TJm +(than) 17.1556 Tj +72 73.2982 Td +(about) 22.1369 Tj +-246 TJm +(one) 14.386 Tj +-246 TJm +(hundred) 32.6474 Tj +-245 TJm +(bytes) 21.031 Tj +-246 TJm +(tend) 17.1556 Tj +-246 TJm +(to) 7.7509 Tj +-246 TJm +(get) 12.1743 Tj +-246 TJm +(l) 2.7696 Tj +1 TJm +(ar) 7.74094 Tj +18 TJm +(ger) 12.7222 Tj +40 TJm +(,) 2.49065 Tj +-247 TJm +(since) 20.4731 Tj +-246 TJm +(the) 12.1743 Tj +-246 TJm +(compression) 50.3609 Tj +-245 TJm +(mechanism) 45.3796 Tj +-246 TJm +(has) 13.2801 Tj +-246 TJm +(a) 4.42339 Tj +-246 TJm +(constant) 33.2053 Tj +-246 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(erhead) 26.5503 Tj +-245 TJm +(in) 7.7509 Tj +-246 TJm +(the) 12.1743 Tj +-246 TJm +(re) 7.74094 Tj +15 TJm +(gion) 17.7135 Tj +-246 TJm +(of) 8.29885 Tj +[1 0 0 1 72 50.8518] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.9514 Td +/F130_0 9.9626 Tf +(3) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 7 7 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(50) 9.9626 Tj +-264 TJm +(bytes.) 23.5217 Tj +-351 TJm +(Random) 33.7633 Tj +-264 TJm +(dat) 12.1743 Tj +1 TJm +(a) 4.42339 Tj +-264 TJm +(\(including) 40.9562 Tj +-264 TJm +(the) 12.1743 Tj +-264 TJm +(output) 25.4644 Tj +-263 TJm +(of) 8.29885 Tj +-264 TJm +(most) 19.3773 Tj +-264 TJm +(\002le) 12.7322 Tj +-263 TJm +(compressors\)) 53.1206 Tj +-264 TJm +(is) 6.64505 Tj +-264 TJm +(coded) 23.7907 Tj +-263 TJm +(at) 7.193 Tj +-264 TJm +(about) 22.1369 Tj +-264 TJm +(8.05) 17.4346 Tj +-263 TJm +(bits) 14.396 Tj +-264 TJm +(per) 12.7222 Tj +-264 TJm +(byte,) 19.6462 Tj +-267 TJm +(gi) 7.7509 Tj +25 TJm +(ving) 17.7135 Tj +-264 TJm +(an) 9.40469 Tj +72 698.082 Td +(e) 4.42339 Tj +15 TJm +(xpansion) 35.9749 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(around) 27.6661 Tj +-250 TJm +(0.5%.) 23.2427 Tj +[1 0 0 1 72 695.925] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -686.081] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 676.283 Td +/F130_0 9.9626 Tf +(As) 11.0684 Tj +-268 TJm +(a) 4.42339 Tj +-268 TJm +(self-check) 40.9363 Tj +-269 TJm +(for) 11.6164 Tj +-268 TJm +(your) 18.2614 Tj +-268 TJm +(protection,) 42.889 Tj +[1 0 0 1 217.273 676.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -217.273 -676.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +217.273 676.283 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 247.161 676.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -247.161 -676.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +249.833 676.283 Td +/F130_0 9.9626 Tf +(uses) 17.1556 Tj +-268 TJm +(32-bit) 23.8007 Tj +-268 TJm +(CRCs) 23.8106 Tj +-269 TJm +(to) 7.7509 Tj +-268 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-268 TJm +(sure) 16.5977 Tj +-268 TJm +(that) 14.9439 Tj +-268 TJm +(the) 12.1743 Tj +-269 TJm +(decompressed) 56.4381 Tj +-268 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-268 TJm +(of) 8.29885 Tj +-268 TJm +(a) 4.42339 Tj +-268 TJm +(\002le) 12.7322 Tj +-269 TJm +(is) 6.64505 Tj +72 664.328 Td +(identical) 34.3112 Tj +-200 TJm +(to) 7.7509 Tj +-199 TJm +(the) 12.1743 Tj +-200 TJm +(original.) 33.4843 Tj +-586 TJm +(This) 17.7135 Tj +-200 TJm +(guards) 26.5603 Tj +-199 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-200 TJm +(corruption) 41.5042 Tj +-199 TJm +(of) 8.29885 Tj +-200 TJm +(the) 12.1743 Tj +-200 TJm +(compressed) 47.0334 Tj +-199 TJm +(data,) 19.0883 Tj +-210 TJm +(and) 14.386 Tj +-199 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-200 TJm +(undetected) 43.158 Tj +-200 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +-199 TJm +(in) 7.7509 Tj +[1 0 0 1 510.112 664.328] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -510.112 -664.328] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.112 664.328 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 540 664.328] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -664.328] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 652.373 Td +/F130_0 9.9626 Tf +(\(hopefully) 41.5042 Tj +-275 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-274 TJm +(unlik) 20.4831 Tj +10 TJm +(ely\).) 17.9825 Tj +-384 TJm +(The) 15.4918 Tj +-275 TJm +(chances) 31.5316 Tj +-275 TJm +(of) 8.29885 Tj +-275 TJm +(data) 16.5977 Tj +-274 TJm +(corruption) 41.5042 Tj +-275 TJm +(going) 22.6948 Tj +-275 TJm +(undetected) 43.158 Tj +-274 TJm +(is) 6.64505 Tj +-275 TJm +(microscopic,) 51.1878 Tj +-281 TJm +(about) 22.1369 Tj +-275 TJm +(one) 14.386 Tj +-274 TJm +(chance) 27.6562 Tj +-275 TJm +(in) 7.7509 Tj +-275 TJm +(four) 16.5977 Tj +72 640.417 Td +(billion) 26.0223 Tj +-279 TJm +(for) 11.6164 Tj +-279 TJm +(each) 18.2515 Tj +-279 TJm +(\002le) 12.7322 Tj +-280 TJm +(processed.) 41.7732 Tj +-795 TJm +(Be) 11.0684 Tj +-279 TJm +(a) 4.42339 Tj +15 TJm +(w) 7.193 Tj +10 TJm +(are,) 14.655 Tj +-286 TJm +(though,) 30.1668 Tj +-287 TJm +(that) 14.9439 Tj +-279 TJm +(the) 12.1743 Tj +-279 TJm +(check) 23.2328 Tj +-279 TJm +(occurs) 26.0024 Tj +-279 TJm +(upon) 19.9252 Tj +-279 TJm +(decompression,) 62.2563 Tj +-287 TJm +(so) 8.85675 Tj +-279 TJm +(it) 5.53921 Tj +-279 TJm +(can) 13.8281 Tj +-279 TJm +(only) 17.7135 Tj +-280 TJm +(tell) 12.7322 Tj +-279 TJm +(you) 14.9439 Tj +72 628.462 Td +(that) 14.9439 Tj +-237 TJm +(something) 41.5142 Tj +-236 TJm +(is) 6.64505 Tj +-237 TJm +(wrong.) 27.9451 Tj +-611 TJm +(It) 6.08715 Tj +-237 TJm +(can') 17.1456 Tj +18 TJm +(t) 2.7696 Tj +-237 TJm +(help) 17.1556 Tj +-237 TJm +(you) 14.9439 Tj +-236 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-237 TJm +(the) 12.1743 Tj +-237 TJm +(original) 30.9936 Tj +-237 TJm +(uncompressed) 56.996 Tj +-236 TJm +(data.) 19.0883 Tj +-612 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-236 TJm +(can) 13.8281 Tj +-237 TJm +(use) 13.2801 Tj +[1 0 0 1 458.159 628.462] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -458.159 -628.462] cm +[1 0 0 1 0 0] Tm +0 0 Td +458.159 628.462 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 529.89 628.462] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -529.89 -628.462] cm +[1 0 0 1 0 0] Tm +0 0 Td +532.249 628.462 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +72 616.507 Td +(try) 11.0684 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(damaged) 35.965 Tj +-250 TJm +(\002les.) 19.0983 Tj +[1 0 0 1 72 614.35] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -604.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 594.708 Td +/F130_0 9.9626 Tf +(Return) 27.1182 Tj +-298 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +-406 TJm +(0) 4.9813 Tj +-298 TJm +(for) 11.6164 Tj +-298 TJm +(a) 4.42339 Tj +-298 TJm +(normal) 28.224 Tj +-298 TJm +(e) 4.42339 Tj +15 TJm +(xit,) 13.0112 Tj +-310 TJm +(1) 4.9813 Tj +-298 TJm +(for) 11.6164 Tj +-297 TJm +(en) 9.40469 Tj +40 TJm +(vironmental) 48.1492 Tj +-298 TJm +(problems) 37.0808 Tj +-298 TJm +(\(\002le) 16.0497 Tj +-298 TJm +(not) 12.7322 Tj +-298 TJm +(found,) 25.7334 Tj +-310 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +25 TJm +(alid) 14.9439 Tj +-298 TJm +(\003ags,) 21.31 Tj +-310 TJm +(I/O) 13.2801 Tj +-298 TJm +(errors,) 25.7234 Tj +-310 TJm +(etc.\),) 19.9152 Tj +-310 TJm +(2) 4.9813 Tj +-298 TJm +(to) 7.7509 Tj +72 582.753 Td +(indicate) 31.5416 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(corrupt) 28.772 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le,) 15.2229 Tj +-250 TJm +(3) 4.9813 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(internal) 30.4357 Tj +-250 TJm +(consistenc) 41.5042 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(\(e) 7.74094 Tj +15 TJm +(g,) 7.47195 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ug\)) 13.2801 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(caused) 27.1082 Tj +[1 0 0 1 443.065 582.753] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -443.065 -582.753] cm +[1 0 0 1 0 0] Tm +0 0 Td +443.065 582.753 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 472.953 582.753] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.953 -582.753] cm +[1 0 0 1 0 0] Tm +0 0 Td +475.444 582.753 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(panic.) 24.0696 Tj +[1 0 0 1 72 580.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -570.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 548.118 Td +/F122_0 20.6585 Tf +(2.4.) 34.4584 Tj +-278 TJm +(OPTIONS) 92.9839 Tj +[1 0 0 1 72 547.86] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -528.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 516.475 Td +/F134_0 9.9626 Tf +(-c) 11.9551 Tj +-600 TJm +(--stdout) 47.8205 Tj +[1 0 0 1 137.753 516.475] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -68.2441 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -516.32] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 504.52 Td +/F130_0 9.9626 Tf +(Compress) 39.8504 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(decompress) 47.0334 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(standard) 33.7533 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 502.363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -488.652] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 478.854 Td +/F134_0 9.9626 Tf +(-d) 11.9551 Tj +-600 TJm +(--decompress) 71.7307 Tj +[1 0 0 1 161.664 478.854] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -92.1544 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -477.32] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 466.899 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(orce) 17.1456 Tj +-296 TJm +(decompression.) 62.2563 Tj +[1 0 0 1 200.214 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -200.214 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +200.214 466.899 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 230.102 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -230.102 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.102 466.899 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 235.659 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -235.659 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +235.659 466.899 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 277.502 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.502 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +280.454 466.899 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 297.791 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -297.791 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +297.791 466.899 Td +/F134_0 9.9626 Tf +(bzcat) 29.8878 Tj +[1 0 0 1 327.679 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -327.679 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +330.631 466.899 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-296 TJm +(really) 22.6848 Tj +-296 TJm +(the) 12.1743 Tj +-297 TJm +(same) 20.4731 Tj +-296 TJm +(program,) 36.2439 Tj +-308 TJm +(and) 14.386 Tj +-296 TJm +(the) 12.1743 Tj +-296 TJm +(decision) 33.2053 Tj +-297 TJm +(about) 22.1369 Tj +108 454.944 Td +(what) 19.3673 Tj +-303 TJm +(actions) 28.224 Tj +-303 TJm +(to) 7.7509 Tj +-303 TJm +(tak) 12.1743 Tj +10 TJm +(e) 4.42339 Tj +-303 TJm +(is) 6.64505 Tj +-303 TJm +(done) 19.3673 Tj +-303 TJm +(on) 9.9626 Tj +-304 TJm +(the) 12.1743 Tj +-303 TJm +(basis) 19.9252 Tj +-303 TJm +(of) 8.29885 Tj +-303 TJm +(which) 24.3486 Tj +-303 TJm +(name) 21.579 Tj +-303 TJm +(is) 6.64505 Tj +-303 TJm +(used.) 20.7521 Tj +-939 TJm +(This) 17.7135 Tj +-303 TJm +(\003ag) 14.9439 Tj +-303 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(errides) 27.1082 Tj +-303 TJm +(that) 14.9439 Tj +-303 TJm +(mechanism,) 47.8703 Tj +-316 TJm +(and) 14.386 Tj +108 442.988 Td +(forces) 24.3386 Tj +-250 TJm +(bzip2) 22.1369 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(decompress.) 49.5241 Tj +[1 0 0 1 72 440.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -427.121] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 417.323 Td +/F134_0 9.9626 Tf +(-z) 11.9551 Tj +-600 TJm +(--compress) 59.7756 Tj +[1 0 0 1 149.709 417.323] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -80.1993 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -415.789] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 405.368 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(complement) 49.2551 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 187.969 405.368] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -187.969 -405.368] cm +[1 0 0 1 0 0] Tm +0 0 Td +187.969 405.368 Td +/F134_0 9.9626 Tf +(-d) 11.9551 Tj +[1 0 0 1 199.924 405.368] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -199.924 -405.368] cm +[1 0 0 1 0 0] Tm +0 0 Td +199.924 405.368 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +-310 TJm +(forces) 24.3386 Tj +-250 TJm +(compression,) 52.8516 Tj +-250 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(ardless) 27.6661 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +20 TJm +(okation) 29.8878 Tj +-250 TJm +(name.) 24.0696 Tj +[1 0 0 1 72 403.211] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -389.5] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 379.702 Td +/F134_0 9.9626 Tf +(-t) 11.9551 Tj +-600 TJm +(--test) 35.8654 Tj +[1 0 0 1 125.798 379.702] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -56.2889 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -379.548] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 367.747 Td +/F130_0 9.9626 Tf +(Check) 25.4544 Tj +-270 TJm +(inte) 14.9439 Tj +15 TJm +(grity) 18.8194 Tj +-271 TJm +(of) 8.29885 Tj +-270 TJm +(the) 12.1743 Tj +-271 TJm +(speci\002ed) 35.417 Tj +-270 TJm +(\002le\(s\),) 25.7334 Tj +-276 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-270 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-270 TJm +(decompress) 47.0334 Tj +-271 TJm +(them.) 22.4159 Tj +-742 TJm +(This) 17.7135 Tj +-271 TJm +(really) 22.6848 Tj +-270 TJm +(performs) 35.965 Tj +-270 TJm +(a) 4.42339 Tj +-271 TJm +(trial) 16.0497 Tj +-270 TJm +(decompres-) 46.4755 Tj +108 355.791 Td +(sion) 16.6077 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(thro) 16.0497 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(a) 4.42339 Tj +15 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(result.) 24.6275 Tj +[1 0 0 1 72 353.635] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -339.924] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 330.126 Td +/F134_0 9.9626 Tf +(-f) 11.9551 Tj +-600 TJm +(--force) 41.8429 Tj +[1 0 0 1 131.776 330.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -62.2665 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -329.971] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 318.171 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(orce) 17.1456 Tj +-338 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(erwrite) 28.2141 Tj +-339 TJm +(of) 8.29885 Tj +-338 TJm +(output) 25.4644 Tj +-338 TJm +(\002les.) 19.0983 Tj +-1150 TJm +(Normally) 38.1866 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 289.831 318.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -289.831 -318.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.831 318.171 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 319.719 318.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -319.719 -318.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +323.089 318.171 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-338 TJm +(not) 12.7322 Tj +-339 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(erwrite) 28.2141 Tj +-338 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +-338 TJm +(output) 25.4644 Tj +-338 TJm +(\002les.) 19.0983 Tj +-1150 TJm +(Also) 18.8194 Tj +-339 TJm +(forces) 24.3386 Tj +[1 0 0 1 108 306.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -306.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 306.215 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 137.888 306.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.888 -306.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.379 306.215 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(break) 22.1269 Tj +-250 TJm +(hard) 17.7035 Tj +-250 TJm +(links) 19.3773 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(\002les,) 19.0983 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(otherwise) 38.7346 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ouldn') 26.0123 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(do.) 12.4533 Tj +[1 0 0 1 72 304.681] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -294.837] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 284.416 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 137.888 284.416] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.888 -284.416] cm +[1 0 0 1 0 0] Tm +0 0 Td +141.211 284.416 Td +/F130_0 9.9626 Tf +(normally) 35.9749 Tj +-334 TJm +(declines) 32.6474 Tj +-333 TJm +(to) 7.7509 Tj +-334 TJm +(decompress) 47.0334 Tj +-333 TJm +(\002les) 16.6077 Tj +-334 TJm +(which) 24.3486 Tj +-333 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-334 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-333 TJm +(the) 12.1743 Tj +-334 TJm +(correct) 27.6562 Tj +-333 TJm +(magic) 24.3486 Tj +-334 TJm +(header) 26.5503 Tj +-333 TJm +(bytes.) 23.5217 Tj +-561 TJm +(If) 6.63509 Tj +-334 TJm +(forced) 25.4445 Tj +108 272.461 Td +(\() 3.31755 Tj +[1 0 0 1 111.318 272.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -111.318 -272.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +111.318 272.461 Td +/F134_0 9.9626 Tf +(-f) 11.9551 Tj +[1 0 0 1 123.273 272.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.273 -272.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +123.273 272.461 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-250 TJm +(ho) 9.9626 Tj +25 TJm +(we) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +40 TJm +(,) 2.49065 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(pass) 17.1556 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(through) 30.9936 Tj +-250 TJm +(unmodi\002ed.) 47.8803 Tj +-310 TJm +(This) 17.7135 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(GNU) 21.579 Tj +[1 0 0 1 412.585 272.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -412.585 -272.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +412.585 272.461 Td +/F134_0 9.9626 Tf +(gzip) 23.9102 Tj +[1 0 0 1 436.496 272.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -436.496 -272.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.986 272.461 Td +/F130_0 9.9626 Tf +(beha) 18.8094 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(es.) 10.7895 Tj +[1 0 0 1 72 270.304] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -256.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 246.795 Td +/F134_0 9.9626 Tf +(-k) 11.9551 Tj +-600 TJm +(--keep) 35.8654 Tj +[1 0 0 1 125.798 246.795] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -56.2889 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -245.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 234.84 Td +/F130_0 9.9626 Tf +(K) 7.193 Tj +25 TJm +(eep) 13.8281 Tj +-250 TJm +(\(don') 21.579 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(delete\)) 27.1082 Tj +-250 TJm +(input) 20.4831 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(during) 26.0123 Tj +-250 TJm +(compression) 50.3609 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(decompression.) 62.2563 Tj +[1 0 0 1 72 232.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -218.973] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 209.174 Td +/F134_0 9.9626 Tf +(-s) 11.9551 Tj +-600 TJm +(--small) 41.8429 Tj +[1 0 0 1 131.776 209.174] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -62.2665 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -209.02] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 197.219 Td +/F130_0 9.9626 Tf +(Reduce) 29.8778 Tj +-347 TJm +(memory) 33.2053 Tj +-347 TJm +(usage,) 25.1755 Tj +-371 TJm +(for) 11.6164 Tj +-346 TJm +(compression,) 52.8516 Tj +-371 TJm +(decompression) 59.7656 Tj +-347 TJm +(and) 14.386 Tj +-347 TJm +(testing.) 29.0609 Tj +-1201 TJm +(Files) 19.3773 Tj +-347 TJm +(are) 12.1643 Tj +-347 TJm +(decompressed) 56.4381 Tj +-346 TJm +(and) 14.386 Tj +-347 TJm +(tested) 23.2427 Tj +108 185.264 Td +(using) 21.589 Tj +-388 TJm +(a) 4.42339 Tj +-388 TJm +(modi\002ed) 35.427 Tj +-388 TJm +(algorithm) 38.7446 Tj +-389 TJm +(which) 24.3486 Tj +-388 TJm +(only) 17.7135 Tj +-388 TJm +(requires) 32.0895 Tj +-388 TJm +(2.5) 12.4533 Tj +-388 TJm +(bytes) 21.031 Tj +-388 TJm +(per) 12.7222 Tj +-388 TJm +(block) 22.1369 Tj +-389 TJm +(byte.) 19.6462 Tj +-1448 TJm +(This) 17.7135 Tj +-389 TJm +(means) 25.4544 Tj +-388 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-388 TJm +(\002le) 12.7322 Tj +-388 TJm +(can) 13.8281 Tj +-388 TJm +(be) 9.40469 Tj +108 173.309 Td +(decompressed) 56.4381 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(2300k) 24.9065 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(albeit) 22.1369 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(about) 22.1369 Tj +-250 TJm +(half) 15.4918 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(normal) 28.224 Tj +-250 TJm +(speed.) 25.1755 Tj +[1 0 0 1 72 171.152] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -161.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 151.51 Td +/F130_0 9.9626 Tf +(During) 28.224 Tj +-252 TJm +(compr) 25.4544 Tj +1 TJm +(ession,) 27.3972 Tj +[1 0 0 1 194.09 151.51] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -194.09 -151.51] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.09 151.51 Td +/F134_0 9.9626 Tf +(-s) 11.9551 Tj +[1 0 0 1 206.046 151.51] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -206.046 -151.51] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.551 151.51 Td +/F130_0 9.9626 Tf +(selects) 26.5603 Tj +-251 TJm +(a) 4.42339 Tj +-252 TJm +(block) 22.1369 Tj +-251 TJm +(size) 15.4918 Tj +-252 TJm +(of) 8.29885 Tj +-252 TJm +(200k,) 22.4159 Tj +-251 TJm +(which) 24.3486 Tj +-252 TJm +(limits) 22.7048 Tj +-251 TJm +(memory) 33.2053 Tj +-252 TJm +(use) 13.2801 Tj +-251 TJm +(to) 7.7509 Tj +-252 TJm +(around) 27.6661 Tj +-251 TJm +(the) 12.1743 Tj +-252 TJm +(same) 20.4731 Tj +-251 TJm +(\002gure,) 25.7334 Tj +-252 TJm +(at) 7.193 Tj +108 139.554 Td +(the) 12.1743 Tj +-287 TJm +(e) 4.42339 Tj +15 TJm +(xpense) 27.6661 Tj +-287 TJm +(of) 8.29885 Tj +-288 TJm +(your) 18.2614 Tj +-287 TJm +(compression) 50.3609 Tj +-287 TJm +(ratio.) 20.7521 Tj +-843 TJm +(In) 8.29885 Tj +-287 TJm +(short,) 22.4159 Tj +-297 TJm +(if) 6.08715 Tj +-287 TJm +(your) 18.2614 Tj +-287 TJm +(machine) 33.7533 Tj +-287 TJm +(is) 6.64505 Tj +-287 TJm +(lo) 7.7509 Tj +25 TJm +(w) 7.193 Tj +-287 TJm +(on) 9.9626 Tj +-288 TJm +(memory) 33.2053 Tj +-287 TJm +(\(8) 8.29885 Tj +-287 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(abytes) 25.4544 Tj +-287 TJm +(or) 8.29885 Tj +-287 TJm +(less\),) 20.7521 Tj +108 127.599 Td +(use) 13.2801 Tj +[1 0 0 1 123.771 127.599] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.771 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +123.771 127.599 Td +/F134_0 9.9626 Tf +(-s) 11.9551 Tj +[1 0 0 1 135.726 127.599] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -135.726 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +138.216 127.599 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-250 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(erything.) 35.696 Tj +-620 TJm +(See) 14.386 Tj +[1 0 0 1 220.079 127.599] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -220.079 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.079 127.599 Td +/F130_0 9.9626 Tf +(MEMOR) 37.6387 Tj +65 TJm +(Y) 7.193 Tj +-250 TJm +(MAN) 23.2427 Tj +35 TJm +(A) 7.193 Tj +40 TJm +(GEMENT) 41.5042 Tj +[1 0 0 1 337.946 127.599] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -337.946 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +340.437 127.599 Td +/F130_0 9.9626 Tf +([5]) 11.6164 Tj +[1 0 0 1 352.053 127.599] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -352.053 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +354.544 127.599 Td +/F130_0 9.9626 Tf +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 125.443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -111.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 101.934 Td +/F134_0 9.9626 Tf +(-q) 11.9551 Tj +-600 TJm +(--quiet) 41.8429 Tj +[1 0 0 1 131.776 101.934] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -62.2665 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -100.399] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 89.9784 Td +/F130_0 9.9626 Tf +(Suppress) 35.9749 Tj +-221 TJm +(non-essential) 52.5726 Tj +-220 TJm +(w) 7.193 Tj +10 TJm +(arning) 25.4544 Tj +-221 TJm +(messages.) 40.1194 Tj +-300 TJm +(Messages) 38.7346 Tj +-221 TJm +(pertaining) 40.3983 Tj +-221 TJm +(to) 7.7509 Tj +-220 TJm +(I/O) 13.2801 Tj +-221 TJm +(errors) 23.2328 Tj +-221 TJm +(and) 14.386 Tj +-220 TJm +(other) 20.4731 Tj +-221 TJm +(critical) 27.6661 Tj +-221 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ents) 16.0497 Tj +-221 TJm +(wi) 9.9626 Tj +1 TJm +(ll) 5.53921 Tj +-221 TJm +(not) 12.7322 Tj +108 78.0232 Td +(be) 9.40469 Tj +-250 TJm +(suppressed.) 46.2065 Tj +[1 0 0 1 72 75.8664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.1482] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.8518 Td +/F130_0 9.9626 Tf +(4) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 8 8 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F134_0 9.9626 Tf +(-v) 11.9551 Tj +-600 TJm +(--verbose) 53.798 Tj +[1 0 0 1 143.731 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -74.2217 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -709.883] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 698.082 Td +/F130_0 9.9626 Tf +(V) 7.193 Tj +111 TJm +(erbose) 26.0024 Tj +-323 TJm +(mode) 22.1369 Tj +-322 TJm +(--) 6.63509 Tj +-323 TJm +(sho) 13.8381 Tj +25 TJm +(w) 7.193 Tj +-322 TJm +(the) 12.1743 Tj +-323 TJm +(compression) 50.3609 Tj +-323 TJm +(ratio) 18.2614 Tj +-322 TJm +(for) 11.6164 Tj +-323 TJm +(each) 18.2515 Tj +-322 TJm +(\002le) 12.7322 Tj +-323 TJm +(processed.) 41.7732 Tj +-1056 TJm +(Further) 29.3299 Tj +[1 0 0 1 430.015 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -430.015 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +430.015 698.082 Td +/F134_0 9.9626 Tf +(-v) 11.9551 Tj +[1 0 0 1 441.97 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.97 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.97 698.082 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +-323 TJm +(increase) 32.6375 Tj +-322 TJm +(the) 12.1743 Tj +-323 TJm +(v) 4.9813 Tj +15 TJm +(erbosity) 32.0995 Tj +108 686.127 Td +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el,) 9.68365 Tj +-250 TJm +(spe) 13.2801 Tj +25 TJm +(wing) 19.9252 Tj +-250 TJm +(out) 12.7322 Tj +-250 TJm +(lots) 14.396 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(information) 47.0434 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(primarily) 37.0808 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(interest) 29.3299 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(diagnostic) 40.9562 Tj +-250 TJm +(purposes.) 37.9077 Tj +[1 0 0 1 72 683.97] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -670.023] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 660.224 Td +/F134_0 9.9626 Tf +(-L) 11.9551 Tj +-600 TJm +(--license) 53.798 Tj +-600 TJm +(-V) 11.9551 Tj +-600 TJm +(--version) 53.798 Tj +[1 0 0 1 221.44 660.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -151.93 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -660.07] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 648.269 Td +/F130_0 9.9626 Tf +(Display) 30.9936 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(softw) 22.1369 Tj +10 TJm +(are) 12.1643 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ersion,) 26.8392 Tj +-250 TJm +(license) 27.6661 Tj +-250 TJm +(terms) 22.1369 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(conditions.) 44.0048 Tj +[1 0 0 1 72 646.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -632.165] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 622.366 Td +/F134_0 9.9626 Tf +(-1) 11.9551 Tj +[1 0 0 1 83.9552 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.4458 622.366 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 100.553 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -100.553 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +100.553 622.366 Td +/F134_0 9.9626 Tf +(--fast) 35.8654 Tj +[1 0 0 1 136.418 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -136.418 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +136.418 622.366 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 152.468 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -152.468 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +152.468 622.366 Td +/F134_0 9.9626 Tf +(-9) 11.9551 Tj +[1 0 0 1 164.423 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.423 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.914 622.366 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 181.021 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -181.021 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.021 622.366 Td +/F134_0 9.9626 Tf +(-best) 29.8878 Tj +[1 0 0 1 210.909 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.909 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.909 622.366 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +[1 0 0 1 214.226 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -142.226 -1.7832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -620.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 610.411 Td +/F130_0 9.9626 Tf +(Set) 12.7322 Tj +-288 TJm +(the) 12.1743 Tj +-289 TJm +(block) 22.1369 Tj +-288 TJm +(size) 15.4918 Tj +-288 TJm +(to) 7.7509 Tj +-288 TJm +(100) 14.9439 Tj +-289 TJm +(k,) 7.47195 Tj +-298 TJm +(200) 14.9439 Tj +-288 TJm +(k) 4.9813 Tj +-288 TJm +(...) 7.47195 Tj +-850 TJm +(900) 14.9439 Tj +-288 TJm +(k) 4.9813 Tj +-288 TJm +(when) 21.579 Tj +-289 TJm +(compressing.) 52.8516 Tj +-849 TJm +(Has) 15.4918 Tj +-289 TJm +(no) 9.9626 Tj +-288 TJm +(ef) 7.74094 Tj +25 TJm +(fect) 14.9339 Tj +-288 TJm +(when) 21.579 Tj +-288 TJm +(decompressing.) 62.2563 Tj +-850 TJm +(See) 14.386 Tj +[1 0 0 1 108 598.456] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -108 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 598.456 Td +/F130_0 9.9626 Tf +(MEMOR) 37.6387 Tj +65 TJm +(Y) 7.193 Tj +-297 TJm +(MAN) 23.2427 Tj +35 TJm +(A) 7.193 Tj +40 TJm +(GEMENT) 41.5042 Tj +[1 0 0 1 226.338 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -226.338 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.3 598.456 Td +/F130_0 9.9626 Tf +([5]) 11.6164 Tj +[1 0 0 1 240.916 598.456] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.916 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.878 598.456 Td +/F130_0 9.9626 Tf +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +-904 TJm +(The) 15.4918 Tj +[1 0 0 1 297.278 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -297.278 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +297.278 598.456 Td +/F134_0 9.9626 Tf +(--fast) 35.8654 Tj +[1 0 0 1 333.144 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -333.144 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +336.106 598.456 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 353.454 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -353.454 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +353.454 598.456 Td +/F134_0 9.9626 Tf +(--best) 35.8654 Tj +[1 0 0 1 389.319 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -389.319 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.281 598.456 Td +/F130_0 9.9626 Tf +(aliases) 26.5603 Tj +-297 TJm +(are) 12.1643 Tj +-298 TJm +(primarily) 37.0808 Tj +-297 TJm +(for) 11.6164 Tj +-297 TJm +(GNU) 21.579 Tj +[1 0 0 1 516.09 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -516.09 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +516.09 598.456 Td +/F134_0 9.9626 Tf +(gzip) 23.9102 Tj +[1 0 0 1 540 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 586.501 Td +/F130_0 9.9626 Tf +(compatibility) 53.1405 Tj +65 TJm +(.) 2.49065 Tj +-356 TJm +(In) 8.29885 Tj +-265 TJm +(particular) 38.1767 Tj +40 TJm +(,) 2.49065 Tj +[1 0 0 1 220.423 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.423 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.423 586.501 Td +/F134_0 9.9626 Tf +(--fast) 35.8654 Tj +[1 0 0 1 256.288 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -256.288 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.932 586.501 Td +/F130_0 9.9626 Tf +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-265 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-266 TJm +(things) 24.3586 Tj +-265 TJm +(signi\002cantly) 49.2651 Tj +-265 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +55 TJm +(.) 2.49065 Tj +-712 TJm +(And) 17.1556 Tj +[1 0 0 1 444.622 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.622 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +444.622 586.501 Td +/F134_0 9.9626 Tf +(--best) 35.8654 Tj +[1 0 0 1 480.487 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -480.487 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +483.131 586.501 Td +/F130_0 9.9626 Tf +(merely) 27.6661 Tj +-265 TJm +(selects) 26.5603 Tj +108 574.546 Td +(the) 12.1743 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 574.446] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -560.498] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 548.643 Td +/F134_0 9.9626 Tf +(--) 11.9551 Tj +[1 0 0 1 83.9552 548.643] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -14.4458 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -548.643] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 536.688 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +35 TJm +(reats) 18.8094 Tj +-261 TJm +(all) 9.9626 Tj +-261 TJm +(subsequent) 44.2738 Tj +-260 TJm +(ar) 7.74094 Tj +18 TJm +(guments) 33.7633 Tj +-261 TJm +(as) 8.29885 Tj +-261 TJm +(\002le) 12.7322 Tj +-261 TJm +(names,) 27.9451 Tj +-263 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-261 TJm +(if) 6.08715 Tj +-261 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-260 TJm +(start) 17.1556 Tj +-261 TJm +(with) 17.7135 Tj +-261 TJm +(a) 4.42339 Tj +-261 TJm +(dash.) 20.7521 Tj +-685 TJm +(This) 17.7135 Tj +-260 TJm +(is) 6.64505 Tj +-261 TJm +(so) 8.85675 Tj +-261 TJm +(you) 14.9439 Tj +-261 TJm +(can) 13.8281 Tj +-260 TJm +(handle) 26.5603 Tj +-261 TJm +(\002les) 16.6077 Tj +108 524.732 Td +(with) 17.7135 Tj +-250 TJm +(names) 25.4544 Tj +-250 TJm +(be) 9.40469 Tj +15 TJm +(ginning) 30.4457 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(dash,) 20.7521 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xample:) 32.0995 Tj +[1 0 0 1 302.27 524.732] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -302.27 -524.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.27 524.732 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(--) 11.9551 Tj +-600 TJm +(-myfilename) 65.7532 Tj +[1 0 0 1 421.821 524.732] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -421.821 -524.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +421.821 524.732 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 522.576] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -508.628] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 498.83 Td +/F134_0 9.9626 Tf +(--repetitive-fast) 101.619 Tj +[1 0 0 1 173.619 498.83] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.619 -498.83] cm +[1 0 0 1 0 0] Tm +0 0 Td +173.619 498.83 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 178.6 498.83] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.582 -498.83] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.582 498.83 Td +/F134_0 9.9626 Tf +(--repetitive-best) 101.619 Tj +[1 0 0 1 285.2 498.83] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -215.691 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -497.295] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 486.874 Td +/F130_0 9.9626 Tf +(These) 23.7907 Tj +-207 TJm +(\003ags) 18.8194 Tj +-206 TJm +(are) 12.1643 Tj +-207 TJm +(redundant) 39.8404 Tj +-207 TJm +(in) 7.7509 Tj +-206 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-207 TJm +(0.9.5) 19.9252 Tj +-207 TJm +(and) 14.386 Tj +-206 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e.) 6.91404 Tj +-591 TJm +(The) 15.4918 Tj +15 TJm +(y) 4.9813 Tj +-207 TJm +(pro) 13.2801 Tj +15 TJm +(vided) 22.1369 Tj +-207 TJm +(some) 21.031 Tj +-207 TJm +(c) 4.42339 Tj +1 TJm +(o) 4.9813 Tj +-1 TJm +(a) 4.42339 Tj +1 TJm +(rse) 11.6164 Tj +-207 TJm +(control) 28.224 Tj +-207 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-207 TJm +(the) 12.1743 Tj +-206 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +108 474.919 Td +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-251 TJm +(sorting) 27.6761 Tj +-250 TJm +(algorithm) 38.7446 Tj +-250 TJm +(in) 7.7509 Tj +-251 TJm +(earlier) 25.4445 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ersions,) 30.7147 Tj +-250 TJm +(which) 24.3486 Tj +-251 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(sometimes) 42.62 Tj +-250 TJm +(useful.) 26.8392 Tj +-622 TJm +(0.9.5) 19.9252 Tj +-251 TJm +(and) 14.386 Tj +-250 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-251 TJm +(an) 9.40469 Tj +-250 TJm +(impro) 23.8007 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ed) 9.40469 Tj +108 462.964 Td +(algorithm) 38.7446 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(renders) 29.3199 Tj +-250 TJm +(these) 20.4731 Tj +-250 TJm +(\003ags) 18.8194 Tj +-250 TJm +(irrele) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant.) 14.6649 Tj +[1 0 0 1 72 460.807] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -436.897] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 414.264 Td +/F122_0 20.6585 Tf +(2.5.) 34.4584 Tj +-278 TJm +(MEMOR) 79.184 Tj +50 TJm +(Y) 13.7792 Tj +-278 TJm +(MANA) 61.9548 Tj +50 TJm +(GEMENT) 88.3771 Tj +[1 0 0 1 72 414.005] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -404.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 392.346 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 392.346] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -392.346] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.454 392.346 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-258 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-257 TJm +(\002les) 16.6077 Tj +-258 TJm +(in) 7.7509 Tj +-257 TJm +(blocks.) 28.503 Tj +-666 TJm +(The) 15.4918 Tj +-257 TJm +(block) 22.1369 Tj +-258 TJm +(size) 15.4918 Tj +-258 TJm +(af) 7.74094 Tj +25 TJm +(fects) 18.8094 Tj +-257 TJm +(both) 17.7135 Tj +-258 TJm +(the) 12.1743 Tj +-257 TJm +(compression) 50.3609 Tj +-258 TJm +(ratio) 18.2614 Tj +-257 TJm +(achie) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ed,) 11.8953 Tj +-260 TJm +(and) 14.386 Tj +-258 TJm +(the) 12.1743 Tj +-257 TJm +(amount) 29.8878 Tj +72 380.391 Td +(of) 8.29885 Tj +-215 TJm +(memory) 33.2053 Tj +-215 TJm +(needed) 28.2141 Tj +-215 TJm +(for) 11.6164 Tj +-215 TJm +(compression) 50.3609 Tj +-214 TJm +(and) 14.386 Tj +-215 TJm +(decompression.) 62.2563 Tj +-597 TJm +(The) 15.4918 Tj +-215 TJm +(\003ags) 18.8194 Tj +[1 0 0 1 337.719 380.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -337.719 -380.391] cm +[1 0 0 1 0 0] Tm +0 0 Td +337.719 380.391 Td +/F134_0 9.9626 Tf +(-1) 11.9551 Tj +[1 0 0 1 349.674 380.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -349.674 -380.391] cm +[1 0 0 1 0 0] Tm +0 0 Td +351.815 380.391 Td +/F130_0 9.9626 Tf +(through) 30.9936 Tj +[1 0 0 1 384.95 380.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -384.95 -380.391] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.95 380.391 Td +/F134_0 9.9626 Tf +(-9) 11.9551 Tj +[1 0 0 1 396.905 380.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -396.905 -380.391] cm +[1 0 0 1 0 0] Tm +0 0 Td +399.046 380.391 Td +/F130_0 9.9626 Tf +(specify) 28.772 Tj +-215 TJm +(the) 12.1743 Tj +-215 TJm +(block) 22.1369 Tj +-215 TJm +(size) 15.4918 Tj +-215 TJm +(to) 7.7509 Tj +-214 TJm +(be) 9.40469 Tj +-215 TJm +(100,000) 32.3785 Tj +72 368.435 Td +(bytes) 21.031 Tj +-278 TJm +(through) 30.9936 Tj +-277 TJm +(900,000) 32.3785 Tj +-278 TJm +(bytes) 21.031 Tj +-278 TJm +(\(the) 15.4918 Tj +-277 TJm +(def) 12.7222 Tj +10 TJm +(ault\)) 18.2614 Tj +-278 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +-786 TJm +(At) 9.9626 Tj +-278 TJm +(decompression) 59.7656 Tj +-278 TJm +(time,) 20.2042 Tj +-284 TJm +(the) 12.1743 Tj +-278 TJm +(block) 22.1369 Tj +-278 TJm +(size) 15.4918 Tj +-277 TJm +(used) 18.2614 Tj +-278 TJm +(for) 11.6164 Tj +-278 TJm +(compression) 50.3609 Tj +72 356.48 Td +(is) 6.64505 Tj +-243 TJm +(read) 17.1456 Tj +-242 TJm +(from) 19.3673 Tj +-243 TJm +(the) 12.1743 Tj +-242 TJm +(header) 26.5503 Tj +-243 TJm +(of) 8.29885 Tj +-242 TJm +(the) 12.1743 Tj +-243 TJm +(compressed) 47.0334 Tj +-242 TJm +(\002le,) 15.2229 Tj +-244 TJm +(and) 14.386 Tj +[1 0 0 1 275.174 356.48] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -275.174 -356.48] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.174 356.48 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 317.017 356.48] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -317.017 -356.48] cm +[1 0 0 1 0 0] Tm +0 0 Td +319.433 356.48 Td +/F130_0 9.9626 Tf +(then) 17.1556 Tj +-243 TJm +(all) 9.9626 Tj +1 TJm +(o) 4.9813 Tj +-1 TJm +(c) 4.42339 Tj +1 TJm +(ates) 15.4918 Tj +-243 TJm +(itself) 19.9252 Tj +-242 TJm +(just) 14.396 Tj +-243 TJm +(enough) 29.3299 Tj +-243 TJm +(memory) 33.2053 Tj +-242 TJm +(to) 7.7509 Tj +-243 TJm +(decompress) 47.0334 Tj +72 344.525 Td +(the) 12.1743 Tj +-303 TJm +(\002le.) 15.2229 Tj +-940 TJm +(Since) 22.1369 Tj +-304 TJm +(block) 22.1369 Tj +-303 TJm +(sizes) 19.3673 Tj +-303 TJm +(are) 12.1643 Tj +-303 TJm +(stored) 24.3486 Tj +-304 TJm +(in) 7.7509 Tj +-303 TJm +(compressed) 47.0334 Tj +-303 TJm +(\002les,) 19.0983 Tj +-317 TJm +(it) 5.53921 Tj +-303 TJm +(follo) 18.8194 Tj +25 TJm +(ws) 11.0684 Tj +-304 TJm +(that) 14.9439 Tj +-303 TJm +(the) 12.1743 Tj +-303 TJm +(\003ags) 18.8194 Tj +[1 0 0 1 406.35 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.35 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +406.35 344.525 Td +/F134_0 9.9626 Tf +(-1) 11.9551 Tj +[1 0 0 1 418.305 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -418.305 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +421.327 344.525 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +[1 0 0 1 432.1 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -432.1 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +432.1 344.525 Td +/F134_0 9.9626 Tf +(-9) 11.9551 Tj +[1 0 0 1 444.055 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.055 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +447.077 344.525 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-303 TJm +(irrele) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant) 12.1743 Tj +-304 TJm +(to) 7.7509 Tj +-303 TJm +(and) 14.386 Tj +-303 TJm +(so) 8.85675 Tj +72 332.57 Td +(ignored) 30.4357 Tj +-250 TJm +(during) 26.0123 Tj +-250 TJm +(decompression.) 62.2563 Tj +[1 0 0 1 72 330.413] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -320.45] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 310.652 Td +/F130_0 9.9626 Tf +(Compression) 52.5826 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(requirements,) 54.5054 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(bytes,) 23.5217 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(estimated) 38.1866 Tj +-250 TJm +(as:) 11.0684 Tj +[1 0 0 1 72 308.495] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -299.13] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 299.13 Td +/F134_0 9.9626 Tf +(Compression:) 71.7307 Tj +-1278 TJm +(400k) 23.9102 Tj +-426 TJm +(+) 5.97756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(8) 5.97756 Tj +-426 TJm +(x) 5.97756 Tj +-426 TJm +(block) 29.8878 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(\)) 5.97756 Tj +90 275.22 Td +(Decompression:) 83.6858 Tj +-426 TJm +(100k) 23.9102 Tj +-426 TJm +(+) 5.97756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(4) 5.97756 Tj +-426 TJm +(x) 5.97756 Tj +-426 TJm +(block) 29.8878 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(\),) 11.9551 Tj +-426 TJm +(or) 11.9551 Tj +153.66 263.265 Td +(100k) 23.9102 Tj +-426 TJm +(+) 5.97756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(2.5) 17.9327 Tj +-426 TJm +(x) 5.97756 Tj +-426 TJm +(block) 29.8878 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(\)) 5.97756 Tj +[1 0 0 1 72 247.723] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -237.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 225.805 Td +/F130_0 9.9626 Tf +(Lar) 13.8281 Tj +18 TJm +(ger) 12.7222 Tj +-292 TJm +(block) 22.1369 Tj +-292 TJm +(sizes) 19.3673 Tj +-291 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-292 TJm +(rapidly) 28.224 Tj +-292 TJm +(diminishing) 47.6113 Tj +-292 TJm +(mar) 15.4918 Tj +18 TJm +(ginal) 19.9252 Tj +-291 TJm +(returns.) 30.1568 Tj +-871 TJm +(Most) 20.4831 Tj +-292 TJm +(of) 8.29885 Tj +-291 TJm +(the) 12.1743 Tj +-292 TJm +(compression) 50.3609 Tj +-292 TJm +(comes) 25.4544 Tj +-292 TJm +(from) 19.3673 Tj +-291 TJm +(the) 12.1743 Tj +-292 TJm +(\002rst) 15.5018 Tj +-292 TJm +(tw) 9.9626 Tj +10 TJm +(o) 4.9813 Tj +-292 TJm +(or) 8.29885 Tj +72 213.85 Td +(three) 19.9152 Tj +-232 TJm +(hundred) 32.6474 Tj +-232 TJm +(k) 4.9813 Tj +-232 TJm +(of) 8.29885 Tj +-232 TJm +(block) 22.1369 Tj +-232 TJm +(size,) 17.9825 Tj +-235 TJm +(a) 4.42339 Tj +-232 TJm +(f) 3.31755 Tj +10 TJm +(act) 11.6164 Tj +-232 TJm +(w) 7.193 Tj +10 TJm +(orth) 16.0497 Tj +-232 TJm +(bearing) 29.8778 Tj +-232 TJm +(in) 7.7509 Tj +-232 TJm +(mind) 20.4831 Tj +-232 TJm +(when) 21.579 Tj +-231 TJm +(using) 21.589 Tj +[1 0 0 1 354.025 213.85] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -354.025 -213.85] cm +[1 0 0 1 0 0] Tm +0 0 Td +354.025 213.85 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 383.913 213.85] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -383.913 -213.85] cm +[1 0 0 1 0 0] Tm +0 0 Td +386.223 213.85 Td +/F130_0 9.9626 Tf +(on) 9.9626 Tj +-232 TJm +(small) 21.589 Tj +-232 TJm +(machines.) 40.1194 Tj +-304 TJm +(It) 6.08715 Tj +-232 TJm +(is) 6.64505 Tj +-232 TJm +(also) 16.0497 Tj +-231 TJm +(important) 38.7446 Tj +72 201.895 Td +(to) 7.7509 Tj +-250 TJm +(appreciate) 40.9363 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(memory) 33.2053 Tj +-250 TJm +(requirement) 48.1393 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(set) 11.0684 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(compression) 50.3609 Tj +-250 TJm +(time) 17.7135 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(choice) 26.0024 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(block) 22.1369 Tj +-250 TJm +(size.) 17.9825 Tj +[1 0 0 1 72 199.738] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -189.776] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 179.977 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-388 TJm +(\002les) 16.6077 Tj +-389 TJm +(compressed) 47.0334 Tj +-388 TJm +(with) 17.7135 Tj +-389 TJm +(the) 12.1743 Tj +-388 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-389 TJm +(900k) 19.9252 Tj +-388 TJm +(block) 22.1369 Tj +-389 TJm +(size,) 17.9825 Tj +[1 0 0 1 302.002 179.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -302.002 -179.977] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.002 179.977 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 343.846 179.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -343.846 -179.977] cm +[1 0 0 1 0 0] Tm +0 0 Td +347.715 179.977 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-388 TJm +(require) 28.2141 Tj +-389 TJm +(about) 22.1369 Tj +-388 TJm +(3700) 19.9252 Tj +-389 TJm +(kbytes) 26.0123 Tj +-388 TJm +(to) 7.7509 Tj +-389 TJm +(decompress.) 49.5241 Tj +72 168.022 Td +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-424 TJm +(support) 29.8878 Tj +-425 TJm +(decompression) 59.7656 Tj +-424 TJm +(of) 8.29885 Tj +-424 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-425 TJm +(\002l) 8.30881 Tj +1 TJm +(e) 4.42339 Tj +-425 TJm +(on) 9.9626 Tj +-424 TJm +(a) 4.42339 Tj +-424 TJm +(4) 4.9813 Tj +-425 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(abyte) 21.579 Tj +-424 TJm +(machine,) 36.2439 Tj +[1 0 0 1 348.272 168.022] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -348.272 -168.022] cm +[1 0 0 1 0 0] Tm +0 0 Td +348.272 168.022 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 390.115 168.022] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -390.115 -168.022] cm +[1 0 0 1 0 0] Tm +0 0 Td +394.342 168.022 Td +/F130_0 9.9626 Tf +(has) 13.2801 Tj +-424 TJm +(an) 9.40469 Tj +-425 TJm +(option) 25.4644 Tj +-424 TJm +(to) 7.7509 Tj +-424 TJm +(decompress) 47.0334 Tj +-424 TJm +(using) 21.589 Tj +72 156.067 Td +(approximately) 57.5539 Tj +-281 TJm +(half) 15.4918 Tj +-281 TJm +(this) 14.396 Tj +-280 TJm +(amount) 29.8878 Tj +-281 TJm +(of) 8.29885 Tj +-281 TJm +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-288 TJm +(about) 22.1369 Tj +-281 TJm +(2300) 19.9252 Tj +-281 TJm +(kbytes.) 28.503 Tj +-805 TJm +(Decompression) 61.9773 Tj +-280 TJm +(speed) 22.6848 Tj +-281 TJm +(is) 6.64505 Tj +-281 TJm +(also) 16.0497 Tj +-281 TJm +(halv) 17.1556 Tj +15 TJm +(ed,) 11.8953 Tj +-288 TJm +(so) 8.85675 Tj +-281 TJm +(you) 14.9439 Tj +-281 TJm +(should) 26.5703 Tj +72 144.112 Td +(use) 13.2801 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(option) 25.4644 Tj +-250 TJm +(only) 17.7135 Tj +-250 TJm +(where) 24.3386 Tj +-250 TJm +(necessary) 38.7246 Tj +65 TJm +(.) 2.49065 Tj +-620 TJm +(The) 15.4918 Tj +-250 TJm +(rele) 14.9339 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant) 12.1743 Tj +-250 TJm +(\003ag) 14.9439 Tj +-250 TJm +(is) 6.64505 Tj +[1 0 0 1 305.024 144.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -305.024 -144.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +305.024 144.112 Td +/F134_0 9.9626 Tf +(-s) 11.9551 Tj +[1 0 0 1 316.979 144.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.979 -144.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +316.979 144.112 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 141.955] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -131.992] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 122.194 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +-204 TJm +(general,) 31.8106 Tj +-214 TJm +(try) 11.0684 Tj +-204 TJm +(and) 14.386 Tj +-205 TJm +(use) 13.2801 Tj +-204 TJm +(the) 12.1743 Tj +-204 TJm +(lar) 10.5105 Tj +18 TJm +(gest) 16.0497 Tj +-205 TJm +(block) 22.1369 Tj +-204 TJm +(size) 15.4918 Tj +-205 TJm +(memory) 33.2053 Tj +-204 TJm +(constraints) 43.1679 Tj +-204 TJm +(allo) 14.9439 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +-214 TJm +(since) 20.4731 Tj +-204 TJm +(that) 14.9439 Tj +-205 TJm +(maximises) 42.62 Tj +-204 TJm +(the) 12.1743 Tj +-204 TJm +(compression) 50.3609 Tj +-205 TJm +(achie) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ed.) 11.8953 Tj +72 110.239 Td +(Compression) 52.5826 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(speed) 22.6848 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(virtually) 33.7633 Tj +-250 TJm +(unaf) 17.7035 Tj +25 TJm +(fected) 24.3386 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(block) 22.1369 Tj +-250 TJm +(size.) 17.9825 Tj +[1 0 0 1 72 108.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -98.1193] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 88.321 Td +/F130_0 9.9626 Tf +(Another) 32.6474 Tj +-296 TJm +(signi\002cant) 41.5142 Tj +-296 TJm +(point) 20.4831 Tj +-295 TJm +(applies) 28.224 Tj +-296 TJm +(to) 7.7509 Tj +-296 TJm +(\002les) 16.6077 Tj +-296 TJm +(which) 24.3486 Tj +-296 TJm +(\002t) 8.30881 Tj +-296 TJm +(in) 7.7509 Tj +-296 TJm +(a) 4.42339 Tj +-295 TJm +(single) 23.8007 Tj +-296 TJm +(block) 22.1369 Tj +-296 TJm +(--) 6.63509 Tj +-296 TJm +(that) 14.9439 Tj +-296 TJm +(means) 25.4544 Tj +-296 TJm +(most) 19.3773 Tj +-295 TJm +(\002les) 16.6077 Tj +-296 TJm +(you') 18.2614 Tj +50 TJm +(d) 4.9813 Tj +-296 TJm +(encounter) 39.2825 Tj +-296 TJm +(using) 21.589 Tj +-296 TJm +(a) 4.42339 Tj +72 76.3658 Td +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-290 TJm +(block) 22.1369 Tj +-290 TJm +(size.) 17.9825 Tj +-859 TJm +(The) 15.4918 Tj +-290 TJm +(amount) 29.8878 Tj +-290 TJm +(of) 8.29885 Tj +-290 TJm +(real) 14.9339 Tj +-290 TJm +(memory) 33.2053 Tj +-289 TJm +(touched) 31.5416 Tj +-290 TJm +(is) 6.64505 Tj +-290 TJm +(proportional) 49.2551 Tj +-290 TJm +(to) 7.7509 Tj +-290 TJm +(the) 12.1743 Tj +-290 TJm +(size) 15.4918 Tj +-290 TJm +(of) 8.29885 Tj +-290 TJm +(the) 12.1743 Tj +-289 TJm +(\002le,) 15.2229 Tj +-300 TJm +(since) 20.4731 Tj +-290 TJm +(the) 12.1743 Tj +-290 TJm +(\002le) 12.7322 Tj +-290 TJm +(is) 6.64505 Tj +-290 TJm +(smaller) 29.3299 Tj +[1 0 0 1 72 50.8518] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.9514 Td +/F130_0 9.9626 Tf +(5) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 9 9 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(than) 17.1556 Tj +-362 TJm +(a) 4.42339 Tj +-362 TJm +(block.) 24.6275 Tj +-1293 TJm +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-362 TJm +(e) 4.42339 Tj +15 TJm +(xample,) 31.8205 Tj +-390 TJm +(compressing) 50.3609 Tj +-362 TJm +(a) 4.42339 Tj +-362 TJm +(\002le) 12.7322 Tj +-362 TJm +(20,000) 27.3972 Tj +-362 TJm +(bytes) 21.031 Tj +-362 TJm +(long) 17.7135 Tj +-362 TJm +(with) 17.7135 Tj +-362 TJm +(the) 12.1743 Tj +-362 TJm +(\003ag) 14.9439 Tj +[1 0 0 1 406.528 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.528 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +406.528 710.037 Td +/F134_0 9.9626 Tf +(-9) 11.9551 Tj +[1 0 0 1 418.483 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -418.483 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +422.09 710.037 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-362 TJm +(cause) 22.1269 Tj +-362 TJm +(the) 12.1743 Tj +-362 TJm +(compressor) 45.9276 Tj +-362 TJm +(to) 7.7509 Tj +72 698.082 Td +(allocate) 30.9837 Tj +-271 TJm +(around) 27.6661 Tj +-272 TJm +(7600k) 24.9065 Tj +-271 TJm +(of) 8.29885 Tj +-272 TJm +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-277 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-271 TJm +(only) 17.7135 Tj +-272 TJm +(touch) 22.1369 Tj +-271 TJm +(400k) 19.9252 Tj +-272 TJm +(+) 5.61891 Tj +-271 TJm +(20000) 24.9065 Tj +-272 TJm +(*) 4.9813 Tj +-271 TJm +(8) 4.9813 Tj +-272 TJm +(=) 5.61891 Tj +-271 TJm +(560) 14.9439 Tj +-272 TJm +(kbytes) 26.0123 Tj +-271 TJm +(of) 8.29885 Tj +-272 TJm +(it.) 8.02986 Tj +-748 TJm +(Similarly) 37.0908 Tj +65 TJm +(,) 2.49065 Tj +-277 TJm +(the) 12.1743 Tj +-272 TJm +(decompressor) 55.3323 Tj +72 686.127 Td +(will) 15.5018 Tj +-250 TJm +(allocate) 30.9837 Tj +-250 TJm +(3700k) 24.9065 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(only) 17.7135 Tj +-250 TJm +(touch) 22.1369 Tj +-250 TJm +(100k) 19.9252 Tj +-250 TJm +(+) 5.61891 Tj +-250 TJm +(20000) 24.9065 Tj +-250 TJm +(*) 4.9813 Tj +-250 TJm +(4) 4.9813 Tj +-250 TJm +(=) 5.61891 Tj +-250 TJm +(180) 14.9439 Tj +-250 TJm +(kbytes.) 28.503 Tj +[1 0 0 1 72 683.97] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -674.008] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 664.209 Td +/F130_0 9.9626 Tf +(Here) 19.3573 Tj +-293 TJm +(is) 6.64505 Tj +-294 TJm +(a) 4.42339 Tj +-293 TJm +(table) 19.3673 Tj +-294 TJm +(which) 24.3486 Tj +-293 TJm +(summarises) 47.0434 Tj +-294 TJm +(the) 12.1743 Tj +-293 TJm +(maximum) 40.4083 Tj +-294 TJm +(memory) 33.2053 Tj +-293 TJm +(usage) 22.6848 Tj +-294 TJm +(for) 11.6164 Tj +-293 TJm +(dif) 11.0684 Tj +25 TJm +(ferent) 23.2328 Tj +-294 TJm +(block) 22.1369 Tj +-293 TJm +(sizes.) 21.8579 Tj +-881 TJm +(Also) 18.8194 Tj +-293 TJm +(recorded) 34.8492 Tj +-294 TJm +(is) 6.64505 Tj +-293 TJm +(the) 12.1743 Tj +-294 TJm +(total) 17.7135 Tj +72 652.254 Td +(compressed) 47.0334 Tj +-289 TJm +(size) 15.4918 Tj +-289 TJm +(for) 11.6164 Tj +-289 TJm +(14) 9.9626 Tj +-289 TJm +(\002les) 16.6077 Tj +-290 TJm +(of) 8.29885 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(Calg) 18.8194 Tj +5 TJm +(ary) 12.7222 Tj +-289 TJm +(T) 6.08715 Tj +70 TJm +(e) 4.42339 Tj +15 TJm +(xt) 7.7509 Tj +-289 TJm +(Compression) 52.5826 Tj +-289 TJm +(Corpus) 28.782 Tj +-289 TJm +(totalling) 33.2153 Tj +-289 TJm +(3,141,622) 39.8504 Tj +-290 TJm +(bytes.) 23.5217 Tj +-854 TJm +(This) 17.7135 Tj +-290 TJm +(column) 29.8878 Tj +-289 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +72 640.299 Td +(some) 21.031 Tj +-253 TJm +(feel) 14.9339 Tj +-253 TJm +(for) 11.6164 Tj +-253 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-253 TJm +(compression) 50.3609 Tj +-253 TJm +(v) 4.9813 Tj +25 TJm +(aries) 18.8094 Tj +-253 TJm +(with) 17.7135 Tj +-253 TJm +(block) 22.1369 Tj +-253 TJm +(size.) 17.9825 Tj +-638 TJm +(These) 23.7907 Tj +-253 TJm +(\002gures) 27.1182 Tj +-253 TJm +(tend) 17.1556 Tj +-254 TJm +(to) 7.7509 Tj +-253 TJm +(understate) 40.9463 Tj +-253 TJm +(the) 12.1743 Tj +-253 TJm +(adv) 14.386 Tj +25 TJm +(antage) 26.0024 Tj +-253 TJm +(of) 8.29885 Tj +-253 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-253 TJm +(block) 22.1369 Tj +72 628.344 Td +(sizes) 19.3673 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-250 TJm +(\002les,) 19.0983 Tj +-250 TJm +(since) 20.4731 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(Corpus) 28.782 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(dominated) 42.0621 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(smaller) 29.3299 Tj +-250 TJm +(\002les.) 19.0983 Tj +[1 0 0 1 72 626.187] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -156.413] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 155.417 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 151.831] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -616.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +123.952 616.822 Td +/F134_0 9.9626 Tf +(Compress) 47.8205 Tj +-1278 TJm +(Decompress) 59.7756 Tj +-1278 TJm +(Decompress) 59.7756 Tj +-1278 TJm +(Corpus) 35.8654 Tj +90 604.867 Td +(Flag) 23.9102 Tj +-2130 TJm +(usage) 29.8878 Tj +-2556 TJm +(usage) 29.8878 Tj +-2982 TJm +(-s) 11.9551 Tj +-426 TJm +(usage) 29.8878 Tj +-2130 TJm +(Size) 23.9102 Tj +94.244 580.956 Td +(-1) 11.9551 Tj +-2556 TJm +(1200k) 29.8878 Tj +-2982 TJm +(500k) 23.9102 Tj +-3834 TJm +(350k) 23.9102 Tj +-2556 TJm +(914704) 35.8654 Tj +94.244 569.001 Td +(-2) 11.9551 Tj +-2556 TJm +(2000k) 29.8878 Tj +-2982 TJm +(900k) 23.9102 Tj +-3834 TJm +(600k) 23.9102 Tj +-2556 TJm +(877703) 35.8654 Tj +94.244 557.046 Td +(-3) 11.9551 Tj +-2556 TJm +(2800k) 29.8878 Tj +-2556 TJm +(1300k) 29.8878 Tj +-3834 TJm +(850k) 23.9102 Tj +-2556 TJm +(860338) 35.8654 Tj +94.244 545.091 Td +(-4) 11.9551 Tj +-2556 TJm +(3600k) 29.8878 Tj +-2556 TJm +(1700k) 29.8878 Tj +-3408 TJm +(1100k) 29.8878 Tj +-2556 TJm +(846899) 35.8654 Tj +94.244 533.136 Td +(-5) 11.9551 Tj +-2556 TJm +(4400k) 29.8878 Tj +-2556 TJm +(2100k) 29.8878 Tj +-3408 TJm +(1350k) 29.8878 Tj +-2556 TJm +(845160) 35.8654 Tj +94.244 521.181 Td +(-6) 11.9551 Tj +-2556 TJm +(5200k) 29.8878 Tj +-2556 TJm +(2500k) 29.8878 Tj +-3408 TJm +(1600k) 29.8878 Tj +-2556 TJm +(838626) 35.8654 Tj +94.244 509.225 Td +(-7) 11.9551 Tj +-2556 TJm +(6100k) 29.8878 Tj +-2556 TJm +(2900k) 29.8878 Tj +-3408 TJm +(1850k) 29.8878 Tj +-2556 TJm +(834096) 35.8654 Tj +94.244 497.27 Td +(-8) 11.9551 Tj +-2556 TJm +(6800k) 29.8878 Tj +-2556 TJm +(3300k) 29.8878 Tj +-3408 TJm +(2100k) 29.8878 Tj +-2556 TJm +(828642) 35.8654 Tj +94.244 485.315 Td +(-9) 11.9551 Tj +-2556 TJm +(7600k) 29.8878 Tj +-2556 TJm +(3700k) 29.8878 Tj +-3408 TJm +(2350k) 29.8878 Tj +-2556 TJm +(828642) 35.8654 Tj +[1 0 0 1 72 469.773] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -459.811] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 435.021 Td +/F122_0 20.6585 Tf +(2.6.) 34.4584 Tj +-278 TJm +(RECO) 59.6824 Tj +50 TJm +(VERING) 79.2047 Tj +-278 TJm +(D) 14.9154 Tj +40 TJm +(A) 14.9154 Tj +90 TJm +(T) 12.6223 Tj +90 TJm +(A) 14.9154 Tj +-278 TJm +(FR) 27.5378 Tj +20 TJm +(OM) 33.2808 Tj +-278 TJm +(D) 14.9154 Tj +40 TJm +(AMA) 47.0394 Tj +50 TJm +(GED) 44.767 Tj +72 410.23 Td +(FILES) 58.5462 Tj +[1 0 0 1 72 409.972] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -400.01] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 388.312 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 388.312] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -388.312] cm +[1 0 0 1 0 0] Tm +0 0 Td +105.138 388.312 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-326 TJm +(\002les) 16.6077 Tj +-326 TJm +(in) 7.7509 Tj +-326 TJm +(blocks,) 28.503 Tj +-346 TJm +(usually) 28.782 Tj +-326 TJm +(900kbytes) 40.9562 Tj +-326 TJm +(long.) 20.2042 Tj +-1077 TJm +(Each) 19.9152 Tj +-326 TJm +(block) 22.1369 Tj +-327 TJm +(is) 6.64505 Tj +-326 TJm +(handled) 31.5416 Tj +-326 TJm +(independently) 56.4481 Tj +65 TJm +(.) 2.49065 Tj +-1077 TJm +(If) 6.63509 Tj +-326 TJm +(a) 4.42339 Tj +-326 TJm +(media) 24.3486 Tj +-326 TJm +(or) 8.29885 Tj +72 376.357 Td +(transmission) 50.3709 Tj +-319 TJm +(error) 19.3573 Tj +-318 TJm +(causes) 26.0024 Tj +-319 TJm +(a) 4.42339 Tj +-318 TJm +(multi-block) 46.4955 Tj +[1 0 0 1 234.518 376.357] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.518 -376.357] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.518 376.357 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 258.429 376.357] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -258.429 -376.357] cm +[1 0 0 1 0 0] Tm +0 0 Td +261.603 376.357 Td +/F130_0 9.9626 Tf +(\002le) 12.7322 Tj +-319 TJm +(to) 7.7509 Tj +-318 TJm +(become) 30.9837 Tj +-319 TJm +(damaged,) 38.4556 Tj +-336 TJm +(it) 5.53921 Tj +-318 TJm +(may) 17.1556 Tj +-319 TJm +(be) 9.40469 Tj +-318 TJm +(possible) 32.6574 Tj +-319 TJm +(to) 7.7509 Tj +-318 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-319 TJm +(data) 16.5977 Tj +-319 TJm +(from) 19.3673 Tj +-318 TJm +(the) 12.1743 Tj +72 364.402 Td +(undamaged) 45.9276 Tj +-250 TJm +(blocks) 26.0123 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002le.) 15.2229 Tj +[1 0 0 1 72 362.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -352.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 342.484 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-358 TJm +(compressed) 47.0334 Tj +-357 TJm +(representation) 56.4381 Tj +-358 TJm +(of) 8.29885 Tj +-357 TJm +(each) 18.2515 Tj +-358 TJm +(block) 22.1369 Tj +-358 TJm +(is) 6.64505 Tj +-357 TJm +(delimited) 37.6387 Tj +-358 TJm +(by) 9.9626 Tj +-357 TJm +(a) 4.42339 Tj +-358 TJm +(48-bit) 23.8007 Tj +-358 TJm +(pattern,) 30.1568 Tj +-384 TJm +(which) 24.3486 Tj +-358 TJm +(mak) 17.1556 Tj +10 TJm +(es) 8.29885 Tj +-357 TJm +(it) 5.53921 Tj +-358 TJm +(possible) 32.6574 Tj +-357 TJm +(to) 7.7509 Tj +-358 TJm +(\002nd) 15.5018 Tj +-358 TJm +(the) 12.1743 Tj +72 330.529 Td +(block) 22.1369 Tj +-286 TJm +(boundaries) 43.7159 Tj +-286 TJm +(wit) 12.7322 Tj +1 TJm +(h) 4.9813 Tj +-286 TJm +(reasonable) 42.6001 Tj +-286 TJm +(certainty) 34.8591 Tj +65 TJm +(.) 2.49065 Tj +-835 TJm +(Each) 19.9152 Tj +-285 TJm +(block) 22.1369 Tj +-286 TJm +(also) 16.0497 Tj +-286 TJm +(carries) 26.5503 Tj +-286 TJm +(its) 9.41466 Tj +-285 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +-286 TJm +(32-bit) 23.8007 Tj +-286 TJm +(CRC,) 22.4258 Tj +-286 TJm +(so) 8.85675 Tj +-285 TJm +(damaged) 35.965 Tj +-286 TJm +(blocks) 26.0123 Tj +-286 TJm +(can) 13.8281 Tj +-286 TJm +(be) 9.40469 Tj +72 318.574 Td +(distinguished) 53.1405 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(undamaged) 45.9276 Tj +-250 TJm +(ones.) 20.7521 Tj +[1 0 0 1 72 316.417] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -306.455] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 296.656 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 143.731 296.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -296.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.448 296.656 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-273 TJm +(a) 4.42339 Tj +-272 TJm +(simple) 26.5703 Tj +-273 TJm +(program) 33.7533 Tj +-273 TJm +(whose) 25.4544 Tj +-272 TJm +(purpose) 31.5416 Tj +-273 TJm +(is) 6.64505 Tj +-273 TJm +(to) 7.7509 Tj +-272 TJm +(search) 25.4445 Tj +-273 TJm +(for) 11.6164 Tj +-273 TJm +(blocks) 26.0123 Tj +-272 TJm +(in) 7.7509 Tj +[1 0 0 1 392.655 296.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.655 -296.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.655 296.656 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 416.566 296.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -416.566 -296.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.282 296.656 Td +/F130_0 9.9626 Tf +(\002les,) 19.0983 Tj +-278 TJm +(and) 14.386 Tj +-273 TJm +(write) 20.4731 Tj +-273 TJm +(each) 18.2515 Tj +-272 TJm +(block) 22.1369 Tj +-273 TJm +(out) 12.7322 Tj +72 284.701 Td +(into) 15.5018 Tj +-254 TJm +(its) 9.41466 Tj +-255 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +[1 0 0 1 121.43 284.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -121.43 -284.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +121.43 284.701 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 145.34 284.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -145.34 -284.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +147.875 284.701 Td +/F130_0 9.9626 Tf +(\002le.) 15.2229 Tj +-647 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-255 TJm +(can) 13.8281 Tj +-254 TJm +(then) 17.1556 Tj +-255 TJm +(use) 13.2801 Tj +[1 0 0 1 240.01 284.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.01 -284.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +240.01 284.701 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(-t) 11.9551 Tj +[1 0 0 1 287.831 284.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.831 -284.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +290.367 284.701 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-255 TJm +(t) 2.7696 Tj +1 TJm +(est) 11.0684 Tj +-255 TJm +(the) 12.1743 Tj +-254 TJm +(inte) 14.9439 Tj +15 TJm +(grity) 18.8194 Tj +-255 TJm +(of) 8.29885 Tj +-254 TJm +(the) 12.1743 Tj +-255 TJm +(resulting) 34.8691 Tj +-254 TJm +(\002les,) 19.0983 Tj +-256 TJm +(and) 14.386 Tj +-255 TJm +(decompress) 47.0334 Tj +-254 TJm +(those) 21.031 Tj +72 272.746 Td +(which) 24.3486 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(undamaged.) 48.4182 Tj +[1 0 0 1 72 270.589] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -260.626] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 250.828 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 143.731 250.828] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -250.828] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.099 250.828 Td +/F130_0 9.9626 Tf +(tak) 12.1743 Tj +10 TJm +(es) 8.29885 Tj +-639 TJm +(a) 4.42339 Tj +-639 TJm +(single) 23.8007 Tj +-639 TJm +(ar) 7.74094 Tj +18 TJm +(gument,) 32.3785 Tj +-737 TJm +(the) 12.1743 Tj +-639 TJm +(name) 21.579 Tj +-639 TJm +(of) 8.29885 Tj +-639 TJm +(the) 12.1743 Tj +-639 TJm +(damaged) 35.965 Tj +-639 TJm +(\002le,) 15.2229 Tj +-737 TJm +(and) 14.386 Tj +-639 TJm +(writes) 24.3486 Tj +-639 TJm +(a) 4.42339 Tj +-639 TJm +(number) 30.4357 Tj +-639 TJm +(of) 8.29885 Tj +-640 TJm +(\002les) 16.6077 Tj +[1 0 0 1 72 238.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -238.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 238.873 Td +/F134_0 9.9626 Tf +(rec0001file.bz2) 89.6634 Tj +[1 0 0 1 161.664 238.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.664 -238.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.664 238.873 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 169.072 238.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.072 -238.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.072 238.873 Td +/F134_0 9.9626 Tf +(rec0002file.bz2) 89.6634 Tj +[1 0 0 1 258.736 238.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -258.736 -238.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.736 238.873 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-494 TJm +(etc,) 14.107 Tj +-493 TJm +(containing) 42.0621 Tj +-445 TJm +(the) 12.1743 Tj +-445 TJm +(e) 4.42339 Tj +15 TJm +(xtracted) 32.0895 Tj +-445 TJm +(blocks.) 28.503 Tj +-1789 TJm +(The) 15.4918 Tj +-445 TJm +(output) 25.4644 Tj +-445 TJm +(\002lenames) 38.1866 Tj +-445 TJm +(are) 12.1643 Tj +72 226.918 Td +(designed) 35.417 Tj +-337 TJm +(so) 8.85675 Tj +-337 TJm +(that) 14.9439 Tj +-337 TJm +(the) 12.1743 Tj +-337 TJm +(use) 13.2801 Tj +-337 TJm +(of) 8.29885 Tj +-337 TJm +(wildc) 22.1369 Tj +1 TJm +(ards) 16.5977 Tj +-337 TJm +(in) 7.7509 Tj +-337 TJm +(subsequent) 44.2738 Tj +-337 TJm +(processing) 42.61 Tj +-337 TJm +(--) 6.63509 Tj +-337 TJm +(for) 11.6164 Tj +-337 TJm +(e) 4.42339 Tj +15 TJm +(xample,) 31.8205 Tj +[1 0 0 1 396.538 226.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -396.538 -226.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +396.538 226.918 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(-dc) 17.9327 Tj +-600 TJm +(rec) 17.9327 Tj +474.247 225.174 Td +(*) 5.97756 Tj +480.224 226.918 Td +(file.bz2) 47.8205 Tj +-600 TJm +(>) 5.97756 Tj +72 214.963 Td +(recovered_data) 83.6858 Tj +[1 0 0 1 155.686 214.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -214.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.177 214.963 Td +/F130_0 9.9626 Tf +(--) 6.63509 Tj +-250 TJm +(lists) 16.0597 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(correct) 27.6562 Tj +-250 TJm +(order) 21.0211 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 213.653] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -203.69] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 193.045 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 143.731 193.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -193.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.93 193.045 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-221 TJm +(be) 9.40469 Tj +-220 TJm +(of) 8.29885 Tj +-221 TJm +(most) 19.3773 Tj +-221 TJm +(use) 13.2801 Tj +-220 TJm +(dealing) 29.3299 Tj +-221 TJm +(with) 17.7135 Tj +-221 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +[1 0 0 1 307.229 193.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -307.229 -193.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +307.229 193.045 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 331.14 193.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.14 -193.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +333.338 193.045 Td +/F130_0 9.9626 Tf +(\002les,) 19.0983 Tj +-227 TJm +(as) 8.29885 Tj +-220 TJm +(these) 20.4731 Tj +-221 TJm +(will) 15.5018 Tj +-221 TJm +(contain) 29.3299 Tj +-220 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-221 TJm +(blocks.) 28.503 Tj +-600 TJm +(It) 6.08715 Tj +-221 TJm +(is) 6.64505 Tj +-221 TJm +(clearly) 27.1082 Tj +72 181.09 Td +(futile) 21.031 Tj +-289 TJm +(to) 7.7509 Tj +-289 TJm +(use) 13.2801 Tj +-289 TJm +(it) 5.53921 Tj +-289 TJm +(on) 9.9626 Tj +-289 TJm +(damaged) 35.965 Tj +-289 TJm +(single-block) 49.2551 Tj +-290 TJm +(\002les) 16.6077 Tj +1 TJm +(,) 2.49065 Tj +-299 TJm +(since) 20.4731 Tj +-289 TJm +(a) 4.42339 Tj +-290 TJm +(damaged) 35.965 Tj +-289 TJm +(block) 22.1369 Tj +-289 TJm +(cannot) 26.5603 Tj +-289 TJm +(be) 9.40469 Tj +-289 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ered.) 19.6363 Tj +-854 TJm +(If) 6.63509 Tj +-289 TJm +(you) 14.9439 Tj +-290 TJm +(wish) 18.8194 Tj +-289 TJm +(to) 7.7509 Tj +-289 TJm +(minimise) 37.0908 Tj +72 169.135 Td +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-320 TJm +(potential) 34.8691 Tj +-320 TJm +(data) 16.5977 Tj +-319 TJm +(loss) 15.5018 Tj +-320 TJm +(through) 30.9936 Tj +-320 TJm +(media) 24.3486 Tj +-320 TJm +(or) 8.29885 Tj +-319 TJm +(transmission) 50.3709 Tj +-320 TJm +(errors,) 25.7234 Tj +-337 TJm +(you) 14.9439 Tj +-320 TJm +(might) 23.2527 Tj +-320 TJm +(consider) 33.7533 Tj +-320 TJm +(compressing) 50.3609 Tj +-319 TJm +(with) 17.7135 Tj +-320 TJm +(a) 4.42339 Tj +-320 TJm +(smaller) 29.3299 Tj +-320 TJm +(block) 22.1369 Tj +72 157.179 Td +(size.) 17.9825 Tj +[1 0 0 1 72 157.08] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -147.117] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 122.426 Td +/F122_0 20.6585 Tf +(2.7.) 34.4584 Tj +-278 TJm +(PERFORMANCE) 161.818 Tj +-278 TJm +(NO) 30.9877 Tj +40 TJm +(TES) 40.1808 Tj +[1 0 0 1 72 122.168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -112.206] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 100.509 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-305 TJm +(sorting) 27.6761 Tj +-304 TJm +(phase) 22.6848 Tj +-305 TJm +(of) 8.29885 Tj +-304 TJm +(compression) 50.3609 Tj +-305 TJm +(g) 4.9813 Tj +5 TJm +(athers) 23.7907 Tj +-304 TJm +(together) 32.6474 Tj +-305 TJm +(similar) 27.6761 Tj +-304 TJm +(strings) 26.5703 Tj +-305 TJm +(in) 7.7509 Tj +-304 TJm +(the) 12.1743 Tj +-305 TJm +(\002le.) 15.2229 Tj +-947 TJm +(Because) 33.1954 Tj +-305 TJm +(of) 8.29885 Tj +-304 TJm +(this,) 16.8866 Tj +-319 TJm +(\002les) 16.6077 Tj +-304 TJm +(containing) 42.0621 Tj +-305 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +72 88.5534 Td +(long) 17.7135 Tj +-286 TJm +(runs) 17.1556 Tj +-285 TJm +(of) 8.29885 Tj +-286 TJm +(repeated) 33.7433 Tj +-285 TJm +(symbols,) 35.706 Tj +-295 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-286 TJm +("aabaabaabaab) 59.3771 Tj +-285 TJm +(...") 11.5367 Tj +-571 TJm +(\(repeated) 37.0609 Tj +-286 TJm +(se) 8.29885 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(eral) 14.9339 Tj +-286 TJm +(hundred) 32.6474 Tj +-285 TJm +(times\)) 24.9065 Tj +-286 TJm +(may) 17.1556 Tj +-286 TJm +(com) 17.1556 Tj +1 TJm +(press) 20.4731 Tj +-286 TJm +(more) 20.4731 Tj +-286 TJm +(slo) 11.6264 Tj +25 TJm +(wly) 14.9439 Tj +72 76.5983 Td +(than) 17.1556 Tj +-322 TJm +(normal.) 30.7147 Tj +-524 TJm +(V) 7.193 Tj +111 TJm +(ersions) 28.224 Tj +-322 TJm +(0.9.5) 19.9252 Tj +-321 TJm +(and) 14.386 Tj +-322 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-322 TJm +(f) 3.31755 Tj +10 TJm +(are) 12.1643 Tj +-321 TJm +(much) 22.1369 Tj +-322 TJm +(better) 22.6848 Tj +-321 TJm +(than) 17.1556 Tj +-322 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-321 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-322 TJm +(in) 7.7509 Tj +-322 TJm +(this) 14.396 Tj +-321 TJm +(respect.) 30.7047 Tj +-1050 TJm +(The) 15.4918 Tj +-321 TJm +(ratio) 18.2614 Tj +-322 TJm +(between) 33.1954 Tj +[1 0 0 1 72 50.8518] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.9514 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 10 10 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(w) 7.193 Tj +10 TJm +(orst-case) 35.4071 Tj +-289 TJm +(and) 14.386 Tj +-290 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(erage-case) 42.0322 Tj +-289 TJm +(compression) 50.3609 Tj +-290 TJm +(time) 17.7135 Tj +-289 TJm +(is) 6.64505 Tj +-290 TJm +(in) 7.7509 Tj +-289 TJm +(the) 12.1743 Tj +-290 TJm +(re) 7.74094 Tj +15 TJm +(gion) 17.7135 Tj +-289 TJm +(of) 8.29885 Tj +-289 TJm +(10:1.) 20.2042 Tj +-857 TJm +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-290 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-289 TJm +(v) 4.9813 Tj +15 TJm +(ersions,) 30.7147 Tj +-299 TJm +(this) 14.396 Tj +-290 TJm +(\002gure) 23.2427 Tj +-289 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-290 TJm +(more) 20.4731 Tj +72 698.082 Td +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-250 TJm +(100:1.) 25.1855 Tj +-620 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 186.002 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.002 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +186.002 698.082 Td +/F134_0 9.9626 Tf +(-vvvv) 29.8878 Tj +[1 0 0 1 215.889 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -215.889 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +218.38 698.082 Td +/F130_0 9.9626 Tf +(option) 25.4644 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(monitor) 31.5516 Tj +-250 TJm +(progress) 33.7533 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(great) 19.9152 Tj +-250 TJm +(detail,) 24.6275 Tj +-250 TJm +(if) 6.08715 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant.) 14.6649 Tj +[1 0 0 1 72 695.925] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -685.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 676.164 Td +/F130_0 9.9626 Tf +(Decompression) 61.9773 Tj +-250 TJm +(speed) 22.6848 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(unaf) 17.7035 Tj +25 TJm +(fected) 24.3386 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(these) 20.4731 Tj +-250 TJm +(phenomena.) 48.4182 Tj +[1 0 0 1 72 674.007] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -664.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 654.247 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 654.247] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -654.247] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.863 654.247 Td +/F130_0 9.9626 Tf +(usually) 28.782 Tj +-299 TJm +(allocates) 34.8591 Tj +-298 TJm +(se) 8.29885 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(eral) 14.9339 Tj +-299 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(abytes) 25.4544 Tj +-298 TJm +(of) 8.29885 Tj +-299 TJm +(memory) 33.2053 Tj +-299 TJm +(to) 7.7509 Tj +-298 TJm +(operate) 29.3199 Tj +-299 TJm +(in,) 10.2416 Tj +-311 TJm +(and) 14.386 Tj +-298 TJm +(then) 17.1556 Tj +-299 TJm +(char) 17.1456 Tj +18 TJm +(ges) 13.2801 Tj +-298 TJm +(all) 9.9626 Tj +-299 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-299 TJm +(it) 5.53921 Tj +-298 TJm +(in) 7.7509 Tj +-299 TJm +(a) 4.42339 Tj +-298 TJm +(f) 3.31755 Tj +10 TJm +(airly) 18.2614 Tj +-299 TJm +(random) 30.4357 Tj +72 642.291 Td +(f) 3.31755 Tj +10 TJm +(ashion.) 28.503 Tj +-743 TJm +(This) 17.7135 Tj +-270 TJm +(means) 25.4544 Tj +-271 TJm +(that) 14.9439 Tj +-270 TJm +(performance,) 52.8317 Tj +-276 TJm +(both) 17.7135 Tj +-270 TJm +(for) 11.6164 Tj +-271 TJm +(compressing) 50.3609 Tj +-270 TJm +(and) 14.386 Tj +-271 TJm +(decompressing,) 62.2563 Tj +-275 TJm +(is) 6.64505 Tj +-271 TJm +(lar) 10.5105 Tj +18 TJm +(gely) 17.1556 Tj +-270 TJm +(determined) 44.8217 Tj +-271 TJm +(by) 9.9626 Tj +-270 TJm +(the) 12.1743 Tj +-271 TJm +(speed) 22.6848 Tj +72 630.336 Td +(at) 7.193 Tj +-294 TJm +(which) 24.3486 Tj +-294 TJm +(your) 18.2614 Tj +-294 TJm +(machine) 33.7533 Tj +-295 TJm +(ca) 8.84679 Tj +1 TJm +(n) 4.9813 Tj +-295 TJm +(service) 28.2141 Tj +-294 TJm +(cache) 22.6749 Tj +-294 TJm +(misses.) 29.0609 Tj +-442 TJm +(Because) 33.1954 Tj +-294 TJm +(of) 8.29885 Tj +-294 TJm +(this,) 16.8866 Tj +-306 TJm +(small) 21.589 Tj +-294 TJm +(changes) 32.0895 Tj +-294 TJm +(to) 7.7509 Tj +-294 TJm +(the) 12.1743 Tj +-294 TJm +(code) 18.8094 Tj +-294 TJm +(to) 7.7509 Tj +-294 TJm +(reduce) 26.5503 Tj +-294 TJm +(the) 12.1743 Tj +-295 TJm +(miss) 18.2714 Tj +-294 TJm +(rate) 14.9339 Tj +72 618.381 Td +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-253 TJm +(been) 18.8094 Tj +-253 TJm +(observ) 26.5603 Tj +15 TJm +(ed) 9.40469 Tj +-253 TJm +(to) 7.7509 Tj +-253 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-253 TJm +(disproportionately) 73.0557 Tj +-253 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-253 TJm +(performance) 50.341 Tj +-253 TJm +(impro) 23.8007 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ements.) 30.7147 Tj +-639 TJm +(I) 3.31755 Tj +-253 TJm +(imagine) 32.0995 Tj +[1 0 0 1 438.909 618.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.909 -618.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.909 618.381 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 468.796 618.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468.796 -618.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +471.318 618.381 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-253 TJm +(perform) 32.0895 Tj +-253 TJm +(best) 16.0497 Tj +72 606.426 Td +(on) 9.9626 Tj +-250 TJm +(machines) 37.6287 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-250 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-250 TJm +(caches.) 29.041 Tj +[1 0 0 1 72 604.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -594.306] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 571.673 Td +/F122_0 20.6585 Tf +(2.8.) 34.4584 Tj +-278 TJm +(CA) 29.8309 Tj +80 TJm +(VEA) 42.4739 Tj +90 TJm +(TS) 26.4016 Tj +[1 0 0 1 72 571.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -561.452] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 549.755 Td +/F130_0 9.9626 Tf +(I/O) 13.2801 Tj +-268 TJm +(error) 19.3573 Tj +-267 TJm +(messages) 37.6287 Tj +-268 TJm +(are) 12.1643 Tj +-268 TJm +(not) 12.7322 Tj +-268 TJm +(as) 8.29885 Tj +-267 TJm +(helpful) 28.224 Tj +-268 TJm +(as) 8.29885 Tj +-268 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-267 TJm +(could) 22.1369 Tj +-268 TJm +(be.) 11.8953 Tj +[1 0 0 1 293.313 549.755] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.313 -549.755] cm +[1 0 0 1 0 0] Tm +0 0 Td +293.313 549.755 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 323.201 549.755] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -323.201 -549.755] cm +[1 0 0 1 0 0] Tm +0 0 Td +325.868 549.755 Td +/F130_0 9.9626 Tf +(tries) 17.1556 Tj +-268 TJm +(hard) 17.7035 Tj +-267 TJm +(to) 7.7509 Tj +-268 TJm +(detect) 23.7907 Tj +-268 TJm +(I/O) 13.2801 Tj +-268 TJm +(errors) 23.2328 Tj +-267 TJm +(and) 14.386 Tj +-268 TJm +(e) 4.42339 Tj +15 TJm +(xit) 10.5205 Tj +-268 TJm +(cleanly) 28.772 Tj +65 TJm +(,) 2.49065 Tj +-272 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-268 TJm +(the) 12.1743 Tj +72 537.8 Td +(details) 26.0123 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(what) 19.3673 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(problem) 33.2053 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(sometimes) 42.62 Tj +-250 TJm +(seem) 20.4731 Tj +-250 TJm +(rather) 23.2328 Tj +-250 TJm +(misleading.) 46.2165 Tj +[1 0 0 1 72 535.643] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -525.681] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 515.882 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-280 TJm +(manual) 29.3299 Tj +-279 TJm +(page) 18.8094 Tj +-280 TJm +(pertains) 31.5416 Tj +-280 TJm +(to) 7.7509 Tj +-279 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-280 TJm +(1.0.5) 19.9252 Tj +-280 TJm +(of) 8.29885 Tj +[1 0 0 1 256.84 515.882] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -256.84 -515.882] cm +[1 0 0 1 0 0] Tm +0 0 Td +256.84 515.882 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 286.728 515.882] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -286.728 -515.882] cm +[1 0 0 1 0 0] Tm +0 0 Td +286.728 515.882 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-798 TJm +(Compressed) 49.2551 Tj +-280 TJm +(data) 16.5977 Tj +-279 TJm +(created) 28.762 Tj +-280 TJm +(by) 9.9626 Tj +-280 TJm +(this) 14.396 Tj +-279 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-280 TJm +(is) 6.64505 Tj +-280 TJm +(entirely) 30.4357 Tj +-279 TJm +(forw) 18.8094 Tj +10 TJm +(ards) 16.5977 Tj +72 503.927 Td +(and) 14.386 Tj +-294 TJm +(backw) 26.0024 Tj +10 TJm +(ards) 16.5977 Tj +-293 TJm +(compatible) 44.2738 Tj +-294 TJm +(with) 17.7135 Tj +-294 TJm +(the) 12.1743 Tj +-293 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-294 TJm +(public) 24.9065 Tj +-294 TJm +(releases,) 34.0223 Tj +-304 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-294 TJm +(0.1pl2,) 27.6761 Tj +-305 TJm +(0.9.0) 19.9252 Tj +-293 TJm +(and) 14.386 Tj +-294 TJm +(0.9.5,) 22.4159 Tj +-305 TJm +(1.0.0,) 22.4159 Tj +-304 TJm +(1.0.1,) 22.4159 Tj +-305 TJm +(1.0.2) 19.9252 Tj +-294 TJm +(and) 14.386 Tj +72 491.972 Td +(1.0.3,) 22.4159 Tj +-263 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-260 TJm +(with) 17.7135 Tj +-260 TJm +(the) 12.1743 Tj +-260 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-260 TJm +(e) 4.42339 Tj +15 TJm +(xception:) 37.0808 Tj +-330 TJm +(0.9.0) 19.9252 Tj +-260 TJm +(and) 14.386 Tj +-260 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-260 TJm +(can) 13.8281 Tj +-260 TJm +(correctly) 35.4071 Tj +-260 TJm +(decompress) 47.0334 Tj +-260 TJm +(multiple) 33.2153 Tj +-260 TJm +(concatenated) 52.0048 Tj +-260 TJm +(compressed) 47.0334 Tj +72 480.017 Td +(\002les.) 19.0983 Tj +-310 TJm +(0.1pl2) 25.1855 Tj +-250 TJm +(cannot) 26.5603 Tj +-250 TJm +(do) 9.9626 Tj +-250 TJm +(this;) 17.1656 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(stop) 16.6077 Tj +-250 TJm +(after) 18.2515 Tj +-250 TJm +(decompressing) 59.7656 Tj +-250 TJm +(just) 14.396 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002rst) 15.5018 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 477.86] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -467.897] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 458.099 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 143.731 458.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -458.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.174 458.099 Td +/F130_0 9.9626 Tf +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-245 TJm +(prior) 19.3673 Tj +-245 TJm +(to) 7.7509 Tj +-245 TJm +(1.0.2) 19.9252 Tj +-246 TJm +(used) 18.2614 Tj +-245 TJm +(32-bit) 23.8007 Tj +-245 TJm +(inte) 14.9439 Tj +15 TJm +(gers) 16.5977 Tj +-245 TJm +(to) 7.7509 Tj +-245 TJm +(represent) 36.5129 Tj +-245 TJm +(bit) 10.5205 Tj +-246 TJm +(positions) 35.9849 Tj +-245 TJm +(in) 7.7509 Tj +-245 TJm +(compressed) 47.0334 Tj +-245 TJm +(\002les,) 19.0983 Tj +-246 TJm +(so) 8.85675 Tj +-245 TJm +(it) 5.53921 Tj +-245 TJm +(could) 22.1369 Tj +72 446.144 Td +(not) 12.7322 Tj +-384 TJm +(handle) 26.5603 Tj +-383 TJm +(compressed) 47.0334 Tj +-384 TJm +(\002les) 16.6077 Tj +-383 TJm +(more) 20.4731 Tj +-384 TJm +(than) 17.1556 Tj +-383 TJm +(512) 14.9439 Tj +-384 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(abytes) 25.4544 Tj +-383 TJm +(long.) 20.2042 Tj +-1421 TJm +(V) 7.193 Tj +111 TJm +(ersions) 28.224 Tj +-384 TJm +(1.0.2) 19.9252 Tj +-383 TJm +(and) 14.386 Tj +-384 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-384 TJm +(use) 13.2801 Tj +-383 TJm +(64-bit) 23.8007 Tj +-384 TJm +(ints) 14.396 Tj +-383 TJm +(on) 9.9626 Tj +-384 TJm +(some) 21.031 Tj +72 434.189 Td +(platforms) 38.1866 Tj +-245 TJm +(which) 24.3486 Tj +-246 TJm +(support) 29.8878 Tj +-245 TJm +(them) 19.9252 Tj +-246 TJm +(\(GNU) 24.8965 Tj +-245 TJm +(supported) 39.2925 Tj +-245 TJm +(tar) 10.5105 Tj +18 TJm +(gets,) 18.5404 Tj +-247 TJm +(and) 14.386 Tj +-245 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws\).) 16.8766 Tj +-309 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-245 TJm +(establish) 34.8691 Tj +-245 TJm +(whether) 32.0895 Tj +-246 TJm +(or) 8.29885 Tj +-245 TJm +(not) 12.7322 Tj +[1 0 0 1 468.269 434.189] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468.269 -434.189] cm +[1 0 0 1 0 0] Tm +0 0 Td +468.269 434.189 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 540 434.189] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -434.189] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 422.233 Td +/F130_0 9.9626 Tf +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-255 TJm +(b) 4.9813 Tj +20 TJm +(uilt) 13.2901 Tj +-255 TJm +(with) 17.7135 Tj +-255 TJm +(such) 18.2614 Tj +-255 TJm +(a) 4.42339 Tj +-255 TJm +(limitation,) 41.2452 Tj +-256 TJm +(run) 13.2801 Tj +-255 TJm +(it) 5.53921 Tj +-255 TJm +(without) 30.4457 Tj +-255 TJm +(ar) 7.74094 Tj +18 TJm +(guments.) 36.2539 Tj +-325 TJm +(In) 8.29885 Tj +-255 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-256 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ent) 12.1743 Tj +-255 TJm +(you) 14.9439 Tj +-255 TJm +(can) 13.8281 Tj +-255 TJm +(b) 4.9813 Tj +20 TJm +(uild) 15.5018 Tj +-255 TJm +(yourself) 32.6474 Tj +-255 TJm +(an) 9.40469 Tj +-255 TJm +(unlimited) 38.1966 Tj +-255 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-255 TJm +(if) 6.08715 Tj +72 410.278 Td +(you) 14.9439 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(recompile) 39.8404 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 176.318 410.278] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.318 -410.278] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.318 410.278 Td +/F134_0 9.9626 Tf +(MaybeUInt64) 65.7532 Tj +[1 0 0 1 242.071 410.278] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -242.071 -410.278] cm +[1 0 0 1 0 0] Tm +0 0 Td +244.562 410.278 Td +/F130_0 9.9626 Tf +(set) 11.0684 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(unsigned) 35.9749 Tj +-250 TJm +(64-bit) 23.8007 Tj +-250 TJm +(inte) 14.9439 Tj +15 TJm +(ger) 12.7222 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 408.121] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -398.159] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 375.525 Td +/F122_0 20.6585 Tf +(2.9.) 34.4584 Tj +-278 TJm +(A) 14.9154 Tj +50 TJm +(UTHOR) 73.441 Tj +[1 0 0 1 72 375.267] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -365.305] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 353.608 Td +/F130_0 9.9626 Tf +(Julian) 23.8007 Tj +-250 TJm +(Se) 9.9626 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard,) 15.2129 Tj +[1 0 0 1 132.801 353.608] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -132.801 -353.608] cm +[1 0 0 1 0 0] Tm +0 0 Td +132.801 353.608 Td +/F134_0 9.9626 Tf +(jseward@bzip.org) 95.641 Tj +[1 0 0 1 228.443 353.608] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -156.443 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -342.111] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 331.69 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-299 TJm +(ideas) 20.4731 Tj +-300 TJm +(embodied) 39.2925 Tj +-299 TJm +(in) 7.7509 Tj +[1 0 0 1 166.942 331.69] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -166.942 -331.69] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.942 331.69 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 196.83 331.69] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.83 -331.69] cm +[1 0 0 1 0 0] Tm +0 0 Td +199.813 331.69 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-299 TJm +(due) 14.386 Tj +-300 TJm +(to) 7.7509 Tj +-299 TJm +(\(at) 10.5105 Tj +-300 TJm +(least\)) 21.579 Tj +-299 TJm +(the) 12.1743 Tj +-300 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-299 TJm +(people:) 29.3299 Tj +-409 TJm +(Michael) 32.6474 Tj +-300 TJm +(Burro) 23.2427 Tj +25 TJm +(ws) 11.0684 Tj +-299 TJm +(and) 14.386 Tj +-299 TJm +(Da) 11.6164 Tj +20 TJm +(vid) 12.7322 Tj +-300 TJm +(Wheeler) 33.7433 Tj +-299 TJm +(\(for) 14.9339 Tj +72 319.735 Td +(the) 12.1743 Tj +-312 TJm +(block) 22.1369 Tj +-313 TJm +(sorting) 27.6761 Tj +-312 TJm +(transformation\),) 64.468 Tj +-328 TJm +(Da) 11.6164 Tj +20 TJm +(vid) 12.7322 Tj +-312 TJm +(Wheeler) 33.7433 Tj +-313 TJm +(\(ag) 12.7222 Tj +5 TJm +(ain,) 14.6649 Tj +-327 TJm +(for) 11.6164 Tj +-313 TJm +(the) 12.1743 Tj +-312 TJm +(Huf) 15.4918 Tj +25 TJm +(fman) 20.4731 Tj +-312 TJm +(coder\),) 27.9351 Tj +-328 TJm +(Peter) 20.4731 Tj +-313 TJm +(Fenwick) 34.3112 Tj +-312 TJm +(\(for) 14.9339 Tj +-312 TJm +(the) 12.1743 Tj +-313 TJm +(structured) 39.8404 Tj +72 307.78 Td +(coding) 27.1182 Tj +-325 TJm +(model) 24.9065 Tj +-326 TJm +(in) 7.7509 Tj +-325 TJm +(the) 12.1743 Tj +-326 TJm +(original) 30.9936 Tj +[1 0 0 1 191.156 307.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.156 -307.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +191.156 307.779 Td +/F134_0 9.9626 Tf +(bzip) 23.9102 Tj +[1 0 0 1 215.067 307.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -215.067 -307.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +215.067 307.779 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-344 TJm +(and) 14.386 Tj +-326 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-325 TJm +(re\002nements\),) 52.2937 Tj +-345 TJm +(and) 14.386 Tj +-325 TJm +(Alistair) 29.8878 Tj +-326 TJm +(Mof) 17.1556 Tj +25 TJm +(f) 3.31755 Tj +10 TJm +(at,) 9.68365 Tj +-344 TJm +(Radford) 32.6474 Tj +-325 TJm +(Neal) 18.8094 Tj +-326 TJm +(and) 14.386 Tj +-325 TJm +(Ian) 12.7222 Tj +-326 TJm +(W) 9.40469 Tj +40 TJm +(itten) 17.7135 Tj +-325 TJm +(\(for) 14.9339 Tj +72 295.824 Td +(the) 12.1743 Tj +-277 TJm +(arithmetic) 40.3983 Tj +-277 TJm +(coder) 22.1269 Tj +-277 TJm +(in) 7.7509 Tj +-277 TJm +(the) 12.1743 Tj +-277 TJm +(original) 30.9936 Tj +[1 0 0 1 214.171 295.824] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -214.171 -295.824] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.171 295.824 Td +/F134_0 9.9626 Tf +(bzip) 23.9102 Tj +[1 0 0 1 238.082 295.824] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -238.082 -295.824] cm +[1 0 0 1 0 0] Tm +0 0 Td +238.082 295.824 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +-782 TJm +(I) 3.31755 Tj +-277 TJm +(am) 12.1743 Tj +-276 TJm +(much) 22.1369 Tj +-277 TJm +(indebted) 34.3112 Tj +-277 TJm +(for) 11.6164 Tj +-277 TJm +(their) 18.2614 Tj +-277 TJm +(help,) 19.6462 Tj +-284 TJm +(support) 29.8878 Tj +-277 TJm +(and) 14.386 Tj +-277 TJm +(advice.) 28.493 Tj +-781 TJm +(See) 14.386 Tj +-277 TJm +(the) 12.1743 Tj +-277 TJm +(manual) 29.3299 Tj +72 283.869 Td +(in) 7.7509 Tj +-330 TJm +(the) 12.1743 Tj +-330 TJm +(source) 26.0024 Tj +-330 TJm +(distrib) 25.4644 Tj +20 TJm +(ution) 20.4831 Tj +-330 TJm +(for) 11.6164 Tj +-329 TJm +(pointers) 32.0995 Tj +-330 TJm +(to) 7.7509 Tj +-330 TJm +(sources) 29.8778 Tj +-330 TJm +(of) 8.29885 Tj +-330 TJm +(documentation.) 61.7083 Tj +-1099 TJm +(Christian) 36.5329 Tj +-330 TJm +(v) 4.9813 Tj +20 TJm +(on) 9.9626 Tj +-330 TJm +(Roques) 29.8878 Tj +-330 TJm +(encouraged) 45.9176 Tj +-330 TJm +(me) 12.1743 Tj +-330 TJm +(to) 7.7509 Tj +-330 TJm +(look) 17.7135 Tj +72 271.914 Td +(for) 11.6164 Tj +-271 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +-271 TJm +(sorting) 27.6761 Tj +-271 TJm +(algorithms,) 45.1107 Tj +-276 TJm +(so) 8.85675 Tj +-272 TJm +(as) 8.29885 Tj +-271 TJm +(to) 7.7509 Tj +-271 TJm +(speed) 22.6848 Tj +-271 TJm +(up) 9.9626 Tj +-271 TJm +(compression.) 52.8516 Tj +-746 TJm +(Bela) 18.2614 Tj +-271 TJm +(Lubkin) 28.782 Tj +-271 TJm +(encouraged) 45.9176 Tj +-271 TJm +(me) 12.1743 Tj +-272 TJm +(to) 7.7509 Tj +-271 TJm +(impro) 23.8007 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-271 TJm +(the) 12.1743 Tj +-271 TJm +(w) 7.193 Tj +10 TJm +(orst-case) 35.4071 Tj +72 259.959 Td +(compression) 50.3609 Tj +-340 TJm +(performance.) 52.8317 Tj +-580 TJm +(Donna) 26.5603 Tj +-339 TJm +(Robinson) 38.1966 Tj +-340 TJm +(XMLised) 38.1866 Tj +-340 TJm +(the) 12.1743 Tj +-340 TJm +(documentation.) 61.7083 Tj +-580 TJm +(Man) 18.2614 Tj +15 TJm +(y) 4.9813 Tj +-340 TJm +(people) 26.5603 Tj +-340 TJm +(sent) 16.0497 Tj +-339 TJm +(patches,) 32.3685 Tj +-363 TJm +(helped) 26.5603 Tj +-340 TJm +(with) 17.7135 Tj +72 248.004 Td +(portability) 41.5142 Tj +-250 TJm +(problems,) 39.5714 Tj +-250 TJm +(lent) 14.9439 Tj +-250 TJm +(machines,) 40.1194 Tj +-250 TJm +(g) 4.9813 Tj +5 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(advice) 26.0024 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(were) 19.3573 Tj +-250 TJm +(generally) 37.0708 Tj +-250 TJm +(helpful.) 30.7147 Tj +[1 0 0 1 72 245.847] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -194.995] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.5851] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.4855] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.9514 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 11 11 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 141.643 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -141.643 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0365 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 701.916 Td +/F122_0 24.7902 Tf +(3.) 20.675 Tj +-556 TJm +(Pr) 26.1785 Tj +20 TJm +(ogramming) 134.983 Tj +-278 TJm +(with) 49.5804 Tj +[1 0 0 1 330.484 701.916] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -330.484 -701.916] cm +[1 0 0 1 0 0] Tm +0 0 Td +330.484 701.916 Td +/F392_0 24.7902 Tf +(libbzip2) 118.993 Tj +[1 0 0 1 449.477 701.916] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -377.477 -5.5156] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -14.9439] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -671.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 656.35 Td +/F122_0 17.2154 Tf +(T) 10.5186 Tj +80 TJm +(ab) 20.0904 Tj +10 TJm +(le) 14.3576 Tj +-278 TJm +(of) 16.2513 Tj +-278 TJm +(Contents) 74.5943 Tj +[1 0 0 1 72 647.528] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.7401] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 635.788 Td +/F130_0 9.9626 Tf +(3.1.) 14.9439 Tj +-310 TJm +(T) 6.08715 Tj +80 TJm +(op-le) 20.4731 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(structure) 34.8591 Tj +[1 0 0 1 164.921 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.902 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.997 635.788 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 635.788 Td +/F130_0 9.9626 Tf +(8) 4.9813 Tj +[1 0 0 1 516.09 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 623.832 Td +/F130_0 9.9626 Tf +(3.1.1.) 22.4159 Tj +-310 TJm +(Lo) 11.0684 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 177.374 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -182.355 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.866 623.832 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 623.832 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 611.877 Td +/F130_0 9.9626 Tf +(3.1.2.) 22.4159 Tj +-310 TJm +(High-le) 30.4357 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 179.287 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -184.268 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.822 611.877 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 611.877 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 599.922 Td +/F130_0 9.9626 Tf +(3.1.3.) 22.4159 Tj +-310 TJm +(Utility) 26.0223 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 202.669 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.65 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.582 599.922 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 599.922 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 587.967 Td +/F130_0 9.9626 Tf +(3.2.) 14.9439 Tj +-310 TJm +(Error) 21.0211 Tj +-250 TJm +(handling) 34.8691 Tj +[1 0 0 1 148.413 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -153.394 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +162.611 587.967 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 587.967 Td +/F130_0 9.9626 Tf +(10) 9.9626 Tj +[1 0 0 1 516.09 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 576.012 Td +/F130_0 9.9626 Tf +(3.3.) 14.9439 Tj +-310 TJm +(Lo) 11.0684 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +[1 0 0 1 167.571 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.552 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.045 576.012 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 576.012 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 516.09 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 564.056 Td +/F130_0 9.9626 Tf +(3.3.1.) 22.4159 Tj +[1 0 0 1 97.5043 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 564.056 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 205.101 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.082 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +219.736 564.056 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 564.056 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 516.09 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 552.101 Td +/F130_0 9.9626 Tf +(3.3.2.) 22.4159 Tj +[1 0 0 1 97.5043 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 552.101 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 181.19 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.172 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.497 552.101 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 552.101 Td +/F130_0 9.9626 Tf +(13) 9.9626 Tj +[1 0 0 1 516.09 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 540.146 Td +/F130_0 9.9626 Tf +(3.3.3.) 22.4159 Tj +[1 0 0 1 97.5043 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 540.146 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 199.123 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.105 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.533 540.146 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 540.146 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 516.09 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -528.191] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 528.191 Td +/F130_0 9.9626 Tf +(3.3.4.) 22.4159 Tj +[1 0 0 1 97.5043 528.191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -528.191] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 528.191 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 217.056 528.191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -222.037 -528.191] cm +[1 0 0 1 0 0] Tm +0 0 Td +232.355 528.191 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 528.191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -528.191] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 528.191 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 516.09 528.191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -516.236] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 516.236 Td +/F130_0 9.9626 Tf +(3.3.5.) 22.4159 Tj +[1 0 0 1 97.5043 516.236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -516.236] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 516.236 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 193.146 516.236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.127 -516.236] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.116 516.236 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 516.236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -516.236] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 516.236 Td +/F130_0 9.9626 Tf +(17) 9.9626 Tj +[1 0 0 1 516.09 516.236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -504.281] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 504.281 Td +/F130_0 9.9626 Tf +(3.3.6.) 22.4159 Tj +[1 0 0 1 97.5043 504.281] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -504.281] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 504.281 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 211.078 504.281] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.06 -504.281] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.938 504.281 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 504.281] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -504.281] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 504.281 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 516.09 504.281] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -492.325] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 492.325 Td +/F130_0 9.9626 Tf +(3.4.) 14.9439 Tj +-310 TJm +(High-le) 30.4357 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +[1 0 0 1 169.483 492.325] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.465 -492.325] cm +[1 0 0 1 0 0] Tm +0 0 Td +184.216 492.325 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 492.325] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -492.325] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 492.325 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 516.09 492.325] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -480.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 480.37 Td +/F130_0 9.9626 Tf +(3.4.1.) 22.4159 Tj +[1 0 0 1 97.5043 480.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -480.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 480.37 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 181.19 480.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.172 -480.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.497 480.37 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 480.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -480.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 480.37 Td +/F130_0 9.9626 Tf +(19) 9.9626 Tj +[1 0 0 1 516.09 480.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -468.415] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 468.415 Td +/F130_0 9.9626 Tf +(3.4.2.) 22.4159 Tj +[1 0 0 1 97.5043 468.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -468.415] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 468.415 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 157.28 468.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -162.261 -468.415] cm +[1 0 0 1 0 0] Tm +0 0 Td +171.472 468.415 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 468.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -468.415] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 468.415 Td +/F130_0 9.9626 Tf +(20) 9.9626 Tj +[1 0 0 1 516.09 468.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -456.46] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 456.46 Td +/F130_0 9.9626 Tf +(3.4.3.) 22.4159 Tj +[1 0 0 1 97.5043 456.46] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -456.46] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 456.46 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 211.078 456.46] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.06 -456.46] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.938 456.46 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 456.46] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -456.46] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 456.46 Td +/F130_0 9.9626 Tf +(21) 9.9626 Tj +[1 0 0 1 516.09 456.46] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -444.505] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 444.505 Td +/F130_0 9.9626 Tf +(3.4.4.) 22.4159 Tj +[1 0 0 1 97.5043 444.505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -444.505] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 444.505 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 187.168 444.505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.149 -444.505] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.914 444.505 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 444.505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -444.505] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 444.505 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 516.09 444.505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6451] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -432.55] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 432.55 Td +/F130_0 9.9626 Tf +(3.4.5.) 22.4159 Tj +[1 0 0 1 97.5043 432.55] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -432.55] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 432.55 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 187.168 432.55] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.149 -432.55] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.914 432.55 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 432.55] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -432.55] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 432.55 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 516.09 432.55] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -420.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 420.594 Td +/F130_0 9.9626 Tf +(3.4.6.) 22.4159 Tj +[1 0 0 1 97.5043 420.594] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -420.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 420.594 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 163.258 420.594] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -168.239 -420.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.675 420.594 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 420.594] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -420.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 420.594 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 516.09 420.594] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -408.639] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 408.639 Td +/F130_0 9.9626 Tf +(3.4.7.) 22.4159 Tj +[1 0 0 1 97.5043 408.639] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -408.639] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 408.639 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 193.146 408.639] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.127 -408.639] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.116 408.639 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 408.639] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -408.639] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 408.639 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 516.09 408.639] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6451] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -396.684] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 396.684 Td +/F130_0 9.9626 Tf +(3.4.8.) 22.4159 Tj +-310 TJm +(Handling) 37.0808 Tj +-250 TJm +(embedded) 40.9463 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(streams) 30.4357 Tj +[1 0 0 1 279.56 396.684] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.541 -396.684] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.601 396.684 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 396.684] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -396.684] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 396.684 Td +/F130_0 9.9626 Tf +(24) 9.9626 Tj +[1 0 0 1 516.09 396.684] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -384.729] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 384.729 Td +/F130_0 9.9626 Tf +(3.4.9.) 22.4159 Tj +-310 TJm +(Standard) 35.417 Tj +-250 TJm +(\002le-reading/writing) 77.4791 Tj +-250 TJm +(code) 18.8094 Tj +[1 0 0 1 234.19 384.729] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -239.172 -384.729] cm +[1 0 0 1 0 0] Tm +0 0 Td +247.564 384.729 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 384.729] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -384.729] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 384.729 Td +/F130_0 9.9626 Tf +(25) 9.9626 Tj +[1 0 0 1 516.09 384.729] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -372.774] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 372.774 Td +/F130_0 9.9626 Tf +(3.5.) 14.9439 Tj +-310 TJm +(Utility) 26.0223 Tj +-250 TJm +(functions) 37.0808 Tj +[1 0 0 1 155.625 372.774] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.607 -372.774] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.645 372.774 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 372.774] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -372.774] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 372.774 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 516.09 372.774] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -360.819] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 360.819 Td +/F130_0 9.9626 Tf +(3.5.1.) 22.4159 Tj +[1 0 0 1 97.5043 360.819] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -360.819] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 360.819 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 240.966 360.819] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.948 -360.819] cm +[1 0 0 1 0 0] Tm +0 0 Td +255.38 360.819 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 360.819] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -360.819] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 360.819 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 516.09 360.819] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -348.863] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 348.863 Td +/F130_0 9.9626 Tf +(3.5.2.) 22.4159 Tj +[1 0 0 1 97.5043 348.863] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -348.863] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 348.863 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 252.922 348.863] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -257.903 -348.863] cm +[1 0 0 1 0 0] Tm +0 0 Td +267.999 348.863 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 348.863] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -348.863] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 348.863 Td +/F130_0 9.9626 Tf +(27) 9.9626 Tj +[1 0 0 1 516.09 348.863] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 336.908 Td +/F130_0 9.9626 Tf +(3.6.) 14.9439 Tj +[1 0 0 1 90.0324 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90.0324 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +90.0324 336.908 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 113.943 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.943 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.433 336.908 Td +/F130_0 9.9626 Tf +(compatibility) 53.1405 Tj +-250 TJm +(functions) 37.0808 Tj +[1 0 0 1 209.144 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -214.126 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +223.971 336.908 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 336.908 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 516.09 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 324.953 Td +/F130_0 9.9626 Tf +(3.7.) 14.9439 Tj +-310 TJm +(Using) 23.8007 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +[1 0 0 1 177.195 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.195 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +177.195 324.953 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 207.083 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.083 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.083 324.953 Td +/F130_0 9.9626 Tf +(-free) 18.7994 Tj +-250 TJm +(en) 9.40469 Tj +40 TJm +(vironment) 40.9562 Tj +[1 0 0 1 278.335 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -283.316 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +291.775 324.953 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 324.953 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 516.09 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -312.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 312.998 Td +/F130_0 9.9626 Tf +(3.7.1.) 22.4159 Tj +-310 TJm +(Getting) 29.8878 Tj +-250 TJm +(rid) 11.0684 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 154.231 312.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -154.231 -312.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +154.231 312.998 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 184.119 312.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -189.1 -312.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.175 312.998 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 312.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -312.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 312.998 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 312.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -301.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 301.043 Td +/F130_0 9.9626 Tf +(3.7.2.) 22.4159 Tj +-310 TJm +(Critical) 29.8878 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(handling) 34.8691 Tj +[1 0 0 1 186.599 301.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.58 -301.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.629 301.043 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 301.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -301.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 301.043 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 301.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -289.088] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 289.088 Td +/F130_0 9.9626 Tf +(3.8.) 14.9439 Tj +-310 TJm +(Making) 30.9936 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(DLL) 19.3673 Tj +[1 0 0 1 189.828 289.088] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -194.809 -289.088] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.243 289.088 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 289.088] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -289.088] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 289.088 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 289.088] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -267.006] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 257.207 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-250 TJm +(chapter) 29.3199 Tj +-250 TJm +(describes) 37.0708 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(programming) 54.2364 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 282.448 257.207] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.448 -257.207] cm +[1 0 0 1 0 0] Tm +0 0 Td +282.448 257.207 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 330.269 257.207] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -330.269 -257.207] cm +[1 0 0 1 0 0] Tm +0 0 Td +330.269 257.207 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 255.05] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -245.088] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 235.289 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-273 TJm +(general) 29.3199 Tj +-272 TJm +(background) 47.0334 Tj +-273 TJm +(information,) 49.534 Tj +-278 TJm +(particularly) 45.9276 Tj +-273 TJm +(about) 22.1369 Tj +-273 TJm +(memory) 33.2053 Tj +-272 TJm +(use) 13.2801 Tj +-273 TJm +(and) 14.386 Tj +-273 TJm +(performance) 50.341 Tj +-272 TJm +(aspects,) 31.2626 Tj +-279 TJm +(you') 18.2614 Tj +50 TJm +(d) 4.9813 Tj +-272 TJm +(be) 9.40469 Tj +-273 TJm +(well) 17.1556 Tj +-273 TJm +(advised) 30.4357 Tj +72 223.334 Td +(to) 7.7509 Tj +-250 TJm +(read) 17.1456 Tj +[1 0 0 1 101.878 223.334] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -101.878 -223.334] cm +[1 0 0 1 0 0] Tm +0 0 Td +101.878 223.334 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 171.636 223.334] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -171.636 -223.334] cm +[1 0 0 1 0 0] Tm +0 0 Td +174.126 223.334 Td +/F130_0 9.9626 Tf +([2]) 11.6164 Tj +[1 0 0 1 185.743 223.334] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -185.743 -223.334] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.233 223.334 Td +/F130_0 9.9626 Tf +(as) 8.29885 Tj +-250 TJm +(well.) 19.6462 Tj +[1 0 0 1 72 221.177] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -211.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 188.581 Td +/F122_0 20.6585 Tf +(3.1.) 34.4584 Tj +-278 TJm +(T) 12.6223 Tj +80 TJm +(op-le) 49.3532 Tj +15 TJm +(vel) 28.7153 Tj +-278 TJm +(structure) 89.5339 Tj +[1 0 0 1 72 184.305] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -174.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 166.664 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 119.821 166.664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.821 -166.664] cm +[1 0 0 1 0 0] Tm +0 0 Td +123.608 166.664 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-380 TJm +(a) 4.42339 Tj +-380 TJm +(\003e) 9.9626 Tj +15 TJm +(xible) 19.9252 Tj +-381 TJm +(library) 26.5603 Tj +-380 TJm +(for) 11.6164 Tj +-380 TJm +(compressing) 50.3609 Tj +-380 TJm +(and) 14.386 Tj +-380 TJm +(decompressing) 59.7656 Tj +-380 TJm +(data) 16.5977 Tj +-381 TJm +(in) 7.7509 Tj +-380 TJm +(the) 12.1743 Tj +[1 0 0 1 405.291 166.664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -405.291 -166.664] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.291 166.664 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 435.178 166.664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -435.178 -166.664] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.966 166.664 Td +/F130_0 9.9626 Tf +(data) 16.5977 Tj +-380 TJm +(format.) 29.0509 Tj +-1401 TJm +(Although) 37.6387 Tj +72 154.708 Td +(packaged) 37.6188 Tj +-285 TJm +(as) 8.29885 Tj +-284 TJm +(a) 4.42339 Tj +-285 TJm +(single) 23.8007 Tj +-285 TJm +(entity) 22.6948 Tj +65 TJm +(,) 2.49065 Tj +-293 TJm +(it) 5.53921 Tj +-285 TJm +(helps) 21.031 Tj +-285 TJm +(to) 7.7509 Tj +-284 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(ard) 12.7222 Tj +-285 TJm +(the) 12.1743 Tj +-285 TJm +(library) 26.5603 Tj +-284 TJm +(as) 8.29885 Tj +-285 TJm +(three) 19.9152 Tj +-285 TJm +(separate) 32.6375 Tj +-284 TJm +(parts:) 22.1369 Tj +-380 TJm +(the) 12.1743 Tj +-285 TJm +(lo) 7.7509 Tj +25 TJm +(w) 7.193 Tj +-284 TJm +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-285 TJm +(interf) 21.579 Tj +10 TJm +(ace,) 15.7608 Tj +-293 TJm +(and) 14.386 Tj +-285 TJm +(the) 12.1743 Tj +-285 TJm +(high) 17.7135 Tj +72 142.753 Td +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace,) 15.7608 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(utility) 23.8106 Tj +-250 TJm +(functions.) 39.5714 Tj +[1 0 0 1 72 140.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -130.634] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 120.835 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-349 TJm +(structure) 34.8591 Tj +-349 TJm +(of) 8.29885 Tj +[1 0 0 1 141.082 120.835] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -141.082 -120.835] cm +[1 0 0 1 0 0] Tm +0 0 Td +141.082 120.835 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 188.903 120.835] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -188.903 -120.835] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.903 120.835 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +-349 TJm +(interf) 21.579 Tj +10 TJm +(aces) 17.1456 Tj +-349 TJm +(is) 6.64505 Tj +-349 TJm +(similar) 27.6761 Tj +-349 TJm +(to) 7.7509 Tj +-349 TJm +(that) 14.9439 Tj +-349 TJm +(of) 8.29885 Tj +-349 TJm +(Jean-loup) 38.7346 Tj +-349 TJm +(Gailly') 28.224 Tj +55 TJm +(s) 3.87545 Tj +-349 TJm +(and) 14.386 Tj +-349 TJm +(Mark) 21.579 Tj +-349 TJm +(Adler') 26.0024 Tj +55 TJm +(s) 3.87545 Tj +-349 TJm +(e) 4.42339 Tj +15 TJm +(xcellent) 31.5416 Tj +[1 0 0 1 516.09 120.835] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -516.09 -120.835] cm +[1 0 0 1 0 0] Tm +0 0 Td +516.09 120.835 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 540 120.835] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -120.835] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 108.88 Td +/F130_0 9.9626 Tf +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 106.723] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -96.7608] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 86.9624 Td +/F130_0 9.9626 Tf +(All) 12.7322 Tj +-242 TJm +(e) 4.42339 Tj +15 TJm +(xternally) 35.417 Tj +-242 TJm +(visible) 26.5703 Tj +-241 TJm +(symbols) 33.2153 Tj +-242 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-242 TJm +(names) 25.4544 Tj +-242 TJm +(be) 9.40469 Tj +15 TJm +(ginning) 30.4457 Tj +[1 0 0 1 284.687 86.9624] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.687 -86.9624] cm +[1 0 0 1 0 0] Tm +0 0 Td +284.687 86.9624 Td +/F134_0 9.9626 Tf +(BZ2_) 23.9102 Tj +[1 0 0 1 308.597 86.9624] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -308.597 -86.9624] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.597 86.9624 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-615 TJm +(This) 17.7135 Tj +-241 TJm +(is) 6.64505 Tj +-242 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-242 TJm +(in) 7.7509 Tj +-242 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-242 TJm +(1.0.) 14.9439 Tj +-614 TJm +(The) 15.4918 Tj +-242 TJm +(intention) 35.427 Tj +-242 TJm +(is) 6.64505 Tj +-241 TJm +(to) 7.7509 Tj +-242 TJm +(minimise) 37.0908 Tj +72 75.0073 Td +(pollution) 35.9849 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(namespaces) 47.5814 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(clients.) 28.503 Tj +[1 0 0 1 72 72.8505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.9987] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -498.225 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +541.288 50.9514 Td +/F130_0 9.9626 Tf +(8) 4.9813 Tj +[1 0 0 1 455.161 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5986 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0366 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 12 12 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -344.462 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +420.96 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 498.449 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -498.449 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.449 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 546.269 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0365 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(part) 15.4918 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(need) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 240.567 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.567 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +240.567 710.037 Td +/F134_0 9.9626 Tf +(#include) 47.8205 Tj +-600 TJm +() 53.798 Tj +[1 0 0 1 348.163 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -348.163 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +350.654 710.037 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-250 TJm +(your) 18.2614 Tj +-250 TJm +(sources.) 32.3685 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -697.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 679.416 Td +/F122_0 17.2154 Tf +(3.1.1.) 43.0729 Tj +-278 TJm +(Lo) 21.0372 Tj +15 TJm +(w-le) 33.484 Tj +15 TJm +(vel) 23.9294 Tj +-278 TJm +(summar) 66.9679 Tj +-10 TJm +(y) 9.57176 Tj +[1 0 0 1 72 675.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -665.89] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 657.498 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-212 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-212 TJm +(pro) 13.2801 Tj +15 TJm +(vides) 21.031 Tj +-212 TJm +(services) 32.0895 Tj +-212 TJm +(for) 11.6164 Tj +-212 TJm +(compressing) 50.3609 Tj +-212 TJm +(and) 14.386 Tj +-212 TJm +(decompress) 47.0334 Tj +1 TJm +(ing) 12.7322 Tj +-212 TJm +(data) 16.5977 Tj +-212 TJm +(in) 7.7509 Tj +-212 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +-595 TJm +(There') 26.5503 Tj +55 TJm +(s) 3.87545 Tj +-212 TJm +(no) 9.9626 Tj +-212 TJm +(pro) 13.2801 Tj +15 TJm +(vision) 24.3586 Tj +-212 TJm +(for) 11.6164 Tj +-212 TJm +(dealing) 29.3299 Tj +72 645.543 Td +(with) 17.7135 Tj +-213 TJm +(\002les,) 19.0983 Tj +-220 TJm +(streams) 30.4357 Tj +-213 TJm +(or) 8.29885 Tj +-213 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-213 TJm +(other) 20.4731 Tj +-213 TJm +(I/O) 13.2801 Tj +-213 TJm +(mechanisms,) 51.7457 Tj +-221 TJm +(just) 14.396 Tj +-213 TJm +(straight) 29.8878 Tj +-213 TJm +(memory-to-memory) 80.7967 Tj +-213 TJm +(w) 7.193 Tj +10 TJm +(ork.) 15.7708 Tj +-595 TJm +(In) 8.29885 Tj +-213 TJm +(f) 3.31755 Tj +10 TJm +(act,) 14.107 Tj +-221 TJm +(this) 14.396 Tj +-213 TJm +(part) 15.4918 Tj +-213 TJm +(of) 8.29885 Tj +-213 TJm +(the) 12.1743 Tj +-213 TJm +(library) 26.5603 Tj +72 633.588 Td +(can) 13.8281 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(compiled) 37.0808 Tj +-250 TJm +(without) 30.4457 Tj +-250 TJm +(inclusion) 36.5329 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 222.534 633.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -222.534 -633.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +222.534 633.588 Td +/F134_0 9.9626 Tf +(stdio.h) 41.8429 Tj +[1 0 0 1 264.377 633.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -264.377 -633.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +264.377 633.588 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(helpful) 28.224 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(embedded) 40.9463 Tj +-250 TJm +(applications.) 50.6399 Tj +[1 0 0 1 72 631.431] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -621.469] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 611.67 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(part) 15.4918 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(global) 24.9065 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(ariables) 30.9837 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(therefore) 35.955 Tj +-250 TJm +(thread-safe.) 46.7445 Tj +[1 0 0 1 72 609.513] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -599.551] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 589.752 Td +/F130_0 9.9626 Tf +(Six) 13.2901 Tj +-875 TJm +(routines) 32.0995 Tj +-876 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-875 TJm +(up) 9.9626 Tj +-876 TJm +(the) 12.1743 Tj +-875 TJm +(lo) 7.7509 Tj +25 TJm +(w) 7.193 Tj +-876 TJm +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-875 TJm +(interf) 21.579 Tj +10 TJm +(ace:) 16.0398 Tj +[1 0 0 1 308.791 589.752] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -308.791 -589.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.791 589.752 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 416.387 589.752] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -416.387 -589.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +416.387 589.752 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 429.158 589.752] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -429.158 -589.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +429.158 589.752 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 512.844 589.752] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -512.844 -589.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +512.844 589.752 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-1032 TJm +(and) 14.386 Tj +[1 0 0 1 72 577.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -577.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 577.797 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 173.619 577.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.619 -577.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +186.15 577.797 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-1258 TJm +(compression,) 52.8516 Tj +-1510 TJm +(and) 14.386 Tj +-1257 TJm +(a) 4.42339 Tj +-1258 TJm +(corresponding) 56.996 Tj +-1258 TJm +(trio) 13.8381 Tj +[1 0 0 1 417.958 577.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -417.958 -577.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +417.958 577.797 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 537.509 577.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -577.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 577.797 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 565.842 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 167.641 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.641 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.707 565.842 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 192.158 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.158 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.158 565.842 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 305.732 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -305.732 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.798 565.842 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-508 TJm +(decompression.) 62.2563 Tj +-2171 TJm +(The) 15.4918 Tj +[1 0 0 1 431.918 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.918 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.918 564.099 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +437.895 565.842 Td +(Init) 23.9102 Tj +[1 0 0 1 461.805 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.805 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +466.871 565.842 Td +/F130_0 9.9626 Tf +(functions) 37.0808 Tj +-508 TJm +(allocate) 30.9837 Tj +72 553.887 Td +(memory) 33.2053 Tj +-574 TJm +(for) 11.6164 Tj +-573 TJm +(compression/decompression) 112.896 Tj +-574 TJm +(and) 14.386 Tj +-574 TJm +(do) 9.9626 Tj +-573 TJm +(other) 20.4731 Tj +-574 TJm +(initialisations,) 56.1891 Tj +-654 TJm +(whilst) 24.3586 Tj +-574 TJm +(the) 12.1743 Tj +[1 0 0 1 419.502 553.887] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -419.502 -553.887] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.502 552.144 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +425.48 553.887 Td +(End) 17.9327 Tj +[1 0 0 1 443.413 553.887] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -443.413 -553.887] cm +[1 0 0 1 0 0] Tm +0 0 Td +449.128 553.887 Td +/F130_0 9.9626 Tf +(functions) 37.0808 Tj +-574 TJm +(close) 20.4731 Tj +-573 TJm +(do) 9.9626 Tj +25 TJm +(wn) 12.1743 Tj +72 541.932 Td +(operations) 41.5042 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(release) 27.6562 Tj +-250 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 539.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -529.812] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 520.014 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-303 TJm +(real) 14.9339 Tj +-303 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-303 TJm +(is) 6.64505 Tj +-303 TJm +(done) 19.3673 Tj +-303 TJm +(by) 9.9626 Tj +[1 0 0 1 176.892 520.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.892 -520.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.892 520.014 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 260.578 520.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.578 -520.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +263.598 520.014 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 281.003 520.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -281.003 -520.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +281.003 520.014 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 376.645 520.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -376.645 -520.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +376.645 520.014 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-939 TJm +(These) 23.7907 Tj +-303 TJm +(compress) 37.6287 Tj +-303 TJm +(and) 14.386 Tj +-303 TJm +(decompress) 47.0334 Tj +-303 TJm +(data) 16.5977 Tj +72 508.059 Td +(from) 19.3673 Tj +-205 TJm +(a) 4.42339 Tj +-205 TJm +(user) 16.5977 Tj +20 TJm +(-supplied) 37.0808 Tj +-205 TJm +(input) 20.4831 Tj +-206 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-205 TJm +(to) 7.7509 Tj +-205 TJm +(a) 4.42339 Tj +-205 TJm +(user) 16.5977 Tj +20 TJm +(-supplied) 37.0808 Tj +-205 TJm +(output) 25.4644 Tj +-205 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +55 TJm +(.) 2.49065 Tj +-591 TJm +(These) 23.7907 Tj +-205 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fers) 14.9339 Tj +-205 TJm +(can) 13.8281 Tj +-205 TJm +(be) 9.40469 Tj +-205 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-205 TJm +(size;) 18.2614 Tj +-220 TJm +(arbitrary) 34.3012 Tj +-206 TJm +(quantities) 38.7446 Tj +-205 TJm +(of) 8.29885 Tj +72 496.104 Td +(data) 16.5977 Tj +-258 TJm +(are) 12.1643 Tj +-258 TJm +(handled) 31.5416 Tj +-258 TJm +(by) 9.9626 Tj +-257 TJm +(making) 29.8878 Tj +-258 TJm +(repeated) 33.7433 Tj +-258 TJm +(calls) 18.2614 Tj +-258 TJm +(to) 7.7509 Tj +-258 TJm +(these) 20.4731 Tj +-258 TJm +(functions.) 39.5714 Tj +-667 TJm +(This) 17.7135 Tj +-258 TJm +(is) 6.64505 Tj +-258 TJm +(a) 4.42339 Tj +-257 TJm +(\003e) 9.9626 Tj +15 TJm +(xible) 19.9252 Tj +-258 TJm +(mechanism) 45.3796 Tj +-258 TJm +(allo) 14.9439 Tj +25 TJm +(wing) 19.9252 Tj +-258 TJm +(a) 4.42339 Tj +-258 TJm +(consumer) 38.7346 Tj +20 TJm +(-pull) 18.8194 Tj +72 484.148 Td +(style) 18.8194 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(acti) 14.386 Tj +25 TJm +(vity) 15.5018 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(producer) 35.4071 Tj +20 TJm +(-push,) 24.6275 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(mixture) 30.9936 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(both.) 20.2042 Tj +[1 0 0 1 72 481.992] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -472.029] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 453.527 Td +/F122_0 17.2154 Tf +(3.1.2.) 43.0729 Tj +-278 TJm +(High-le) 58.343 Tj +15 TJm +(vel) 23.9294 Tj +-278 TJm +(summar) 66.9679 Tj +-10 TJm +(y) 9.57176 Tj +[1 0 0 1 72 449.697] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -439.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 431.61 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-284 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-284 TJm +(pro) 13.2801 Tj +15 TJm +(vides) 21.031 Tj +-285 TJm +(some) 21.031 Tj +-284 TJm +(handy) 24.3486 Tj +-284 TJm +(wrappers) 36.5129 Tj +-284 TJm +(around) 27.6661 Tj +-284 TJm +(the) 12.1743 Tj +-284 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-285 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-284 TJm +(to) 7.7509 Tj +-284 TJm +(f) 3.31755 Tj +10 TJm +(acilitate) 31.5416 Tj +-284 TJm +(reading) 29.8778 Tj +-284 TJm +(and) 14.386 Tj +-285 TJm +(writ) 16.0497 Tj +1 TJm +(ing) 12.7322 Tj +[1 0 0 1 510.112 431.61] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -510.112 -431.61] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.112 431.61 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 540 431.61] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -431.61] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 419.654 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-347 TJm +(\002les) 16.6077 Tj +-346 TJm +(\() 3.31755 Tj +[1 0 0 1 125.391 419.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.391 -419.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +125.391 419.654 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 149.301 419.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.301 -419.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +152.754 419.654 Td +/F130_0 9.9626 Tf +(\002les\).) 22.4159 Tj +-1200 TJm +(The) 15.4918 Tj +-346 TJm +(routines) 32.0995 Tj +-347 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-346 TJm +(hooks) 23.8007 Tj +-347 TJm +(to) 7.7509 Tj +-346 TJm +(f) 3.31755 Tj +10 TJm +(acilitate) 31.5416 Tj +-347 TJm +(reading) 29.8778 Tj +-347 TJm +(\002les) 16.6077 Tj +-346 TJm +(in) 7.7509 Tj +-347 TJm +(which) 24.3486 Tj +-346 TJm +(the) 12.1743 Tj +[1 0 0 1 460.049 419.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -460.049 -419.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +460.049 419.654 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 489.937 419.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -489.937 -419.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.39 419.654 Td +/F130_0 9.9626 Tf +(data) 16.5977 Tj +-347 TJm +(stream) 26.5603 Tj +72 407.699 Td +(is) 6.64505 Tj +-339 TJm +(embedded) 40.9463 Tj +-339 TJm +(within) 25.4644 Tj +-339 TJm +(some) 21.031 Tj +-339 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +20 TJm +(-scale) 23.2328 Tj +-339 TJm +(\002le) 12.7322 Tj +-339 TJm +(structure,) 37.3498 Tj +-361 TJm +(or) 8.29885 Tj +-339 TJm +(wh) 12.1743 Tj +-1 TJm +(e) 4.42339 Tj +1 TJm +(re) 7.74094 Tj +-340 TJm +(there) 19.9152 Tj +-339 TJm +(are) 12.1643 Tj +-339 TJm +(multiple) 33.2153 Tj +[1 0 0 1 400.941 407.699] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -400.941 -407.699] cm +[1 0 0 1 0 0] Tm +0 0 Td +400.941 407.699 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 430.829 407.699] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -430.829 -407.699] cm +[1 0 0 1 0 0] Tm +0 0 Td +434.207 407.699 Td +/F130_0 9.9626 Tf +(data) 16.5977 Tj +-339 TJm +(streams) 30.4357 Tj +-339 TJm +(concatenated) 52.0048 Tj +72 395.744 Td +(end-to-end.) 45.6486 Tj +[1 0 0 1 72 395.644] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -385.682] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 373.826 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-332 TJm +(reading) 29.8778 Tj +-333 TJm +(\002les,) 19.0983 Tj +[1 0 0 1 144.803 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -144.803 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +144.803 373.826 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 228.489 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -228.489 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +228.489 373.826 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 234.496 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.496 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.496 373.826 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 294.272 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.272 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.272 373.826 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 300.279 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.279 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +300.279 373.826 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 389.942 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -389.942 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +393.253 373.826 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 410.951 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.951 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +410.951 373.826 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 524.525 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -524.525 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +527.836 373.826 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +72 361.871 Td +(supplied.) 36.2539 Tj +-620 TJm +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(writing) 28.782 Tj +-250 TJm +(\002les,) 19.0983 Tj +[1 0 0 1 183.471 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.471 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.471 361.871 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 273.135 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -273.135 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +273.135 361.871 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 278.116 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.116 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +278.116 361.871 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 343.869 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -343.869 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +346.36 361.871 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 363.237 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.237 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.237 361.871 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteFinish) 101.619 Tj +[1 0 0 1 464.856 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -464.856 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +467.346 361.871 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable.) 29.0509 Tj +[1 0 0 1 72 359.714] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -349.751] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 339.953 Td +/F130_0 9.9626 Tf +(As) 11.0684 Tj +-374 TJm +(with) 17.7135 Tj +-374 TJm +(the) 12.1743 Tj +-375 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-374 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-405 TJm +(no) 9.9626 Tj +-374 TJm +(global) 24.9065 Tj +-374 TJm +(v) 4.9813 Tj +25 TJm +(ariables) 30.9837 Tj +-375 TJm +(are) 12.1643 Tj +-374 TJm +(used) 18.2614 Tj +-374 TJm +(so) 8.85675 Tj +-374 TJm +(the) 12.1743 Tj +-374 TJm +(library) 26.5603 Tj +-375 TJm +(is) 6.64505 Tj +-374 TJm +(per) 12.7222 Tj +-374 TJm +(se) 8.29885 Tj +-374 TJm +(thread-safe.) 46.7445 Tj +-1365 TJm +(Ho) 12.1743 Tj +25 TJm +(we) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +40 TJm +(,) 2.49065 Tj +-406 TJm +(if) 6.08715 Tj +-374 TJm +(I/O) 13.2801 Tj +72 327.998 Td +(errors) 23.2328 Tj +-267 TJm +(occur) 22.1269 Tj +-267 TJm +(whilst) 24.3586 Tj +-267 TJm +(reading) 29.8778 Tj +-267 TJm +(or) 8.29885 Tj +-267 TJm +(writing) 28.782 Tj +-267 TJm +(the) 12.1743 Tj +-268 TJm +(underlying) 43.1679 Tj +-267 TJm +(compressed) 47.0334 Tj +-267 TJm +(\002les,) 19.0983 Tj +-271 TJm +(you) 14.9439 Tj +-267 TJm +(may) 17.1556 Tj +-267 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-267 TJm +(to) 7.7509 Tj +-267 TJm +(consult) 28.782 Tj +[1 0 0 1 457.199 327.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -457.199 -327.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +457.199 327.998 Td +/F134_0 9.9626 Tf +(errno) 29.8878 Tj +[1 0 0 1 487.087 327.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -487.087 -327.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +489.748 327.998 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-267 TJm +(determine) 39.8404 Tj +72 316.043 Td +(the) 12.1743 Tj +-366 TJm +(cause) 22.1269 Tj +-365 TJm +(of) 8.29885 Tj +-366 TJm +(the) 12.1743 Tj +-365 TJm +(error) 19.3573 Tj +55 TJm +(.) 2.49065 Tj +-1314 TJm +(In) 8.29885 Tj +-366 TJm +(that) 14.9439 Tj +-365 TJm +(case,) 19.6363 Tj +-395 TJm +(you') 18.2614 Tj +50 TJm +(d) 4.9813 Tj +-366 TJm +(need) 18.8094 Tj +-365 TJm +(a) 4.42339 Tj +-366 TJm +(C) 6.64505 Tj +-365 TJm +(library) 26.5603 Tj +-366 TJm +(which) 24.3486 Tj +-366 TJm +(correctly) 35.4071 Tj +-365 TJm +(supports) 33.7633 Tj +[1 0 0 1 431.668 316.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.668 -316.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.668 316.043 Td +/F134_0 9.9626 Tf +(errno) 29.8878 Tj +[1 0 0 1 461.556 316.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.556 -316.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +465.199 316.043 Td +/F130_0 9.9626 Tf +(in) 7.7509 Tj +-366 TJm +(a) 4.42339 Tj +-365 TJm +(multithreaded) 55.3422 Tj +72 304.088 Td +(en) 9.40469 Tj +40 TJm +(vironment.) 43.4469 Tj +[1 0 0 1 72 303.988] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -294.025] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 282.17 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-243 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-243 TJm +(the) 12.1743 Tj +-242 TJm +(library) 26.5603 Tj +-243 TJm +(a) 4.42339 Tj +-243 TJm +(little) 18.2714 Tj +-242 TJm +(simpler) 29.8878 Tj +-243 TJm +(and) 14.386 Tj +-243 TJm +(more) 20.4731 Tj +-243 TJm +(portable,) 35.1381 Tj +[1 0 0 1 289.263 282.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -289.263 -282.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.263 282.17 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 372.949 282.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -372.949 -282.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +375.368 282.17 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 392.172 282.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.172 -282.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.172 282.17 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 481.836 282.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -481.836 -282.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +484.254 282.17 Td +/F130_0 9.9626 Tf +(require) 28.2141 Tj +-243 TJm +(you) 14.9439 Tj +-242 TJm +(to) 7.7509 Tj +72 270.215 Td +(pass) 17.1556 Tj +-247 TJm +(them) 19.9252 Tj +-248 TJm +(\002le) 12.7322 Tj +-247 TJm +(handles) 30.4357 Tj +-247 TJm +(\() 3.31755 Tj +[1 0 0 1 165.421 270.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.421 -270.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +165.421 270.215 Td +/F134_0 9.9626 Tf +(FILE) 23.9102 Tj +189.331 268.471 Td +(*) 5.97756 Tj +[1 0 0 1 195.309 270.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -195.309 -270.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +195.309 270.215 Td +/F130_0 9.9626 Tf +(s\)) 7.193 Tj +-247 TJm +(which) 24.3486 Tj +-248 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-247 TJm +(pre) 12.7222 Tj +25 TJm +(viously) 29.3399 Tj +-247 TJm +(been) 18.8094 Tj +-248 TJm +(opened) 28.772 Tj +-247 TJm +(for) 11.6164 Tj +-247 TJm +(reading) 29.8778 Tj +-247 TJm +(or) 8.29885 Tj +-248 TJm +(writing) 28.782 Tj +-247 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +-618 TJm +(That) 18.2614 Tj +-248 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +20 TJm +(oids) 16.6077 Tj +72 258.26 Td +(portability) 41.5142 Tj +-272 TJm +(problems) 37.0808 Tj +-273 TJm +(associated) 40.9463 Tj +-272 TJm +(with) 17.7135 Tj +-272 TJm +(\002le) 12.7322 Tj +-273 TJm +(operations) 41.5042 Tj +-272 TJm +(and) 14.386 Tj +-272 TJm +(\002le) 12.7322 Tj +-273 TJm +(attrib) 21.031 Tj +20 TJm +(utes,) 18.5404 Tj +-278 TJm +(whilst) 24.3586 Tj +-272 TJm +(not) 12.7322 Tj +-272 TJm +(being) 22.1369 Tj +-273 TJm +(much) 22.1369 Tj +-272 TJm +(of) 8.29885 Tj +-273 TJm +(an) 9.40469 Tj +-272 TJm +(imposition) 42.63 Tj +-272 TJm +(on) 9.9626 Tj +-273 TJm +(the) 12.1743 Tj +72 246.304 Td +(programmer) 49.2451 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 244.147] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -234.185] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 215.683 Td +/F122_0 17.2154 Tf +(3.1.3.) 43.0729 Tj +-278 TJm +(Utility) 47.8244 Tj +-278 TJm +(functions) 77.4693 Tj +-278 TJm +(summar) 66.9679 Tj +-10 TJm +(y) 9.57176 Tj +[1 0 0 1 72 212.12] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -202.157] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 193.765 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-273 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-273 TJm +(simple) 26.5703 Tj +-273 TJm +(needs,) 25.1755 Tj +[1 0 0 1 165.929 193.765] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.929 -193.765] cm +[1 0 0 1 0 0] Tm +0 0 Td +165.929 193.765 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 309.391 193.765] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -309.391 -193.765] cm +[1 0 0 1 0 0] Tm +0 0 Td +312.112 193.765 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 329.219 193.765] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -329.219 -193.765] cm +[1 0 0 1 0 0] Tm +0 0 Td +329.219 193.765 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 484.636 193.765] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -484.636 -193.765] cm +[1 0 0 1 0 0] Tm +0 0 Td +487.357 193.765 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-273 TJm +(pro) 13.2801 Tj +15 TJm +(vided.) 24.6275 Tj +72 181.81 Td +(These) 23.7907 Tj +-374 TJm +(compress) 37.6287 Tj +-373 TJm +(data) 16.5977 Tj +-374 TJm +(in) 7.7509 Tj +-373 TJm +(memory) 33.2053 Tj +-374 TJm +(from) 19.3673 Tj +-373 TJm +(one) 14.386 Tj +-374 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-373 TJm +(to) 7.7509 Tj +-374 TJm +(another) 29.8778 Tj +-374 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-373 TJm +(in) 7.7509 Tj +-374 TJm +(a) 4.42339 Tj +-373 TJm +(single) 23.8007 Tj +-374 TJm +(function) 33.2053 Tj +-373 TJm +(call.) 16.8766 Tj +-1362 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-373 TJm +(should) 26.5703 Tj +-374 TJm +(assess) 24.3486 Tj +72 169.855 Td +(whether) 32.0895 Tj +-344 TJm +(these) 20.4731 Tj +-343 TJm +(functions) 37.0808 Tj +-344 TJm +(ful\002ll) 22.1469 Tj +-344 TJm +(your) 18.2614 Tj +-343 TJm +(memory-to-memory) 80.7967 Tj +-344 TJm +(compression/decompression) 112.896 Tj +-343 TJm +(requirements) 52.0147 Tj +-344 TJm +(before) 25.4445 Tj +-344 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(esting) 23.8007 Tj +72 157.9 Td +(ef) 7.74094 Tj +25 TJm +(fort) 14.386 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(understanding) 56.4481 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(general) 29.3199 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(comple) 29.3299 Tj +15 TJm +(x) 4.9813 Tj +-250 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +[1 0 0 1 72 155.743] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -145.78] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 135.982 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(oshioka) 30.9936 Tj +-423 TJm +(Tsuneo) 29.3299 Tj +-422 TJm +(\() 3.31755 Tj +[1 0 0 1 150.16 135.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -150.16 -135.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.16 135.982 Td +/F134_0 9.9626 Tf +(tsuneo@rr.iij4u.or.jp) 125.529 Tj +[1 0 0 1 275.69 135.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -275.69 -135.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.69 135.982 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-423 TJm +(has) 13.2801 Tj +-422 TJm +(contrib) 28.224 Tj +20 TJm +(uted) 17.1556 Tj +-423 TJm +(some) 21.031 Tj +-423 TJm +(functions) 37.0808 Tj +-422 TJm +(to) 7.7509 Tj +-423 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-423 TJm +(better) 22.6848 Tj +[1 0 0 1 476.462 135.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -476.462 -135.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +476.462 135.982 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 500.372 135.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -500.372 -135.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +504.583 135.982 Td +/F130_0 9.9626 Tf +(compati-) 35.417 Tj +72 124.027 Td +(bility) 21.041 Tj +65 TJm +(.) 2.49065 Tj +-1446 TJm +(These) 23.7907 Tj +-388 TJm +(functions) 37.0808 Tj +-387 TJm +(are) 12.1643 Tj +[1 0 0 1 193.913 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.913 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.913 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzopen) 59.7756 Tj +[1 0 0 1 253.689 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.689 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.689 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 260.385 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.385 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +260.385 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzread) 59.7756 Tj +[1 0 0 1 320.161 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -320.161 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +320.161 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 326.857 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -326.857 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +326.857 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzwrite) 65.7532 Tj +[1 0 0 1 392.611 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.611 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.611 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 399.306 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -399.306 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +399.306 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzflush) 65.7532 Tj +[1 0 0 1 465.06 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -465.06 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +465.06 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 471.756 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -471.756 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +471.756 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzclose) 65.7532 Tj +[1 0 0 1 537.509 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 112.072] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -112.072] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 112.072 Td +/F134_0 9.9626 Tf +(BZ2_bzerror) 65.7532 Tj +[1 0 0 1 137.753 112.072] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -112.072] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.408 112.072 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 157.449 112.072] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -157.449 -112.072] cm +[1 0 0 1 0 0] Tm +0 0 Td +157.449 112.072 Td +/F134_0 9.9626 Tf +(BZ2_bzlibVersion) 95.641 Tj +[1 0 0 1 253.091 112.072] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.091 -112.072] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.091 112.072 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-719 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-266 TJm +(may) 17.1556 Tj +-267 TJm +(\002nd) 15.5018 Tj +-266 TJm +(these) 20.4731 Tj +-267 TJm +(functions) 37.0808 Tj +-266 TJm +(more) 20.4731 Tj +-267 TJm +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(enient) 24.3486 Tj +-266 TJm +(for) 11.6164 Tj +-267 TJm +(simple) 26.5703 Tj +-266 TJm +(\002le) 12.7322 Tj +-267 TJm +(reading) 29.8778 Tj +72 100.117 Td +(and) 14.386 Tj +-270 TJm +(wri) 13.2801 Tj +1 TJm +(ting,) 17.9925 Tj +-275 TJm +(than) 17.1556 Tj +-269 TJm +(those) 21.031 Tj +-270 TJm +(in) 7.7509 Tj +-269 TJm +(the) 12.1743 Tj +-270 TJm +(high-le) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-269 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +-737 TJm +(These) 23.7907 Tj +-270 TJm +(functions) 37.0808 Tj +-269 TJm +(are) 12.1643 Tj +-270 TJm +(not) 12.7322 Tj +-269 TJm +(\(yet\)) 18.8094 Tj +-270 TJm +(of) 8.29885 Tj +25 TJm +(\002cially) 27.6761 Tj +-269 TJm +(part) 15.4918 Tj +-270 TJm +(of) 8.29885 Tj +-269 TJm +(the) 12.1743 Tj +-270 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-274 TJm +(and) 14.386 Tj +-270 TJm +(are) 12.1643 Tj +72 88.1614 Td +(minimally) 40.9662 Tj +-291 TJm +(documented) 48.6972 Tj +-291 TJm +(here.) 19.6363 Tj +-867 TJm +(If) 6.63509 Tj +-291 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-291 TJm +(break,) 24.6176 Tj +-301 TJm +(you) 14.9439 Tj +-291 TJm +(get) 12.1743 Tj +-292 TJm +(to) 7.7509 Tj +-291 TJm +(k) 4.9813 Tj +10 TJm +(eep) 13.8281 Tj +-291 TJm +(all) 9.9626 Tj +-291 TJm +(the) 12.1743 Tj +-291 TJm +(pieces.) 27.3872 Tj +-433 TJm +(I) 3.31755 Tj +-291 TJm +(hope) 19.3673 Tj +-291 TJm +(to) 7.7509 Tj +-291 TJm +(document) 39.2925 Tj +-292 TJm +(them) 19.9252 Tj +-291 TJm +(properly) 33.7533 Tj +-291 TJm +(when) 21.579 Tj +72 76.2062 Td +(time) 17.7135 Tj +-250 TJm +(permits.) 32.3785 Tj +[1 0 0 1 72 74.0494] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -23.1976] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.9737] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -498.225 -51.071] cm +[1 0 0 1 0 0] Tm +0 0 Td +541.288 51.071 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 455.161 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5986 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0366 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 13 13 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(oshioka) 30.9936 Tj +-250 TJm +(also) 16.0497 Tj +-250 TJm +(contrib) 28.224 Tj +20 TJm +(uted) 17.1556 Tj +-250 TJm +(modi\002cations) 54.2464 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(allo) 14.9439 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uilt) 13.2901 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(DLL.) 21.8579 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -698.137] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 675.504 Td +/F122_0 20.6585 Tf +(3.2.) 34.4584 Tj +-278 TJm +(Err) 29.8515 Tj +20 TJm +(or) 20.6585 Tj +-278 TJm +(handling) 86.084 Tj +[1 0 0 1 72 670.907] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -661.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 653.805 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-214 TJm +(library) 26.5603 Tj +-215 TJm +(is) 6.64505 Tj +-214 TJm +(designed) 35.417 Tj +-215 TJm +(to) 7.7509 Tj +-214 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-215 TJm +(cleanly) 28.772 Tj +-214 TJm +(in) 7.7509 Tj +-215 TJm +(all) 9.9626 Tj +-214 TJm +(situations,) 40.6873 Tj +-222 TJm +(including) 37.6387 Tj +-214 TJm +(the) 12.1743 Tj +-215 TJm +(w) 7.193 Tj +10 TJm +(orst-case) 35.4071 Tj +-214 TJm +(situation) 34.3212 Tj +-215 TJm +(of) 8.29885 Tj +-214 TJm +(decompressing) 59.7656 Tj +-215 TJm +(random) 30.4357 Tj +72 641.85 Td +(data.) 19.0883 Tj +-764 TJm +(I'm) 14.386 Tj +-274 TJm +(not) 12.7322 Tj +-275 TJm +(100%) 23.2427 Tj +-274 TJm +(sure) 16.5977 Tj +-274 TJm +(that) 14.9439 Tj +-274 TJm +(it) 5.53921 Tj +-274 TJm +(can) 13.8281 Tj +-274 TJm +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-274 TJm +(do) 9.9626 Tj +-274 TJm +(this,) 16.8866 Tj +-280 TJm +(so) 8.85675 Tj +-274 TJm +(you) 14.9439 Tj +-274 TJm +(might) 23.2527 Tj +-274 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-274 TJm +(to) 7.7509 Tj +-274 TJm +(add) 14.386 Tj +-274 TJm +(a) 4.42339 Tj +-275 TJm +(s) 3.87545 Tj +1 TJm +(ignal) 19.9252 Tj +-275 TJm +(handler) 29.8778 Tj +-274 TJm +(to) 7.7509 Tj +-274 TJm +(catch) 21.0211 Tj +-274 TJm +(se) 8.29885 Tj +15 TJm +(gmentation) 44.8317 Tj +72 629.894 Td +(violations) 39.3025 Tj +-273 TJm +(during) 26.0123 Tj +-273 TJm +(decompression) 59.7656 Tj +-273 TJm +(if) 6.08715 Tj +-273 TJm +(you) 14.9439 Tj +-273 TJm +(are) 12.1643 Tj +-273 TJm +(feeling) 27.6661 Tj +-274 TJm +(especiall) 34.8591 Tj +1 TJm +(y) 4.9813 Tj +-274 TJm +(paranoid.) 37.3498 Tj +-758 TJm +(I) 3.31755 Tj +-273 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-273 TJm +(be) 9.40469 Tj +-273 TJm +(interested) 38.7346 Tj +-273 TJm +(in) 7.7509 Tj +-274 TJm +(hearing) 29.8778 Tj +-273 TJm +(more) 20.4731 Tj +-273 TJm +(about) 22.1369 Tj +72 617.939 Td +(the) 12.1743 Tj +-250 TJm +(rob) 13.2801 Tj +20 TJm +(ustness) 28.782 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(corrupted) 38.1767 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(data.) 19.0883 Tj +[1 0 0 1 72 615.783] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -606.039] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 596.241 Td +/F130_0 9.9626 Tf +(V) 7.193 Tj +111 TJm +(ersion) 24.3486 Tj +-251 TJm +(1.0.3) 19.9252 Tj +-251 TJm +(more) 20.4731 Tj +-251 TJm +(rob) 13.2801 Tj +20 TJm +(ust) 11.6264 Tj +-251 TJm +(in) 7.7509 Tj +-251 TJm +(this) 14.396 Tj +-251 TJm +(respect) 28.2141 Tj +-252 TJm +(than) 17.1556 Tj +-251 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-251 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-251 TJm +(v) 4.9813 Tj +15 TJm +(ersion.) 26.8392 Tj +-626 TJm +(In) 8.29885 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(estig) 18.8194 Tj +5 TJm +(ations) 23.8007 Tj +-251 TJm +(with) 17.7135 Tj +-251 TJm +(V) 7.193 Tj +111 TJm +(algrind) 28.224 Tj +-251 TJm +(\(a) 7.74094 Tj +-252 TJm +(tool) 15.5018 Tj +-251 TJm +(for) 11.6164 Tj +-251 TJm +(detecting) 36.5229 Tj +72 584.285 Td +(problems) 37.0808 Tj +-422 TJm +(with) 17.7135 Tj +-421 TJm +(memory) 33.2053 Tj +-422 TJm +(management\)) 54.2264 Tj +-421 TJm +(indicate) 31.5416 Tj +-422 TJm +(that,) 17.4346 Tj +-464 TJm +(at) 7.193 Tj +-422 TJm +(least) 18.2614 Tj +-421 TJm +(for) 11.6164 Tj +-422 TJm +(the) 12.1743 Tj +-422 TJm +(f) 3.31755 Tj +1 TJm +(e) 4.42339 Tj +25 TJm +(w) 7.193 Tj +-422 TJm +(\002les) 16.6077 Tj +-422 TJm +(I) 3.31755 Tj +-421 TJm +(tested,) 25.7334 Tj +-464 TJm +(all) 9.9626 Tj +-422 TJm +(single-bit) 37.6387 Tj +-422 TJm +(errors) 23.2328 Tj +-421 TJm +(in) 7.7509 Tj +-422 TJm +(the) 12.1743 Tj +72 572.33 Td +(decompressed) 56.4381 Tj +-342 TJm +(data) 16.5977 Tj +-341 TJm +(are) 12.1643 Tj +-342 TJm +(caught) 26.5603 Tj +-342 TJm +(properly) 33.7533 Tj +65 TJm +(,) 2.49065 Tj +-365 TJm +(with) 17.7135 Tj +-341 TJm +(no) 9.9626 Tj +-342 TJm +(se) 8.29885 Tj +15 TJm +(gmentation) 44.8317 Tj +-342 TJm +(f) 3.31755 Tj +10 TJm +(aults,) 21.31 Tj +-365 TJm +(no) 9.9626 Tj +-341 TJm +(uses) 17.1556 Tj +-342 TJm +(of) 8.29885 Tj +-342 TJm +(uninitialised) 49.2651 Tj +-342 TJm +(data,) 19.0883 Tj +-364 TJm +(no) 9.9626 Tj +-342 TJm +(out) 12.7322 Tj +-342 TJm +(of) 8.29885 Tj +-342 TJm +(range) 22.1269 Tj +72 560.375 Td +(reads) 21.0211 Tj +-261 TJm +(or) 8.29885 Tj +-260 TJm +(writes,) 26.8392 Tj +-263 TJm +(and) 14.386 Tj +-261 TJm +(no) 9.9626 Tj +-261 TJm +(in\002nit) 23.8106 Tj +1 TJm +(e) 4.42339 Tj +-261 TJm +(looping) 30.4457 Tj +-261 TJm +(in) 7.7509 Tj +-260 TJm +(the) 12.1743 Tj +-261 TJm +(decompressor) 55.3323 Tj +55 TJm +(.) 2.49065 Tj +-342 TJm +(So) 10.5205 Tj +-260 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +-261 TJm +(certainly) 34.8591 Tj +-260 TJm +(pretty) 23.2427 Tj +-261 TJm +(rob) 13.2801 Tj +20 TJm +(ust,) 14.117 Tj +-263 TJm +(although) 34.8691 Tj +-261 TJm +(I) 3.31755 Tj +-260 TJm +(w) 7.193 Tj +10 TJm +(ouldn') 26.0123 Tj +18 TJm +(t) 2.7696 Tj +-261 TJm +(claim) 22.1369 Tj +72 548.42 Td +(it) 5.53921 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(totally) 25.4644 Tj +-250 TJm +(bombproof.) 46.7644 Tj +[1 0 0 1 72 546.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -536.519] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 526.721 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-282 TJm +(\002le) 12.7322 Tj +[1 0 0 1 105.84 526.721] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -105.84 -526.721] cm +[1 0 0 1 0 0] Tm +0 0 Td +105.84 526.721 Td +/F134_0 9.9626 Tf +(bzlib.h) 41.8429 Tj +[1 0 0 1 147.683 526.721] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.683 -526.721] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.491 526.721 Td +/F130_0 9.9626 Tf +(contains) 33.2053 Tj +-282 TJm +(all) 9.9626 Tj +-282 TJm +(de\002nitions) 42.0721 Tj +-282 TJm +(nee) 13.8281 Tj +1 TJm +(ded) 14.386 Tj +-282 TJm +(to) 7.7509 Tj +-282 TJm +(use) 13.2801 Tj +-282 TJm +(the) 12.1743 Tj +-282 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-811 TJm +(In) 8.29885 Tj +-282 TJm +(particular) 38.1767 Tj +40 TJm +(,) 2.49065 Tj +-290 TJm +(you) 14.9439 Tj +-282 TJm +(should) 26.5703 Tj +-281 TJm +(de\002nitely) 37.6387 Tj +-282 TJm +(not) 12.7322 Tj +-282 TJm +(include) 29.3299 Tj +[1 0 0 1 72 514.766] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -514.766] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 514.766 Td +/F134_0 9.9626 Tf +(bzlib_private.h) 89.6634 Tj +[1 0 0 1 161.664 514.766] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.664 -514.766] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.664 514.766 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 513.232] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -503.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 493.067 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +[1 0 0 1 82.8075 493.067] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -82.8075 -493.067] cm +[1 0 0 1 0 0] Tm +0 0 Td +82.8075 493.067 Td +/F134_0 9.9626 Tf +(bzlib.h) 41.8429 Tj +[1 0 0 1 124.651 493.067] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -124.651 -493.067] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.651 493.067 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-252 TJm +(the) 12.1743 Tj +-252 TJm +(v) 4.9813 Tj +25 TJm +(arious) 24.3486 Tj +-252 TJm +(return) 23.7907 Tj +-252 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-251 TJm +(are) 12.1643 Tj +-252 TJm +(de\002ned.) 31.8205 Tj +-631 TJm +(The) 15.4918 Tj +-252 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-252 TJm +(list) 12.1843 Tj +-251 TJm +(is) 6.64505 Tj +-252 TJm +(not) 12.7322 Tj +-252 TJm +(intended) 34.3112 Tj +-252 TJm +(as) 8.29885 Tj +-252 TJm +(an) 9.40469 Tj +-251 TJm +(e) 4.42339 Tj +15 TJm +(xhausti) 28.782 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-252 TJm +(description) 44.2738 Tj +-252 TJm +(of) 8.29885 Tj +72 481.112 Td +(the) 12.1743 Tj +-236 TJm +(circumstances) 56.4381 Tj +-236 TJm +(in) 7.7509 Tj +-237 TJm +(which) 24.3486 Tj +-236 TJm +(a) 4.42339 Tj +-236 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-236 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-236 TJm +(may) 17.1556 Tj +-237 TJm +(be) 9.40469 Tj +-236 TJm +(returned) 33.1954 Tj +-236 TJm +(--) 6.63509 Tj +-236 TJm +(those) 21.031 Tj +-236 TJm +(descriptions) 48.1492 Tj +-236 TJm +(are) 12.1643 Tj +-237 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-236 TJm +(later) 17.7035 Tj +55 TJm +(.) 2.49065 Tj +-305 TJm +(Rather) 26.5603 Tj +40 TJm +(,) 2.49065 Tj +-239 TJm +(it) 5.53921 Tj +-236 TJm +(is) 6.64505 Tj +-237 TJm +(intended) 34.3112 Tj +-236 TJm +(to) 7.7509 Tj +72 469.157 Td +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +15 TJm +(y) 4.9813 Tj +-266 TJm +(the) 12.1743 Tj +-265 TJm +(rough) 23.2427 Tj +-266 TJm +(meaning) 34.3112 Tj +-265 TJm +(of) 8.29885 Tj +-266 TJm +(each) 18.2515 Tj +-266 TJm +(return) 23.7907 Tj +-265 TJm +(v) 4.9813 Tj +25 TJm +(alue.) 19.0883 Tj +-714 TJm +(The) 15.4918 Tj +-265 TJm +(\002rst) 15.5018 Tj +-266 TJm +(\002) 5.53921 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-265 TJm +(actions) 28.224 Tj +-266 TJm +(are) 12.1643 Tj +-266 TJm +(normal) 28.224 Tj +-265 TJm +(and) 14.386 Tj +-266 TJm +(not) 12.7322 Tj +-265 TJm +(intended) 34.3112 Tj +-266 TJm +(to) 7.7509 Tj +-266 TJm +(denote) 26.5603 Tj +-265 TJm +(an) 9.40469 Tj +-266 TJm +(error) 19.3573 Tj +72 457.202 Td +(situation.) 36.8118 Tj +[1 0 0 1 72 457.102] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -437.615] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 425.76 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 101.888 425.76] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -32.3786 -1.3101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -424.449] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 413.804 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(requested) 38.1767 Tj +-250 TJm +(action) 24.3486 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(completed) 41.5042 Tj +-250 TJm +(successfully) 48.6972 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 411.648] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.766] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -398.138] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 388.34 Td +/F134_0 9.9626 Tf +(BZ_RUN_OK,) 59.7756 Tj +-600 TJm +(BZ_FLUSH_OK,) 71.7307 Tj +-600 TJm +(BZ_FINISH_OK) 71.7307 Tj +[1 0 0 1 287.193 388.34] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -217.684 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -387.03] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 376.384 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +[1 0 0 1 118.79 376.384] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -118.79 -376.384] cm +[1 0 0 1 0 0] Tm +0 0 Td +118.79 376.384 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 202.476 376.384] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.476 -376.384] cm +[1 0 0 1 0 0] Tm +0 0 Td +202.476 376.384 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(requested) 38.1767 Tj +-250 TJm +(\003ush/\002nish/nothing-special) 108.493 Tj +-250 TJm +(action) 24.3486 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(completed) 41.5042 Tj +-250 TJm +(successfully) 48.6972 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 374.228] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -360.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 350.92 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 149.709 350.92] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -80.1993 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -349.61] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 338.965 Td +/F130_0 9.9626 Tf +(Compression) 52.5826 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(completed,) 43.9948 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(logical) 27.1182 Tj +-250 TJm +(stream) 26.5603 Tj +-250 TJm +(end) 14.386 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(detected) 33.1954 Tj +-250 TJm +(during) 26.0123 Tj +-250 TJm +(decompression.) 62.2563 Tj +[1 0 0 1 72 336.808] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -313.555] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 303.756 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-250 TJm +(indicate) 31.5416 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(kind.) 20.2042 Tj +[1 0 0 1 72 301.6] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -282.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 272.314 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +[1 0 0 1 161.664 272.314] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -92.1544 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -271.004] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 260.359 Td +/F130_0 9.9626 Tf +(Indicates) 35.965 Tj +-386 TJm +(that) 14.9439 Tj +-385 TJm +(the) 12.1743 Tj +-386 TJm +(library) 26.5603 Tj +-386 TJm +(has) 13.2801 Tj +-386 TJm +(been) 18.8094 Tj +-385 TJm +(improperly) 44.2738 Tj +-386 TJm +(compiled) 37.0808 Tj +-386 TJm +(on) 9.9626 Tj +-386 TJm +(your) 18.2614 Tj +-385 TJm +(platform) 34.3112 Tj +-386 TJm +(--) 6.63509 Tj +-386 TJm +(a) 4.42339 Tj +-386 TJm +(major) 23.2427 Tj +-385 TJm +(con\002guration) 53.1305 Tj +-386 TJm +(error) 19.3573 Tj +55 TJm +(.) 2.49065 Tj +108 248.404 Td +(Speci\002cally) 47.0434 Tj +65 TJm +(,) 2.49065 Tj +-481 TJm +(it) 5.53921 Tj +-435 TJm +(means) 25.4544 Tj +-435 TJm +(that) 14.9439 Tj +[1 0 0 1 220.614 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.614 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.614 248.404 Td +/F134_0 9.9626 Tf +(sizeof\(char\)) 71.7307 Tj +[1 0 0 1 292.345 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -292.345 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +292.345 248.404 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 299.628 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -299.628 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.628 248.404 Td +/F134_0 9.9626 Tf +(sizeof\(short\)) 77.7083 Tj +[1 0 0 1 377.337 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -377.337 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +381.669 248.404 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 400.388 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -400.388 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +400.388 248.404 Td +/F134_0 9.9626 Tf +(sizeof\(int\)) 65.7532 Tj +[1 0 0 1 466.141 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -466.141 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +470.474 248.404 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-435 TJm +(not) 12.7322 Tj +-435 TJm +(1,) 7.47195 Tj +-481 TJm +(2) 4.9813 Tj +-435 TJm +(and) 14.386 Tj +108 236.449 Td +(4) 4.9813 Tj +-389 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(,) 2.49065 Tj +-424 TJm +(as) 8.29885 Tj +-390 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-389 TJm +(should) 26.5703 Tj +-389 TJm +(be.) 11.8953 Tj +-1456 TJm +(Note) 19.3673 Tj +-389 TJm +(that) 14.9439 Tj +-389 TJm +(the) 12.1743 Tj +-389 TJm +(library) 26.5603 Tj +-390 TJm +(should) 26.5703 Tj +-389 TJm +(still) 14.9539 Tj +-389 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-389 TJm +(properly) 33.7533 Tj +-390 TJm +(on) 9.9626 Tj +-389 TJm +(64-bit) 23.8007 Tj +-389 TJm +(platforms) 38.1866 Tj +108 224.493 Td +(which) 24.3486 Tj +-292 TJm +(follo) 18.8194 Tj +25 TJm +(w) 7.193 Tj +-292 TJm +(the) 12.1743 Tj +-292 TJm +(LP64) 21.589 Tj +-292 TJm +(programming) 54.2364 Tj +-293 TJm +(model) 24.9065 Tj +-292 TJm +(--) 6.63509 Tj +-292 TJm +(that) 14.9439 Tj +-292 TJm +(is,) 9.1357 Tj +-303 TJm +(where) 24.3386 Tj +[1 0 0 1 355.279 224.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -355.279 -224.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +355.279 224.493 Td +/F134_0 9.9626 Tf +(sizeof\(long\)) 71.7307 Tj +[1 0 0 1 427.01 224.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.01 -224.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +429.92 224.493 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 447.217 224.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -447.217 -224.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +447.217 224.493 Td +/F134_0 9.9626 Tf +(sizeof\(void) 65.7532 Tj +512.97 222.75 Td +(*) 5.97756 Tj +518.948 224.493 Td +(\)) 5.97756 Tj +[1 0 0 1 524.925 224.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -524.925 -224.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +527.836 224.493 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +108 212.538 Td +(8.) 7.47195 Tj +-620 TJm +(Under) 24.8965 Tj +-250 TJm +(LP64,) 24.0796 Tj +[1 0 0 1 175.606 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -175.606 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +175.606 212.538 Td +/F134_0 9.9626 Tf +(sizeof\(int\)) 65.7532 Tj +[1 0 0 1 241.36 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -241.36 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.85 212.538 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(still) 14.9539 Tj +-250 TJm +(4,) 7.47195 Tj +-250 TJm +(so) 8.85675 Tj +[1 0 0 1 291.74 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -291.74 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +291.74 212.538 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 339.56 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.56 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.56 212.538 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 433.458 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -433.458 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +433.458 212.538 Td +/F134_0 9.9626 Tf +(long) 23.9102 Tj +[1 0 0 1 457.368 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -457.368 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +459.859 212.538 Td +/F130_0 9.9626 Tf +(type,) 19.6462 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(OK.) 16.8766 Tj +[1 0 0 1 72 210.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -196.872] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 187.074 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 173.619 187.074] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -104.11 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -185.764] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 175.118 Td +/F130_0 9.9626 Tf +(When) 23.7907 Tj +-291 TJm +(using) 21.589 Tj +-290 TJm +(the) 12.1743 Tj +-291 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-300 TJm +(it) 5.53921 Tj +-291 TJm +(is) 6.64505 Tj +-290 TJm +(important) 38.7446 Tj +-291 TJm +(to) 7.7509 Tj +-290 TJm +(call) 14.386 Tj +-291 TJm +(the) 12.1743 Tj +-290 TJm +(functions) 37.0808 Tj +-291 TJm +(in) 7.7509 Tj +-290 TJm +(the) 12.1743 Tj +-291 TJm +(correct) 27.6562 Tj +-290 TJm +(sequence) 36.5129 Tj +-291 TJm +(and) 14.386 Tj +-290 TJm +(with) 17.7135 Tj +-291 TJm +(data) 16.5977 Tj +-290 TJm +(structures) 38.7346 Tj +108 163.163 Td +(\(b) 8.29885 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fers) 14.9339 Tj +-206 TJm +(etc\)) 14.9339 Tj +-205 TJm +(in) 7.7509 Tj +-206 TJm +(the) 12.1743 Tj +-205 TJm +(correct) 27.6562 Tj +-206 TJm +(states.) 24.6275 Tj +[1 0 0 1 239.409 163.163] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -239.409 -163.163] cm +[1 0 0 1 0 0] Tm +0 0 Td +239.409 163.163 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 287.23 163.163] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.23 -163.163] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.278 163.163 Td +/F130_0 9.9626 Tf +(checks) 27.1082 Tj +-206 TJm +(as) 8.29885 Tj +-205 TJm +(much) 22.1369 Tj +-206 TJm +(as) 8.29885 Tj +-205 TJm +(it) 5.53921 Tj +-206 TJm +(can) 13.8281 Tj +-206 TJm +(to) 7.7509 Tj +-205 TJm +(ensure) 26.0024 Tj +-206 TJm +(this) 14.396 Tj +-206 TJm +(is) 6.64505 Tj +-205 TJm +(happening,) 43.9948 Tj +-215 TJm +(and) 14.386 Tj +-205 TJm +(returns) 27.6661 Tj +[1 0 0 1 108 151.208] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -151.208] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 151.208 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 209.619 151.208] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -209.619 -151.208] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.27 151.208 Td +/F130_0 9.9626 Tf +(if) 6.08715 Tj +-367 TJm +(not.) 15.2229 Tj +-659 TJm +(Code) 21.031 Tj +-367 TJm +(which) 24.3486 Tj +-367 TJm +(complies) 35.9749 Tj +-366 TJm +(precisely) 35.965 Tj +-367 TJm +(with) 17.7135 Tj +-366 TJm +(the) 12.1743 Tj +-367 TJm +(function) 33.2053 Tj +-366 TJm +(semantics,) 41.7831 Tj +-396 TJm +(as) 8.29885 Tj +-367 TJm +(detailed) 31.5416 Tj +108 139.253 Td +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(ne) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-250 TJm +(recei) 19.3573 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue;) 19.3673 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ent) 12.1743 Tj +-250 TJm +(denotes) 30.4357 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uggy) 19.9252 Tj +-250 TJm +(code) 18.8094 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(estig) 18.8194 Tj +5 TJm +(ate.) 14.107 Tj +[1 0 0 1 72 137.096] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -123.587] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 113.788 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +[1 0 0 1 155.686 113.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.1768 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -112.478] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 101.833 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-434 TJm +(when) 21.579 Tj +-434 TJm +(a) 4.42339 Tj +-434 TJm +(parameter) 39.8305 Tj +-434 TJm +(to) 7.7509 Tj +-434 TJm +(a) 4.42339 Tj +-433 TJm +(function) 33.2053 Tj +-434 TJm +(call) 14.386 Tj +-434 TJm +(is) 6.64505 Tj +-434 TJm +(out) 12.7322 Tj +-434 TJm +(of) 8.29885 Tj +-434 TJm +(range) 22.1269 Tj +-434 TJm +(or) 8.29885 Tj +-434 TJm +(otherwise) 38.7346 Tj +-434 TJm +(manifestly) 42.0621 Tj +-434 TJm +(incorrect.) 37.8977 Tj +-1723 TJm +(As) 11.0684 Tj +108 89.8778 Td +(with) 17.7135 Tj +[1 0 0 1 131.644 89.8778] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.644 -89.8778] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.644 89.8778 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 233.263 89.8778] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -233.263 -89.8778] cm +[1 0 0 1 0 0] Tm +0 0 Td +233.263 89.8778 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-595 TJm +(this) 14.396 Tj +-596 TJm +(denotes) 30.4357 Tj +-595 TJm +(a) 4.42339 Tj +-595 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-596 TJm +(in) 7.7509 Tj +-595 TJm +(the) 12.1743 Tj +-595 TJm +(client) 22.1369 Tj +-595 TJm +(code.) 21.3 Tj +-2692 TJm +(The) 15.4918 Tj +-596 TJm +(distinction) 42.0721 Tj +-595 TJm +(between) 33.1954 Tj +[1 0 0 1 108 77.9227] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -77.9227] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 77.9227 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +[1 0 0 1 191.686 77.9227] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.686 -77.9227] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.177 77.9227 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 211.053 77.9227] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -211.053 -77.9227] cm +[1 0 0 1 0 0] Tm +0 0 Td +211.053 77.9227 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 312.672 77.9227] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -312.672 -77.9227] cm +[1 0 0 1 0 0] Tm +0 0 Td +315.163 77.9227 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(bit) 10.5205 Tj +-250 TJm +(hazy) 18.8094 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(still) 14.9539 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(orth) 16.0497 Tj +-250 TJm +(making.) 32.3785 Tj +[1 0 0 1 72 75.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.1482] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(10) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 14 14 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 143.731 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -74.2217 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -708.727] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 698.082 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-228 TJm +(when) 21.579 Tj +-227 TJm +(a) 4.42339 Tj +-228 TJm +(request) 28.772 Tj +-227 TJm +(to) 7.7509 Tj +-228 TJm +(allocate) 30.9837 Tj +-228 TJm +(memory) 33.2053 Tj +-227 TJm +(f) 3.31755 Tj +10 TJm +(ailed.) 21.8579 Tj +-605 TJm +(Note) 19.3673 Tj +-228 TJm +(that) 14.9439 Tj +-228 TJm +(the) 12.1743 Tj +-227 TJm +(quantity) 32.6574 Tj +-228 TJm +(of) 8.29885 Tj +-227 TJm +(memory) 33.2053 Tj +-228 TJm +(needed) 28.2141 Tj +-228 TJm +(to) 7.7509 Tj +-227 TJm +(decompress) 47.0334 Tj +108 686.127 Td +(a) 4.42339 Tj +-351 TJm +(stream) 26.5603 Tj +-352 TJm +(cannot) 26.5603 Tj +-351 TJm +(be) 9.40469 Tj +-352 TJm +(determined) 44.8217 Tj +-351 TJm +(until) 18.2714 Tj +-352 TJm +(the) 12.1743 Tj +-351 TJm +(stream') 29.8778 Tj +55 TJm +(s) 3.87545 Tj +-351 TJm +(header) 26.5503 Tj +-352 TJm +(has) 13.2801 Tj +-351 TJm +(been) 18.8094 Tj +-352 TJm +(read.) 19.6363 Tj +-1228 TJm +(So) 10.5205 Tj +[1 0 0 1 426.471 686.127] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -426.471 -686.127] cm +[1 0 0 1 0 0] Tm +0 0 Td +426.471 686.127 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 522.113 686.127] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -522.113 -686.127] cm +[1 0 0 1 0 0] Tm +0 0 Td +525.614 686.127 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 108 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 674.172 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 167.776 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.776 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.13 674.172 Td +/F130_0 9.9626 Tf +(may) 17.1556 Tj +-437 TJm +(return) 23.7907 Tj +[1 0 0 1 221.784 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -221.784 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.784 674.172 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 293.515 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.515 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +297.867 674.172 Td +/F130_0 9.9626 Tf +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-437 TJm +(though) 27.6761 Tj +-437 TJm +(some) 21.031 Tj +-437 TJm +(of) 8.29885 Tj +-437 TJm +(the) 12.1743 Tj +-437 TJm +(compressed) 47.0334 Tj +-437 TJm +(data) 16.5977 Tj +-437 TJm +(has) 13.2801 Tj +-437 TJm +(been) 18.8094 Tj +-437 TJm +(read.) 19.6363 Tj +108 662.217 Td +(The) 15.4918 Tj +-479 TJm +(same) 20.4731 Tj +-478 TJm +(is) 6.64505 Tj +-479 TJm +(not) 12.7322 Tj +-478 TJm +(true) 15.4918 Tj +-479 TJm +(for) 11.6164 Tj +-479 TJm +(compression;) 53.1305 Tj +-593 TJm +(once) 18.8094 Tj +[1 0 0 1 301.675 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -301.675 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +301.675 662.217 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 409.271 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.271 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +414.04 662.217 Td +/F130_0 9.9626 Tf +(or) 8.29885 Tj +[1 0 0 1 427.107 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.107 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +427.107 662.217 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 516.771 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -516.771 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +521.539 662.217 Td +/F130_0 9.9626 Tf +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +108 650.262 Td +(successfully) 48.6972 Tj +-250 TJm +(completed,) 43.9948 Tj +[1 0 0 1 205.672 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -205.672 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +205.672 650.261 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 277.403 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.403 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +279.894 650.261 Td +/F130_0 9.9626 Tf +(cannot) 26.5603 Tj +-250 TJm +(occur) 22.1269 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 648.105] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -634.157] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 624.359 Td +/F134_0 9.9626 Tf +(BZ_DATA_ERROR) 77.7083 Tj +[1 0 0 1 149.709 624.359] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -80.1993 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -623.049] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 612.404 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-266 TJm +(when) 21.579 Tj +-265 TJm +(a) 4.42339 Tj +-266 TJm +(data) 16.5977 Tj +-265 TJm +(inte) 14.9439 Tj +15 TJm +(grity) 18.8194 Tj +-266 TJm +(error) 19.3573 Tj +-266 TJm +(is) 6.64505 Tj +-265 TJm +(detected) 33.1954 Tj +-266 TJm +(during) 26.0123 Tj +-265 TJm +(decompression.) 62.2563 Tj +-714 TJm +(Most) 20.4831 Tj +-266 TJm +(importantl) 41.5142 Tj +1 TJm +(y) 4.9813 Tj +64 TJm +(,) 2.49065 Tj +-269 TJm +(this) 14.396 Tj +-266 TJm +(means) 25.4544 Tj +-265 TJm +(when) 21.579 Tj +108 600.448 Td +(stored) 24.3486 Tj +-222 TJm +(and) 14.386 Tj +-223 TJm +(computed) 39.2925 Tj +-222 TJm +(CRCs) 23.8106 Tj +-222 TJm +(for) 11.6164 Tj +-222 TJm +(the) 12.1743 Tj +-223 TJm +(data) 16.5977 Tj +-222 TJm +(do) 9.9626 Tj +-222 TJm +(not) 12.7322 Tj +-222 TJm +(match.) 26.8392 Tj +-602 TJm +(This) 17.7135 Tj +-222 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-222 TJm +(is) 6.64505 Tj +-223 TJm +(also) 16.0497 Tj +-222 TJm +(returned) 33.1954 Tj +-222 TJm +(upon) 19.9252 Tj +-222 TJm +(detection) 36.5229 Tj +-223 TJm +(of) 8.29885 Tj +-222 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-222 TJm +(other) 20.4731 Tj +108 588.493 Td +(anomaly) 34.3112 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(data.) 19.0883 Tj +[1 0 0 1 72 586.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -572.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 562.59 Td +/F134_0 9.9626 Tf +(BZ_DATA_ERROR_MAGIC) 113.574 Tj +[1 0 0 1 185.574 562.59] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.065 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -561.28] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 550.635 Td +/F130_0 9.9626 Tf +(As) 11.0684 Tj +-306 TJm +(a) 4.42339 Tj +-306 TJm +(special) 27.6661 Tj +-306 TJm +(case) 17.1456 Tj +-307 TJm +(of) 8.29885 Tj +[1 0 0 1 191.852 550.635] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.852 -550.635] cm +[1 0 0 1 0 0] Tm +0 0 Td +191.852 550.635 Td +/F134_0 9.9626 Tf +(BZ_DATA_ERROR) 77.7083 Tj +[1 0 0 1 269.561 550.635] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -269.561 -550.635] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.561 550.635 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-306 TJm +(it) 5.53921 Tj +-306 TJm +(is) 6.64505 Tj +-306 TJm +(sometimes) 42.62 Tj +-307 TJm +(usef) 16.5977 Tj +1 TJm +(ul) 7.7509 Tj +-307 TJm +(to) 7.7509 Tj +-306 TJm +(kno) 14.9439 Tj +25 TJm +(w) 7.193 Tj +-306 TJm +(when) 21.579 Tj +-306 TJm +(the) 12.1743 Tj +-306 TJm +(compressed) 47.0334 Tj +-306 TJm +(stream) 26.5603 Tj +-306 TJm +(does) 18.2614 Tj +108 538.68 Td +(not) 12.7322 Tj +-250 TJm +(start) 17.1556 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(correct) 27.6562 Tj +-250 TJm +(magic) 24.3486 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(\() 3.31755 Tj +[1 0 0 1 261.562 538.68] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -261.562 -538.68] cm +[1 0 0 1 0 0] Tm +0 0 Td +261.562 538.68 Td +/F134_0 9.9626 Tf +('B') 17.9327 Tj +-600 TJm +('Z') 17.9327 Tj +-600 TJm +('h') 17.9327 Tj +[1 0 0 1 327.316 538.68] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -327.316 -538.68] cm +[1 0 0 1 0 0] Tm +0 0 Td +327.316 538.68 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +[1 0 0 1 72 536.523] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -522.576] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 512.777 Td +/F134_0 9.9626 Tf +(BZ_IO_ERROR) 65.7532 Tj +[1 0 0 1 137.753 512.777] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -68.2441 -1.3101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -511.467] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 500.822 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-233 TJm +(by) 9.9626 Tj +[1 0 0 1 159.123 500.822] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.123 -500.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.123 500.822 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 218.899 500.822] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -218.899 -500.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.218 500.822 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 237.923 500.822] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -237.923 -500.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +237.923 500.822 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 303.676 500.822] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.676 -500.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +305.995 500.822 Td +/F130_0 9.9626 Tf +(when) 21.579 Tj +-233 TJm +(there) 19.9152 Tj +-232 TJm +(is) 6.64505 Tj +-233 TJm +(an) 9.40469 Tj +-233 TJm +(error) 19.3573 Tj +-233 TJm +(reading) 29.8778 Tj +-232 TJm +(or) 8.29885 Tj +-233 TJm +(writing) 28.782 Tj +-233 TJm +(in) 7.7509 Tj +-233 TJm +(the) 12.1743 Tj +-232 TJm +(compressed) 47.0334 Tj +108 488.867 Td +(\002le,) 15.2229 Tj +-384 TJm +(and) 14.386 Tj +-357 TJm +(by) 9.9626 Tj +[1 0 0 1 158.511 488.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.511 -488.867] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.511 488.867 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 242.197 488.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -242.197 -488.867] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.755 488.867 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 263.698 488.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -263.698 -488.867] cm +[1 0 0 1 0 0] Tm +0 0 Td +263.698 488.867 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 353.362 488.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -353.362 -488.867] cm +[1 0 0 1 0 0] Tm +0 0 Td +356.92 488.867 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-357 TJm +(attempts) 33.7633 Tj +-357 TJm +(to) 7.7509 Tj +-357 TJm +(use) 13.2801 Tj +-357 TJm +(a) 4.42339 Tj +-357 TJm +(\002le) 12.7322 Tj +-357 TJm +(for) 11.6164 Tj +-358 TJm +(which) 24.3486 Tj +-357 TJm +(the) 12.1743 Tj +-357 TJm +(error) 19.3573 Tj +108 476.912 Td +(indicator) 35.417 Tj +-260 TJm +(\(viz,) 17.9825 Tj +[1 0 0 1 166.603 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -166.603 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.603 476.912 Td +/F134_0 9.9626 Tf +(ferror\(f\)) 53.798 Tj +[1 0 0 1 220.401 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.401 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.401 476.912 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-260 TJm +(is) 6.64505 Tj +-260 TJm +(set.) 13.5591 Tj +-679 TJm +(On) 12.1743 Tj +-260 TJm +(receipt) 27.1082 Tj +-260 TJm +(of) 8.29885 Tj +[1 0 0 1 311.223 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -311.223 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +311.223 476.912 Td +/F134_0 9.9626 Tf +(BZ_IO_ERROR) 65.7532 Tj +[1 0 0 1 376.976 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -376.976 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +376.976 476.912 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-260 TJm +(the) 12.1743 Tj +-260 TJm +(caller) 22.1269 Tj +-260 TJm +(should) 26.5703 Tj +-260 TJm +(consult) 28.782 Tj +[1 0 0 1 482.068 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -482.068 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +482.068 476.912 Td +/F134_0 9.9626 Tf +(errno) 29.8878 Tj +[1 0 0 1 511.956 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.956 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +514.546 476.912 Td +/F130_0 9.9626 Tf +(and/or) 25.4544 Tj +[1 0 0 1 108 464.957] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -464.957] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 464.957 Td +/F134_0 9.9626 Tf +(perror) 35.8654 Tj +[1 0 0 1 143.865 464.957] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.865 -464.957] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.356 464.957 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(acquire) 29.3199 Tj +-250 TJm +(operating-system) 68.6224 Tj +-250 TJm +(speci\002c) 30.4357 Tj +-250 TJm +(information) 47.0434 Tj +-250 TJm +(about) 22.1369 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(problem.) 35.696 Tj +[1 0 0 1 72 462.8] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.9849] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -448.852] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.054 Td +/F134_0 9.9626 Tf +(BZ_UNEXPECTED_EOF) 101.619 Tj +[1 0 0 1 173.619 439.054] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -104.11 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -437.744] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 427.099 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-250 TJm +(by) 9.9626 Tj +[1 0 0 1 159.467 427.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.467 -427.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.467 427.099 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 219.242 427.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -219.242 -427.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.733 427.099 Td +/F130_0 9.9626 Tf +(when) 21.579 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(\002nishes) 30.4457 Tj +-250 TJm +(before) 25.4445 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(logical) 27.1182 Tj +-250 TJm +(end) 14.386 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(stream) 26.5603 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(detected.) 35.686 Tj +[1 0 0 1 72 424.942] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -410.994] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 401.196 Td +/F134_0 9.9626 Tf +(BZ_OUTBUFF_FULL) 89.6634 Tj +[1 0 0 1 161.664 401.196] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -92.1544 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -399.886] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 389.241 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-258 TJm +(by) 9.9626 Tj +[1 0 0 1 159.632 389.241] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.632 -389.241] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.632 389.241 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 303.094 389.241] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.094 -389.241] cm +[1 0 0 1 0 0] Tm +0 0 Td +305.668 389.241 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 322.627 389.241] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -322.627 -389.241] cm +[1 0 0 1 0 0] Tm +0 0 Td +322.627 389.241 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 478.044 389.241] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -478.044 -389.241] cm +[1 0 0 1 0 0] Tm +0 0 Td +480.618 389.241 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-258 TJm +(indicate) 31.5416 Tj +-259 TJm +(that) 14.9439 Tj +108 377.286 Td +(the) 12.1743 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(\002t) 8.30881 Tj +-250 TJm +(into) 15.5018 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-250 TJm +(pro) 13.2801 Tj +15 TJm +(vided.) 24.6275 Tj +[1 0 0 1 72 375.129] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -351.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 328.585 Td +/F122_0 20.6585 Tf +(3.3.) 34.4584 Tj +-278 TJm +(Lo) 25.2447 Tj +15 TJm +(w-le) 40.1808 Tj +15 TJm +(vel) 28.7153 Tj +-278 TJm +(interface) 86.1046 Tj +[1 0 0 1 72 328.327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -318.364] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 297.964 Td +/F122_0 17.2154 Tf +(3.3.1.) 43.0729 Tj +[1 0 0 1 119.858 297.964] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -297.964] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 297.964 Td +/F392_0 17.2154 Tf +(BZ2_bzCompressInit) 185.926 Tj +[1 0 0 1 305.785 297.964] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -233.785 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -244.779] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 15 15 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -296.523] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 274.969 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 271.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(typedef) 41.8429 Tj +-426 TJm +(struct) 35.8654 Tj +-426 TJm +({) 5.97756 Tj +98.4879 699.676 Td +(char) 23.9102 Tj +126.642 697.933 Td +(*) 5.97756 Tj +132.62 699.676 Td +(next_in;) 47.8205 Tj +98.4879 687.721 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(avail_in;) 53.798 Tj +98.4879 675.766 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(total_in_lo32;) 83.6858 Tj +98.4879 663.811 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(total_in_hi32;) 83.6858 Tj +98.4879 639.9 Td +(char) 23.9102 Tj +126.642 638.157 Td +(*) 5.97756 Tj +132.62 639.9 Td +(next_out;) 53.798 Tj +98.4879 627.945 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(avail_out;) 59.7756 Tj +98.4879 615.99 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(total_out_lo32;) 89.6634 Tj +98.4879 604.035 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(total_out_hi32;) 89.6634 Tj +98.4879 580.125 Td +(void) 23.9102 Tj +126.642 578.381 Td +(*) 5.97756 Tj +132.62 580.125 Td +(state;) 35.8654 Tj +98.4879 556.214 Td +(void) 23.9102 Tj +126.642 554.471 Td +(*) 5.97756 Tj +132.62 556.214 Td +(\() 5.97756 Tj +138.597 554.471 Td +(*) 5.97756 Tj +144.575 556.214 Td +(bzalloc\)\(void) 77.7083 Tj +226.527 554.471 Td +(*) 5.97756 Tj +232.505 556.214 Td +(,int,int\);) 59.7756 Tj +98.4879 544.259 Td +(void) 23.9102 Tj +-426 TJm +(\() 5.97756 Tj +132.62 542.516 Td +(*) 5.97756 Tj +138.597 544.259 Td +(bzfree\)\(void) 71.7307 Tj +214.572 542.516 Td +(*) 5.97756 Tj +220.55 544.259 Td +(,void) 29.8878 Tj +254.682 542.516 Td +(*) 5.97756 Tj +260.659 544.259 Td +(\);) 11.9551 Tj +98.4879 532.304 Td +(void) 23.9102 Tj +126.642 530.56 Td +(*) 5.97756 Tj +132.62 532.304 Td +(opaque;) 41.8429 Tj +89.9999 520.349 Td +(}) 5.97756 Tj +-426 TJm +(bz_stream;) 59.7756 Tj +89.9999 496.438 Td +(int) 17.9327 Tj +-426 TJm +(BZ2_bzCompressInit) 107.596 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +292.281 494.695 Td +(*) 5.97756 Tj +298.258 496.438 Td +(strm,) 29.8878 Tj +196.099 484.483 Td +(int) 17.9327 Tj +-426 TJm +(blockSize100k,) 83.6858 Tj +196.099 472.528 Td +(int) 17.9327 Tj +-426 TJm +(verbosity,) 59.7756 Tj +196.099 460.573 Td +(int) 17.9327 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -435.068] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 423.113 Td +/F130_0 9.9626 Tf +(Prepares) 34.3012 Tj +-356 TJm +(for) 11.6164 Tj +-356 TJm +(compression.) 52.8516 Tj +-1256 TJm +(The) 15.4918 Tj +[1 0 0 1 209.409 423.113] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -209.409 -423.113] cm +[1 0 0 1 0 0] Tm +0 0 Td +209.409 423.113 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 263.208 423.113] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -263.208 -423.113] cm +[1 0 0 1 0 0] Tm +0 0 Td +266.754 423.113 Td +/F130_0 9.9626 Tf +(structure) 34.8591 Tj +-356 TJm +(holds) 21.589 Tj +-356 TJm +(all) 9.9626 Tj +-356 TJm +(data) 16.5977 Tj +-356 TJm +(pertaining) 40.3983 Tj +-356 TJm +(to) 7.7509 Tj +-356 TJm +(the) 12.1743 Tj +-356 TJm +(compression) 50.3609 Tj +-355 TJm +(acti) 14.386 Tj +25 TJm +(vity) 15.5018 Tj +65 TJm +(.) 2.49065 Tj +-1256 TJm +(A) 7.193 Tj +[1 0 0 1 72 411.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -411.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 411.158 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 125.798 411.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.798 -411.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +128.581 411.158 Td +/F130_0 9.9626 Tf +(structure) 34.8591 Tj +-279 TJm +(should) 26.5703 Tj +-280 TJm +(be) 9.40469 Tj +-279 TJm +(allocated) 35.965 Tj +-279 TJm +(and) 14.386 Tj +-280 TJm +(initialised) 39.3025 Tj +-279 TJm +(prior) 19.3673 Tj +-279 TJm +(to) 7.7509 Tj +-279 TJm +(the) 12.1743 Tj +-280 TJm +(call.) 16.8766 Tj +-796 TJm +(The) 15.4918 Tj +-279 TJm +(\002elds) 21.589 Tj +-279 TJm +(of) 8.29885 Tj +[1 0 0 1 431.939 411.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.939 -411.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.939 411.158 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 485.738 411.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -485.738 -411.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +488.52 411.158 Td +/F130_0 9.9626 Tf +(comprise) 36.5229 Tj +-279 TJm +(the) 12.1743 Tj +72 399.203 Td +(entirety) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(user) 16.5977 Tj +20 TJm +(-visible) 29.8878 Tj +-250 TJm +(data.) 19.0883 Tj +[1 0 0 1 204.422 399.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.422 -399.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.422 399.203 Td +/F134_0 9.9626 Tf +(state) 29.8878 Tj +[1 0 0 1 234.31 399.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.31 -399.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +236.8 399.203 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(pointer) 28.224 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(pri) 11.0684 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ate) 11.6164 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(structures) 38.7346 Tj +-250 TJm +(required) 33.1954 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(compression.) 52.8516 Tj +[1 0 0 1 72 397.046] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -387.083] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 377.285 Td +/F130_0 9.9626 Tf +(Custom) 31.0036 Tj +-372 TJm +(memory) 33.2053 Tj +-372 TJm +(allocators) 38.7346 Tj +-372 TJm +(are) 12.1643 Tj +-372 TJm +(supported,) 41.7831 Tj +-403 TJm +(via) 12.1743 Tj +-372 TJm +(\002elds) 21.589 Tj +[1 0 0 1 288.908 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -288.908 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +288.908 377.285 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 330.751 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -330.751 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +330.751 377.285 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 337.253 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -337.253 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +337.253 377.285 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 373.118 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -373.118 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +373.118 377.285 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-403 TJm +(and) 14.386 Tj +[1 0 0 1 397.714 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -397.714 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +397.714 377.285 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 433.579 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -433.579 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +433.579 377.285 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1353 TJm +(The) 15.4918 Tj +-372 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +[1 0 0 1 493.782 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.782 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.782 377.285 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 529.648 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -529.648 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.355 377.285 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +72 365.33 Td +(passed) 26.5603 Tj +-306 TJm +(to) 7.7509 Tj +-306 TJm +(as) 8.29885 Tj +-306 TJm +(the) 12.1743 Tj +-306 TJm +(\002rst) 15.5018 Tj +-306 TJm +(ar) 7.74094 Tj +18 TJm +(gument) 29.8878 Tj +-306 TJm +(to) 7.7509 Tj +-306 TJm +(all) 9.9626 Tj +-306 TJm +(calls) 18.2614 Tj +-305 TJm +(to) 7.7509 Tj +[1 0 0 1 253.941 365.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.941 -365.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.941 365.33 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 295.784 365.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -295.784 -365.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +298.832 365.33 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 316.266 365.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.266 -365.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +316.266 365.33 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 352.132 365.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -352.132 -365.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +352.132 365.33 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-320 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-306 TJm +(is) 6.64505 Tj +-306 TJm +(otherwise) 38.7346 Tj +-306 TJm +(ignored) 30.4357 Tj +-306 TJm +(by) 9.9626 Tj +-306 TJm +(the) 12.1743 Tj +-306 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-955 TJm +(The) 15.4918 Tj +72 353.375 Td +(call) 14.386 Tj +[1 0 0 1 89.4309 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -89.4309 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +89.4309 353.375 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +-600 TJm +(\() 5.97756 Tj +-600 TJm +(opaque,) 41.8429 Tj +-600 TJm +(n,) 11.9551 Tj +-600 TJm +(m) 5.97756 Tj +-600 TJm +(\)) 5.97756 Tj +[1 0 0 1 232.893 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.893 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +235.938 353.375 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-306 TJm +(e) 4.42339 Tj +15 TJm +(xpected) 30.9837 Tj +-305 TJm +(to) 7.7509 Tj +-306 TJm +(return) 23.7907 Tj +-306 TJm +(a) 4.42339 Tj +-305 TJm +(pointer) 28.224 Tj +[1 0 0 1 360.3 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.3 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.3 353.375 Td +/F134_0 9.9626 Tf +(p) 5.97756 Tj +[1 0 0 1 366.277 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -366.277 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +369.322 353.375 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +[1 0 0 1 380.118 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -380.118 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +380.118 353.375 Td +/F134_0 9.9626 Tf +(n) 5.97756 Tj +392.073 351.631 Td +(*) 5.97756 Tj +404.029 353.375 Td +(m) 5.97756 Tj +[1 0 0 1 410.006 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.006 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +413.051 353.375 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-306 TJm +(of) 8.29885 Tj +-305 TJm +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-320 TJm +(and) 14.386 Tj +[1 0 0 1 504.135 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -504.135 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +504.135 353.375 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +72 341.42 Td +(\() 5.97756 Tj +-600 TJm +(opaque,) 41.8429 Tj +-600 TJm +(p) 5.97756 Tj +-600 TJm +(\)) 5.97756 Tj +[1 0 0 1 149.709 341.42] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -341.42] cm +[1 0 0 1 0 0] Tm +0 0 Td +152.199 341.42 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-250 TJm +(free) 15.4819 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 339.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -329.3] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 319.502 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-280 TJm +(you) 14.9439 Tj +-280 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-280 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-279 TJm +(to) 7.7509 Tj +-280 TJm +(use) 13.2801 Tj +-280 TJm +(a) 4.42339 Tj +-280 TJm +(custom) 28.782 Tj +-280 TJm +(memory) 33.2053 Tj +-279 TJm +(allocator) 34.8591 Tj +40 TJm +(,) 2.49065 Tj +-288 TJm +(set) 11.0684 Tj +[1 0 0 1 299.9 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -299.9 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.9 319.502 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 341.743 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -341.743 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +341.743 319.502 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 347.096 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -347.096 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +347.096 319.502 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 382.961 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.961 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +385.749 319.502 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 402.923 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -402.923 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +402.923 319.502 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 438.788 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.788 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.576 319.502 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +[1 0 0 1 452.115 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -452.115 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +452.115 319.502 Td +/F134_0 9.9626 Tf +(NULL) 23.9102 Tj +[1 0 0 1 476.025 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -476.025 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +476.025 319.502 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-280 TJm +(and) 14.386 Tj +-280 TJm +(the) 12.1743 Tj +-279 TJm +(library) 26.5603 Tj +72 307.547 Td +(will) 15.5018 Tj +-250 TJm +(then) 17.1556 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(standard) 33.7533 Tj +[1 0 0 1 176.318 307.547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.318 -307.547] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.318 307.547 Td +/F134_0 9.9626 Tf +(malloc) 35.8654 Tj +[1 0 0 1 212.183 307.547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.183 -307.547] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.674 307.547 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 219.934 307.547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -219.934 -307.547] cm +[1 0 0 1 0 0] Tm +0 0 Td +219.934 307.547 Td +/F134_0 9.9626 Tf +(free) 23.9102 Tj +[1 0 0 1 243.844 307.547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.844 -307.547] cm +[1 0 0 1 0 0] Tm +0 0 Td +246.335 307.547 Td +/F130_0 9.9626 Tf +(routines.) 34.5901 Tj +[1 0 0 1 72 307.392] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -297.43] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 285.629 Td +/F130_0 9.9626 Tf +(Before) 27.1082 Tj +-362 TJm +(calling) 27.1182 Tj +[1 0 0 1 133.438 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -133.438 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +133.438 285.629 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 241.035 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -241.035 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +241.035 285.629 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-390 TJm +(\002elds) 21.589 Tj +[1 0 0 1 272.606 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.606 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +272.606 285.629 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 314.449 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -314.449 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +314.449 285.629 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 320.825 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -320.825 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +320.825 285.629 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 356.69 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -356.69 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.296 285.629 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 378.288 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -378.288 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +378.288 285.629 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 414.154 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -414.154 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +417.76 285.629 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-362 TJm +(be) 9.40469 Tj +-362 TJm +(\002lled) 20.4831 Tj +-362 TJm +(appropriately) 53.1206 Tj +65 TJm +(,) 2.49065 Tj +72 273.674 Td +(as) 8.29885 Tj +-322 TJm +(just) 14.396 Tj +-323 TJm +(described.) 40.6673 Tj +-1055 TJm +(Upon) 22.1369 Tj +-322 TJm +(return,) 26.2813 Tj +-341 TJm +(the) 12.1743 Tj +-322 TJm +(internal) 30.4357 Tj +-323 TJm +(state) 18.2614 Tj +-322 TJm +(will) 15.5018 Tj +-323 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-322 TJm +(been) 18.8094 Tj +-323 TJm +(allocated) 35.965 Tj +-322 TJm +(and) 14.386 Tj +-323 TJm +(initialised,) 41.7931 Tj +-340 TJm +(and) 14.386 Tj +[1 0 0 1 459.801 273.674] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -459.801 -273.674] cm +[1 0 0 1 0 0] Tm +0 0 Td +459.801 273.674 Td +/F134_0 9.9626 Tf +(total_in_lo32) 77.7083 Tj +[1 0 0 1 537.509 273.674] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -273.674] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 273.674 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 261.718 Td +/F134_0 9.9626 Tf +(total_in_hi32) 77.7083 Tj +[1 0 0 1 149.709 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +149.709 261.718 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 155.006 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.006 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.006 261.718 Td +/F134_0 9.9626 Tf +(total_out_lo32) 83.6858 Tj +[1 0 0 1 238.692 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -238.692 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +241.435 261.718 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 258.564 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -258.564 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.564 261.718 Td +/F134_0 9.9626 Tf +(total_out_hi32) 83.6858 Tj +[1 0 0 1 342.25 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.25 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +344.994 261.718 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-275 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-276 TJm +(been) 18.8094 Tj +-275 TJm +(set) 11.0684 Tj +-275 TJm +(to) 7.7509 Tj +-276 TJm +(zero.) 19.6363 Tj +-772 TJm +(These) 23.7907 Tj +-275 TJm +(four) 16.5977 Tj +-276 TJm +(\002elds) 21.589 Tj +-275 TJm +(are) 12.1643 Tj +72 249.763 Td +(used) 18.2614 Tj +-340 TJm +(by) 9.9626 Tj +-339 TJm +(the) 12.1743 Tj +-340 TJm +(library) 26.5603 Tj +-339 TJm +(to) 7.7509 Tj +-340 TJm +(inform) 27.1182 Tj +-339 TJm +(the) 12.1743 Tj +-340 TJm +(caller) 22.1269 Tj +-339 TJm +(of) 8.29885 Tj +-340 TJm +(the) 12.1743 Tj +-339 TJm +(total) 17.7135 Tj +-340 TJm +(amount) 29.8878 Tj +-339 TJm +(of) 8.29885 Tj +-340 TJm +(data) 16.5977 Tj +-340 TJm +(passed) 26.5603 Tj +-339 TJm +(into) 15.5018 Tj +-340 TJm +(and) 14.386 Tj +-339 TJm +(out) 12.7322 Tj +-340 TJm +(of) 8.29885 Tj +-339 TJm +(the) 12.1743 Tj +-340 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-362 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +72 237.808 Td +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-376 TJm +(should) 26.5703 Tj +-377 TJm +(not) 12.7322 Tj +-376 TJm +(try) 11.0684 Tj +-376 TJm +(to) 7.7509 Tj +-377 TJm +(change) 28.2141 Tj +-376 TJm +(them.) 22.4159 Tj +-1378 TJm +(As) 11.0684 Tj +-377 TJm +(of) 8.29885 Tj +-376 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-377 TJm +(1.0,) 14.9439 Tj +-408 TJm +(64-bit) 23.8007 Tj +-376 TJm +(counts) 26.0123 Tj +-376 TJm +(are) 12.1643 Tj +-377 TJm +(maintained,) 46.7644 Tj +-408 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-376 TJm +(on) 9.9626 Tj +-376 TJm +(32-bit) 23.8007 Tj +-377 TJm +(platforms,) 40.6773 Tj +72 225.853 Td +(using) 21.589 Tj +-371 TJm +(the) 12.1743 Tj +[1 0 0 1 113.148 225.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.148 -225.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +113.148 225.853 Td +/F134_0 9.9626 Tf +(_hi32) 29.8878 Tj +[1 0 0 1 143.036 225.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.036 -225.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.729 225.853 Td +/F130_0 9.9626 Tf +(\002elds) 21.589 Tj +-371 TJm +(to) 7.7509 Tj +-370 TJm +(store) 19.3673 Tj +-371 TJm +(the) 12.1743 Tj +-371 TJm +(upper) 22.6848 Tj +-370 TJm +(32) 9.9626 Tj +-371 TJm +(bits) 14.396 Tj +-370 TJm +(of) 8.29885 Tj +-371 TJm +(the) 12.1743 Tj +-371 TJm +(count.) 24.6275 Tj +-1344 TJm +(So,) 13.0112 Tj +-400 TJm +(for) 11.6164 Tj +-371 TJm +(e) 4.42339 Tj +15 TJm +(xample,) 31.8205 Tj +-401 TJm +(the) 12.1743 Tj +-371 TJm +(total) 17.7135 Tj +-370 TJm +(amount) 29.8878 Tj +-371 TJm +(of) 8.29885 Tj +-370 TJm +(data) 16.5977 Tj +-371 TJm +(in) 7.7509 Tj +-371 TJm +(is) 6.64505 Tj +[1 0 0 1 72 213.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -213.898] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 213.898 Td +/F134_0 9.9626 Tf +(\(total_in_hi32) 83.6858 Tj +-600 TJm +(<<) 11.9551 Tj +-600 TJm +(32\)) 17.9327 Tj +-600 TJm +(+) 5.97756 Tj +-600 TJm +(total_in_lo32) 77.7083 Tj +[1 0 0 1 293.171 213.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.171 -213.898] cm +[1 0 0 1 0 0] Tm +0 0 Td +293.171 213.898 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 212.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -202.625] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 191.98 Td +/F130_0 9.9626 Tf +(P) 5.53921 Tj +15 TJm +(arameter) 34.8492 Tj +[1 0 0 1 115.367 191.98] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -115.367 -191.98] cm +[1 0 0 1 0 0] Tm +0 0 Td +115.367 191.98 Td +/F134_0 9.9626 Tf +(blockSize100k) 77.7083 Tj +[1 0 0 1 193.076 191.98] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.076 -191.98] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.204 191.98 Td +/F130_0 9.9626 Tf +(speci\002es) 34.3112 Tj +-314 TJm +(the) 12.1743 Tj +-314 TJm +(block) 22.1369 Tj +-314 TJm +(size) 15.4918 Tj +-314 TJm +(to) 7.7509 Tj +-314 TJm +(be) 9.40469 Tj +-314 TJm +(used) 18.2614 Tj +-314 TJm +(for) 11.6164 Tj +-314 TJm +(compression.) 52.8516 Tj +-1004 TJm +(It) 6.08715 Tj +-314 TJm +(should) 26.5703 Tj +-314 TJm +(be) 9.40469 Tj +-315 TJm +(a) 4.42339 Tj +-314 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-314 TJm +(between) 33.1954 Tj +-314 TJm +(1) 4.9813 Tj +72 180.025 Td +(and) 14.386 Tj +-289 TJm +(9) 4.9813 Tj +-289 TJm +(inclusi) 26.5703 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-299 TJm +(and) 14.386 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(actual) 23.7907 Tj +-289 TJm +(block) 22.1369 Tj +-289 TJm +(size) 15.4918 Tj +-289 TJm +(used) 18.2614 Tj +-289 TJm +(is) 6.64505 Tj +-289 TJm +(100000) 29.8878 Tj +-289 TJm +(x) 4.9813 Tj +-289 TJm +(this) 14.396 Tj +-289 TJm +(\002gure.) 25.7334 Tj +-854 TJm +(9) 4.9813 Tj +-290 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(best) 16.0497 Tj +-289 TJm +(compression) 50.3609 Tj +-289 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-289 TJm +(tak) 12.1743 Tj +10 TJm +(es) 8.29885 Tj +-289 TJm +(most) 19.3773 Tj +72 168.07 Td +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 165.913] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -155.95] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 146.152 Td +/F130_0 9.9626 Tf +(P) 5.53921 Tj +15 TJm +(arameter) 34.8492 Tj +[1 0 0 1 115.095 146.152] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -115.095 -146.152] cm +[1 0 0 1 0 0] Tm +0 0 Td +115.095 146.152 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 168.893 146.152] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -168.893 -146.152] cm +[1 0 0 1 0 0] Tm +0 0 Td +171.75 146.152 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-287 TJm +(be) 9.40469 Tj +-286 TJm +(set) 11.0684 Tj +-287 TJm +(to) 7.7509 Tj +-287 TJm +(a) 4.42339 Tj +-287 TJm +(number) 30.4357 Tj +-286 TJm +(between) 33.1954 Tj +-287 TJm +(0) 4.9813 Tj +-287 TJm +(and) 14.386 Tj +-287 TJm +(4) 4.9813 Tj +-286 TJm +(inclusi) 26.5703 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e.) 6.91404 Tj +-841 TJm +(0) 4.9813 Tj +-286 TJm +(is) 6.64505 Tj +-287 TJm +(silent,) 24.0796 Tj +-296 TJm +(and) 14.386 Tj +-287 TJm +(greater) 27.6562 Tj +-287 TJm +(numbers) 34.3112 Tj +-286 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +72 134.197 Td +(increasingly) 48.6972 Tj +-342 TJm +(v) 4.9813 Tj +15 TJm +(erbose) 26.0024 Tj +-342 TJm +(monitoring/deb) 61.4394 Tj +20 TJm +(ugging) 27.6761 Tj +-342 TJm +(output.) 27.9551 Tj +-1173 TJm +(If) 6.63509 Tj +-343 TJm +(the) 12.1743 Tj +-342 TJm +(library) 26.5603 Tj +-342 TJm +(has) 13.2801 Tj +-342 TJm +(been) 18.8094 Tj +-342 TJm +(compiled) 37.0808 Tj +-342 TJm +(with) 17.7135 Tj +[1 0 0 1 446.429 134.197] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -446.429 -134.197] cm +[1 0 0 1 0 0] Tm +0 0 Td +446.429 134.197 Td +/F134_0 9.9626 Tf +(-DBZ_NO_STDIO) 77.7083 Tj +[1 0 0 1 524.138 134.197] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -524.138 -134.197] cm +[1 0 0 1 0 0] Tm +0 0 Td +524.138 134.197 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-342 TJm +(no) 9.9626 Tj +72 122.242 Td +(such) 18.2614 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(appear) 26.5503 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(erbosity) 32.0995 Tj +-250 TJm +(setting.) 29.0609 Tj +[1 0 0 1 72 120.085] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -110.122] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 100.324 Td +/F130_0 9.9626 Tf +(P) 5.53921 Tj +15 TJm +(arameter) 34.8492 Tj +[1 0 0 1 116.619 100.324] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.619 -100.324] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.619 100.324 Td +/F134_0 9.9626 Tf +(workFactor) 59.7756 Tj +[1 0 0 1 176.394 100.324] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.394 -100.324] cm +[1 0 0 1 0 0] Tm +0 0 Td +180.775 100.324 Td +/F130_0 9.9626 Tf +(controls) 32.0995 Tj +-440 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-439 TJm +(the) 12.1743 Tj +-440 TJm +(compression) 50.3609 Tj +-440 TJm +(phase) 22.6848 Tj +-439 TJm +(beha) 18.8094 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-440 TJm +(when) 21.579 Tj +-439 TJm +(presented) 38.1767 Tj +-440 TJm +(with) 17.7135 Tj +-440 TJm +(w) 7.193 Tj +10 TJm +(orst) 14.9439 Tj +-439 TJm +(case,) 19.6363 Tj +-487 TJm +(highly) 25.4644 Tj +72 88.3686 Td +(repetiti) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-433 TJm +(input) 20.4831 Tj +-396 TJm +(data.) 19.0883 Tj +-1496 TJm +(If) 6.63509 Tj +-396 TJm +(compression) 50.3609 Tj +-396 TJm +(runs) 17.1556 Tj +-397 TJm +(i) 2.7696 Tj +1 TJm +(nto) 12.7322 Tj +-397 TJm +(dif) 11.0684 Tj +25 TJm +(\002culties) 31.5516 Tj +-396 TJm +(caused) 27.1082 Tj +-396 TJm +(by) 9.9626 Tj +-396 TJm +(repetiti) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-396 TJm +(data,) 19.0883 Tj +-432 TJm +(the) 12.1743 Tj +-397 TJm +(library) 26.5603 Tj +-396 TJm +(switches) 34.3112 Tj +-396 TJm +(from) 19.3673 Tj +[1 0 0 1 72 50.8518] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(12) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 16 16 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(the) 12.1743 Tj +-255 TJm +(standard) 33.7533 Tj +-254 TJm +(sorting) 27.6761 Tj +-255 TJm +(algorithm) 38.7446 Tj +-254 TJm +(to) 7.7509 Tj +-255 TJm +(a) 4.42339 Tj +-255 TJm +(f) 3.31755 Tj +10 TJm +(allback) 28.772 Tj +-254 TJm +(algorithm.) 41.2352 Tj +-648 TJm +(The) 15.4918 Tj +-255 TJm +(f) 3.31755 Tj +10 TJm +(allback) 28.772 Tj +-254 TJm +(is) 6.64505 Tj +-255 TJm +(slo) 11.6264 Tj +25 TJm +(wer) 14.9339 Tj +-255 TJm +(than) 17.1556 Tj +-254 TJm +(the) 12.1743 Tj +-255 TJm +(standard) 33.7533 Tj +-254 TJm +(algorithm) 38.7446 Tj +-255 TJm +(by) 9.9626 Tj +-255 TJm +(perhaps) 30.9837 Tj +72 698.082 Td +(a) 4.42339 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(actor) 19.9152 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(three,) 22.4059 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-250 TJm +(beha) 18.8094 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-250 TJm +(reasonably) 43.158 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(matter) 25.4544 Tj +-250 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(bad) 14.386 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(input.) 22.9738 Tj +[1 0 0 1 72 695.925] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -685.964] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 676.165 Td +/F130_0 9.9626 Tf +(Lo) 11.0684 Tj +25 TJm +(wer) 14.9339 Tj +-240 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-239 TJm +(of) 8.29885 Tj +[1 0 0 1 138.421 676.165] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.421 -676.165] cm +[1 0 0 1 0 0] Tm +0 0 Td +138.421 676.165 Td +/F134_0 9.9626 Tf +(workFactor) 59.7756 Tj +[1 0 0 1 198.197 676.165] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.197 -676.165] cm +[1 0 0 1 0 0] Tm +0 0 Td +200.585 676.165 Td +/F130_0 9.9626 Tf +(reduce) 26.5503 Tj +-240 TJm +(the) 12.1743 Tj +-239 TJm +(amount) 29.8878 Tj +-240 TJm +(of) 8.29885 Tj +-240 TJm +(ef) 7.74094 Tj +25 TJm +(fort) 14.386 Tj +-239 TJm +(the) 12.1743 Tj +-240 TJm +(standard) 33.7533 Tj +-240 TJm +(algorithm) 38.7446 Tj +-239 TJm +(will) 15.5018 Tj +-240 TJm +(e) 4.42339 Tj +15 TJm +(xpend) 24.3486 Tj +-240 TJm +(before) 25.4445 Tj +-240 TJm +(resorting) 35.417 Tj +-239 TJm +(to) 7.7509 Tj +-240 TJm +(the) 12.1743 Tj +72 664.21 Td +(f) 3.31755 Tj +10 TJm +(allback.) 31.2626 Tj +-618 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-248 TJm +(should) 26.5703 Tj +-247 TJm +(set) 11.0684 Tj +-248 TJm +(this) 14.396 Tj +-247 TJm +(parameter) 39.8305 Tj +-248 TJm +(carefully;) 38.1767 Tj +-248 TJm +(too) 12.7322 Tj +-248 TJm +(lo) 7.7509 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +-248 TJm +(and) 14.386 Tj +-247 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-248 TJm +(inputs) 24.3586 Tj +-248 TJm +(will) 15.5018 Tj +-247 TJm +(be) 9.40469 Tj +-248 TJm +(handled) 31.5416 Tj +-247 TJm +(by) 9.9626 Tj +-248 TJm +(the) 12.1743 Tj +-247 TJm +(f) 3.31755 Tj +10 TJm +(allback) 28.772 Tj +-248 TJm +(algorithm) 38.7446 Tj +72 652.255 Td +(and) 14.386 Tj +-308 TJm +(so) 8.85675 Tj +-308 TJm +(compress) 37.6287 Tj +-308 TJm +(rather) 23.2328 Tj +-309 TJm +(slo) 11.6264 Tj +25 TJm +(wly) 14.9439 Tj +65 TJm +(,) 2.49065 Tj +-322 TJm +(too) 12.7322 Tj +-309 TJm +(high,) 20.2042 Tj +-322 TJm +(and) 14.386 Tj +-308 TJm +(your) 18.2614 Tj +-309 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(erage-to-w) 43.148 Tj +10 TJm +(orst) 14.9439 Tj +-308 TJm +(case) 17.1456 Tj +-308 TJm +(compression) 50.3609 Tj +-308 TJm +(times) 21.589 Tj +-308 TJm +(can) 13.8281 Tj +-308 TJm +(become) 30.9837 Tj +-309 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-308 TJm +(lar) 10.5105 Tj +18 TJm +(ge.) 11.8953 Tj +72 640.3 Td +(The) 15.4918 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(30) 9.9626 Tj +-250 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-250 TJm +(reasonable) 42.6001 Tj +-250 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +-250 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(wide) 19.3673 Tj +-250 TJm +(range) 22.1269 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(circumstances.) 58.9288 Tj +[1 0 0 1 72 638.143] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -628.181] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 618.383 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-250 TJm +(range) 22.1269 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(0) 4.9813 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(250) 14.9439 Tj +-250 TJm +(inclusi) 26.5703 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e.) 6.91404 Tj +-620 TJm +(0) 4.9813 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(special) 27.6661 Tj +-250 TJm +(case,) 19.6363 Tj +-250 TJm +(equi) 17.1556 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(alent) 19.3673 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(using) 21.589 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(30.) 12.4533 Tj +[1 0 0 1 72 616.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -606.265] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 596.466 Td +/F130_0 9.9626 Tf +(Note) 19.3673 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(generated) 38.7246 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(same) 20.4731 Tj +-250 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(ardless) 27.6661 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(whether) 32.0895 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(allback) 28.772 Tj +-250 TJm +(algorithm) 38.7446 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(used.) 20.7521 Tj +[1 0 0 1 72 594.309] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -584.348] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 574.549 Td +/F130_0 9.9626 Tf +(Be) 11.0684 Tj +-303 TJm +(a) 4.42339 Tj +15 TJm +(w) 7.193 Tj +10 TJm +(are) 12.1643 Tj +-303 TJm +(also) 16.0497 Tj +-303 TJm +(that) 14.9439 Tj +-303 TJm +(this) 14.396 Tj +-304 TJm +(parameter) 39.8305 Tj +-303 TJm +(may) 17.1556 Tj +-303 TJm +(disappear) 38.1767 Tj +-303 TJm +(entirely) 30.4357 Tj +-303 TJm +(in) 7.7509 Tj +-303 TJm +(future) 23.7907 Tj +-303 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-303 TJm +(of) 8.29885 Tj +-303 TJm +(the) 12.1743 Tj +-304 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-938 TJm +(In) 8.29885 Tj +-303 TJm +(principle) 35.417 Tj +-303 TJm +(it) 5.53921 Tj +-304 TJm +(should) 26.5703 Tj +-303 TJm +(be) 9.40469 Tj +72 562.594 Td +(possible) 32.6574 Tj +-270 TJm +(to) 7.7509 Tj +-270 TJm +(de) 9.40469 Tj +25 TJm +(vise) 16.0497 Tj +-270 TJm +(a) 4.42339 Tj +-270 TJm +(good) 19.9252 Tj +-270 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-270 TJm +(to) 7.7509 Tj +-271 TJm +(automat) 32.0995 Tj +1 TJm +(ically) 22.1369 Tj +-271 TJm +(choose) 27.6661 Tj +-270 TJm +(which) 24.3486 Tj +-270 TJm +(algorithm) 38.7446 Tj +-270 TJm +(to) 7.7509 Tj +-270 TJm +(use.) 15.7708 Tj +-740 TJm +(Such) 19.9252 Tj +-270 TJm +(a) 4.42339 Tj +-271 TJm +(m) 7.7509 Tj +1 TJm +(echanism) 37.6287 Tj +-271 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-270 TJm +(render) 25.4445 Tj +-270 TJm +(the) 12.1743 Tj +72 550.639 Td +(parameter) 39.8305 Tj +-250 TJm +(obsolete.) 35.696 Tj +[1 0 0 1 72 548.482] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -538.521] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 528.722 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 528.623] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -144.458] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 143.462 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 139.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -519.258] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 519.258 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 507.303 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 495.348 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 483.392 Td +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 471.437 Td +(or) 11.9551 Tj +-426 TJm +(blockSize) 53.798 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(1) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(blockSize) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(9) 5.97756 Tj +98.4879 459.482 Td +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(4) 5.97756 Tj +98.4879 447.527 Td +(or) 11.9551 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(250) 17.9327 Tj +90 435.572 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 423.617 Td +(if) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(enough) 35.8654 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 411.661 Td +(BZ_OK) 29.8878 Tj +98.4879 399.706 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 384.165] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5482] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -374.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 362.248 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 362.148] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -48.8169] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 47.8207 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 44.2341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -352.783] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 352.783 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +98.4879 340.828 Td +(if) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(returned) 47.8205 Tj +98.4879 328.873 Td +(no) 11.9551 Tj +-426 TJm +(specific) 47.8205 Tj +-426 TJm +(action) 35.8654 Tj +-426 TJm +(needed) 35.8654 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(case) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +[1 0 0 1 72 313.331] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -303.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 282.711 Td +/F122_0 17.2154 Tf +(3.3.2.) 43.0729 Tj +[1 0 0 1 119.858 282.711] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -282.711] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 282.711 Td +/F392_0 17.2154 Tf +(BZ2_bzCompress) 144.609 Tj +[1 0 0 1 264.468 282.711] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.468 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -271.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 271.014 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzCompress) 83.6858 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +268.371 269.27 Td +(*) 5.97756 Tj +274.348 271.014 Td +(strm,) 29.8878 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(action) 35.8654 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 255.472] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5482] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -245.51] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 233.555 Td +/F130_0 9.9626 Tf +(Pro) 13.8381 Tj +15 TJm +(vides) 21.031 Tj +-222 TJm +(more) 20.4731 Tj +-221 TJm +(input) 20.4831 Tj +-222 TJm +(and/or) 25.4544 Tj +-222 TJm +(output) 25.4644 Tj +-222 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-221 TJm +(space) 22.1269 Tj +-222 TJm +(for) 11.6164 Tj +-222 TJm +(the) 12.1743 Tj +-221 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-601 TJm +(The) 15.4918 Tj +-222 TJm +(caller) 22.1269 Tj +-222 TJm +(maintains) 38.7446 Tj +-222 TJm +(input) 20.4831 Tj +-221 TJm +(and) 14.386 Tj +-222 TJm +(output) 25.4644 Tj +-222 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fers,) 17.4246 Tj +-227 TJm +(and) 14.386 Tj +-222 TJm +(calls) 18.2614 Tj +[1 0 0 1 72 221.6] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -221.6] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 221.6 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 155.686 221.6] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -221.6] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.177 221.6 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(transfer) 30.4258 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(between) 33.1954 Tj +-250 TJm +(them.) 22.4159 Tj +[1 0 0 1 72 220.066] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -210.104] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 199.683 Td +/F130_0 9.9626 Tf +(Before) 27.1082 Tj +-212 TJm +(each) 18.2515 Tj +-213 TJm +(call) 14.386 Tj +-212 TJm +(to) 7.7509 Tj +[1 0 0 1 147.961 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.961 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +147.961 199.683 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 231.647 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -231.647 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +231.647 199.683 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 236.329 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -236.329 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +236.329 199.683 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 278.172 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.172 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +280.288 199.683 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-212 TJm +(point) 20.4831 Tj +-213 TJm +(at) 7.193 Tj +-212 TJm +(the) 12.1743 Tj +-213 TJm +(data) 16.5977 Tj +-212 TJm +(to) 7.7509 Tj +-212 TJm +(be) 9.40469 Tj +-213 TJm +(compressed,) 49.5241 Tj +-220 TJm +(and) 14.386 Tj +[1 0 0 1 463.493 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -463.493 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +463.493 199.683 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 511.314 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.314 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +513.43 199.683 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +72 187.728 Td +(indicate) 31.5416 Tj +-246 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-247 TJm +(m) 7.7509 Tj +1 TJm +(an) 9.40469 Tj +14 TJm +(y) 4.9813 Tj +-246 TJm +(bytes) 21.031 Tj +-246 TJm +(the) 12.1743 Tj +-246 TJm +(library) 26.5603 Tj +-247 TJm +(may) 17.1556 Tj +-246 TJm +(read.) 19.6363 Tj +[1 0 0 1 259.242 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.242 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +259.242 187.728 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 342.929 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.929 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +345.382 187.728 Td +/F130_0 9.9626 Tf +(updates) 30.4357 Tj +[1 0 0 1 378.271 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -378.271 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +378.271 187.728 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 420.114 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -420.114 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +420.114 187.728 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 425.066 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -425.066 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +425.066 187.728 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 472.886 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.886 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +475.34 187.728 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 492.179 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -492.179 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +492.179 187.728 Td +/F134_0 9.9626 Tf +(total_in) 47.8205 Tj +[1 0 0 1 540 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 175.773 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(re\003ect) 24.8965 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(read.) 19.6363 Tj +[1 0 0 1 72 173.616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -163.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 153.856 Td +/F130_0 9.9626 Tf +(Similarly) 37.0908 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 113.611 153.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.611 -153.856] cm +[1 0 0 1 0 0] Tm +0 0 Td +113.611 153.856 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 161.432 153.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.432 -153.856] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.072 153.856 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-265 TJm +(point) 20.4831 Tj +-265 TJm +(to) 7.7509 Tj +-265 TJm +(a) 4.42339 Tj +-265 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-265 TJm +(in) 7.7509 Tj +-265 TJm +(which) 24.3486 Tj +-265 TJm +(the) 12.1743 Tj +-265 TJm +(compressed) 47.0334 Tj +-265 TJm +(data) 16.5977 Tj +-265 TJm +(is) 6.64505 Tj +-265 TJm +(to) 7.7509 Tj +-265 TJm +(be) 9.40469 Tj +-265 TJm +(placed,) 28.493 Tj +-269 TJm +(with) 17.7135 Tj +[1 0 0 1 464.742 153.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -464.742 -153.856] cm +[1 0 0 1 0 0] Tm +0 0 Td +464.742 153.856 Td +/F134_0 9.9626 Tf +(avail_out) 53.798 Tj +[1 0 0 1 518.54 153.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -518.54 -153.856] cm +[1 0 0 1 0 0] Tm +0 0 Td +521.181 153.856 Td +/F130_0 9.9626 Tf +(indi-) 18.8194 Tj +72 141.901 Td +(cating) 24.3486 Tj +-209 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-209 TJm +(much) 22.1369 Tj +-209 TJm +(output) 25.4644 Tj +-209 TJm +(space) 22.1269 Tj +-209 TJm +(is) 6.64505 Tj +-210 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable.) 29.0509 Tj +[1 0 0 1 243.087 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.087 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.087 141.901 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 326.773 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -326.773 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +328.856 141.901 Td +/F130_0 9.9626 Tf +(updates) 30.4357 Tj +[1 0 0 1 361.375 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -361.375 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +361.375 141.901 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 409.196 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.196 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +409.196 141.901 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 413.851 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -413.851 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +413.851 141.901 Td +/F134_0 9.9626 Tf +(avail_out) 53.798 Tj +[1 0 0 1 467.649 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -467.649 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +469.732 141.901 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 486.202 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -486.202 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +486.202 141.901 Td +/F134_0 9.9626 Tf +(total_out) 53.798 Tj +[1 0 0 1 540 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 129.946 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(re\003ect) 24.8965 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 127.789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -117.827] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 108.029 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-272 TJm +(may) 17.1556 Tj +-272 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-272 TJm +(and) 14.386 Tj +-272 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-272 TJm +(as) 8.29885 Tj +-272 TJm +(little) 18.2714 Tj +-272 TJm +(or) 8.29885 Tj +-272 TJm +(as) 8.29885 Tj +-272 TJm +(much) 22.1369 Tj +-271 TJm +(data) 16.5977 Tj +-272 TJm +(as) 8.29885 Tj +-272 TJm +(you) 14.9439 Tj +-272 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-272 TJm +(on) 9.9626 Tj +-272 TJm +(each) 18.2515 Tj +-272 TJm +(call) 14.386 Tj +-272 TJm +(of) 8.29885 Tj +[1 0 0 1 399.123 108.029] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -399.123 -108.029] cm +[1 0 0 1 0 0] Tm +0 0 Td +399.123 108.029 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 482.809 108.029] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -482.809 -108.029] cm +[1 0 0 1 0 0] Tm +0 0 Td +482.809 108.029 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-752 TJm +(In) 8.29885 Tj +-272 TJm +(the) 12.1743 Tj +-272 TJm +(limit,) 21.32 Tj +72 96.0736 Td +(it) 5.53921 Tj +-266 TJm +(is) 6.64505 Tj +-265 TJm +(acceptable) 42.0422 Tj +-266 TJm +(to) 7.7509 Tj +-266 TJm +(supply) 26.5703 Tj +-266 TJm +(and) 14.386 Tj +-265 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-266 TJm +(data) 16.5977 Tj +-266 TJm +(one) 14.386 Tj +-265 TJm +(byte) 17.1556 Tj +-266 TJm +(at) 7.193 Tj +-266 TJm +(a) 4.42339 Tj +-266 TJm +(time,) 20.2042 Tj +-269 TJm +(although) 34.8691 Tj +-266 TJm +(this) 14.396 Tj +-266 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-265 TJm +(be) 9.40469 Tj +-266 TJm +(terribly) 29.3299 Tj +-266 TJm +(inef) 15.4918 Tj +25 TJm +(\002cient.) 27.3972 Tj +-714 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-266 TJm +(should) 26.5703 Tj +72 84.1184 Td +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-250 TJm +(ensure) 26.0024 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(least) 18.2614 Tj +-250 TJm +(one) 14.386 Tj +-250 TJm +(byte) 17.1556 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(space) 22.1269 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(each) 18.2515 Tj +-250 TJm +(call.) 16.8766 Tj +[1 0 0 1 72 81.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.1482] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(13) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 17 17 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(A) 7.193 Tj +-250 TJm +(second) 27.6661 Tj +-250 TJm +(purpose) 31.5416 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 156.662 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -156.662 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +156.662 710.037 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 240.348 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.348 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +242.839 710.037 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(request) 28.772 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(change) 28.2141 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(mode) 22.1369 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -697.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 688.12 Td +/F130_0 9.9626 Tf +(Conceptually) 53.1305 Tj +65 TJm +(,) 2.49065 Tj +-217 TJm +(a) 4.42339 Tj +-210 TJm +(compressed) 47.0334 Tj +-209 TJm +(stream) 26.5603 Tj +-209 TJm +(can) 13.8281 Tj +-209 TJm +(be) 9.40469 Tj +-210 TJm +(in) 7.7509 Tj +-209 TJm +(one) 14.386 Tj +-209 TJm +(of) 8.29885 Tj +-209 TJm +(four) 16.5977 Tj +-210 TJm +(states:) 24.9065 Tj +-289 TJm +(IDLE,) 25.1755 Tj +-209 TJm +(R) 6.64505 Tj +40 TJm +(UNNING,) 41.7732 Tj +-210 TJm +(FLUSHING) 49.2551 Tj +-209 TJm +(and) 14.386 Tj +-209 TJm +(FINISHING.) 52.2937 Tj +-419 TJm +(Be-) 14.386 Tj +72 676.164 Td +(fore) 16.0398 Tj +-264 TJm +(initialisation) 49.823 Tj +-263 TJm +(\() 3.31755 Tj +[1 0 0 1 146.434 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -146.434 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.434 676.164 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 254.031 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.031 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +254.031 676.164 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-264 TJm +(and) 14.386 Tj +-263 TJm +(after) 18.2515 Tj +-264 TJm +(termination) 45.9375 Tj +-264 TJm +(\() 3.31755 Tj +[1 0 0 1 349.75 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -349.75 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +349.75 676.164 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 451.369 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -451.369 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +451.369 676.164 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-267 TJm +(a) 4.42339 Tj +-264 TJm +(stream) 26.5603 Tj +-264 TJm +(is) 6.64505 Tj +-263 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(arded) 22.1269 Tj +72 664.209 Td +(as) 8.29885 Tj +-250 TJm +(IDLE.) 25.1755 Tj +[1 0 0 1 72 664.11] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -654.147] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 642.291 Td +/F130_0 9.9626 Tf +(Upon) 22.1369 Tj +-389 TJm +(initialisation) 49.823 Tj +-390 TJm +(\() 3.31755 Tj +[1 0 0 1 155.036 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.036 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.036 642.291 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 262.632 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -262.632 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +262.632 642.291 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-424 TJm +(the) 12.1743 Tj +-390 TJm +(stream) 26.5603 Tj +-389 TJm +(is) 6.64505 Tj +-389 TJm +(placed) 26.0024 Tj +-390 TJm +(in) 7.7509 Tj +-389 TJm +(the) 12.1743 Tj +-390 TJm +(R) 6.64505 Tj +40 TJm +(UNNING) 39.2825 Tj +-389 TJm +(state.) 20.7521 Tj +-1457 TJm +(Subsequent) 45.9375 Tj +-389 TJm +(calls) 18.2614 Tj +72 630.336 Td +(to) 7.7509 Tj +[1 0 0 1 83.818 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.818 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.818 630.336 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 167.504 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.504 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +171.571 630.336 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-408 TJm +(pass) 17.1556 Tj +[1 0 0 1 223.431 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -223.431 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +223.431 630.336 Td +/F134_0 9.9626 Tf +(BZ_RUN) 35.8654 Tj +[1 0 0 1 259.297 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.297 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +263.363 630.336 Td +/F130_0 9.9626 Tf +(as) 8.29885 Tj +-408 TJm +(the) 12.1743 Tj +-408 TJm +(requested) 38.1767 Tj +-409 TJm +(action;) 27.1182 Tj +-487 TJm +(other) 20.4731 Tj +-408 TJm +(actions) 28.224 Tj +-408 TJm +(are) 12.1643 Tj +-409 TJm +(ille) 12.7322 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(al) 7.193 Tj +-408 TJm +(and) 14.386 Tj +-408 TJm +(will) 15.5018 Tj +-408 TJm +(result) 22.1369 Tj +-409 TJm +(in) 7.7509 Tj +[1 0 0 1 72 618.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -618.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 618.381 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 173.619 618.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.619 -618.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +173.619 618.381 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 617.071] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -607.108] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 596.463 Td +/F130_0 9.9626 Tf +(At) 9.9626 Tj +-279 TJm +(some) 21.031 Tj +-279 TJm +(point,) 22.9738 Tj +-286 TJm +(the) 12.1743 Tj +-279 TJm +(calling) 27.1182 Tj +-279 TJm +(program) 33.7533 Tj +-279 TJm +(will) 15.5018 Tj +-279 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-278 TJm +(pro) 13.2801 Tj +14 TJm +(vi) 7.7509 Tj +1 TJm +(ded) 14.386 Tj +-279 TJm +(all) 9.9626 Tj +-279 TJm +(the) 12.1743 Tj +-279 TJm +(input) 20.4831 Tj +-279 TJm +(data) 16.5977 Tj +-279 TJm +(it) 5.53921 Tj +-279 TJm +(w) 7.193 Tj +10 TJm +(ants) 16.0497 Tj +-279 TJm +(to.) 10.2416 Tj +-793 TJm +(It) 6.08715 Tj +-279 TJm +(will) 15.5018 Tj +-279 TJm +(then) 17.1556 Tj +-279 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-279 TJm +(to) 7.7509 Tj +-279 TJm +(\002nish) 22.1469 Tj +-279 TJm +(up) 9.9626 Tj +-279 TJm +(--) 6.63509 Tj +72 584.508 Td +(in) 7.7509 Tj +-287 TJm +(ef) 7.74094 Tj +25 TJm +(fect,) 17.4246 Tj +-297 TJm +(asking) 26.0123 Tj +-288 TJm +(the) 12.1743 Tj +-287 TJm +(library) 26.5603 Tj +-287 TJm +(to) 7.7509 Tj +-288 TJm +(process) 29.8778 Tj +-287 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-288 TJm +(data) 16.5977 Tj +-287 TJm +(it) 5.53921 Tj +-287 TJm +(might) 23.2527 Tj +-288 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-287 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fered) 20.4632 Tj +-288 TJm +(internally) 38.1866 Tj +65 TJm +(.) 2.49065 Tj +-844 TJm +(In) 8.29885 Tj +-288 TJm +(this) 14.396 Tj +-287 TJm +(state,) 20.7521 Tj +[1 0 0 1 456.314 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -456.314 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +456.314 584.508 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 540 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 572.553 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-258 TJm +(no) 9.9626 Tj +-257 TJm +(longer) 25.4544 Tj +-258 TJm +(attempt) 29.8878 Tj +-258 TJm +(to) 7.7509 Tj +-258 TJm +(read) 17.1456 Tj +-257 TJm +(data) 16.5977 Tj +-258 TJm +(from) 19.3673 Tj +[1 0 0 1 234.207 572.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.207 -572.553] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.207 572.553 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 276.051 572.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -276.051 -572.553] cm +[1 0 0 1 0 0] Tm +0 0 Td +276.051 572.553 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-260 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-257 TJm +(it) 5.53921 Tj +-258 TJm +(will) 15.5018 Tj +-258 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-257 TJm +(to) 7.7509 Tj +-258 TJm +(write) 20.4731 Tj +-258 TJm +(data) 16.5977 Tj +-258 TJm +(to) 7.7509 Tj +[1 0 0 1 407.082 572.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -407.082 -572.553] cm +[1 0 0 1 0 0] Tm +0 0 Td +407.082 572.553 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 454.902 572.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -454.902 -572.553] cm +[1 0 0 1 0 0] Tm +0 0 Td +454.902 572.553 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-666 TJm +(Because) 33.1954 Tj +-258 TJm +(the) 12.1743 Tj +-258 TJm +(output) 25.4644 Tj +72 560.598 Td +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-228 TJm +(supplied) 33.7633 Tj +-228 TJm +(by) 9.9626 Tj +-229 TJm +(the) 12.1743 Tj +-228 TJm +(user) 16.5977 Tj +-228 TJm +(can) 13.8281 Tj +-228 TJm +(be) 9.40469 Tj +-228 TJm +(arbitrarily) 39.8404 Tj +-229 TJm +(sma) 16.0497 Tj +1 TJm +(ll,) 8.02986 Tj +-233 TJm +(the) 12.1743 Tj +-228 TJm +(\002nishing-up) 48.1592 Tj +-228 TJm +(operation) 37.6287 Tj +-229 TJm +(cannot) 26.5603 Tj +-228 TJm +(necessarily) 44.2638 Tj +-228 TJm +(be) 9.40469 Tj +-228 TJm +(done) 19.3673 Tj +-228 TJm +(with) 17.7135 Tj +-229 TJm +(a) 4.42339 Tj +-228 TJm +(single) 23.8007 Tj +72 548.643 Td +(call) 14.386 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 99.6659 548.643] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -99.6659 -548.643] cm +[1 0 0 1 0 0] Tm +0 0 Td +99.6659 548.643 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 183.352 548.643] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.352 -548.643] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.352 548.643 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 547.108] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -537.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 526.725 Td +/F130_0 9.9626 Tf +(Instead,) 31.2626 Tj +-346 TJm +(the) 12.1743 Tj +-327 TJm +(calling) 27.1182 Tj +-326 TJm +(program) 33.7533 Tj +-327 TJm +(passes) 25.4544 Tj +[1 0 0 1 218.231 526.725] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -218.231 -526.725] cm +[1 0 0 1 0 0] Tm +0 0 Td +218.231 526.725 Td +/F134_0 9.9626 Tf +(BZ_FINISH) 53.798 Tj +[1 0 0 1 272.029 526.725] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.029 -526.725] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.284 526.725 Td +/F130_0 9.9626 Tf +(as) 8.29885 Tj +-327 TJm +(an) 9.40469 Tj +-327 TJm +(action) 24.3486 Tj +-326 TJm +(to) 7.7509 Tj +[1 0 0 1 338.108 526.725] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -338.108 -526.725] cm +[1 0 0 1 0 0] Tm +0 0 Td +338.108 526.725 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 421.795 526.725] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -421.795 -526.725] cm +[1 0 0 1 0 0] Tm +0 0 Td +421.795 526.725 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1081 TJm +(This) 17.7135 Tj +-326 TJm +(changes) 32.0895 Tj +-327 TJm +(the) 12.1743 Tj +-327 TJm +(stream') 29.8778 Tj +55 TJm +(s) 3.87545 Tj +72 514.77 Td +(state) 18.2614 Tj +-291 TJm +(to) 7.7509 Tj +-290 TJm +(FINISHING.) 52.2937 Tj +-581 TJm +(An) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-291 TJm +(remaining) 40.3983 Tj +-290 TJm +(input) 20.4831 Tj +-291 TJm +(\(ie,) 13.0012 Tj +[1 0 0 1 264.452 514.77] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -264.452 -514.77] cm +[1 0 0 1 0 0] Tm +0 0 Td +264.452 514.77 Td +/F134_0 9.9626 Tf +(next_in[0) 53.798 Tj +-600 TJm +(..) 11.9551 Tj +-1200 TJm +(avail_in-1]) 65.7532 Tj +[1 0 0 1 413.892 514.77] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -413.892 -514.77] cm +[1 0 0 1 0 0] Tm +0 0 Td +413.892 514.77 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-291 TJm +(is) 6.64505 Tj +-290 TJm +(compressed) 47.0334 Tj +-291 TJm +(and) 14.386 Tj +-290 TJm +(transferred) 43.148 Tj +72 502.814 Td +(to) 7.7509 Tj +-421 TJm +(the) 12.1743 Tj +-421 TJm +(output) 25.4644 Tj +-421 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +55 TJm +(.) 2.49065 Tj +-1646 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-421 TJm +(do) 9.9626 Tj +-422 TJm +(this) 14.396 Tj +1 TJm +(,) 2.49065 Tj +[1 0 0 1 222.339 502.814] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -222.339 -502.814] cm +[1 0 0 1 0 0] Tm +0 0 Td +222.339 502.814 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 306.025 502.814] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -306.025 -502.814] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.22 502.814 Td +/F130_0 9.9626 Tf +(must) 19.3773 Tj +-421 TJm +(be) 9.40469 Tj +-421 TJm +(called) 23.7907 Tj +-421 TJm +(repeatedly) 41.4942 Tj +-421 TJm +(until) 18.2714 Tj +-421 TJm +(all) 9.9626 Tj +-421 TJm +(the) 12.1743 Tj +-421 TJm +(output) 25.4644 Tj +-421 TJm +(has) 13.2801 Tj +-421 TJm +(been) 18.8094 Tj +72 490.859 Td +(consumed.) 42.889 Tj +-1397 TJm +(At) 9.9626 Tj +-379 TJm +(that) 14.9439 Tj +-380 TJm +(point,) 22.9738 Tj +[1 0 0 1 188.346 490.859] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -188.346 -490.859] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.346 490.859 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 272.033 490.859] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.033 -490.859] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.813 490.859 Td +/F130_0 9.9626 Tf +(returns) 27.6661 Tj +[1 0 0 1 307.259 490.859] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -307.259 -490.859] cm +[1 0 0 1 0 0] Tm +0 0 Td +307.259 490.859 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 384.968 490.859] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -384.968 -490.859] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.968 490.859 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-379 TJm +(and) 14.386 Tj +-380 TJm +(the) 12.1743 Tj +-379 TJm +(stream') 29.8778 Tj +55 TJm +(s) 3.87545 Tj +-380 TJm +(state) 18.2614 Tj +-379 TJm +(is) 6.64505 Tj +-380 TJm +(set) 11.0684 Tj +-379 TJm +(back) 18.8094 Tj +-379 TJm +(to) 7.7509 Tj +72 478.904 Td +(IDLE.) 25.1755 Tj +[1 0 0 1 99.6662 478.904] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -99.6662 -478.904] cm +[1 0 0 1 0 0] Tm +0 0 Td +99.6662 478.904 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 201.285 478.904] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -201.285 -478.904] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.776 478.904 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-250 TJm +(then) 17.1556 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(called.) 26.2813 Tj +[1 0 0 1 72 477.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -467.407] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 456.986 Td +/F130_0 9.9626 Tf +(Just) 15.5018 Tj +-380 TJm +(to) 7.7509 Tj +-380 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-379 TJm +(sure) 16.5977 Tj +-380 TJm +(the) 12.1743 Tj +-380 TJm +(calling) 27.1182 Tj +-380 TJm +(program) 33.7533 Tj +-379 TJm +(does) 18.2614 Tj +-380 TJm +(not) 12.7322 Tj +-380 TJm +(cheat,) 23.5117 Tj +-412 TJm +(the) 12.1743 Tj +-380 TJm +(library) 26.5603 Tj +-380 TJm +(mak) 17.1556 Tj +10 TJm +(es) 8.29885 Tj +-379 TJm +(a) 4.42339 Tj +-380 TJm +(note) 17.1556 Tj +-380 TJm +(of) 8.29885 Tj +[1 0 0 1 415.708 456.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -415.708 -456.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +415.708 456.986 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 463.528 456.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -463.528 -456.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +467.312 456.986 Td +/F130_0 9.9626 Tf +(at) 7.193 Tj +-380 TJm +(the) 12.1743 Tj +-380 TJm +(time) 17.7135 Tj +-379 TJm +(of) 8.29885 Tj +-380 TJm +(the) 12.1743 Tj +72 445.031 Td +(\002rst) 15.5018 Tj +-286 TJm +(call) 14.386 Tj +-286 TJm +(t) 2.7696 Tj +1 TJm +(o) 4.9813 Tj +[1 0 0 1 118.179 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -118.179 -445.031] cm +[1 0 0 1 0 0] Tm +0 0 Td +118.179 445.031 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 201.865 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -201.865 -445.031] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.713 445.031 Td +/F130_0 9.9626 Tf +(which) 24.3486 Tj +-286 TJm +(has) 13.2801 Tj +[1 0 0 1 248.035 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -248.035 -445.031] cm +[1 0 0 1 0 0] Tm +0 0 Td +248.035 445.031 Td +/F134_0 9.9626 Tf +(BZ_FINISH) 53.798 Tj +[1 0 0 1 301.833 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -301.833 -445.031] cm +[1 0 0 1 0 0] Tm +0 0 Td +304.68 445.031 Td +/F130_0 9.9626 Tf +(as) 8.29885 Tj +-286 TJm +(an) 9.40469 Tj +-286 TJm +(action) 24.3486 Tj +-285 TJm +(\(ie,) 13.0012 Tj +-295 TJm +(at) 7.193 Tj +-286 TJm +(the) 12.1743 Tj +-286 TJm +(time) 17.7135 Tj +-285 TJm +(the) 12.1743 Tj +-286 TJm +(program) 33.7533 Tj +-286 TJm +(has) 13.2801 Tj +-286 TJm +(announced) 43.158 Tj +-285 TJm +(its) 9.41466 Tj +72 433.076 Td +(intention) 35.427 Tj +-292 TJm +(to) 7.7509 Tj +-292 TJm +(not) 12.7322 Tj +-291 TJm +(supply) 26.5703 Tj +-292 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-292 TJm +(more) 20.4731 Tj +-292 TJm +(input\).) 26.2913 Tj +-870 TJm +(By) 11.6264 Tj +-292 TJm +(comparing) 42.61 Tj +-292 TJm +(this) 14.396 Tj +-292 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-291 TJm +(with) 17.7135 Tj +-292 TJm +(that) 14.9439 Tj +-292 TJm +(of) 8.29885 Tj +[1 0 0 1 392.862 433.076] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.862 -433.076] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.862 433.076 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 440.682 433.076] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -440.682 -433.076] cm +[1 0 0 1 0 0] Tm +0 0 Td +443.589 433.076 Td +/F130_0 9.9626 Tf +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-292 TJm +(subsequent) 44.2738 Tj +-292 TJm +(calls) 18.2614 Tj +-291 TJm +(to) 7.7509 Tj +[1 0 0 1 72 421.121] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -421.121] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 421.121 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 155.686 421.121] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -421.121] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.686 421.121 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-247 TJm +(the) 12.1743 Tj +-247 TJm +(library) 26.5603 Tj +-246 TJm +(can) 13.8281 Tj +-247 TJm +(detect) 23.7907 Tj +-246 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-247 TJm +(att) 9.9626 Tj +1 TJm +(empts) 23.8007 Tj +-247 TJm +(to) 7.7509 Tj +-246 TJm +(slip) 14.396 Tj +-247 TJm +(in) 7.7509 Tj +-246 TJm +(more) 20.4731 Tj +-247 TJm +(data) 16.5977 Tj +-246 TJm +(to) 7.7509 Tj +-247 TJm +(compress.) 40.1194 Tj +-617 TJm +(An) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-247 TJm +(calls) 18.2614 Tj +-246 TJm +(for) 11.6164 Tj +-247 TJm +(which) 24.3486 Tj +-246 TJm +(this) 14.396 Tj +-247 TJm +(is) 6.64505 Tj +72 409.166 Td +(detected) 33.1954 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(return) 23.7907 Tj +[1 0 0 1 151.959 409.166] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -151.959 -409.166] cm +[1 0 0 1 0 0] Tm +0 0 Td +151.959 409.166 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 253.578 409.166] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.578 -409.166] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.578 409.166 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-500 TJm +(This) 17.7135 Tj +-250 TJm +(indicates) 35.417 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(programming) 54.2364 Tj +-250 TJm +(mistak) 26.5703 Tj +10 TJm +(e) 4.42339 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(corrected.) 39.5515 Tj +[1 0 0 1 72 407.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -397.046] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 387.248 Td +/F130_0 9.9626 Tf +(Instead) 28.772 Tj +-224 TJm +(of) 8.29885 Tj +-223 TJm +(asking) 26.0123 Tj +-224 TJm +(to) 7.7509 Tj +-223 TJm +(\002nish,) 24.6375 Tj +-229 TJm +(the) 12.1743 Tj +-224 TJm +(calling) 27.1182 Tj +-223 TJm +(program) 33.7533 Tj +-224 TJm +(may) 17.1556 Tj +-224 TJm +(ask) 13.2801 Tj +[1 0 0 1 293.282 387.248] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.282 -387.248] cm +[1 0 0 1 0 0] Tm +0 0 Td +293.282 387.248 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 376.968 387.248] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -376.968 -387.248] cm +[1 0 0 1 0 0] Tm +0 0 Td +379.196 387.248 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-224 TJm +(tak) 12.1743 Tj +10 TJm +(e) 4.42339 Tj +-223 TJm +(all) 9.9626 Tj +-224 TJm +(the) 12.1743 Tj +-223 TJm +(remaining) 40.3983 Tj +-224 TJm +(input,) 22.9738 Tj +-229 TJm +(compress) 37.6287 Tj +72 375.293 Td +(it) 5.53921 Tj +-278 TJm +(and) 14.386 Tj +-278 TJm +(terminate) 37.6287 Tj +-278 TJm +(the) 12.1743 Tj +-278 TJm +(current) 28.2141 Tj +-277 TJm +(\(Burro) 26.5603 Tj +25 TJm +(ws-Wheeler\)) 51.4469 Tj +-278 TJm +(compression) 50.3609 Tj +-278 TJm +(block.) 24.6275 Tj +-787 TJm +(Th) 11.0684 Tj +-1 TJm +(i) 2.7696 Tj +1 TJm +(s) 3.87545 Tj +-278 TJm +(could) 22.1369 Tj +-278 TJm +(be) 9.40469 Tj +-278 TJm +(useful) 24.3486 Tj +-278 TJm +(for) 11.6164 Tj +-278 TJm +(error) 19.3573 Tj +-278 TJm +(control) 28.224 Tj +-278 TJm +(purposes.) 37.9077 Tj +72 363.338 Td +(The) 15.4918 Tj +-328 TJm +(mechanism) 45.3796 Tj +-328 TJm +(is) 6.64505 Tj +-328 TJm +(analogous) 40.3983 Tj +-328 TJm +(to) 7.7509 Tj +-328 TJm +(that) 14.9439 Tj +-328 TJm +(for) 11.6164 Tj +-328 TJm +(\002nishing:) 37.6487 Tj +-466 TJm +(call) 14.386 Tj +[1 0 0 1 297.049 363.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -297.049 -363.337] cm +[1 0 0 1 0 0] Tm +0 0 Td +297.049 363.337 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 380.735 363.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -380.735 -363.337] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.003 363.337 Td +/F130_0 9.9626 Tf +(with) 17.7135 Tj +-328 TJm +(an) 9.40469 Tj +-328 TJm +(action) 24.3486 Tj +-328 TJm +(of) 8.29885 Tj +[1 0 0 1 456.841 363.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -456.841 -363.337] cm +[1 0 0 1 0 0] Tm +0 0 Td +456.841 363.337 Td +/F134_0 9.9626 Tf +(BZ_FLUSH) 47.8205 Tj +[1 0 0 1 504.662 363.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -504.662 -363.337] cm +[1 0 0 1 0 0] Tm +0 0 Td +504.662 363.337 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-328 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +72 351.382 Td +(output) 25.4644 Tj +-445 TJm +(data,) 19.0883 Tj +-494 TJm +(and) 14.386 Tj +-446 TJm +(persist) 26.0123 Tj +-445 TJm +(with) 17.7135 Tj +-445 TJm +(the) 12.1743 Tj +[1 0 0 1 213.94 351.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.94 -351.382] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.94 351.382 Td +/F134_0 9.9626 Tf +(BZ_FLUSH) 47.8205 Tj +[1 0 0 1 261.761 351.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -261.761 -351.382] cm +[1 0 0 1 0 0] Tm +0 0 Td +266.195 351.382 Td +/F130_0 9.9626 Tf +(action) 24.3486 Tj +-445 TJm +(until) 18.2714 Tj +-445 TJm +(the) 12.1743 Tj +-446 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +[1 0 0 1 360.062 351.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.062 -351.382] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.062 351.382 Td +/F134_0 9.9626 Tf +(BZ_RUN) 35.8654 Tj +[1 0 0 1 395.928 351.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -395.928 -351.382] cm +[1 0 0 1 0 0] Tm +0 0 Td +400.362 351.382 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-445 TJm +(returned.) 35.686 Tj +-1792 TJm +(As) 11.0684 Tj +-445 TJm +(with) 17.7135 Tj +-445 TJm +(\002nishing,) 37.3697 Tj +[1 0 0 1 72 339.427] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -339.427] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 339.427 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 155.686 339.427] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -339.427] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.177 339.427 Td +/F130_0 9.9626 Tf +(detects) 27.6661 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(attempt) 29.8878 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(input) 20.4831 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(once) 18.8094 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\003ush) 19.3773 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(be) 9.40469 Tj +15 TJm +(gun.) 17.4346 Tj +[1 0 0 1 72 337.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -327.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 317.509 Td +/F130_0 9.9626 Tf +(Once) 21.0211 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\003ush) 19.3773 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(complete,) 39.0135 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(stream) 26.5603 Tj +-250 TJm +(returns) 27.6661 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(normal) 28.224 Tj +-250 TJm +(R) 6.64505 Tj +40 TJm +(UNNING) 39.2825 Tj +-250 TJm +(state.) 20.7521 Tj +[1 0 0 1 72 315.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -305.39] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 295.591 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-344 TJm +(all) 9.9626 Tj +-343 TJm +(sounds) 27.6761 Tj +-344 TJm +(pretty) 23.2427 Tj +-344 TJm +(comple) 29.3299 Tj +15 TJm +(x,) 7.47195 Tj +-367 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-344 TJm +(isn') 14.9439 Tj +18 TJm +(t) 2.7696 Tj +-344 TJm +(really) 22.6848 Tj +65 TJm +(.) 2.49065 Tj +-1182 TJm +(Here') 22.6749 Tj +55 TJm +(s) 3.87545 Tj +-344 TJm +(a) 4.42339 Tj +-344 TJm +(table) 19.3673 Tj +-343 TJm +(which) 24.3486 Tj +-344 TJm +(sho) 13.8381 Tj +25 TJm +(ws) 11.0684 Tj +-344 TJm +(which) 24.3486 Tj +-344 TJm +(actions) 28.224 Tj +-343 TJm +(are) 12.1643 Tj +-344 TJm +(allo) 14.9439 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-344 TJm +(in) 7.7509 Tj +-344 TJm +(each) 18.2515 Tj +72 283.636 Td +(state,) 20.7521 Tj +-281 TJm +(what) 19.3673 Tj +-274 TJm +(action) 24.3486 Tj +-275 TJm +(will) 15.5018 Tj +-274 TJm +(be) 9.40469 Tj +-275 TJm +(tak) 12.1743 Tj +10 TJm +(en,) 11.8953 Tj +-280 TJm +(what) 19.3673 Tj +-275 TJm +(the) 12.1743 Tj +-274 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-275 TJm +(state) 18.2614 Tj +-274 TJm +(is,) 9.1357 Tj +-281 TJm +(and) 14.386 Tj +-274 TJm +(what) 19.3673 Tj +-275 TJm +(the) 12.1743 Tj +-275 TJm +(non-error) 37.6188 Tj +-274 TJm +(return) 23.7907 Tj +-275 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-274 TJm +(are.) 14.655 Tj +-767 TJm +(Note) 19.3673 Tj +-275 TJm +(that) 14.9439 Tj +-274 TJm +(you) 14.9439 Tj +-275 TJm +(can') 17.1456 Tj +18 TJm +(t) 2.7696 Tj +72 271.681 Td +(e) 4.42339 Tj +15 TJm +(xplicitly) 33.2153 Tj +-347 TJm +(ask) 13.2801 Tj +-348 TJm +(what) 19.3673 Tj +-347 TJm +(state) 18.2614 Tj +-348 TJm +(the) 12.1743 Tj +-347 TJm +(stream) 26.5603 Tj +-348 TJm +(is) 6.64505 Tj +-347 TJm +(in,) 10.2416 Tj +-372 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-347 TJm +(nor) 13.2801 Tj +-348 TJm +(do) 9.9626 Tj +-347 TJm +(you) 14.9439 Tj +-348 TJm +(need) 18.8094 Tj +-347 TJm +(to) 7.7509 Tj +-348 TJm +(--) 6.63509 Tj +-347 TJm +(it) 5.53921 Tj +-348 TJm +(can) 13.8281 Tj +-347 TJm +(be) 9.40469 Tj +-347 TJm +(inferred) 31.5316 Tj +-348 TJm +(from) 19.3673 Tj +-347 TJm +(the) 12.1743 Tj +-348 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-347 TJm +(returned) 33.1954 Tj +-348 TJm +(by) 9.9626 Tj +[1 0 0 1 72 259.726] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -259.726] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 259.726 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 155.686 259.726] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -259.726] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.686 259.726 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 258.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -207.34] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(14) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 18 18 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -595.402] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 573.848 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 570.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(IDLE/any) 47.8205 Tj +98.4879 699.676 Td +(Illegal.) 47.8205 Tj +-852 TJm +(IDLE) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(only) 23.9102 Tj +-426 TJm +(exists) 35.8654 Tj +-426 TJm +(after) 29.8878 Tj +-426 TJm +(BZ2_bzCompressEnd) 101.619 Tj +-426 TJm +(or) 11.9551 Tj +98.4879 687.721 Td +(before) 35.8654 Tj +-426 TJm +(BZ2_bzCompressInit.) 113.574 Tj +98.4879 675.766 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_SEQUENCE_ERROR) 101.619 Tj +90 651.856 Td +(RUNNING/BZ_RUN) 83.6858 Tj +98.4879 639.9 Td +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible.) 53.798 Tj +98.4879 627.945 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(RUNNING) 41.8429 Tj +98.4879 615.99 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_RUN_OK) 53.798 Tj +90 592.08 Td +(RUNNING/BZ_FLUSH) 95.641 Tj +98.4879 580.125 Td +(Remember) 47.8205 Tj +-426 TJm +(current) 41.8429 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(next_in.) 47.8205 Tj +-426 TJm +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +98.4879 568.169 Td +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible,) 53.798 Tj +-426 TJm +(but) 17.9327 Tj +-426 TJm +(do) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(accept) 35.8654 Tj +-426 TJm +(any) 17.9327 Tj +-426 TJm +(more) 23.9102 Tj +-426 TJm +(input.) 35.8654 Tj +98.4879 556.214 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(FLUSHING) 47.8205 Tj +98.4879 544.259 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_FLUSH_OK) 65.7532 Tj +90 520.349 Td +(RUNNING/BZ_FINISH) 101.619 Tj +98.4879 508.394 Td +(Remember) 47.8205 Tj +-426 TJm +(current) 41.8429 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(next_in.) 47.8205 Tj +-426 TJm +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +98.4879 496.438 Td +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible,) 53.798 Tj +-426 TJm +(but) 17.9327 Tj +-426 TJm +(do) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(accept) 35.8654 Tj +-426 TJm +(any) 17.9327 Tj +-426 TJm +(more) 23.9102 Tj +-426 TJm +(input.) 35.8654 Tj +98.4879 484.483 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(FINISHING) 53.798 Tj +98.4879 472.528 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_FINISH_OK) 71.7307 Tj +90 448.618 Td +(FLUSHING/BZ_FLUSH) 101.619 Tj +98.4879 436.663 Td +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible,) 53.798 Tj +98.4879 424.707 Td +(but) 17.9327 Tj +-426 TJm +(do) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(accept) 35.8654 Tj +-426 TJm +(any) 17.9327 Tj +-426 TJm +(more) 23.9102 Tj +-426 TJm +(input.) 35.8654 Tj +98.4879 412.752 Td +(If) 11.9551 Tj +-426 TJm +(all) 17.9327 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(existing) 47.8205 Tj +-426 TJm +(input) 29.8878 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(used) 23.9102 Tj +-426 TJm +(up) 11.9551 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(all) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +98.4879 400.797 Td +(output) 35.8654 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(removed) 41.8429 Tj +106.976 388.842 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(RUNNING;) 47.8205 Tj +-426 TJm +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_RUN_OK) 53.798 Tj +98.4879 376.887 Td +(else) 23.9102 Tj +106.976 364.932 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(FLUSHING;) 53.798 Tj +-426 TJm +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_FLUSH_OK) 65.7532 Tj +90 341.021 Td +(FLUSHING/other) 83.6858 Tj +98.4879 329.066 Td +(Illegal.) 47.8205 Tj +98.4879 317.111 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_SEQUENCE_ERROR) 101.619 Tj +90 293.201 Td +(FINISHING/BZ_FINISH) 113.574 Tj +98.4879 281.245 Td +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible,) 53.798 Tj +98.4879 269.29 Td +(but) 17.9327 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(accept) 35.8654 Tj +-426 TJm +(any) 17.9327 Tj +-426 TJm +(more) 23.9102 Tj +-426 TJm +(input.) 35.8654 Tj +98.4879 257.335 Td +(If) 11.9551 Tj +-426 TJm +(all) 17.9327 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(existing) 47.8205 Tj +-426 TJm +(input) 29.8878 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(used) 23.9102 Tj +-426 TJm +(up) 11.9551 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(all) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +98.4879 245.38 Td +(output) 35.8654 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(removed) 41.8429 Tj +106.976 233.425 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(IDLE;) 29.8878 Tj +-426 TJm +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_STREAM_END) 77.7083 Tj +98.4879 221.47 Td +(else) 23.9102 Tj +106.976 209.514 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(FINISHING;) 59.7756 Tj +-426 TJm +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_FINISH_OK) 71.7307 Tj +90 185.604 Td +(FINISHING/other) 89.6634 Tj +98.4879 173.649 Td +(Illegal.) 47.8205 Tj +98.4879 161.694 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 72 146.152] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -136.189] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 124.234 Td +/F130_0 9.9626 Tf +(That) 18.2614 Tj +-250 TJm +(still) 14.9539 Tj +-250 TJm +(looks) 21.589 Tj +-250 TJm +(complicated?) 53.1206 Tj +-620 TJm +(W) 9.40469 Tj +80 TJm +(ell,) 12.4533 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(air) 10.5105 Tj +-250 TJm +(enough.) 31.8205 Tj +-620 TJm +(The) 15.4918 Tj +-250 TJm +(usual) 21.031 Tj +-250 TJm +(sequence) 36.5129 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(calls) 18.2614 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(compressing) 50.3609 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(load) 17.1556 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(is:) 9.41466 Tj +[1 0 0 1 72 122.077] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 7.3724 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -79.3724 -92.3537] cm +[1 0 0 1 0 0] Tm +0 0 Td +79.3724 92.3537 Td +/F130_0 9.9626 Tf +(1.) 7.47195 Tj +[1 0 0 1 86.8444 92.3537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -92.3537] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 92.3537 Td +/F130_0 9.9626 Tf +(Get) 14.386 Tj +-250 TJm +(started) 26.5603 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 158.056 92.3537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.056 -92.3537] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.056 92.3537 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 265.653 92.3537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -265.653 -92.3537] cm +[1 0 0 1 0 0] Tm +0 0 Td +265.653 92.3537 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 268.144 92.3537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.144 -41.5019] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.893 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(15) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 19 19 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -31.5168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 7.3724 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -79.3724 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +79.3724 710.037 Td +/F130_0 9.9626 Tf +(2.) 7.47195 Tj +[1 0 0 1 86.8444 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 710.037 Td +/F130_0 9.9626 Tf +(Sho) 15.5018 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-240 TJm +(data) 16.5977 Tj +-240 TJm +(in) 7.7509 Tj +-241 TJm +(and) 14.386 Tj +-240 TJm +(shlurp) 24.9065 Tj +-240 TJm +(out) 12.7322 Tj +-240 TJm +(its) 9.41466 Tj +-240 TJm +(compressed) 47.0334 Tj +-241 TJm +(form) 19.3673 Tj +-240 TJm +(using) 21.589 Tj +-240 TJm +(zero) 17.1456 Tj +-240 TJm +(or) 8.29885 Tj +-240 TJm +(more) 20.4731 Tj +-241 TJm +(calls) 18.2614 Tj +-240 TJm +(of) 8.29885 Tj +[1 0 0 1 401.454 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -401.454 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +401.454 710.037 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 485.14 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -485.14 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +487.533 710.037 Td +/F130_0 9.9626 Tf +(with) 17.7135 Tj +-240 TJm +(action) 24.3486 Tj +-240 TJm +(=) 5.61891 Tj +[1 0 0 1 91.9253 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 698.082 Td +/F134_0 9.9626 Tf +(BZ_RUN) 35.8654 Tj +[1 0 0 1 127.791 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -127.791 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +127.791 698.082 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 130.281 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -58.2814 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 7.3724 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -79.3724 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +79.3724 676.164 Td +/F130_0 9.9626 Tf +(3.) 7.47195 Tj +[1 0 0 1 86.8444 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 676.164 Td +/F130_0 9.9626 Tf +(Finish) 24.9165 Tj +-242 TJm +(up.) 12.4533 Tj +-307 TJm +(Repeatedly) 44.8217 Tj +-241 TJm +(call) 14.386 Tj +[1 0 0 1 198.784 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.784 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.784 676.164 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 282.471 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.471 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +284.878 676.164 Td +/F130_0 9.9626 Tf +(with) 17.7135 Tj +-242 TJm +(action) 24.3486 Tj +-241 TJm +(=) 5.61891 Tj +[1 0 0 1 339.78 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.78 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.78 676.164 Td +/F134_0 9.9626 Tf +(BZ_FINISH) 53.798 Tj +[1 0 0 1 393.579 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -393.579 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +393.579 676.164 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-242 TJm +(cop) 14.386 Tj +10 TJm +(ying) 17.7135 Tj +-241 TJm +(out) 12.7322 Tj +-242 TJm +(the) 12.1743 Tj +-242 TJm +(compres) 33.7533 Tj +1 TJm +(sed) 13.2801 Tj +-242 TJm +(output,) 27.9551 Tj +91.9253 664.209 Td +(until) 18.2714 Tj +[1 0 0 1 112.687 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -112.687 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +112.687 664.209 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 190.396 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -190.396 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.886 664.209 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(returned.) 35.686 Tj +[1 0 0 1 237.708 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.708 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 7.3724 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -79.3724 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +79.3724 642.291 Td +/F130_0 9.9626 Tf +(4.) 7.47195 Tj +[1 0 0 1 86.8444 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 642.291 Td +/F130_0 9.9626 Tf +(Close) 22.6948 Tj +-250 TJm +(up) 9.9626 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(go) 9.9626 Tj +-250 TJm +(home.) 24.6275 Tj +-620 TJm +(Call) 16.6077 Tj +[1 0 0 1 208.796 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -208.796 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.796 642.291 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 310.415 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -310.415 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.415 642.291 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 312.906 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.906 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -630.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 620.374 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-269 TJm +(the) 12.1743 Tj +-270 TJm +(data) 16.5977 Tj +-269 TJm +(you) 14.9439 Tj +-270 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-269 TJm +(to) 7.7509 Tj +-270 TJm +(compress) 37.6287 Tj +-269 TJm +(\002ts) 12.1843 Tj +-270 TJm +(into) 15.5018 Tj +-269 TJm +(your) 18.2614 Tj +-270 TJm +(input) 20.4831 Tj +-269 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-270 TJm +(all) 9.9626 Tj +-269 TJm +(at) 7.193 Tj +-270 TJm +(once,) 21.3 Tj +-274 TJm +(you) 14.9439 Tj +-269 TJm +(can) 13.8281 Tj +-270 TJm +(skip) 16.6077 Tj +-269 TJm +(the) 12.1743 Tj +-270 TJm +(calls) 18.2614 Tj +-269 TJm +(of) 8.29885 Tj +[1 0 0 1 456.314 620.374] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -456.314 -620.374] cm +[1 0 0 1 0 0] Tm +0 0 Td +456.314 620.374 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +72 608.418 Td +(\() 5.97756 Tj +-600 TJm +(...,) 23.9102 Tj +-600 TJm +(BZ_RUN) 35.8654 Tj +-600 TJm +(\)) 5.97756 Tj +[1 0 0 1 161.664 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.664 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.154 608.418 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +-250 TJm +(just) 14.396 Tj +-250 TJm +(do) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 225.036 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -225.036 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +225.036 608.418 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +-600 TJm +(\() 5.97756 Tj +-600 TJm +(...,) 23.9102 Tj +-600 TJm +(BZ_FINISH) 53.798 Tj +-600 TJm +(\)) 5.97756 Tj +[1 0 0 1 422.296 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.296 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +424.786 608.418 Td +/F130_0 9.9626 Tf +(calls.) 20.7521 Tj +[1 0 0 1 72 606.262] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -596.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 586.501 Td +/F130_0 9.9626 Tf +(All) 12.7322 Tj +-278 TJm +(required) 33.1954 Tj +-277 TJm +(memory) 33.2053 Tj +-278 TJm +(is) 6.64505 Tj +-277 TJm +(allocated) 35.965 Tj +-278 TJm +(by) 9.9626 Tj +[1 0 0 1 220.295 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.295 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.295 586.501 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 327.891 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -327.891 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +327.891 586.501 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-785 TJm +(The) 15.4918 Tj +-278 TJm +(compression) 50.3609 Tj +-277 TJm +(library) 26.5603 Tj +-278 TJm +(can) 13.8281 Tj +-277 TJm +(accept) 25.4445 Tj +-278 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-277 TJm +(data) 16.5977 Tj +-278 TJm +(at) 7.193 Tj +-278 TJm +(all) 9.9626 Tj +72 574.545 Td +(\(ob) 13.2801 Tj +15 TJm +(viously\).) 35.1481 Tj +-612 TJm +(So) 10.5205 Tj +-238 TJm +(you) 14.9439 Tj +-237 TJm +(shouldn') 34.8691 Tj +18 TJm +(t) 2.7696 Tj +-238 TJm +(get) 12.1743 Tj +-238 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-237 TJm +(error) 19.3573 Tj +-238 TJm +(return) 23.7907 Tj +-238 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-238 TJm +(from) 19.3673 Tj +-237 TJm +(the) 12.1743 Tj +[1 0 0 1 339.287 574.545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.287 -574.545] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.287 574.545 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 422.973 574.545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.973 -574.545] cm +[1 0 0 1 0 0] Tm +0 0 Td +425.342 574.545 Td +/F130_0 9.9626 Tf +(calls.) 20.7521 Tj +-612 TJm +(If) 6.63509 Tj +-238 TJm +(you) 14.9439 Tj +-237 TJm +(do,) 12.4533 Tj +-240 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-238 TJm +(will) 15.5018 Tj +-238 TJm +(be) 9.40469 Tj +[1 0 0 1 72 562.59] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -562.59] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 562.59 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 173.619 562.59] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.619 -562.59] cm +[1 0 0 1 0 0] Tm +0 0 Td +173.619 562.59 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(indicate) 31.5416 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(your) 18.2614 Tj +-250 TJm +(programming.) 56.727 Tj +[1 0 0 1 72 560.433] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -550.471] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 540.673 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +35 TJm +(ri) 6.08715 Tj +25 TJm +(vial) 14.9439 Tj +-250 TJm +(other) 20.4731 Tj +-250 TJm +(possible) 32.6574 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 538.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8617] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -529.151] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 529.151 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 517.196 Td +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL,) 29.8878 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(strm->s) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +[1 0 0 1 72 501.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -491.691] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 471.033 Td +/F122_0 17.2154 Tf +(3.3.3.) 43.0729 Tj +[1 0 0 1 119.858 471.033] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -471.033] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 471.033 Td +/F392_0 17.2154 Tf +(BZ2_bzCompressEnd) 175.597 Tj +[1 0 0 1 295.455 471.033] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -223.455 -2.3326] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -459.335] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 459.335 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzCompressEnd) 101.619 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +286.303 457.592 Td +(*) 5.97756 Tj +292.281 459.335 Td +(strm) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 443.793] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -433.831] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 421.876 Td +/F130_0 9.9626 Tf +(Releases) 34.8591 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(memory) 33.2053 Tj +-250 TJm +(associated) 40.9463 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(compression) 50.3609 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 419.719] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -409.756] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 399.958 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 399.858] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -390.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 390.493 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +-852 TJm +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(strm->s) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +90 378.538 Td +(BZ_OK) 29.8878 Tj +-4686 TJm +(otherwise) 53.798 Tj +[1 0 0 1 72 362.996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -353.034] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 332.375 Td +/F122_0 17.2154 Tf +(3.3.4.) 43.0729 Tj +[1 0 0 1 119.858 332.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -332.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 332.375 Td +/F392_0 17.2154 Tf +(BZ2_bzDecompressInit) 206.585 Tj +[1 0 0 1 326.443 332.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.443 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -320.678] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 320.678 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzDecompressInit) 119.551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +304.236 318.934 Td +(*) 5.97756 Tj +310.214 320.678 Td +(strm,) 29.8878 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(verbosity,) 59.7756 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 305.136] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -295.173] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 283.218 Td +/F130_0 9.9626 Tf +(Prepares) 34.3012 Tj +-351 TJm +(for) 11.6164 Tj +-351 TJm +(decompression.) 62.2563 Tj +-1228 TJm +(As) 11.0684 Tj +-351 TJm +(with) 17.7135 Tj +[1 0 0 1 235.177 283.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -235.177 -283.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +235.177 283.218 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 342.773 283.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.773 -283.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +342.773 283.218 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-377 TJm +(a) 4.42339 Tj +[1 0 0 1 356.937 283.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -356.937 -283.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +356.937 283.218 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 410.736 283.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.736 -283.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +414.235 283.218 Td +/F130_0 9.9626 Tf +(record) 25.4445 Tj +-351 TJm +(should) 26.5703 Tj +-351 TJm +(be) 9.40469 Tj +-352 TJm +(allocated) 35.965 Tj +-351 TJm +(and) 14.386 Tj +72 271.263 Td +(initialised) 39.3025 Tj +-306 TJm +(before) 25.4445 Tj +-305 TJm +(the) 12.1743 Tj +-306 TJm +(call.) 16.8766 Tj +-953 TJm +(Fields) 24.3586 Tj +[1 0 0 1 211.833 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -211.833 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +211.833 271.263 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 253.676 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.676 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.676 271.263 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 259.35 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.35 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +259.35 271.263 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 295.215 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -295.215 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +298.26 271.263 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 315.69 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -315.69 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +315.69 271.263 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 351.556 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -351.556 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +354.6 271.263 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-306 TJm +(be) 9.40469 Tj +-305 TJm +(set) 11.0684 Tj +-306 TJm +(if) 6.08715 Tj +-305 TJm +(a) 4.42339 Tj +-306 TJm +(custom) 28.782 Tj +-305 TJm +(memory) 33.2053 Tj +-306 TJm +(allocator) 34.8591 Tj +-306 TJm +(is) 6.64505 Tj +72 259.308 Td +(required,) 35.686 Tj +-350 TJm +(or) 8.29885 Tj +-331 TJm +(made) 21.579 Tj +[1 0 0 1 147.635 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.635 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +147.635 259.308 Td +/F134_0 9.9626 Tf +(NULL) 23.9102 Tj +[1 0 0 1 171.546 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -171.546 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +174.835 259.308 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-330 TJm +(the) 12.1743 Tj +-331 TJm +(normal) 28.224 Tj +[1 0 0 1 236.722 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -236.722 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +236.722 259.308 Td +/F134_0 9.9626 Tf +(malloc) 35.8654 Tj +[1 0 0 1 272.587 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.587 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.878 259.308 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 281.938 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -281.938 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +281.938 259.308 Td +/F134_0 9.9626 Tf +(free) 23.9102 Tj +[1 0 0 1 305.848 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -305.848 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +309.139 259.308 Td +/F130_0 9.9626 Tf +(routines.) 34.5901 Tj +-1102 TJm +(Upon) 22.1369 Tj +-330 TJm +(return,) 26.2813 Tj +-350 TJm +(the) 12.1743 Tj +-331 TJm +(internal) 30.4357 Tj +-330 TJm +(state) 18.2614 Tj +-330 TJm +(will) 15.5018 Tj +-330 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-331 TJm +(been) 18.8094 Tj +72 247.353 Td +(initialised,) 41.7931 Tj +-250 TJm +(and) 14.386 Tj +[1 0 0 1 133.16 247.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -133.16 -247.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +133.16 247.353 Td +/F134_0 9.9626 Tf +(total_in) 47.8205 Tj +[1 0 0 1 180.98 247.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -180.98 -247.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.471 247.353 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 200.348 247.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -200.348 -247.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +200.348 247.353 Td +/F134_0 9.9626 Tf +(total_out) 53.798 Tj +[1 0 0 1 254.146 247.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.146 -247.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +256.637 247.353 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(zero.) 19.6363 Tj +[1 0 0 1 72 245.913] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -235.951] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 225.435 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(meaning) 34.3112 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(parameter) 39.8305 Tj +[1 0 0 1 192.756 225.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.756 -225.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.756 225.435 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 246.554 225.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -246.554 -225.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +246.554 225.435 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(see) 12.7222 Tj +[1 0 0 1 266.748 225.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -266.748 -225.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +266.748 225.435 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 374.345 225.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -374.345 -225.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +374.345 225.435 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 223.278] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -213.315] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 203.517 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 81.4975 203.517] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -81.4975 -203.517] cm +[1 0 0 1 0 0] Tm +0 0 Td +81.4975 203.517 Td +/F134_0 9.9626 Tf +(small) 29.8878 Tj +[1 0 0 1 111.385 203.517] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -111.385 -203.517] cm +[1 0 0 1 0 0] Tm +0 0 Td +114.248 203.517 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-287 TJm +(nonzero,) 34.5802 Tj +-297 TJm +(the) 12.1743 Tj +-287 TJm +(library) 26.5603 Tj +-288 TJm +(will) 15.5018 Tj +-287 TJm +(use) 13.2801 Tj +-287 TJm +(an) 9.40469 Tj +-287 TJm +(alternati) 32.6474 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-288 TJm +(decompression) 59.7656 Tj +-287 TJm +(algorithm) 38.7446 Tj +-287 TJm +(which) 24.3486 Tj +-288 TJm +(uses) 17.1556 Tj +-287 TJm +(less) 14.9439 Tj +-287 TJm +(memory) 33.2053 Tj +-287 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-288 TJm +(at) 7.193 Tj +-287 TJm +(the) 12.1743 Tj +72 191.562 Td +(cost) 16.0497 Tj +-289 TJm +(of) 8.29885 Tj +-290 TJm +(decompressing) 59.7656 Tj +-289 TJm +(more) 20.4731 Tj +-289 TJm +(slo) 11.6264 Tj +25 TJm +(wly) 14.9439 Tj +-290 TJm +(\(roughly) 34.3112 Tj +-289 TJm +(speaking,) 37.9077 Tj +-299 TJm +(half) 15.4918 Tj +-290 TJm +(the) 12.1743 Tj +-289 TJm +(speed,) 25.1755 Tj +-299 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-289 TJm +(the) 12.1743 Tj +-290 TJm +(maximum) 40.4083 Tj +-289 TJm +(memory) 33.2053 Tj +-289 TJm +(requirement) 48.1393 Tj +-290 TJm +(drops) 22.1369 Tj +72 179.607 Td +(to) 7.7509 Tj +-250 TJm +(around) 27.6661 Tj +-250 TJm +(2300k\).) 30.7147 Tj +-620 TJm +(See) 14.386 Tj +[1 0 0 1 166.166 179.607] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -166.166 -179.607] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.166 179.607 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 235.924 179.607] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -235.924 -179.607] cm +[1 0 0 1 0 0] Tm +0 0 Td +238.415 179.607 Td +/F130_0 9.9626 Tf +([2]) 11.6164 Tj +[1 0 0 1 250.031 179.607] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -250.031 -179.607] cm +[1 0 0 1 0 0] Tm +0 0 Td +252.522 179.607 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(information) 47.0434 Tj +-250 TJm +(on) 9.9626 Tj +-250 TJm +(memory) 33.2053 Tj +-250 TJm +(management.) 53.3995 Tj +[1 0 0 1 72 177.45] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -167.487] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 157.689 Td +/F130_0 9.9626 Tf +(Note) 19.3673 Tj +-289 TJm +(that) 14.9439 Tj +-290 TJm +(the) 12.1743 Tj +-289 TJm +(amount) 29.8878 Tj +-289 TJm +(of) 8.29885 Tj +-289 TJm +(memory) 33.2053 Tj +-290 TJm +(needed) 28.2141 Tj +-289 TJm +(to) 7.7509 Tj +-289 TJm +(decompress) 47.0334 Tj +-289 TJm +(a) 4.42339 Tj +-290 TJm +(stream) 26.5603 Tj +-289 TJm +(cannot) 26.5603 Tj +-289 TJm +(be) 9.40469 Tj +-289 TJm +(determined) 44.8217 Tj +-290 TJm +(until) 18.2714 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(stream') 29.8778 Tj +55 TJm +(s) 3.87545 Tj +-289 TJm +(header) 26.5503 Tj +-290 TJm +(has) 13.2801 Tj +72 145.734 Td +(been) 18.8094 Tj +-342 TJm +(read,) 19.6363 Tj +-366 TJm +(so) 8.85675 Tj +-342 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-342 TJm +(if) 6.08715 Tj +[1 0 0 1 161.081 145.734] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.081 -145.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.081 145.734 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 280.633 145.734] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -280.633 -145.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +284.043 145.734 Td +/F130_0 9.9626 Tf +(succeeds,) 37.8977 Tj +-365 TJm +(a) 4.42339 Tj +-343 TJm +(subsequent) 44.2738 Tj +[1 0 0 1 381.098 145.734] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -381.098 -145.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +381.098 145.734 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 476.739 145.734] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -476.739 -145.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +480.149 145.734 Td +/F130_0 9.9626 Tf +(could) 22.1369 Tj +-342 TJm +(f) 3.31755 Tj +10 TJm +(ail) 9.9626 Tj +-343 TJm +(with) 17.7135 Tj +[1 0 0 1 72 133.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -133.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 133.779 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 143.731 133.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -133.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.731 133.779 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 132.469] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -122.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 111.861 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 111.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.9095] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 20 20 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -117.195] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 95.6413 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 92.0547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 687.721 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 675.766 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(1) 5.97756 Tj +-426 TJm +(\)) 5.97756 Tj +98.4879 663.811 Td +(or) 11.9551 Tj +-426 TJm +(\(verbosity) 59.7756 Tj +-426 TJm +(<;) 11.9551 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(||) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(4\)) 11.9551 Tj +90 651.856 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 639.9 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +[1 0 0 1 72 624.359] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -614.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 602.441 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 602.341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -48.8169] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 47.8207 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 44.2341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -592.976] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 592.976 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +98.4879 581.021 Td +(if) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(returned) 47.8205 Tj +98.4879 569.066 Td +(no) 11.9551 Tj +-426 TJm +(specific) 47.8205 Tj +-426 TJm +(action) 35.8654 Tj +-426 TJm +(required) 47.8205 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(case) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +[1 0 0 1 72 553.524] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -543.562] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 522.903 Td +/F122_0 17.2154 Tf +(3.3.5.) 43.0729 Tj +[1 0 0 1 119.858 522.903] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -522.903] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 522.903 Td +/F392_0 17.2154 Tf +(BZ2_bzDecompress) 165.268 Tj +[1 0 0 1 285.126 522.903] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.126 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -511.206] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 511.206 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzDecompress) 95.641 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +280.326 509.462 Td +(*) 5.97756 Tj +286.303 511.206 Td +(strm) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 495.664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 473.746 Td +/F130_0 9.9626 Tf +(Pro) 13.8381 Tj +15 TJm +(vides) 21.031 Tj +-301 TJm +(more) 20.4731 Tj +-302 TJm +(input) 20.4831 Tj +-301 TJm +(and/out) 29.8878 Tj +-302 TJm +(output) 25.4644 Tj +-301 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-301 TJm +(space) 22.1269 Tj +-302 TJm +(for) 11.6164 Tj +-301 TJm +(the) 12.1743 Tj +-302 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-928 TJm +(The) 15.4918 Tj +-301 TJm +(caller) 22.1269 Tj +-302 TJm +(maintains) 38.7446 Tj +-301 TJm +(input) 20.4831 Tj +-302 TJm +(and) 14.386 Tj +-301 TJm +(output) 25.4644 Tj +-301 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fers,) 17.4246 Tj +-315 TJm +(and) 14.386 Tj +72 461.791 Td +(uses) 17.1556 Tj +[1 0 0 1 91.6461 461.791] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.6461 -461.791] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.6461 461.791 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 187.287 461.791] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -187.287 -461.791] cm +[1 0 0 1 0 0] Tm +0 0 Td +189.778 461.791 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(transfer) 30.4258 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(between) 33.1954 Tj +-250 TJm +(them.) 22.4159 Tj +[1 0 0 1 72 460.257] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -450.294] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.873 Td +/F130_0 9.9626 Tf +(Before) 27.1082 Tj +-498 TJm +(each) 18.2515 Tj +-499 TJm +(call) 14.386 Tj +-498 TJm +(to) 7.7509 Tj +[1 0 0 1 159.356 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.356 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.356 439.873 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 254.997 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.997 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +254.997 439.873 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 263.071 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -263.071 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +263.071 439.873 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 304.914 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -304.914 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +309.879 439.873 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-498 TJm +(point) 20.4831 Tj +-499 TJm +(at) 7.193 Tj +-498 TJm +(the) 12.1743 Tj +-498 TJm +(compressed) 47.0334 Tj +-499 TJm +(data,) 19.0883 Tj +-560 TJm +(and) 14.386 Tj +[1 0 0 1 492.179 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -492.179 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +492.179 439.873 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 540 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 427.918 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-308 TJm +(indicate) 31.5416 Tj +-308 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-309 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-308 TJm +(bytes) 21.031 Tj +-308 TJm +(the) 12.1743 Tj +-308 TJm +(library) 26.5603 Tj +-308 TJm +(may) 17.1556 Tj +-309 TJm +(read.) 19.6363 Tj +[1 0 0 1 294.955 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.955 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.955 427.918 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 390.597 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -390.597 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +393.667 427.918 Td +/F130_0 9.9626 Tf +(updates) 30.4357 Tj +[1 0 0 1 427.173 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.173 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +427.173 427.918 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 469.016 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -469.016 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +469.016 427.918 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 474.723 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -474.723 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +474.723 427.918 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 522.543 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -522.543 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +525.614 427.918 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 72 415.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -415.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 415.963 Td +/F134_0 9.9626 Tf +(total_in) 47.8205 Tj +[1 0 0 1 119.821 415.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.821 -415.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.311 415.963 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(re\003ect) 24.8965 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(read.) 19.6363 Tj +[1 0 0 1 72 413.806] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -403.843] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 394.045 Td +/F130_0 9.9626 Tf +(Similarly) 37.0908 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 113.799 394.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.799 -394.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +113.799 394.045 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 161.62 394.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.62 -394.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.41 394.045 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-280 TJm +(point) 20.4831 Tj +-280 TJm +(to) 7.7509 Tj +-280 TJm +(a) 4.42339 Tj +-280 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-280 TJm +(in) 7.7509 Tj +-281 TJm +(which) 24.3486 Tj +-280 TJm +(the) 12.1743 Tj +-280 TJm +(uncompressed) 56.996 Tj +-280 TJm +(output) 25.4644 Tj +-280 TJm +(is) 6.64505 Tj +-280 TJm +(to) 7.7509 Tj +-280 TJm +(be) 9.40469 Tj +-280 TJm +(placed,) 28.493 Tj +-288 TJm +(with) 17.7135 Tj +[1 0 0 1 486.202 394.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -486.202 -394.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +486.202 394.045 Td +/F134_0 9.9626 Tf +(avail_out) 53.798 Tj +[1 0 0 1 540 394.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -394.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 382.09 Td +/F130_0 9.9626 Tf +(indicating) 39.8504 Tj +-525 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-524 TJm +(much) 22.1369 Tj +-525 TJm +(output) 25.4644 Tj +-524 TJm +(space) 22.1269 Tj +-525 TJm +(is) 6.64505 Tj +-525 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable.) 29.0509 Tj +[1 0 0 1 285.792 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -285.792 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +285.792 382.09 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 369.478 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -369.478 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +374.705 382.09 Td +/F130_0 9.9626 Tf +(updates) 30.4357 Tj +[1 0 0 1 410.367 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.367 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +410.367 382.09 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 458.188 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -458.188 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +458.188 382.09 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 466.589 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -466.589 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +466.589 382.09 Td +/F134_0 9.9626 Tf +(avail_out) 53.798 Tj +[1 0 0 1 520.387 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -520.387 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +525.614 382.09 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 72 370.135] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -370.135] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 370.135 Td +/F134_0 9.9626 Tf +(total_out) 53.798 Tj +[1 0 0 1 125.798 370.135] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.798 -370.135] cm +[1 0 0 1 0 0] Tm +0 0 Td +128.289 370.135 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(re\003ect) 24.8965 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 367.978] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -358.015] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 348.217 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-320 TJm +(may) 17.1556 Tj +-321 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-320 TJm +(and) 14.386 Tj +-321 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-320 TJm +(as) 8.29885 Tj +-321 TJm +(little) 18.2714 Tj +-320 TJm +(or) 8.29885 Tj +-320 TJm +(as) 8.29885 Tj +-321 TJm +(much) 22.1369 Tj +-320 TJm +(data) 16.5977 Tj +-321 TJm +(as) 8.29885 Tj +-320 TJm +(you) 14.9439 Tj +-321 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-320 TJm +(on) 9.9626 Tj +-320 TJm +(each) 18.2515 Tj +-321 TJm +(call) 14.386 Tj +-320 TJm +(of) 8.29885 Tj +[1 0 0 1 407.816 348.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -407.816 -348.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +407.816 348.217 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 503.457 348.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -503.457 -348.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +503.457 348.217 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1043 TJm +(In) 8.29885 Tj +-320 TJm +(the) 12.1743 Tj +72 336.262 Td +(limit,) 21.32 Tj +-295 TJm +(it) 5.53921 Tj +-286 TJm +(is) 6.64505 Tj +-287 TJm +(acceptable) 42.0422 Tj +-286 TJm +(to) 7.7509 Tj +-286 TJm +(supply) 26.5703 Tj +-286 TJm +(and) 14.386 Tj +-287 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-286 TJm +(data) 16.5977 Tj +-286 TJm +(one) 14.386 Tj +-286 TJm +(byte) 17.1556 Tj +-287 TJm +(at) 7.193 Tj +-286 TJm +(a) 4.42339 Tj +-286 TJm +(time,) 20.2042 Tj +-295 TJm +(although) 34.8691 Tj +-286 TJm +(this) 14.396 Tj +-287 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-286 TJm +(be) 9.40469 Tj +-286 TJm +(terribly) 29.3299 Tj +-286 TJm +(inef) 15.4918 Tj +25 TJm +(\002cient.) 27.3972 Tj +-838 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +72 324.306 Td +(should) 26.5703 Tj +-250 TJm +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-250 TJm +(ensure) 26.0024 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(least) 18.2614 Tj +-250 TJm +(one) 14.386 Tj +-250 TJm +(byte) 17.1556 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(space) 22.1269 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(each) 18.2515 Tj +-250 TJm +(call.) 16.8766 Tj +[1 0 0 1 72 322.15] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -312.187] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 302.389 Td +/F130_0 9.9626 Tf +(Use) 15.4918 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 100.772 302.389] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -100.772 -302.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +100.772 302.389 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 196.413 302.389] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.413 -302.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.904 302.389 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(simpler) 29.8878 Tj +-250 TJm +(than) 17.1556 Tj +[1 0 0 1 260.064 302.389] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.064 -302.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +260.064 302.389 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 343.75 302.389] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -343.75 -302.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +343.75 302.389 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 300.232] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -290.269] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 280.471 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-346 TJm +(should) 26.5703 Tj +-347 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-346 TJm +(input) 20.4831 Tj +-346 TJm +(and) 14.386 Tj +-346 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-347 TJm +(output) 25.4644 Tj +-346 TJm +(as) 8.29885 Tj +-346 TJm +(described) 38.1767 Tj +-346 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-371 TJm +(and) 14.386 Tj +-346 TJm +(repeatedly) 41.4942 Tj +-346 TJm +(call) 14.386 Tj +[1 0 0 1 422.638 280.471] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.638 -280.471] cm +[1 0 0 1 0 0] Tm +0 0 Td +422.638 280.471 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 518.279 280.471] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -518.279 -280.471] cm +[1 0 0 1 0 0] Tm +0 0 Td +521.729 280.471 Td +/F130_0 9.9626 Tf +(until) 18.2714 Tj +[1 0 0 1 72 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 268.516 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 149.709 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +152.314 268.516 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-262 TJm +(returned.) 35.686 Tj +-344 TJm +(Appearance) 47.5714 Tj +-262 TJm +(of) 8.29885 Tj +[1 0 0 1 261.767 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -261.767 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +261.767 268.516 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 339.475 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.475 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +342.081 268.516 Td +/F130_0 9.9626 Tf +(denotes) 30.4357 Tj +-262 TJm +(that) 14.9439 Tj +[1 0 0 1 392.672 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.672 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.672 268.516 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 488.313 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -488.313 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +490.919 268.516 Td +/F130_0 9.9626 Tf +(has) 13.2801 Tj +-262 TJm +(detected) 33.1954 Tj +72 256.561 Td +(the) 12.1743 Tj +-212 TJm +(logical) 27.1182 Tj +-212 TJm +(end) 14.386 Tj +-211 TJm +(of) 8.29885 Tj +-212 TJm +(the) 12.1743 Tj +-212 TJm +(compressed) 47.0334 Tj +-212 TJm +(stream.) 29.0509 Tj +[1 0 0 1 237.858 256.561] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -237.858 -256.561] cm +[1 0 0 1 0 0] Tm +0 0 Td +237.858 256.561 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 333.499 256.561] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -333.499 -256.561] cm +[1 0 0 1 0 0] Tm +0 0 Td +335.609 256.561 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-212 TJm +(not) 12.7322 Tj +-212 TJm +(produce) 32.0895 Tj +[1 0 0 1 402.263 256.561] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -402.263 -256.561] cm +[1 0 0 1 0 0] Tm +0 0 Td +402.263 256.561 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 479.972 256.561] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -479.972 -256.561] cm +[1 0 0 1 0 0] Tm +0 0 Td +482.082 256.561 Td +/F130_0 9.9626 Tf +(until) 18.2714 Tj +-212 TJm +(all) 9.9626 Tj +-212 TJm +(output) 25.4644 Tj +72 244.605 Td +(data) 16.5977 Tj +-256 TJm +(has) 13.2801 Tj +-256 TJm +(been) 18.8094 Tj +-255 TJm +(placed) 26.0024 Tj +-256 TJm +(into) 15.5018 Tj +-256 TJm +(the) 12.1743 Tj +-256 TJm +(output) 25.4644 Tj +-256 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +40 TJm +(,) 2.49065 Tj +-257 TJm +(so) 8.85675 Tj +-256 TJm +(once) 18.8094 Tj +[1 0 0 1 278.978 244.605] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.978 -244.605] cm +[1 0 0 1 0 0] Tm +0 0 Td +278.978 244.605 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 356.687 244.605] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -356.687 -244.605] cm +[1 0 0 1 0 0] Tm +0 0 Td +359.236 244.605 Td +/F130_0 9.9626 Tf +(appears,) 32.9164 Tj +-257 TJm +(you) 14.9439 Tj +-256 TJm +(are) 12.1643 Tj +-256 TJm +(guaranteed) 43.7059 Tj +-256 TJm +(to) 7.7509 Tj +-256 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-255 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +72 232.65 Td +(all) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(decompressed) 56.4381 Tj +-250 TJm +(output,) 27.9551 Tj +-250 TJm +(and) 14.386 Tj +[1 0 0 1 205.369 232.65] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -205.369 -232.65] cm +[1 0 0 1 0 0] Tm +0 0 Td +205.369 232.65 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 318.943 232.65] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -318.943 -232.65] cm +[1 0 0 1 0 0] Tm +0 0 Td +321.433 232.65 Td +/F130_0 9.9626 Tf +(can) 13.8281 Tj +-250 TJm +(safely) 23.7907 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(called.) 26.2813 Tj +[1 0 0 1 72 230.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -220.531] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 210.732 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-250 TJm +(case) 17.1456 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue,) 19.0883 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(call) 14.386 Tj +[1 0 0 1 261.259 210.732] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -261.259 -210.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +261.259 210.732 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 374.833 210.732] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -374.833 -210.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +377.323 210.732 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(clean) 21.0211 Tj +-250 TJm +(up) 9.9626 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(release) 27.6562 Tj +-250 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 208.576] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -198.613] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 188.815 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 188.715] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -137.863] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(17) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 21 21 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -200.882] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 179.328 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 175.741] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(strm->s) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 687.721 Td +(or) 11.9551 Tj +-426 TJm +(strm->avail_out) 89.6634 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(1) 5.97756 Tj +90 675.766 Td +(BZ_DATA_ERROR) 77.7083 Tj +98.4879 663.811 Td +(if) 11.9551 Tj +-426 TJm +(a) 5.97756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(integrity) 53.798 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(detected) 47.8205 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(stream) 35.8654 Tj +90 651.856 Td +(BZ_DATA_ERROR_MAGIC) 113.574 Tj +98.4879 639.9 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(stream) 35.8654 Tj +-426 TJm +(doesn't) 41.8429 Tj +-426 TJm +(begin) 29.8878 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(right) 29.8878 Tj +-426 TJm +(magic) 29.8878 Tj +-426 TJm +(bytes) 29.8878 Tj +90 627.945 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 615.99 Td +(if) 11.9551 Tj +-426 TJm +(there) 29.8878 Tj +-426 TJm +(wasn't) 35.8654 Tj +-426 TJm +(enough) 35.8654 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(available) 53.798 Tj +90 604.035 Td +(BZ_STREAM_END) 77.7083 Tj +98.4879 592.08 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(logical) 41.8429 Tj +-426 TJm +(end) 17.9327 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(stream) 35.8654 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected) 47.8205 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(all) 17.9327 Tj +98.4879 580.125 Td +(output) 35.8654 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(consumed,) 53.798 Tj +-426 TJm +(eg) 11.9551 Tj +-426 TJm +(s-->avail_out) 77.7083 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +90 568.169 Td +(BZ_OK) 29.8878 Tj +98.4879 556.214 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 540.673] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 518.755 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 518.655] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -509.29] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 509.29 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +98.4879 497.335 Td +(if) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(returned) 47.8205 Tj +90 485.38 Td +(BZ2_bzDecompressEnd) 113.574 Tj +98.4879 473.425 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 457.883] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -447.92] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 427.262 Td +/F122_0 17.2154 Tf +(3.3.6.) 43.0729 Tj +[1 0 0 1 119.858 427.262] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -427.262] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 427.262 Td +/F392_0 17.2154 Tf +(BZ2_bzDecompressEnd) 196.256 Tj +[1 0 0 1 316.114 427.262] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -244.114 -2.3326] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -415.564] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 415.564 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzDecompressEnd) 113.574 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +298.259 413.821 Td +(*) 5.97756 Tj +304.236 415.564 Td +(strm) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 400.023] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -390.06] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 378.105 Td +/F130_0 9.9626 Tf +(Releases) 34.8591 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(memory) 33.2053 Tj +-250 TJm +(associated) 40.9463 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 375.948] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -365.985] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 356.187 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 356.087] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -346.723] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 346.723 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 334.767 Td +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(strm->s) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +90 322.812 Td +(BZ_OK) 29.8878 Tj +98.4879 310.857 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 295.315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -285.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 273.397 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 273.298] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -263.933] cm +[1 0 0 1 0 0] Tm +0 0 Td +98.4879 263.933 Td +/F134_0 9.9626 Tf +(None.) 29.8878 Tj +[1 0 0 1 72 248.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -238.429] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 213.639 Td +/F122_0 20.6585 Tf +(3.4.) 34.4584 Tj +-278 TJm +(High-le) 70.0117 Tj +15 TJm +(vel) 28.7153 Tj +-278 TJm +(interface) 86.1046 Tj +[1 0 0 1 72 209.042] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -199.08] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 191.721 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-250 TJm +(pro) 13.2801 Tj +15 TJm +(vides) 21.031 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(reading) 29.8778 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(writing) 28.782 Tj +[1 0 0 1 300.292 191.721] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.292 -191.721] cm +[1 0 0 1 0 0] Tm +0 0 Td +300.292 191.721 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 330.18 191.721] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -330.18 -191.721] cm +[1 0 0 1 0 0] Tm +0 0 Td +332.67 191.721 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-250 TJm +(\002les.) 19.0983 Tj +-620 TJm +(First,) 20.7621 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(general) 29.3199 Tj +-250 TJm +(points.) 26.8492 Tj +[1 0 0 1 72 189.564] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 159.84 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 159.84 Td +/F130_0 9.9626 Tf +(All) 12.7322 Tj +-332 TJm +(of) 8.29885 Tj +-331 TJm +(the) 12.1743 Tj +-332 TJm +(functions) 37.0808 Tj +-332 TJm +(tak) 12.1743 Tj +10 TJm +(e) 4.42339 Tj +-331 TJm +(an) 9.40469 Tj +[1 0 0 1 202.958 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.958 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +202.958 159.84 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +220.891 158.097 Td +(*) 5.97756 Tj +[1 0 0 1 226.868 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.868 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.172 159.84 Td +/F130_0 9.9626 Tf +(\002rst) 15.5018 Tj +-332 TJm +(ar) 7.74094 Tj +18 TJm +(gument,) 32.3785 Tj +[1 0 0 1 292.426 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -292.426 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +292.426 159.84 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 334.269 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -334.269 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +334.269 159.84 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1110 TJm +(After) 21.0211 Tj +-332 TJm +(each) 18.2515 Tj +-331 TJm +(call,) 16.8766 Tj +[1 0 0 1 414.083 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -414.083 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +414.083 159.84 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 455.926 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -455.926 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +459.23 159.84 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-332 TJm +(be) 9.40469 Tj +-331 TJm +(consulted) 38.1866 Tj +86.944 147.885 Td +(\002rst) 15.5018 Tj +-349 TJm +(to) 7.7509 Tj +-349 TJm +(determine) 39.8404 Tj +-348 TJm +(the) 12.1743 Tj +-349 TJm +(outcome) 34.3112 Tj +-349 TJm +(of) 8.29885 Tj +-349 TJm +(the) 12.1743 Tj +-348 TJm +(call.) 16.8766 Tj +-1213 TJm +(If) 6.63509 Tj +[1 0 0 1 280.386 147.885] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -280.386 -147.885] cm +[1 0 0 1 0 0] Tm +0 0 Td +280.386 147.885 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 322.229 147.885] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -322.229 -147.885] cm +[1 0 0 1 0 0] Tm +0 0 Td +325.704 147.885 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +[1 0 0 1 335.824 147.885] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -335.824 -147.885] cm +[1 0 0 1 0 0] Tm +0 0 Td +335.824 147.885 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 365.711 147.885] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -365.711 -147.885] cm +[1 0 0 1 0 0] Tm +0 0 Td +365.711 147.885 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-349 TJm +(the) 12.1743 Tj +-349 TJm +(call) 14.386 Tj +-348 TJm +(completed) 41.5042 Tj +-349 TJm +(successfully) 48.6972 Tj +65 TJm +(,) 2.49065 Tj +-374 TJm +(and) 14.386 Tj +-348 TJm +(only) 17.7135 Tj +86.944 135.93 Td +(then) 17.1556 Tj +-271 TJm +(should) 26.5703 Tj +-270 TJm +(the) 12.1743 Tj +-271 TJm +(return) 23.7907 Tj +-270 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-271 TJm +(of) 8.29885 Tj +-271 TJm +(the) 12.1743 Tj +-270 TJm +(function) 33.2053 Tj +-271 TJm +(\(if) 9.40469 Tj +-270 TJm +(an) 9.40469 Tj +15 TJm +(y\)) 8.29885 Tj +-271 TJm +(be) 9.40469 Tj +-271 TJm +(cons) 18.2614 Tj +1 TJm +(u) 4.9813 Tj +-1 TJm +(l) 2.7696 Tj +1 TJm +(ted.) 14.6649 Tj +-744 TJm +(If) 6.63509 Tj +[1 0 0 1 365.077 135.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -365.077 -135.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +365.077 135.93 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 406.92 135.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.92 -135.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +409.616 135.93 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +[1 0 0 1 418.956 135.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -418.956 -135.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +418.956 135.93 Td +/F134_0 9.9626 Tf +(BZ_IO_ERROR) 65.7532 Tj +[1 0 0 1 484.71 135.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -484.71 -135.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +484.71 135.93 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-271 TJm +(there) 19.9152 Tj +-270 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-271 TJm +(an) 9.40469 Tj +86.944 123.975 Td +(error) 19.3573 Tj +-246 TJm +(reading/writing) 61.4294 Tj +-245 TJm +(the) 12.1743 Tj +-246 TJm +(underlying) 43.1679 Tj +-246 TJm +(compressed) 47.0334 Tj +-245 TJm +(\002le,) 15.2229 Tj +-247 TJm +(and) 14.386 Tj +-245 TJm +(you) 14.9439 Tj +-246 TJm +(should) 26.5703 Tj +-246 TJm +(then) 17.1556 Tj +-245 TJm +(consult) 28.782 Tj +[1 0 0 1 414.096 123.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -414.096 -123.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +414.096 123.975 Td +/F134_0 9.9626 Tf +(errno) 29.8878 Tj +[1 0 0 1 443.984 123.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -443.984 -123.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +446.432 123.975 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 451.649 123.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -451.649 -123.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +451.649 123.975 Td +/F134_0 9.9626 Tf +(perror) 35.8654 Tj +[1 0 0 1 487.514 123.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -487.514 -123.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +489.962 123.975 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-246 TJm +(determine) 39.8404 Tj +86.944 112.02 Td +(the) 12.1743 Tj +-356 TJm +(cause) 22.1269 Tj +-356 TJm +(of) 8.29885 Tj +-355 TJm +(the) 12.1743 Tj +-356 TJm +(dif) 11.0684 Tj +25 TJm +(\002culty) 25.4644 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 206.528 112.02] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -206.528 -112.02] cm +[1 0 0 1 0 0] Tm +0 0 Td +206.528 112.02 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 248.371 112.02] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -248.371 -112.02] cm +[1 0 0 1 0 0] Tm +0 0 Td +251.916 112.02 Td +/F130_0 9.9626 Tf +(may) 17.1556 Tj +-356 TJm +(also) 16.0497 Tj +-356 TJm +(be) 9.40469 Tj +-355 TJm +(set) 11.0684 Tj +-356 TJm +(to) 7.7509 Tj +-356 TJm +(v) 4.9813 Tj +25 TJm +(arious) 24.3486 Tj +-356 TJm +(other) 20.4731 Tj +-356 TJm +(v) 4.9813 Tj +25 TJm +(alues;) 23.2427 Tj +-408 TJm +(precise) 28.2141 Tj +-356 TJm +(details) 26.0123 Tj +-356 TJm +(are) 12.1643 Tj +-356 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-356 TJm +(on) 9.9626 Tj +-356 TJm +(a) 4.42339 Tj +86.944 100.064 Td +(per) 12.7222 Tj +20 TJm +(-function) 36.5229 Tj +-250 TJm +(basis) 19.9252 Tj +-250 TJm +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 186.839 100.064] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -114.838 -49.2126] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 22 22 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -31.5168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 710.037 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 710.037 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 95.9576 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -95.9576 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +95.9576 710.037 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 137.801 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.801 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.179 710.037 Td +/F130_0 9.9626 Tf +(indicates) 35.417 Tj +-239 TJm +(an) 9.40469 Tj +-238 TJm +(error) 19.3573 Tj +-239 TJm +(\(ie,) 13.0012 Tj +-241 TJm +(an) 9.40469 Tj +15 TJm +(ything) 25.4644 Tj +-239 TJm +(e) 4.42339 Tj +15 TJm +(xcept) 21.579 Tj +[1 0 0 1 292.225 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -292.225 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +292.225 710.037 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 322.113 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -322.113 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +324.492 710.037 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 341.256 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -341.256 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +341.256 710.037 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 418.965 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -418.965 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +418.965 710.037 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-239 TJm +(you) 14.9439 Tj +-239 TJm +(should) 26.5703 Tj +-238 TJm +(immediately) 49.813 Tj +-239 TJm +(call) 14.386 Tj +[1 0 0 1 86.944 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 698.082 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 176.608 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.608 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.343 698.082 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 193.695 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.695 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.695 698.082 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 289.337 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -289.337 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.337 698.082 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-281 TJm +(depending) 41.5042 Tj +-274 TJm +(on) 9.9626 Tj +-275 TJm +(whether) 32.0895 Tj +-274 TJm +(you) 14.9439 Tj +-275 TJm +(are) 12.1643 Tj +-275 TJm +(attempting) 42.62 Tj +-274 TJm +(to) 7.7509 Tj +-275 TJm +(read) 17.1456 Tj +-274 TJm +(or) 8.29885 Tj +-275 TJm +(to) 7.7509 Tj +-274 TJm +(write\)) 23.7907 Tj +86.944 686.127 Td +(to) 7.7509 Tj +-242 TJm +(free) 15.4819 Tj +-242 TJm +(up) 9.9626 Tj +-241 TJm +(all) 9.9626 Tj +-242 TJm +(resources) 37.6188 Tj +-242 TJm +(associated) 40.9463 Tj +-242 TJm +(wi) 9.9626 Tj +1 TJm +(th) 7.7509 Tj +-242 TJm +(the) 12.1743 Tj +-242 TJm +(stream.) 29.0509 Tj +-614 TJm +(Once) 21.0211 Tj +-242 TJm +(an) 9.40469 Tj +-242 TJm +(error) 19.3573 Tj +-242 TJm +(has) 13.2801 Tj +-242 TJm +(been) 18.8094 Tj +-241 TJm +(indicated,) 39.0135 Tj +-244 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +-241 TJm +(of) 8.29885 Tj +-242 TJm +(all) 9.9626 Tj +-242 TJm +(calls) 18.2614 Tj +-242 TJm +(e) 4.42339 Tj +15 TJm +(xcept) 21.579 Tj +[1 0 0 1 86.944 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 674.172 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 176.608 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.608 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.705 674.172 Td +/F130_0 9.9626 Tf +(\() 3.31755 Tj +[1 0 0 1 183.022 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.022 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.022 674.172 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 278.664 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.664 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +278.664 674.172 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-311 TJm +(is) 6.64505 Tj +-311 TJm +(unde\002ned.) 41.7831 Tj +-985 TJm +(The) 15.4918 Tj +-311 TJm +(implication) 45.3896 Tj +-310 TJm +(is) 6.64505 Tj +-311 TJm +(that) 14.9439 Tj +-311 TJm +(\(1\)) 11.6164 Tj +[1 0 0 1 455.988 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -455.988 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +455.988 674.172 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 497.831 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -497.831 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +500.928 674.172 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-311 TJm +(be) 9.40469 Tj +86.944 662.217 Td +(check) 23.2328 Tj +10 TJm +(ed) 9.40469 Tj +-291 TJm +(after) 18.2515 Tj +-291 TJm +(each) 18.2515 Tj +-291 TJm +(call,) 16.8766 Tj +-301 TJm +(and) 14.386 Tj +-291 TJm +(\(2\)) 11.6164 Tj +-291 TJm +(if) 6.08715 Tj +[1 0 0 1 225.347 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -225.347 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +225.347 662.217 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 267.19 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -267.19 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +270.09 662.217 Td +/F130_0 9.9626 Tf +(indicates) 35.417 Tj +-291 TJm +(an) 9.40469 Tj +-291 TJm +(error) 19.3573 Tj +40 TJm +(,) 2.49065 Tj +[1 0 0 1 345.161 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -345.161 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +345.161 662.217 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 434.824 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -434.824 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +437.724 662.217 Td +/F130_0 9.9626 Tf +(\() 3.31755 Tj +[1 0 0 1 441.041 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.041 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.041 662.217 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 536.683 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -536.683 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +536.683 662.217 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +86.944 650.262 Td +(should) 26.5703 Tj +-250 TJm +(then) 17.1556 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(called) 23.7907 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(clean) 21.0211 Tj +-250 TJm +(up.) 12.4533 Tj +[1 0 0 1 220.034 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -148.034 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 628.344 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 628.344 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +[1 0 0 1 106.362 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -106.362 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +106.362 628.344 Td +/F134_0 9.9626 Tf +(FILE) 23.9102 Tj +130.273 626.6 Td +(*) 5.97756 Tj +[1 0 0 1 136.25 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -136.25 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.177 628.344 Td +/F130_0 9.9626 Tf +(ar) 7.74094 Tj +18 TJm +(guments) 33.7633 Tj +-394 TJm +(passed) 26.5603 Tj +-394 TJm +(to) 7.7509 Tj +[1 0 0 1 227.592 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -227.592 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +227.592 628.344 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 311.278 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -311.278 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +315.205 628.344 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 321.901 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -321.901 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +321.901 628.344 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 411.565 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -411.565 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +415.491 628.344 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-394 TJm +(be) 9.40469 Tj +-394 TJm +(set) 11.0684 Tj +-394 TJm +(to) 7.7509 Tj +-394 TJm +(binary) 25.4544 Tj +-395 TJm +(mode.) 24.6275 Tj +86.944 616.389 Td +(Most) 20.4831 Tj +-229 TJm +(Unix) 19.9252 Tj +-229 TJm +(systems) 31.5516 Tj +-228 TJm +(will) 15.5018 Tj +-229 TJm +(do) 9.9626 Tj +-229 TJm +(this) 14.396 Tj +-229 TJm +(by) 9.9626 Tj +-229 TJm +(def) 12.7222 Tj +10 TJm +(ault,) 17.4346 Tj +-233 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-229 TJm +(other) 20.4731 Tj +-229 TJm +(platforms,) 40.6773 Tj +-233 TJm +(including) 37.6387 Tj +-229 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-228 TJm +(and) 14.386 Tj +-229 TJm +(Mac,) 20.1942 Tj +-233 TJm +(will) 15.5018 Tj +-229 TJm +(not.) 15.2229 Tj +-606 TJm +(If) 6.63509 Tj +-229 TJm +(you) 14.9439 Tj +-229 TJm +(omit) 18.2714 Tj +86.944 604.433 Td +(this,) 16.8866 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(encounter) 39.2825 Tj +-250 TJm +(problems) 37.0808 Tj +-250 TJm +(when) 21.579 Tj +-250 TJm +(mo) 12.7322 Tj +15 TJm +(ving) 17.7135 Tj +-250 TJm +(code) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(platforms.) 40.6773 Tj +[1 0 0 1 372.66 604.433] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.66 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 582.516 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 582.516 Td +/F130_0 9.9626 Tf +(Memory) 34.3112 Tj +-348 TJm +(allocation) 39.2925 Tj +-348 TJm +(requests) 32.6474 Tj +-348 TJm +(are) 12.1643 Tj +-348 TJm +(handled) 31.5416 Tj +-348 TJm +(by) 9.9626 Tj +[1 0 0 1 267.67 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -267.67 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +267.67 582.516 Td +/F134_0 9.9626 Tf +(malloc) 35.8654 Tj +[1 0 0 1 303.535 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.535 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +307.003 582.516 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 313.241 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -313.241 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +313.241 582.516 Td +/F134_0 9.9626 Tf +(free) 23.9102 Tj +[1 0 0 1 337.151 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -337.151 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +337.151 582.516 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1209 TJm +(At) 9.9626 Tj +-348 TJm +(present) 28.772 Tj +-348 TJm +(there) 19.9152 Tj +-348 TJm +(is) 6.64505 Tj +-348 TJm +(no) 9.9626 Tj +-348 TJm +(f) 3.31755 Tj +10 TJm +(acility) 24.9065 Tj +-348 TJm +(for) 11.6164 Tj +-348 TJm +(user) 16.5977 Tj +20 TJm +(-de\002ned) 32.6474 Tj +86.944 570.56 Td +(memory) 33.2053 Tj +-250 TJm +(allocators) 38.7346 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(I/O) 13.2801 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(\(could) 25.4544 Tj +-250 TJm +(easily) 23.2427 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(added,) 26.2813 Tj +-250 TJm +(though\).) 33.4843 Tj +[1 0 0 1 387.165 570.56] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -315.165 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -548.478] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 529.977 Td +/F122_0 17.2154 Tf +(3.4.1.) 43.0729 Tj +[1 0 0 1 119.858 529.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -529.977] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 529.977 Td +/F392_0 17.2154 Tf +(BZ2_bzReadOpen) 144.609 Tj +[1 0 0 1 264.468 529.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.468 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -72.7272] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 71.731 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 68.1444] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -518.279] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 518.279 Td +/F134_0 9.9626 Tf +(typedef) 41.8429 Tj +-426 TJm +(void) 23.9102 Tj +-426 TJm +(BZFILE;) 41.8429 Tj +90 494.369 Td +(BZFILE) 35.8654 Tj +130.109 492.625 Td +(*) 5.97756 Tj +136.087 494.369 Td +(BZ2_bzReadOpen\() 89.6634 Tj +-426 TJm +(int) 17.9327 Tj +252.171 492.625 Td +(*) 5.97756 Tj +258.149 494.369 Td +(bzerror,) 47.8205 Tj +-426 TJm +(FILE) 23.9102 Tj +338.368 492.625 Td +(*) 5.97756 Tj +344.346 494.369 Td +(f,) 11.9551 Tj +191.855 482.414 Td +(int) 17.9327 Tj +-426 TJm +(verbosity,) 59.7756 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(small,) 35.8654 Tj +191.855 470.458 Td +(void) 23.9102 Tj +220.01 468.715 Td +(*) 5.97756 Tj +225.987 470.458 Td +(unused,) 41.8429 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(nUnused) 41.8429 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 454.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -444.954] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 432.999 Td +/F130_0 9.9626 Tf +(Prepare) 30.4258 Tj +-290 TJm +(to) 7.7509 Tj +-289 TJm +(read) 17.1456 Tj +-290 TJm +(compressed) 47.0334 Tj +-290 TJm +(data) 16.5977 Tj +-289 TJm +(from) 19.3673 Tj +-290 TJm +(\002le) 12.7322 Tj +-289 TJm +(handle) 26.5603 Tj +[1 0 0 1 272.697 432.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.697 -432.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +272.697 432.999 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 278.675 432.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.675 -432.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +278.675 432.999 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 285.439 432.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -285.439 -432.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +285.439 432.999 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 291.417 432.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -291.417 -432.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.303 432.999 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-290 TJm +(refer) 18.7994 Tj +-289 TJm +(to) 7.7509 Tj +-290 TJm +(a) 4.42339 Tj +-290 TJm +(\002le) 12.7322 Tj +-289 TJm +(which) 24.3486 Tj +-290 TJm +(has) 13.2801 Tj +-289 TJm +(been) 18.8094 Tj +-290 TJm +(opened) 28.772 Tj +-290 TJm +(for) 11.6164 Tj +-289 TJm +(reading,) 32.3685 Tj +-300 TJm +(and) 14.386 Tj +72 421.044 Td +(for) 11.6164 Tj +-306 TJm +(which) 24.3486 Tj +-305 TJm +(the) 12.1743 Tj +-306 TJm +(error) 19.3573 Tj +-306 TJm +(indicator) 35.417 Tj +-305 TJm +(\() 3.31755 Tj +[1 0 0 1 193.457 421.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.457 -421.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.457 421.044 Td +/F134_0 9.9626 Tf +(ferror\(f\)) 53.798 Tj +[1 0 0 1 247.255 421.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -247.255 -421.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +247.255 421.044 Td +/F130_0 9.9626 Tf +(\)is) 9.9626 Tj +-306 TJm +(not) 12.7322 Tj +-305 TJm +(set.) 13.5591 Tj +-954 TJm +(If) 6.63509 Tj +[1 0 0 1 308.784 421.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -308.784 -421.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.784 421.044 Td +/F134_0 9.9626 Tf +(small) 29.8878 Tj +[1 0 0 1 338.671 421.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -338.671 -421.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +341.717 421.044 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-306 TJm +(1,) 7.47195 Tj +-319 TJm +(the) 12.1743 Tj +-306 TJm +(library) 26.5603 Tj +-306 TJm +(will) 15.5018 Tj +-305 TJm +(try) 11.0684 Tj +-306 TJm +(to) 7.7509 Tj +-306 TJm +(dec) 13.8281 Tj +1 TJm +(ompress) 33.2053 Tj +-306 TJm +(using) 21.589 Tj +-306 TJm +(less) 14.9439 Tj +72 409.089 Td +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xpense) 27.6661 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(speed.) 25.1755 Tj +[1 0 0 1 72 406.932] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -396.969] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 387.171 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-227 TJm +(reasons) 29.8778 Tj +-227 TJm +(e) 4.42339 Tj +15 TJm +(xplained) 34.3112 Tj +-228 TJm +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 189.193 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -189.193 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +189.193 387.171 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 248.969 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -248.969 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +251.232 387.171 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-227 TJm +(decompress) 47.0334 Tj +-227 TJm +(the) 12.1743 Tj +[1 0 0 1 332.732 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -332.732 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +332.732 387.171 Td +/F134_0 9.9626 Tf +(nUnused) 41.8429 Tj +[1 0 0 1 374.575 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -374.575 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +376.838 387.171 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-227 TJm +(starting) 29.8878 Tj +-227 TJm +(at) 7.193 Tj +[1 0 0 1 441.74 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.74 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.74 387.171 Td +/F134_0 9.9626 Tf +(unused) 35.8654 Tj +[1 0 0 1 477.605 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -477.605 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.605 387.171 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-232 TJm +(before) 25.4445 Tj +-227 TJm +(starting) 29.8878 Tj +72 375.216 Td +(to) 7.7509 Tj +-280 TJm +(read) 17.1456 Tj +-279 TJm +(from) 19.3673 Tj +-280 TJm +(the) 12.1743 Tj +-279 TJm +(\002le) 12.7322 Tj +[1 0 0 1 155.094 375.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.094 -375.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.094 375.215 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 161.072 375.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.072 -375.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.072 375.215 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-797 TJm +(At) 9.9626 Tj +-280 TJm +(most) 19.3773 Tj +[1 0 0 1 206.414 375.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -206.414 -375.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +206.414 375.215 Td +/F134_0 9.9626 Tf +(BZ_MAX_UNUSED) 77.7083 Tj +[1 0 0 1 284.122 375.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.122 -375.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +286.907 375.215 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-280 TJm +(may) 17.1556 Tj +-279 TJm +(be) 9.40469 Tj +-280 TJm +(supplied) 33.7633 Tj +-279 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-280 TJm +(this.) 16.8866 Tj +-797 TJm +(If) 6.63509 Tj +-279 TJm +(this) 14.396 Tj +-280 TJm +(f) 3.31755 Tj +10 TJm +(acility) 24.9065 Tj +-279 TJm +(is) 6.64505 Tj +-280 TJm +(not) 12.7322 Tj +-279 TJm +(required,) 35.686 Tj +72 363.26 Td +(you) 14.9439 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(pass) 17.1556 Tj +[1 0 0 1 138.141 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.141 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +138.141 363.26 Td +/F134_0 9.9626 Tf +(NULL) 23.9102 Tj +[1 0 0 1 162.052 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -162.052 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.542 363.26 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 181.419 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -181.419 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.419 363.26 Td +/F134_0 9.9626 Tf +(0) 5.97756 Tj +[1 0 0 1 187.397 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -187.397 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +189.887 363.26 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +[1 0 0 1 203.994 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -203.994 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.994 363.26 Td +/F134_0 9.9626 Tf +(unused) 35.8654 Tj +[1 0 0 1 239.86 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -239.86 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +242.351 363.26 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +-250 TJm +(n) 4.9813 Tj +[1 0 0 1 264.208 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -264.208 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +264.208 363.26 Td +/F134_0 9.9626 Tf +(Unused) 35.8654 Tj +[1 0 0 1 300.074 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.074 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.565 363.26 Td +/F130_0 9.9626 Tf +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 361.103] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -351.141] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 341.343 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(meaning) 34.3112 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(parameters) 43.7059 Tj +[1 0 0 1 196.631 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.631 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.631 341.343 Td +/F134_0 9.9626 Tf +(small) 29.8878 Tj +[1 0 0 1 226.519 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.519 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.01 341.343 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 245.887 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.887 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.887 341.343 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 299.685 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -299.685 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.685 341.343 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(see) 12.7222 Tj +[1 0 0 1 319.879 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -319.879 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +319.879 341.343 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 439.431 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -439.431 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +439.431 341.343 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 339.186] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -329.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 319.425 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-402 TJm +(amount) 29.8878 Tj +-402 TJm +(of) 8.29885 Tj +-402 TJm +(memory) 33.2053 Tj +-402 TJm +(needed) 28.2141 Tj +-402 TJm +(to) 7.7509 Tj +-402 TJm +(decompress) 47.0334 Tj +-402 TJm +(a) 4.42339 Tj +-401 TJm +(\002le) 12.7322 Tj +-402 TJm +(cannot) 26.5603 Tj +-402 TJm +(be) 9.40469 Tj +-402 TJm +(determined) 44.8217 Tj +-402 TJm +(until) 18.2714 Tj +-402 TJm +(the) 12.1743 Tj +-402 TJm +(\002le') 16.0497 Tj +55 TJm +(s) 3.87545 Tj +-402 TJm +(header) 26.5503 Tj +-402 TJm +(has) 13.2801 Tj +-402 TJm +(been) 18.8094 Tj +-402 TJm +(read.) 19.6363 Tj +72 307.47 Td +(So) 10.5205 Tj +-492 TJm +(it) 5.53921 Tj +-491 TJm +(is) 6.64505 Tj +-492 TJm +(possible) 32.6574 Tj +-492 TJm +(that) 14.9439 Tj +[1 0 0 1 166.797 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -166.797 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.797 307.47 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 250.483 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -250.483 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +255.381 307.47 Td +/F130_0 9.9626 Tf +(returns) 27.6661 Tj +[1 0 0 1 287.945 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.945 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +287.945 307.47 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 317.833 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -317.833 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +322.729 307.47 Td +/F130_0 9.9626 Tf +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-492 TJm +(a) 4.42339 Tj +-491 TJm +(subsequent) 44.2738 Tj +-492 TJm +(call) 14.386 Tj +-492 TJm +(of) 8.29885 Tj +[1 0 0 1 431.135 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.135 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.135 307.47 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 490.911 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -490.911 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +495.81 307.47 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-492 TJm +(return) 23.7907 Tj +[1 0 0 1 72 295.514] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -295.514] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 295.514 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 143.731 295.514] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -295.514] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.731 295.514 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 294.204] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -284.242] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 273.597 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 273.597] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -273.597] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 273.597 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 273.597] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -273.597] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 273.597 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 271.44] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -168.369] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 167.372 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 163.786] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -262.075] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 262.075 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 250.12 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 238.165 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 226.209 Td +(if) 11.9551 Tj +-426 TJm +(f) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 214.254 Td +(or) 11.9551 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(neither) 41.8429 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(nor) 17.9327 Tj +-426 TJm +(1) 5.97756 Tj +98.4879 202.299 Td +(or) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(unused) 35.8654 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(nUnused) 41.8429 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(\)) 5.97756 Tj +98.4879 190.344 Td +(or) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(unused) 35.8654 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(!\(0) 17.9327 Tj +-426 TJm +(<=) 11.9551 Tj +-426 TJm +(nUnused) 41.8429 Tj +-426 TJm +(<=) 11.9551 Tj +-426 TJm +(BZ_MAX_UNUSED\)) 83.6858 Tj +-426 TJm +(\)) 5.97756 Tj +90 178.389 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 166.434 Td +(if) 11.9551 Tj +-426 TJm +(ferror\(f\)) 53.798 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(nonzero) 41.8429 Tj +90 154.478 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 142.523 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 130.568 Td +(BZ_OK) 29.8878 Tj +98.4879 118.613 Td +(otherwise.) 59.7756 Tj +[1 0 0 1 72 103.071] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -93.1085] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 81.1533 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 81.0538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -30.202] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.9737] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -51.071] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 51.071 Td +/F130_0 9.9626 Tf +(19) 9.9626 Tj +[1 0 0 1 453.269 50.8519] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 23 23 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -81.33] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(Pointer) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(abstract) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +90 687.721 Td +(NULL) 23.9102 Tj +98.4879 675.766 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 660.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 638.306 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 638.207] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -628.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 628.842 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +98.4879 616.887 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +90 604.932 Td +(BZ2_bzClose) 65.7532 Tj +98.4879 592.976 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 577.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -567.472] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 546.813 Td +/F122_0 17.2154 Tf +(3.4.2.) 43.0729 Tj +[1 0 0 1 119.858 546.813] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -546.813] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 546.813 Td +/F392_0 17.2154 Tf +(BZ2_bzRead) 103.292 Tj +[1 0 0 1 223.15 546.813] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -151.15 -2.3326] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -535.116] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 535.116 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzRead) 59.7756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +208.595 533.373 Td +(*) 5.97756 Tj +214.572 535.116 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +306.747 533.373 Td +(*) 5.97756 Tj +312.724 535.116 Td +(b,) 11.9551 Tj +-426 TJm +(void) 23.9102 Tj +357.077 533.373 Td +(*) 5.97756 Tj +363.055 535.116 Td +(buf,) 23.9102 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 519.574] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -509.612] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 497.656 Td +/F130_0 9.9626 Tf +(Reads) 24.3486 Tj +-285 TJm +(up) 9.9626 Tj +-284 TJm +(to) 7.7509 Tj +[1 0 0 1 122.569 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -122.569 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.569 497.656 Td +/F134_0 9.9626 Tf +(len) 17.9327 Tj +[1 0 0 1 140.501 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.501 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.337 497.656 Td +/F130_0 9.9626 Tf +(\(uncompressed\)) 63.6311 Tj +-285 TJm +(bytes) 21.031 Tj +-284 TJm +(from) 19.3673 Tj +-285 TJm +(the) 12.1743 Tj +-284 TJm +(compressed) 47.0334 Tj +-285 TJm +(\002le) 12.7322 Tj +[1 0 0 1 336.319 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -336.319 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +336.319 497.656 Td +/F134_0 9.9626 Tf +(b) 5.97756 Tj +[1 0 0 1 342.296 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.296 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +345.132 497.656 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-285 TJm +(the) 12.1743 Tj +-284 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +[1 0 0 1 405.205 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -405.205 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.205 497.656 Td +/F134_0 9.9626 Tf +(buf) 17.9327 Tj +[1 0 0 1 423.137 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -423.137 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +423.137 497.656 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-828 TJm +(If) 6.63509 Tj +-284 TJm +(the) 12.1743 Tj +-285 TJm +(read) 17.1456 Tj +-285 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-284 TJm +(successful,) 43.4369 Tj +[1 0 0 1 72 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 485.701 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 113.843 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +117.36 485.701 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-353 TJm +(set) 11.0684 Tj +-353 TJm +(to) 7.7509 Tj +[1 0 0 1 153.374 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -153.374 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +153.374 485.701 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 183.262 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.262 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +186.778 485.701 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +-353 TJm +(the) 12.1743 Tj +-353 TJm +(number) 30.4357 Tj +-353 TJm +(of) 8.29885 Tj +-353 TJm +(bytes) 21.031 Tj +-353 TJm +(read) 17.1456 Tj +-353 TJm +(is) 6.64505 Tj +-353 TJm +(returned.) 35.686 Tj +-1238 TJm +(If) 6.63509 Tj +-353 TJm +(the) 12.1743 Tj +-353 TJm +(logical) 27.1182 Tj +-353 TJm +(end-of-stream) 55.8802 Tj +-353 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-353 TJm +(detected,) 35.686 Tj +[1 0 0 1 72 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 473.746 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 113.843 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.795 473.746 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-296 TJm +(be) 9.40469 Tj +-297 TJm +(set) 11.0684 Tj +-296 TJm +(to) 7.7509 Tj +[1 0 0 1 172.329 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.329 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.329 473.746 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 250.037 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -250.037 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +250.037 473.746 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-296 TJm +(and) 14.386 Tj +-297 TJm +(the) 12.1743 Tj +-296 TJm +(number) 30.4357 Tj +-296 TJm +(of) 8.29885 Tj +-297 TJm +(bytes) 21.031 Tj +-296 TJm +(read) 17.1456 Tj +-296 TJm +(is) 6.64505 Tj +-296 TJm +(returned.) 35.686 Tj +-898 TJm +(All) 12.7322 Tj +-297 TJm +(other) 20.4731 Tj +[1 0 0 1 470 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -470 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +470 473.746 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 511.843 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.843 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +514.795 473.746 Td +/F130_0 9.9626 Tf +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +72 461.791 Td +(denote) 26.5603 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(error) 19.3573 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 461.691] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -451.729] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.873 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 131.776 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +134.224 439.873 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-246 TJm +(supply) 26.5703 Tj +[1 0 0 1 181.193 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -181.193 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.193 439.873 Td +/F134_0 9.9626 Tf +(len) 17.9327 Tj +[1 0 0 1 199.126 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -199.126 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.575 439.873 Td +/F130_0 9.9626 Tf +(bytes,) 23.5217 Tj +-247 TJm +(unless) 24.9065 Tj +-245 TJm +(the) 12.1743 Tj +-246 TJm +(logical) 27.1182 Tj +-246 TJm +(stream) 26.5603 Tj +-246 TJm +(end) 14.386 Tj +-245 TJm +(is) 6.64505 Tj +-246 TJm +(detected) 33.1954 Tj +-246 TJm +(or) 8.29885 Tj +-246 TJm +(an) 9.40469 Tj +-246 TJm +(error) 19.3573 Tj +-245 TJm +(occurs.) 28.493 Tj +-617 TJm +(Because) 33.1954 Tj +-246 TJm +(of) 8.29885 Tj +-246 TJm +(this,) 16.8866 Tj +-247 TJm +(it) 5.53921 Tj +72 427.918 Td +(is) 6.64505 Tj +-231 TJm +(possible) 32.6574 Tj +-231 TJm +(to) 7.7509 Tj +-231 TJm +(detect) 23.7907 Tj +-231 TJm +(the) 12.1743 Tj +-231 TJm +(stream) 26.5603 Tj +-231 TJm +(end) 14.386 Tj +-232 TJm +(by) 9.9626 Tj +-231 TJm +(observing) 39.2925 Tj +-231 TJm +(when) 21.579 Tj +-231 TJm +(the) 12.1743 Tj +-231 TJm +(number) 30.4357 Tj +-231 TJm +(of) 8.29885 Tj +-231 TJm +(bytes) 21.031 Tj +-231 TJm +(returned) 33.1954 Tj +-231 TJm +(is) 6.64505 Tj +-231 TJm +(less) 14.9439 Tj +-231 TJm +(than) 17.1556 Tj +-232 TJm +(the) 12.1743 Tj +-231 TJm +(number) 30.4357 Tj +-231 TJm +(requested.) 40.6673 Tj +72 415.963 Td +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-309 TJm +(this) 14.396 Tj +-297 TJm +(is) 6.64505 Tj +-298 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(arded) 22.1269 Tj +-297 TJm +(as) 8.29885 Tj +-297 TJm +(inadvisable;) 48.1492 Tj +-321 TJm +(you) 14.9439 Tj +-298 TJm +(should) 26.5703 Tj +-297 TJm +(instead) 28.224 Tj +-297 TJm +(check) 23.2328 Tj +[1 0 0 1 360.631 415.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.631 -415.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.631 415.963 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 402.475 415.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -402.475 -415.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.437 415.963 Td +/F130_0 9.9626 Tf +(after) 18.2515 Tj +-297 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-298 TJm +(call) 14.386 Tj +-297 TJm +(and) 14.386 Tj +-297 TJm +(w) 7.193 Tj +10 TJm +(atch) 16.5977 Tj +-298 TJm +(out) 12.7322 Tj +-297 TJm +(for) 11.6164 Tj +[1 0 0 1 72 404.008] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -404.008] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 404.008 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 149.709 404.008] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -404.008] cm +[1 0 0 1 0 0] Tm +0 0 Td +149.709 404.008 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 402.698] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -392.735] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 382.09 Td +/F130_0 9.9626 Tf +(Internally) 38.7346 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 117.541 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -117.541 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +117.541 382.09 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 177.317 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.317 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.786 382.09 Td +/F130_0 9.9626 Tf +(copies) 25.4544 Tj +-449 TJm +(data) 16.5977 Tj +-448 TJm +(from) 19.3673 Tj +-449 TJm +(the) 12.1743 Tj +-448 TJm +(compressed) 47.0334 Tj +-449 TJm +(\002le) 12.7322 Tj +-448 TJm +(in) 7.7509 Tj +-449 TJm +(chunks) 28.224 Tj +-449 TJm +(of) 8.29885 Tj +-448 TJm +(size) 15.4918 Tj +[1 0 0 1 419.602 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -419.602 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.602 382.09 Td +/F134_0 9.9626 Tf +(BZ_MAX_UNUSED) 77.7083 Tj +[1 0 0 1 497.31 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -497.31 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +501.778 382.09 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-449 TJm +(be-) 12.7222 Tj +72 370.135 Td +(fore) 16.0398 Tj +-414 TJm +(decompressing) 59.7656 Tj +-414 TJm +(it.) 8.02986 Tj +-1605 TJm +(If) 6.63509 Tj +-415 TJm +(the) 12.1743 Tj +-414 TJm +(\002le) 12.7322 Tj +-414 TJm +(contains) 33.2053 Tj +-414 TJm +(more) 20.4731 Tj +-414 TJm +(bytes) 21.031 Tj +-415 TJm +(than) 17.1556 Tj +-414 TJm +(strictly) 27.6761 Tj +-414 TJm +(needed) 28.2141 Tj +-414 TJm +(to) 7.7509 Tj +-414 TJm +(reach) 21.569 Tj +-414 TJm +(the) 12.1743 Tj +-415 TJm +(logical) 27.1182 Tj +-414 TJm +(end-of-stream,) 58.3709 Tj +[1 0 0 1 72 358.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -358.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 358.18 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 131.776 358.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -358.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +134.749 358.18 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-298 TJm +(almost) 26.5703 Tj +-299 TJm +(certainly) 34.8591 Tj +-298 TJm +(read) 17.1456 Tj +-299 TJm +(some) 21.031 Tj +-298 TJm +(of) 8.29885 Tj +-299 TJm +(the) 12.1743 Tj +-298 TJm +(trailing) 28.782 Tj +-298 TJm +(data) 16.5977 Tj +-299 TJm +(before) 25.4445 Tj +-298 TJm +(signalling) 39.3025 Tj +[1 0 0 1 413.162 358.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -413.162 -358.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +413.162 358.18 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_END) 89.6634 Tj +[1 0 0 1 502.826 358.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -502.826 -358.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +502.826 358.18 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-597 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-298 TJm +(col-) 15.4918 Tj +72 346.224 Td +(lect) 14.386 Tj +-242 TJm +(the) 12.1743 Tj +-242 TJm +(read) 17.1456 Tj +-243 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-242 TJm +(unused) 28.224 Tj +-242 TJm +(data) 16.5977 Tj +-242 TJm +(once) 18.8094 Tj +[1 0 0 1 208.759 346.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -208.759 -346.224] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.759 346.224 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_END) 89.6634 Tj +[1 0 0 1 298.423 346.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -298.423 -346.224] cm +[1 0 0 1 0 0] Tm +0 0 Td +300.835 346.224 Td +/F130_0 9.9626 Tf +(has) 13.2801 Tj +-242 TJm +(appeared,) 38.4457 Tj +-244 TJm +(call) 14.386 Tj +[1 0 0 1 374.201 346.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -374.201 -346.224] cm +[1 0 0 1 0 0] Tm +0 0 Td +374.201 346.224 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 487.775 346.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -487.775 -346.224] cm +[1 0 0 1 0 0] Tm +0 0 Td +490.188 346.224 Td +/F130_0 9.9626 Tf +(immediately) 49.813 Tj +72 334.269 Td +(before) 25.4445 Tj +[1 0 0 1 99.935 334.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -99.935 -334.269] cm +[1 0 0 1 0 0] Tm +0 0 Td +99.935 334.269 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 189.599 334.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -189.599 -334.269] cm +[1 0 0 1 0 0] Tm +0 0 Td +189.599 334.269 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 332.959] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -322.996] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 312.351 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 312.351 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 312.351 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 310.195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -259.343] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(20) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 24 24 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -284.568] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 263.014 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 259.427] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(buf) 17.9327 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +90 687.721 Td +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 675.766 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzWriteOpen) 89.6634 Tj +90 663.811 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 651.856 Td +(if) 11.9551 Tj +-426 TJm +(there) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(reading) 41.8429 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(file) 23.9102 Tj +90 639.9 Td +(BZ_UNEXPECTED_EOF) 101.619 Tj +98.4879 627.945 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(file) 23.9102 Tj +-426 TJm +(ended) 29.8878 Tj +-426 TJm +(before) 35.8654 Tj +98.4879 615.99 Td +(the) 17.9327 Tj +-426 TJm +(logical) 41.8429 Tj +-426 TJm +(end-of-stream) 77.7083 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected) 47.8205 Tj +90 604.035 Td +(BZ_DATA_ERROR) 77.7083 Tj +98.4879 592.08 Td +(if) 11.9551 Tj +-426 TJm +(a) 5.97756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(integrity) 53.798 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected) 47.8205 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(stream) 35.8654 Tj +90 580.125 Td +(BZ_DATA_ERROR_MAGIC) 113.574 Tj +98.4879 568.169 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(stream) 35.8654 Tj +-426 TJm +(does) 23.9102 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(begin) 29.8878 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(requisite) 53.798 Tj +-426 TJm +(header) 35.8654 Tj +-426 TJm +(bytes) 29.8878 Tj +98.4879 556.214 Td +(\(ie,) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(a) 5.97756 Tj +-426 TJm +(bzip2) 29.8878 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(file\).) 35.8654 Tj +-852 TJm +(This) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(really) 35.8654 Tj +98.4879 544.259 Td +(a) 5.97756 Tj +-426 TJm +(special) 41.8429 Tj +-426 TJm +(case) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(BZ_DATA_ERROR.) 83.6858 Tj +90 532.304 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 520.349 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(available) 53.798 Tj +90 508.394 Td +(BZ_STREAM_END) 77.7083 Tj +98.4879 496.438 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(logical) 41.8429 Tj +-426 TJm +(end) 17.9327 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(stream) 35.8654 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected.) 53.798 Tj +90 484.483 Td +(BZ_OK) 29.8878 Tj +98.4879 472.528 Td +(otherwise.) 59.7756 Tj +[1 0 0 1 72 456.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -447.024] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 435.068 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 434.969] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -425.604] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 425.604 Td +/F134_0 9.9626 Tf +(number) 35.8654 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(bytes) 29.8878 Tj +-426 TJm +(read) 23.9102 Tj +98.4879 413.649 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(BZ_STREAM_END) 77.7083 Tj +90 401.694 Td +(undefined) 53.798 Tj +98.4879 389.739 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 374.197] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -364.234] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 352.279 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 352.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -84.6825] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 83.6862 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 80.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -342.815] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 342.815 Td +/F134_0 9.9626 Tf +(collect) 41.8429 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(then) 23.9102 Tj +-426 TJm +(BZ2_bzRead) 59.7756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(BZ2_bzReadClose) 89.6634 Tj +98.4879 330.859 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +90 318.904 Td +(collect) 41.8429 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(then) 23.9102 Tj +-426 TJm +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(BZ2_bzReadGetUnused) 113.574 Tj +98.4879 306.949 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_SEQUENCE_END) 89.6634 Tj +90 294.994 Td +(BZ2_bzReadClose) 89.6634 Tj +98.4879 283.039 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 267.497] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -257.534] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 236.876 Td +/F122_0 17.2154 Tf +(3.4.3.) 43.0729 Tj +[1 0 0 1 119.858 236.876] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -236.876] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 236.876 Td +/F392_0 17.2154 Tf +(BZ2_bzReadGetUnused) 196.256 Tj +[1 0 0 1 316.114 236.876] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -244.114 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8617] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -225.178] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 225.178 Td +/F134_0 9.9626 Tf +(void) 23.9102 Tj +-426 TJm +(BZ2_bzReadGetUnused\() 119.551 Tj +-426 TJm +(int) 17.9327 Tj +259.883 223.435 Td +(*) 5.97756 Tj +270.104 225.178 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +362.278 223.435 Td +(*) 5.97756 Tj +368.256 225.178 Td +(b,) 11.9551 Tj +200.343 213.223 Td +(void) 23.9102 Tj +224.254 211.48 Td +(**) 11.9551 Tj +240.453 213.223 Td +(unused,) 41.8429 Tj +-426 TJm +(int) 17.9327 Tj +304.473 211.48 Td +(*) 5.97756 Tj +314.694 213.223 Td +(nUnused) 41.8429 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 197.681] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -187.719] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 175.764 Td +/F130_0 9.9626 Tf +(Returns) 30.9936 Tj +-435 TJm +(data) 16.5977 Tj +-435 TJm +(which) 24.3486 Tj +-435 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-435 TJm +(read) 17.1456 Tj +-435 TJm +(from) 19.3673 Tj +-435 TJm +(the) 12.1743 Tj +-435 TJm +(compressed) 47.0334 Tj +-435 TJm +(\002le) 12.7322 Tj +-435 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-435 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-435 TJm +(not) 12.7322 Tj +-435 TJm +(needed) 28.2141 Tj +-435 TJm +(to) 7.7509 Tj +-435 TJm +(get) 12.1743 Tj +-435 TJm +(to) 7.7509 Tj +-435 TJm +(the) 12.1743 Tj +-435 TJm +(logical) 27.1182 Tj +-435 TJm +(end-of-stream.) 58.3709 Tj +[1 0 0 1 72 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 162.065 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +77.9776 163.809 Td +(unused) 35.8654 Tj +[1 0 0 1 113.843 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +117.2 163.809 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-337 TJm +(set) 11.0684 Tj +-337 TJm +(to) 7.7509 Tj +-337 TJm +(the) 12.1743 Tj +-337 TJm +(address) 29.8778 Tj +-337 TJm +(of) 8.29885 Tj +-336 TJm +(the) 12.1743 Tj +-337 TJm +(data,) 19.0883 Tj +-359 TJm +(and) 14.386 Tj +[1 0 0 1 269.089 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -269.089 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.089 162.065 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +275.067 163.809 Td +(nUnused) 41.8429 Tj +[1 0 0 1 316.91 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.91 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +320.267 163.809 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-337 TJm +(the) 12.1743 Tj +-337 TJm +(number) 30.4357 Tj +-337 TJm +(of) 8.29885 Tj +-337 TJm +(bytes.) 23.5217 Tj +[1 0 0 1 427.247 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.247 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +427.247 162.065 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +433.225 163.809 Td +(nUnused) 41.8429 Tj +[1 0 0 1 475.068 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -475.068 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +478.425 163.809 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-337 TJm +(be) 9.40469 Tj +-337 TJm +(set) 11.0684 Tj +-337 TJm +(to) 7.7509 Tj +-337 TJm +(a) 4.42339 Tj +72 151.853 Td +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-250 TJm +(between) 33.1954 Tj +[1 0 0 1 131.506 151.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.506 -151.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.506 151.853 Td +/F134_0 9.9626 Tf +(0) 5.97756 Tj +[1 0 0 1 137.484 151.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.484 -151.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +139.975 151.853 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 156.851 151.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -156.851 -151.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +156.851 151.853 Td +/F134_0 9.9626 Tf +(BZ_MAX_UNUSED) 77.7083 Tj +[1 0 0 1 234.56 151.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.56 -151.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +237.05 151.853 Td +/F130_0 9.9626 Tf +(inclusi) 26.5703 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e.) 6.91404 Tj +[1 0 0 1 72 150.543] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -140.581] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 129.935 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-882 TJm +(function) 33.2053 Tj +-883 TJm +(may) 17.1556 Tj +-882 TJm +(only) 17.7135 Tj +-883 TJm +(be) 9.40469 Tj +-882 TJm +(called) 23.7907 Tj +-883 TJm +(once) 18.8094 Tj +[1 0 0 1 271.332 129.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -271.332 -129.935] cm +[1 0 0 1 0 0] Tm +0 0 Td +271.332 129.935 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 331.108 129.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.108 -129.935] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.9 129.935 Td +/F130_0 9.9626 Tf +(has) 13.2801 Tj +-882 TJm +(signalled) 35.9749 Tj +[1 0 0 1 406.737 129.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.737 -129.935] cm +[1 0 0 1 0 0] Tm +0 0 Td +406.737 129.935 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 484.446 129.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -484.446 -129.935] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.231 129.935 Td +/F130_0 9.9626 Tf +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-882 TJm +(before) 25.4445 Tj +[1 0 0 1 72 117.98] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -117.98] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 117.98 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 161.664 117.98] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.664 -117.98] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.664 117.98 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 116.67] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -106.708] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 96.0625 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 96.0625] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -96.0625] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 96.0625 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 96.0625] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -96.0625] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 96.0625 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 93.9057] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -43.0539] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(21) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 25 25 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -129.151] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 107.597 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 104.01] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 687.721 Td +(or) 11.9551 Tj +-426 TJm +(unused) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(nUnused) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +90 675.766 Td +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 663.811 Td +(if) 11.9551 Tj +-426 TJm +(BZ_STREAM_END) 77.7083 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(signalled) 53.798 Tj +98.4879 651.856 Td +(or) 11.9551 Tj +-426 TJm +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzWriteOpen) 89.6634 Tj +90 639.9 Td +(BZ_OK) 29.8878 Tj +98.4879 627.945 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 612.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -602.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 590.486 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 590.386] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3238] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -581.021] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 581.021 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 72 565.48] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -555.517] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 534.858 Td +/F122_0 17.2154 Tf +(3.4.4.) 43.0729 Tj +[1 0 0 1 119.858 534.858] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -534.858] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 534.858 Td +/F392_0 17.2154 Tf +(BZ2_bzReadClose) 154.939 Tj +[1 0 0 1 274.797 534.858] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.797 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -523.161] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 523.161 Td +/F134_0 9.9626 Tf +(void) 23.9102 Tj +-426 TJm +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +244.46 521.417 Td +(*) 5.97756 Tj +250.438 523.161 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +342.612 521.417 Td +(*) 5.97756 Tj +348.59 523.161 Td +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 507.619] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 485.701 Td +/F130_0 9.9626 Tf +(Releases) 34.8591 Tj +-430 TJm +(all) 9.9626 Tj +-429 TJm +(memory) 33.2053 Tj +-430 TJm +(pertaining) 40.3983 Tj +-429 TJm +(to) 7.7509 Tj +-430 TJm +(the) 12.1743 Tj +-429 TJm +(compressed) 47.0334 Tj +-430 TJm +(\002le) 12.7322 Tj +[1 0 0 1 304.352 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -304.352 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +304.352 485.701 Td +/F134_0 9.9626 Tf +(b) 5.97756 Tj +[1 0 0 1 310.33 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -310.33 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.33 485.701 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 321.276 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -321.276 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +321.276 485.701 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 410.94 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.94 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +415.22 485.701 Td +/F130_0 9.9626 Tf +(does) 18.2614 Tj +-430 TJm +(not) 12.7322 Tj +-429 TJm +(call) 14.386 Tj +[1 0 0 1 473.438 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -473.438 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +473.438 485.701 Td +/F134_0 9.9626 Tf +(fclose) 35.8654 Tj +[1 0 0 1 509.304 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -509.304 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +513.584 485.701 Td +/F130_0 9.9626 Tf +(on) 9.9626 Tj +-430 TJm +(the) 12.1743 Tj +72 473.746 Td +(underlying) 43.1679 Tj +-264 TJm +(\002le) 12.7322 Tj +-264 TJm +(handle,) 29.0509 Tj +-267 TJm +(so) 8.85675 Tj +-264 TJm +(you) 14.9439 Tj +-264 TJm +(should) 26.5703 Tj +-264 TJm +(do) 9.9626 Tj +-264 TJm +(that) 14.9439 Tj +-264 TJm +(yourself) 32.6474 Tj +-264 TJm +(if) 6.08715 Tj +-263 TJm +(appropriate.) 47.8603 Tj +[1 0 0 1 348.653 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -348.653 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +348.653 473.746 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 438.317 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.317 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +440.946 473.746 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-264 TJm +(be) 9.40469 Tj +-264 TJm +(called) 23.7907 Tj +-264 TJm +(to) 7.7509 Tj +-264 TJm +(clean) 21.0211 Tj +72 461.791 Td +(up) 9.9626 Tj +-250 TJm +(after) 18.2515 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(situations.) 40.6873 Tj +[1 0 0 1 72 459.634] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -449.671] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.873 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 439.873 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 439.873 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 437.716] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -428.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 428.351 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 416.396 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzOpenWrite) 89.6634 Tj +90 404.441 Td +(BZ_OK) 29.8878 Tj +98.4879 392.486 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 376.944] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -366.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 355.026 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 354.927] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -345.562] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 345.562 Td +/F134_0 9.9626 Tf +(none) 23.9102 Tj +[1 0 0 1 72 330.02] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -320.058] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 299.399 Td +/F122_0 17.2154 Tf +(3.4.5.) 43.0729 Tj +[1 0 0 1 119.858 299.399] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -299.399] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 299.399 Td +/F392_0 17.2154 Tf +(BZ2_bzWriteOpen) 154.939 Tj +[1 0 0 1 274.797 299.399] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.797 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -48.8169] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 47.8207 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 44.2341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -287.702] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 287.702 Td +/F134_0 9.9626 Tf +(BZFILE) 35.8654 Tj +130.109 285.958 Td +(*) 5.97756 Tj +136.087 287.702 Td +(BZ2_bzWriteOpen\() 95.641 Tj +-426 TJm +(int) 17.9327 Tj +258.149 285.958 Td +(*) 5.97756 Tj +264.127 287.702 Td +(bzerror,) 47.8205 Tj +-426 TJm +(FILE) 23.9102 Tj +344.346 285.958 Td +(*) 5.97756 Tj +350.323 287.702 Td +(f,) 11.9551 Tj +196.099 275.746 Td +(int) 17.9327 Tj +-426 TJm +(blockSize100k,) 83.6858 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(verbosity,) 59.7756 Tj +196.099 263.791 Td +(int) 17.9327 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 248.249] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -238.287] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 226.332 Td +/F130_0 9.9626 Tf +(Prepare) 30.4258 Tj +-268 TJm +(to) 7.7509 Tj +-269 TJm +(write) 20.4731 Tj +-268 TJm +(compressed) 47.0334 Tj +-269 TJm +(data) 16.5977 Tj +-268 TJm +(to) 7.7509 Tj +-269 TJm +(\002le) 12.7322 Tj +-268 TJm +(handle) 26.5603 Tj +[1 0 0 1 262.72 226.332] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -262.72 -226.332] cm +[1 0 0 1 0 0] Tm +0 0 Td +262.72 226.332 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 268.698 226.332] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -268.698 -226.332] cm +[1 0 0 1 0 0] Tm +0 0 Td +268.698 226.332 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 274.829 226.332] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -274.829 -226.332] cm +[1 0 0 1 0 0] Tm +0 0 Td +274.829 226.332 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 280.807 226.332] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -280.807 -226.332] cm +[1 0 0 1 0 0] Tm +0 0 Td +283.481 226.332 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-268 TJm +(refer) 18.7994 Tj +-269 TJm +(to) 7.7509 Tj +-268 TJm +(a) 4.42339 Tj +-269 TJm +(\002le) 12.7322 Tj +-268 TJm +(which) 24.3486 Tj +-269 TJm +(has) 13.2801 Tj +-268 TJm +(been) 18.8094 Tj +-269 TJm +(opened) 28.772 Tj +-268 TJm +(for) 11.6164 Tj +-269 TJm +(writing,) 31.2726 Tj +-273 TJm +(and) 14.386 Tj +-268 TJm +(for) 11.6164 Tj +72 214.377 Td +(which) 24.3486 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(indicator) 35.417 Tj +-250 TJm +(\() 3.31755 Tj +[1 0 0 1 176.577 214.376] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.577 -214.376] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.577 214.376 Td +/F134_0 9.9626 Tf +(ferror\(f\)) 53.798 Tj +[1 0 0 1 230.375 214.376] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -230.375 -214.376] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.375 214.376 Td +/F130_0 9.9626 Tf +(\)is) 9.9626 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(set.) 13.5591 Tj +[1 0 0 1 72 212.593] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -202.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 192.459 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-223 TJm +(the) 12.1743 Tj +-224 TJm +(meaning) 34.3112 Tj +-223 TJm +(of) 8.29885 Tj +-224 TJm +(parameters) 43.7059 Tj +[1 0 0 1 195.306 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -195.306 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +195.306 192.459 Td +/F134_0 9.9626 Tf +(blockSize100k) 77.7083 Tj +[1 0 0 1 273.015 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -273.015 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +273.015 192.459 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 277.784 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.784 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +277.784 192.459 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 331.583 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.583 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +333.808 192.459 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 350.42 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -350.42 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +350.42 192.459 Td +/F134_0 9.9626 Tf +(workFactor) 59.7756 Tj +[1 0 0 1 410.196 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.196 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +410.196 192.459 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-229 TJm +(see) 12.7222 Tj +[1 0 0 1 429.913 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -429.913 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +429.913 192.459 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 537.509 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 192.459 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 190.302] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -180.339] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 170.541 Td +/F130_0 9.9626 Tf +(All) 12.7322 Tj +-382 TJm +(required) 33.1954 Tj +-382 TJm +(memory) 33.2053 Tj +-382 TJm +(is) 6.64505 Tj +-382 TJm +(allocated) 35.965 Tj +-383 TJm +(at) 7.193 Tj +-382 TJm +(this) 14.396 Tj +-382 TJm +(stage,) 22.9638 Tj +-415 TJm +(so) 8.85675 Tj +-382 TJm +(if) 6.08715 Tj +-382 TJm +(the) 12.1743 Tj +-382 TJm +(call) 14.386 Tj +-382 TJm +(completes) 40.3983 Tj +-382 TJm +(successfully) 48.6972 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 424.691 170.541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -424.691 -170.541] cm +[1 0 0 1 0 0] Tm +0 0 Td +424.691 170.541 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 496.422 170.541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.422 -170.541] cm +[1 0 0 1 0 0] Tm +0 0 Td +500.228 170.541 Td +/F130_0 9.9626 Tf +(cannot) 26.5603 Tj +-382 TJm +(be) 9.40469 Tj +72 158.586 Td +(signalled) 35.9749 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(subsequent) 44.2738 Tj +-250 TJm +(call) 14.386 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 203.715 158.586] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -203.715 -158.586] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.715 158.586 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 269.468 158.586] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -269.468 -158.586] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.468 158.586 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 156.429] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -146.466] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 136.668 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 136.668] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -136.668] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 136.668 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 136.668] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -136.668] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 136.668 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 134.511] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -83.6593] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 26 26 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -165.016] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 143.462 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 139.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 687.721 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 675.766 Td +(if) 11.9551 Tj +-426 TJm +(f) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 663.811 Td +(or) 11.9551 Tj +-426 TJm +(blockSize100k) 77.7083 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(1) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(blockSize100k) 77.7083 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(9) 5.97756 Tj +90 651.856 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 639.9 Td +(if) 11.9551 Tj +-426 TJm +(ferror\(f\)) 53.798 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(nonzero) 41.8429 Tj +90 627.945 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 615.99 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 604.035 Td +(BZ_OK) 29.8878 Tj +98.4879 592.08 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 576.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -566.575] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 554.62 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 554.521] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -545.156] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 545.156 Td +/F134_0 9.9626 Tf +(Pointer) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(abstract) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +98.4879 533.201 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +90 521.245 Td +(NULL) 23.9102 Tj +98.4879 509.29 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 493.748] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -483.786] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 471.831 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 471.731] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -84.6825] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 83.6862 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 80.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -462.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 462.366 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +98.4879 450.411 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +98.4879 438.456 Td +(\(you) 23.9102 Tj +-426 TJm +(could) 29.8878 Tj +-426 TJm +(go) 11.9551 Tj +-426 TJm +(directly) 47.8205 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(BZ2_bzWriteClose,) 101.619 Tj +-426 TJm +(but) 17.9327 Tj +-426 TJm +(this) 23.9102 Tj +-426 TJm +(would) 29.8878 Tj +-426 TJm +(be) 11.9551 Tj +-426 TJm +(pretty) 35.8654 Tj +485.505 434.212 Td +/F564_0 9.9626 Tf +( ) 9.9626 Tj +493.808 434.212 Td +/F147_0 9.9626 Tf +(-) 2.7696 Tj +90 426.501 Td +/F134_0 9.9626 Tf +(pointless\)) 59.7756 Tj +90 414.546 Td +(BZ2_bzWriteClose) 95.641 Tj +98.4879 402.59 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 387.049] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -377.086] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 356.428 Td +/F122_0 17.2154 Tf +(3.4.6.) 43.0729 Tj +[1 0 0 1 119.858 356.428] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -356.428] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 356.428 Td +/F392_0 17.2154 Tf +(BZ2_bzWrite) 113.622 Tj +[1 0 0 1 233.48 356.428] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.48 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -344.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 344.73 Td +/F134_0 9.9626 Tf +(void) 23.9102 Tj +-426 TJm +(BZ2_bzWrite) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +220.55 342.987 Td +(*) 5.97756 Tj +226.528 344.73 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +318.702 342.987 Td +(*) 5.97756 Tj +324.679 344.73 Td +(b,) 11.9551 Tj +-426 TJm +(void) 23.9102 Tj +369.033 342.987 Td +(*) 5.97756 Tj +375.01 344.73 Td +(buf,) 23.9102 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 329.188] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -319.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 307.27 Td +/F130_0 9.9626 Tf +(Absorbs) 33.2053 Tj +[1 0 0 1 107.696 307.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -107.696 -307.27] cm +[1 0 0 1 0 0] Tm +0 0 Td +107.696 307.27 Td +/F134_0 9.9626 Tf +(len) 17.9327 Tj +[1 0 0 1 125.629 307.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.629 -307.27] cm +[1 0 0 1 0 0] Tm +0 0 Td +128.119 307.27 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +[1 0 0 1 214.544 307.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -214.544 -307.27] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.544 307.27 Td +/F134_0 9.9626 Tf +(buf) 17.9327 Tj +[1 0 0 1 232.477 307.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.477 -307.27] cm +[1 0 0 1 0 0] Tm +0 0 Td +232.477 307.27 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(entually) 32.0995 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(written) 28.224 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002le.) 15.2229 Tj +[1 0 0 1 72 305.114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -295.151] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 285.353 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 285.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -285.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 285.353 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 285.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -285.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 285.353 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 283.196] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -108.593] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 107.597 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 104.01] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -273.831] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 273.831 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 261.876 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(buf) 17.9327 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +90 249.921 Td +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 237.965 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzReadOpen) 83.6858 Tj +90 226.01 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 214.055 Td +(if) 11.9551 Tj +-426 TJm +(there) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(writing) 41.8429 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(file.) 29.8878 Tj +90 202.1 Td +(BZ_OK) 29.8878 Tj +98.4879 190.145 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 174.603] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -164.64] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 143.982 Td +/F122_0 17.2154 Tf +(3.4.7.) 43.0729 Tj +[1 0 0 1 119.858 143.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -143.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 143.982 Td +/F392_0 17.2154 Tf +(BZ2_bzWriteClose) 165.268 Tj +[1 0 0 1 285.126 143.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.126 -2.3326] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -90.7975] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 27 27 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -165.016] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 143.462 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 139.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(void) 23.9102 Tj +-426 TJm +(BZ2_bzWriteClose\() 101.619 Tj +-426 TJm +(int) 17.9327 Tj +246.194 709.888 Td +(*) 5.97756 Tj +252.171 711.631 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +340.102 709.888 Td +(*) 5.97756 Tj +350.323 711.631 Td +(f,) 11.9551 Tj +187.611 699.676 Td +(int) 17.9327 Tj +-426 TJm +(abandon,) 47.8205 Tj +187.611 687.721 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +257.609 685.978 Td +(*) 5.97756 Tj +267.83 687.721 Td +(nbytes_in,) 59.7756 Tj +187.611 675.766 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +257.609 674.023 Td +(*) 5.97756 Tj +267.83 675.766 Td +(nbytes_out) 59.7756 Tj +-426 TJm +(\);) 11.9551 Tj +90 651.856 Td +(void) 23.9102 Tj +-426 TJm +(BZ2_bzWriteClose64\() 113.574 Tj +-426 TJm +(int) 17.9327 Tj +258.149 650.112 Td +(*) 5.97756 Tj +264.127 651.856 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +352.057 650.112 Td +(*) 5.97756 Tj +362.278 651.856 Td +(f,) 11.9551 Tj +196.099 639.9 Td +(int) 17.9327 Tj +-426 TJm +(abandon,) 47.8205 Tj +196.099 627.945 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +266.097 626.202 Td +(*) 5.97756 Tj +276.318 627.945 Td +(nbytes_in_lo32,) 89.6634 Tj +196.099 615.99 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +266.097 614.247 Td +(*) 5.97756 Tj +276.318 615.99 Td +(nbytes_in_hi32,) 89.6634 Tj +196.099 604.035 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +266.097 602.292 Td +(*) 5.97756 Tj +276.318 604.035 Td +(nbytes_out_lo32,) 95.641 Tj +196.099 592.08 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +266.097 590.336 Td +(*) 5.97756 Tj +276.318 592.08 Td +(nbytes_out_hi32) 89.6634 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 576.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -566.575] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 554.62 Td +/F130_0 9.9626 Tf +(Compresses) 48.1492 Tj +-403 TJm +(and) 14.386 Tj +-402 TJm +(\003ushes) 27.6761 Tj +-403 TJm +(to) 7.7509 Tj +-403 TJm +(the) 12.1743 Tj +-402 TJm +(compressed) 47.0334 Tj +-403 TJm +(\002le) 12.7322 Tj +-403 TJm +(a) 4.42339 Tj +1 TJm +(ll) 5.53921 Tj +-403 TJm +(data) 16.5977 Tj +-403 TJm +(so) 8.85675 Tj +-402 TJm +(f) 3.31755 Tj +10 TJm +(ar) 7.74094 Tj +-403 TJm +(supplied) 33.7633 Tj +-403 TJm +(by) 9.9626 Tj +[1 0 0 1 384.152 554.62] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -384.152 -554.62] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.152 554.62 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 449.906 554.62] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -449.906 -554.62] cm +[1 0 0 1 0 0] Tm +0 0 Td +449.906 554.62 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-768 TJm +(The) 15.4918 Tj +-403 TJm +(logical) 27.1182 Tj +-402 TJm +(end-of-) 29.3199 Tj +72 542.665 Td +(stream) 26.5603 Tj +-352 TJm +(mark) 20.4731 Tj +10 TJm +(ers) 11.6164 Tj +-352 TJm +(are) 12.1643 Tj +-353 TJm +(also) 16.0497 Tj +-352 TJm +(written,) 30.7147 Tj +-378 TJm +(so) 8.85675 Tj +-352 TJm +(subsequent) 44.2738 Tj +-352 TJm +(calls) 18.2614 Tj +-352 TJm +(to) 7.7509 Tj +[1 0 0 1 300.456 542.665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.456 -542.665] cm +[1 0 0 1 0 0] Tm +0 0 Td +300.456 542.665 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 366.209 542.665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -366.209 -542.665] cm +[1 0 0 1 0 0] Tm +0 0 Td +369.718 542.665 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-352 TJm +(ille) 12.7322 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(al.) 9.68365 Tj +-1234 TJm +(All) 12.7322 Tj +-352 TJm +(memory) 33.2053 Tj +-352 TJm +(associated) 40.9463 Tj +-352 TJm +(with) 17.7135 Tj +72 530.71 Td +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +[1 0 0 1 151.411 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -151.411 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +151.411 530.71 Td +/F134_0 9.9626 Tf +(b) 5.97756 Tj +[1 0 0 1 157.389 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -157.389 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.879 530.71 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(released.) 35.1281 Tj +[1 0 0 1 207.231 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.231 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.231 530.71 Td +/F134_0 9.9626 Tf +(fflush) 35.8654 Tj +[1 0 0 1 243.097 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.097 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.587 530.71 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(called) 23.7907 Tj +-250 TJm +(on) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le,) 15.2229 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(not) 12.7322 Tj +[1 0 0 1 422.771 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.771 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +422.771 530.71 Td +/F134_0 9.9626 Tf +(fclose) 35.8654 Tj +[1 0 0 1 458.636 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -458.636 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +458.636 530.71 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +50 TJm +(d.) 7.47195 Tj +[1 0 0 1 72 528.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -518.59] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 508.792 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 81.5743 508.792] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -81.5743 -508.792] cm +[1 0 0 1 0 0] Tm +0 0 Td +81.5743 508.792 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 177.216 508.792] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.216 -508.792] cm +[1 0 0 1 0 0] Tm +0 0 Td +180.155 508.792 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-295 TJm +(called) 23.7907 Tj +-295 TJm +(to) 7.7509 Tj +-295 TJm +(clean) 21.0211 Tj +-295 TJm +(up) 9.9626 Tj +-295 TJm +(after) 18.2515 Tj +-295 TJm +(an) 9.40469 Tj +-295 TJm +(error) 19.3573 Tj +40 TJm +(,) 2.49065 Tj +-306 TJm +(the) 12.1743 Tj +-295 TJm +(only) 17.7135 Tj +-295 TJm +(action) 24.3486 Tj +-295 TJm +(is) 6.64505 Tj +-295 TJm +(to) 7.7509 Tj +-295 TJm +(release) 27.6562 Tj +-295 TJm +(the) 12.1743 Tj +-295 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +-891 TJm +(The) 15.4918 Tj +-295 TJm +(library) 26.5603 Tj +72 496.837 Td +(records) 29.3199 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(error) 19.3573 Tj +-289 TJm +(codes) 22.6848 Tj +-289 TJm +(issued) 24.9065 Tj +-289 TJm +(by) 9.9626 Tj +-289 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-289 TJm +(calls,) 20.7521 Tj +-299 TJm +(so) 8.85675 Tj +-289 TJm +(this) 14.396 Tj +-289 TJm +(situation) 34.3212 Tj +-289 TJm +(will) 15.5018 Tj +-289 TJm +(be) 9.40469 Tj +-289 TJm +(detected) 33.1954 Tj +-289 TJm +(automatically) 54.2364 Tj +65 TJm +(.) 2.49065 Tj +-427 TJm +(There) 23.2328 Tj +-289 TJm +(is) 6.64505 Tj +-289 TJm +(no) 9.9626 Tj +-289 TJm +(attempt) 29.8878 Tj +72 484.882 Td +(to) 7.7509 Tj +-263 TJm +(complete) 36.5229 Tj +-262 TJm +(the) 12.1743 Tj +-263 TJm +(compression) 50.3609 Tj +-263 TJm +(operation,) 40.1194 Tj +-265 TJm +(nor) 13.2801 Tj +-263 TJm +(to) 7.7509 Tj +[1 0 0 1 258.308 484.882] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -258.308 -484.882] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.308 484.882 Td +/F134_0 9.9626 Tf +(fflush) 35.8654 Tj +[1 0 0 1 294.173 484.882] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.173 -484.882] cm +[1 0 0 1 0 0] Tm +0 0 Td +296.79 484.882 Td +/F130_0 9.9626 Tf +(the) 12.1743 Tj +-263 TJm +(compressed) 47.0334 Tj +-262 TJm +(\002le.) 15.2229 Tj +-696 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-263 TJm +(can) 13.8281 Tj +-263 TJm +(force) 20.4632 Tj +-262 TJm +(this) 14.396 Tj +-263 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +-263 TJm +(to) 7.7509 Tj +-262 TJm +(happen) 28.772 Tj +72 472.926 Td +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(case) 17.1456 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(error) 19.3573 Tj +40 TJm +(,) 2.49065 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(passing) 29.8878 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(nonzero) 32.0895 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 305.014 472.926] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -305.014 -472.926] cm +[1 0 0 1 0 0] Tm +0 0 Td +305.014 472.926 Td +/F134_0 9.9626 Tf +(abandon) 41.8429 Tj +[1 0 0 1 346.858 472.926] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -346.858 -472.926] cm +[1 0 0 1 0 0] Tm +0 0 Td +346.858 472.926 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 470.77] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -460.807] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 451.009 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 80.5974 451.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -80.5974 -451.009] cm +[1 0 0 1 0 0] Tm +0 0 Td +80.5974 451.009 Td +/F134_0 9.9626 Tf +(nbytes_in) 53.798 Tj +[1 0 0 1 134.396 451.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -134.396 -451.009] cm +[1 0 0 1 0 0] Tm +0 0 Td +136.358 451.009 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-197 TJm +(non-null,) 36.2539 Tj +[1 0 0 1 183.287 451.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.287 -451.009] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.287 449.265 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +189.265 451.009 Td +(nbytes_in) 53.798 Tj +[1 0 0 1 243.063 451.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.063 -451.009] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.025 451.009 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-197 TJm +(be) 9.40469 Tj +-197 TJm +(set) 11.0684 Tj +-197 TJm +(to) 7.7509 Tj +-197 TJm +(be) 9.40469 Tj +-197 TJm +(the) 12.1743 Tj +-197 TJm +(total) 17.7135 Tj +-197 TJm +(v) 4.9813 Tj +20 TJm +(olume) 24.9065 Tj +-197 TJm +(of) 8.29885 Tj +-197 TJm +(uncompressed) 56.996 Tj +-197 TJm +(data) 16.5977 Tj +-197 TJm +(handled.) 34.0322 Tj +-584 TJm +(Similarly) 37.0908 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 72 439.053] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -439.053] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.053 Td +/F134_0 9.9626 Tf +(nbytes_out) 59.7756 Tj +[1 0 0 1 131.776 439.053] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -439.053] cm +[1 0 0 1 0 0] Tm +0 0 Td +134.716 439.053 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-295 TJm +(be) 9.40469 Tj +-295 TJm +(set) 11.0684 Tj +-295 TJm +(to) 7.7509 Tj +-295 TJm +(the) 12.1743 Tj +-295 TJm +(total) 17.7135 Tj +-295 TJm +(v) 4.9813 Tj +20 TJm +(olume) 24.9065 Tj +-296 TJm +(of) 8.29885 Tj +-295 TJm +(compressed) 47.0334 Tj +-295 TJm +(data) 16.5977 Tj +-295 TJm +(written.) 30.7147 Tj +-890 TJm +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-295 TJm +(compatibility) 53.1405 Tj +-295 TJm +(with) 17.7135 Tj +-295 TJm +(older) 20.4731 Tj +-296 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-295 TJm +(of) 8.29885 Tj +72 427.098 Td +(the) 12.1743 Tj +-283 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 118.294 427.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -118.294 -427.098] cm +[1 0 0 1 0 0] Tm +0 0 Td +118.294 427.098 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 213.936 427.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.936 -427.098] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.753 427.098 Td +/F130_0 9.9626 Tf +(only) 17.7135 Tj +-283 TJm +(yields) 23.8007 Tj +-283 TJm +(the) 12.1743 Tj +-282 TJm +(lo) 7.7509 Tj +25 TJm +(wer) 14.9339 Tj +-283 TJm +(32) 9.9626 Tj +-283 TJm +(bits) 14.396 Tj +-283 TJm +(of) 8.29885 Tj +-283 TJm +(these) 20.4731 Tj +-282 TJm +(counts.) 28.503 Tj +-817 TJm +(Use) 15.4918 Tj +[1 0 0 1 423.499 427.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -423.499 -427.098] cm +[1 0 0 1 0 0] Tm +0 0 Td +423.499 427.098 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose64) 107.596 Tj +[1 0 0 1 531.095 427.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -531.095 -427.098] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.913 427.098 Td +/F130_0 9.9626 Tf +(if) 6.08715 Tj +72 415.143 Td +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(full) 13.8381 Tj +-250 TJm +(64) 9.9626 Tj +-250 TJm +(bit) 10.5205 Tj +-250 TJm +(counts.) 28.503 Tj +-620 TJm +(These) 23.7907 Tj +-250 TJm +(tw) 9.9626 Tj +10 TJm +(o) 4.9813 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(otherwise) 38.7346 Tj +-250 TJm +(absolutely) 40.9562 Tj +-250 TJm +(identical.) 36.8018 Tj +[1 0 0 1 72 412.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -403.024] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 393.225 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 393.225] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -393.225] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 393.225 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 393.225] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -393.225] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 393.225 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 391.069] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -84.6825] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 83.6862 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 80.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -381.704] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 381.704 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 369.748 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzReadOpen) 83.6858 Tj +90 357.793 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 345.838 Td +(if) 11.9551 Tj +-426 TJm +(there) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(writing) 41.8429 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(file) 23.9102 Tj +90 333.883 Td +(BZ_OK) 29.8878 Tj +98.4879 321.928 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 306.386] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -296.423] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 275.765 Td +/F122_0 17.2154 Tf +(3.4.8.) 43.0729 Tj +-278 TJm +(Handling) 73.6475 Tj +-278 TJm +(embed) 55.4852 Tj +10 TJm +(ded) 30.609 Tj +-278 TJm +(compressed) 101.416 Tj +-278 TJm +(data) 35.3949 Tj +-278 TJm +(streams) 66.0211 Tj +[1 0 0 1 72 271.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -261.972] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 253.847 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-203 TJm +(high-le) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-203 TJm +(library) 26.5603 Tj +-203 TJm +(f) 3.31755 Tj +10 TJm +(acilitates) 35.417 Tj +-203 TJm +(use) 13.2801 Tj +-203 TJm +(of) 8.29885 Tj +[1 0 0 1 226.404 253.847] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.404 -253.847] cm +[1 0 0 1 0 0] Tm +0 0 Td +226.404 253.847 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 256.292 253.847] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -256.292 -253.847] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.316 253.847 Td +/F130_0 9.9626 Tf +(data) 16.5977 Tj +-203 TJm +(streams) 30.4357 Tj +-203 TJm +(which) 24.3486 Tj +-203 TJm +(form) 19.3673 Tj +-203 TJm +(some) 21.031 Tj +-203 TJm +(part) 15.4918 Tj +-203 TJm +(of) 8.29885 Tj +-204 TJm +(a) 4.42339 Tj +-203 TJm +(surrounding,) 50.6399 Tj +-212 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-203 TJm +(data) 16.5977 Tj +-203 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 251.69] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 221.967 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 221.967 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-240 TJm +(writing,) 31.2726 Tj +-243 TJm +(the) 12.1743 Tj +-240 TJm +(library) 26.5603 Tj +-241 TJm +(tak) 12.1743 Tj +10 TJm +(es) 8.29885 Tj +-240 TJm +(an) 9.40469 Tj +-241 TJm +(open) 19.3673 Tj +-240 TJm +(\002le) 12.7322 Tj +-241 TJm +(handle,) 29.0509 Tj +-242 TJm +(writes) 24.3486 Tj +-241 TJm +(compres) 33.7533 Tj +1 TJm +(sed) 13.2801 Tj +-241 TJm +(data) 16.5977 Tj +-240 TJm +(to) 7.7509 Tj +-241 TJm +(it,) 8.02986 Tj +[1 0 0 1 398.926 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -398.926 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +398.926 221.967 Td +/F134_0 9.9626 Tf +(fflush) 35.8654 Tj +[1 0 0 1 434.791 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -434.791 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +434.791 221.967 Td +/F130_0 9.9626 Tf +(es) 8.29885 Tj +-240 TJm +(it) 5.53921 Tj +-241 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-240 TJm +(does) 18.2614 Tj +-241 TJm +(not) 12.7322 Tj +[1 0 0 1 504.135 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -504.135 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +504.135 221.967 Td +/F134_0 9.9626 Tf +(fclose) 35.8654 Tj +[1 0 0 1 540 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 210.011 Td +/F130_0 9.9626 Tf +(it.) 8.02986 Tj +-610 TJm +(The) 15.4918 Tj +-235 TJm +(calling) 27.1182 Tj +-235 TJm +(application) 44.2738 Tj +-235 TJm +(can) 13.8281 Tj +-235 TJm +(write) 20.4731 Tj +-235 TJm +(its) 9.41466 Tj +-235 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +-235 TJm +(data) 16.5977 Tj +-235 TJm +(before) 25.4445 Tj +-235 TJm +(and) 14.386 Tj +-235 TJm +(after) 18.2515 Tj +-235 TJm +(the) 12.1743 Tj +-235 TJm +(compressed) 47.0334 Tj +-235 TJm +(data) 16.5977 Tj +-235 TJm +(stream,) 29.0509 Tj +-238 TJm +(using) 21.589 Tj +-235 TJm +(that) 14.9439 Tj +-235 TJm +(same) 20.4731 Tj +-235 TJm +(\002le) 12.7322 Tj +86.944 198.056 Td +(handle.) 29.0509 Tj +[1 0 0 1 115.995 198.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -43.9948 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -176.139] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 176.139 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 176.139] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -176.139] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 176.139 Td +/F130_0 9.9626 Tf +(Reading) 33.2053 Tj +-236 TJm +(is) 6.64505 Tj +-236 TJm +(more) 20.4731 Tj +-236 TJm +(comple) 29.3299 Tj +15 TJm +(x,) 7.47195 Tj +-238 TJm +(and) 14.386 Tj +-236 TJm +(the) 12.1743 Tj +-236 TJm +(f) 3.31755 Tj +10 TJm +(acilities) 30.9936 Tj +-236 TJm +(are) 12.1643 Tj +-236 TJm +(not) 12.7322 Tj +-235 TJm +(as) 8.29885 Tj +-236 TJm +(general) 29.3199 Tj +-236 TJm +(as) 8.29885 Tj +-236 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-236 TJm +(could) 22.1369 Tj +-236 TJm +(be) 9.40469 Tj +-236 TJm +(since) 20.4731 Tj +-235 TJm +(generality) 39.8404 Tj +-236 TJm +(is) 6.64505 Tj +-236 TJm +(hard) 17.7035 Tj +-236 TJm +(to) 7.7509 Tj +-236 TJm +(reconcile) 36.5129 Tj +86.944 164.183 Td +(with) 17.7135 Tj +-404 TJm +(ef) 7.74094 Tj +25 TJm +(\002cienc) 26.5603 Tj +15 TJm +(y) 4.9813 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 164.811 164.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.811 -164.183] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.811 164.183 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 224.587 164.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -224.587 -164.183] cm +[1 0 0 1 0 0] Tm +0 0 Td +228.614 164.183 Td +/F130_0 9.9626 Tf +(reads) 21.0211 Tj +-404 TJm +(from) 19.3673 Tj +-405 TJm +(the) 12.1743 Tj +-404 TJm +(compressed) 47.0334 Tj +-404 TJm +(\002le) 12.7322 Tj +-404 TJm +(in) 7.7509 Tj +-405 TJm +(blocks) 26.0123 Tj +-404 TJm +(of) 8.29885 Tj +-404 TJm +(size) 15.4918 Tj +[1 0 0 1 434.744 164.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -434.744 -164.183] cm +[1 0 0 1 0 0] Tm +0 0 Td +434.744 164.183 Td +/F134_0 9.9626 Tf +(BZ_MAX_UNUSED) 77.7083 Tj +[1 0 0 1 512.452 164.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -512.452 -164.183] cm +[1 0 0 1 0 0] Tm +0 0 Td +516.479 164.183 Td +/F130_0 9.9626 Tf +(bytes,) 23.5217 Tj +86.944 152.228 Td +(and) 14.386 Tj +-413 TJm +(in) 7.7509 Tj +-413 TJm +(doing) 22.6948 Tj +-413 TJm +(so) 8.85675 Tj +-413 TJm +(probably) 35.417 Tj +-413 TJm +(will) 15.5018 Tj +-413 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ershoot) 29.3299 Tj +-413 TJm +(the) 12.1743 Tj +-413 TJm +(logical) 27.1182 Tj +-413 TJm +(end) 14.386 Tj +-413 TJm +(of) 8.29885 Tj +-413 TJm +(compressed) 47.0334 Tj +-413 TJm +(stream.) 29.0509 Tj +-1598 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-413 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-413 TJm +(this) 14.396 Tj +-413 TJm +(data) 16.5977 Tj +-413 TJm +(once) 18.8094 Tj +86.944 140.273 Td +(decompression) 59.7656 Tj +-252 TJm +(has) 13.2801 Tj +-252 TJm +(ended,) 26.2813 Tj +-253 TJm +(call) 14.386 Tj +[1 0 0 1 210.705 140.273] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.705 -140.273] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.705 140.273 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 324.279 140.273] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -324.279 -140.273] cm +[1 0 0 1 0 0] Tm +0 0 Td +326.789 140.273 Td +/F130_0 9.9626 Tf +(after) 18.2515 Tj +-252 TJm +(the) 12.1743 Tj +-252 TJm +(last) 13.8381 Tj +-252 TJm +(call) 14.386 Tj +-252 TJm +(of) 8.29885 Tj +[1 0 0 1 406.291 140.273] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.291 -140.273] cm +[1 0 0 1 0 0] Tm +0 0 Td +406.291 140.273 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 466.067 140.273] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -466.067 -140.273] cm +[1 0 0 1 0 0] Tm +0 0 Td +468.578 140.273 Td +/F130_0 9.9626 Tf +(\(the) 15.4918 Tj +-252 TJm +(one) 14.386 Tj +-252 TJm +(returning) 36.5229 Tj +[1 0 0 1 86.944 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -128.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 128.318 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 164.653 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -128.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.653 128.318 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(before) 25.4445 Tj +-250 TJm +(calling) 27.1182 Tj +[1 0 0 1 243.028 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.028 -128.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.028 128.318 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 332.692 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -332.692 -128.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +332.692 128.318 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 335.182 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -263.182 -77.466] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8519] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(24) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 28 28 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-271 TJm +(mechanism) 45.3796 Tj +-272 TJm +(mak) 17.1556 Tj +10 TJm +(es) 8.29885 Tj +-271 TJm +(it) 5.53921 Tj +-271 TJm +(easy) 17.7035 Tj +-271 TJm +(to) 7.7509 Tj +-272 TJm +(decompress) 47.0334 Tj +-271 TJm +(multiple) 33.2153 Tj +[1 0 0 1 293.312 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.312 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +293.312 710.037 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 323.2 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -323.2 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +325.903 710.037 Td +/F130_0 9.9626 Tf +(streams) 30.4357 Tj +-271 TJm +(placed) 26.0024 Tj +-272 TJm +(end-to-end.) 45.6486 Tj +-374 TJm +(As) 11.0684 Tj +-271 TJm +(the) 12.1743 Tj +-271 TJm +(end) 14.386 Tj +-271 TJm +(of) 8.29885 Tj +-272 TJm +(one) 14.386 Tj +-271 TJm +(stream,) 29.0509 Tj +72 698.082 Td +(when) 21.579 Tj +[1 0 0 1 96.1948 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -96.1948 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +96.1948 698.082 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 155.971 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.971 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.586 698.082 Td +/F130_0 9.9626 Tf +(returns) 27.6661 Tj +[1 0 0 1 188.868 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -188.868 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.868 698.082 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 266.577 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -266.577 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +266.577 698.082 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-263 TJm +(call) 14.386 Tj +[1 0 0 1 288.685 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -288.685 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +288.685 698.082 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 402.259 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -402.259 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +404.875 698.082 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-263 TJm +(collect) 26.5603 Tj +-262 TJm +(the) 12.1743 Tj +-263 TJm +(unused) 28.224 Tj +-262 TJm +(data) 16.5977 Tj +-263 TJm +(\(cop) 17.7035 Tj +10 TJm +(y) 4.9813 Tj +-262 TJm +(it) 5.53921 Tj +72 686.127 Td +(into) 15.5018 Tj +-265 TJm +(your) 18.2614 Tj +-265 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +-265 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-265 TJm +(some) 21.031 Tj +25 TJm +(where\).) 30.1468 Tj +-711 TJm +(That) 18.2614 Tj +-265 TJm +(data) 16.5977 Tj +-265 TJm +(forms) 23.2427 Tj +-265 TJm +(the) 12.1743 Tj +-265 TJm +(start) 17.1556 Tj +-265 TJm +(of) 8.29885 Tj +-265 TJm +(the) 12.1743 Tj +-265 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-265 TJm +(compressed) 47.0334 Tj +-265 TJm +(stream.) 29.0509 Tj +-711 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-265 TJm +(start) 17.1556 Tj +-265 TJm +(uncompressing) 60.3235 Tj +72 674.172 Td +(that) 14.9439 Tj +-246 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-246 TJm +(stream,) 29.0509 Tj +-247 TJm +(call) 14.386 Tj +[1 0 0 1 157.205 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -157.205 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +157.205 674.172 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 240.891 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.891 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.344 674.172 Td +/F130_0 9.9626 Tf +(ag) 9.40469 Tj +5 TJm +(ain,) 14.6649 Tj +-247 TJm +(feeding) 29.8778 Tj +-246 TJm +(in) 7.7509 Tj +-246 TJm +(the) 12.1743 Tj +-247 TJm +(unused) 28.224 Tj +-246 TJm +(data) 16.5977 Tj +-246 TJm +(via) 12.1743 Tj +-246 TJm +(the) 12.1743 Tj +[1 0 0 1 405.967 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -405.967 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.967 674.172 Td +/F134_0 9.9626 Tf +(unused) 35.8654 Tj +[1 0 0 1 441.833 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.833 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +444.286 674.172 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 449.508 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -449.508 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +449.508 674.172 Td +/F134_0 9.9626 Tf +(nUnused) 41.8429 Tj +[1 0 0 1 491.351 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -491.351 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.804 674.172 Td +/F130_0 9.9626 Tf +(parameters.) 46.1966 Tj +72 662.217 Td +(K) 7.193 Tj +25 TJm +(eep) 13.8281 Tj +-263 TJm +(doing) 22.6948 Tj +-263 TJm +(this) 14.396 Tj +-264 TJm +(until) 18.2714 Tj +[1 0 0 1 158.622 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.622 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.622 662.217 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 236.33 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -236.33 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +238.952 662.217 Td +/F130_0 9.9626 Tf +(return) 23.7907 Tj +-263 TJm +(coincides) 37.6287 Tj +-263 TJm +(with) 17.7135 Tj +-263 TJm +(the) 12.1743 Tj +-264 TJm +(ph) 9.9626 Tj +5 TJm +(ysical) 23.2427 Tj +-263 TJm +(end) 14.386 Tj +-263 TJm +(of) 8.29885 Tj +-263 TJm +(\002le) 12.7322 Tj +-263 TJm +(\() 3.31755 Tj +[1 0 0 1 423.125 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -423.125 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +423.125 662.217 Td +/F134_0 9.9626 Tf +(feof\(f\)) 41.8429 Tj +[1 0 0 1 464.968 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -464.968 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +464.968 662.217 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +-699 TJm +(In) 8.29885 Tj +-263 TJm +(this) 14.396 Tj +-263 TJm +(situation) 34.3212 Tj +[1 0 0 1 72 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 650.261 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 185.574 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -185.574 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.065 650.261 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(course) 26.0024 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(data.) 19.0883 Tj +[1 0 0 1 72 648.951] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -638.989] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 628.344 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-240 TJm +(should) 26.5703 Tj +-241 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-240 TJm +(some) 21.031 Tj +-241 TJm +(feel) 14.9339 Tj +-240 TJm +(for) 11.6164 Tj +-241 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-240 TJm +(the) 12.1743 Tj +-240 TJm +(high-le) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-241 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-240 TJm +(can) 13.8281 Tj +-241 TJm +(be) 9.40469 Tj +-240 TJm +(used.) 20.7521 Tj +-614 TJm +(If) 6.63509 Tj +-240 TJm +(you) 14.9439 Tj +-241 TJm +(require) 28.2141 Tj +-240 TJm +(e) 4.42339 Tj +15 TJm +(xtra) 15.4918 Tj +-241 TJm +(\003e) 9.9626 Tj +15 TJm +(xibi) 15.5018 Tj +1 TJm +(lity) 13.2901 Tj +65 TJm +(,) 2.49065 Tj +-243 TJm +(you') 18.2614 Tj +10 TJm +(ll) 5.53921 Tj +-240 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-241 TJm +(to) 7.7509 Tj +72 616.389 Td +(bite) 14.9439 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ullet) 17.7135 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(get) 12.1743 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(grips) 19.9252 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +[1 0 0 1 72 614.232] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -604.269] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 585.767 Td +/F122_0 17.2154 Tf +(3.4.9.) 43.0729 Tj +-278 TJm +(Standar) 64.0929 Tj +20 TJm +(d) 10.5186 Tj +-278 TJm +(\002le-reading/writing) 154.009 Tj +-278 TJm +(code) 40.1807 Tj +[1 0 0 1 72 581.937] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -571.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 563.85 Td +/F130_0 9.9626 Tf +(Here') 22.6749 Tj +55 TJm +(s) 3.87545 Tj +-250 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(you') 18.2614 Tj +50 TJm +(d) 4.9813 Tj +-250 TJm +(write) 20.4731 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le:) 15.5018 Tj +[1 0 0 1 72 561.693] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -371.606] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 370.61 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 367.024] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -552.328] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 552.328 Td +/F134_0 9.9626 Tf +(FILE) 23.9102 Tj +113.91 550.584 Td +(*) 5.97756 Tj +132.62 552.328 Td +(f;) 11.9551 Tj +90 540.373 Td +(BZFILE) 35.8654 Tj +125.865 538.629 Td +(*) 5.97756 Tj +136.087 540.373 Td +(b;) 11.9551 Tj +90 528.418 Td +(int) 17.9327 Tj +-2130 TJm +(nBuf;) 29.8878 Tj +90 516.462 Td +(char) 23.9102 Tj +-1704 TJm +(buf[) 23.9102 Tj +-426 TJm +(/) 5.97756 Tj +165.018 514.719 Td +(*) 5.97756 Tj +175.24 516.462 Td +(whatever) 47.8205 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(you) 17.9327 Tj +-426 TJm +(like) 23.9102 Tj +305.79 514.719 Td +(*) 5.97756 Tj +311.767 516.462 Td +(/) 5.97756 Tj +-426 TJm +(];) 11.9551 Tj +90 504.507 Td +(int) 17.9327 Tj +-2130 TJm +(bzerror;) 47.8205 Tj +90 492.552 Td +(int) 17.9327 Tj +-2130 TJm +(nWritten;) 53.798 Tj +90 468.642 Td +(f) 5.97756 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(fopen) 29.8878 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +("myfile.bz2",) 77.7083 Tj +-426 TJm +("w") 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +90 456.687 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(!f) 11.9551 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +94.244 444.731 Td +(/) 5.97756 Tj +100.222 442.988 Td +(*) 5.97756 Tj +110.443 444.731 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +184.685 442.988 Td +(*) 5.97756 Tj +190.662 444.731 Td +(/) 5.97756 Tj +90 432.776 Td +(}) 5.97756 Tj +90 420.821 Td +(b) 5.97756 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ2_bzWriteOpen\() 95.641 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(f,) 11.9551 Tj +-426 TJm +(9) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 408.866 Td +(if) 11.9551 Tj +-426 TJm +(\(bzerror) 47.8205 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(BZ_OK\)) 35.8654 Tj +-426 TJm +({) 5.97756 Tj +94.244 396.911 Td +(BZ2_bzWriteClose) 95.641 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +94.244 384.956 Td +(/) 5.97756 Tj +100.222 383.212 Td +(*) 5.97756 Tj +110.443 384.956 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +184.685 383.212 Td +(*) 5.97756 Tj +190.662 384.956 Td +(/) 5.97756 Tj +90 373 Td +(}) 5.97756 Tj +90 349.09 Td +(while) 29.8878 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(/) 5.97756 Tj +140.331 347.347 Td +(*) 5.97756 Tj +150.553 349.09 Td +(condition) 53.798 Tj +208.595 347.347 Td +(*) 5.97756 Tj +214.572 349.09 Td +(/) 5.97756 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +94.244 337.135 Td +(/) 5.97756 Tj +100.222 335.391 Td +(*) 5.97756 Tj +110.443 337.135 Td +(get) 17.9327 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(write) 29.8878 Tj +-426 TJm +(into) 23.9102 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(set) 17.9327 Tj +-426 TJm +(nBuf) 23.9102 Tj +-426 TJm +(appropriately) 77.7083 Tj +421.874 335.391 Td +(*) 5.97756 Tj +427.852 337.135 Td +(/) 5.97756 Tj +94.2439 325.18 Td +(nWritten) 47.8205 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ2_bzWrite) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b,) 11.9551 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(nBuf) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +94.2439 313.225 Td +(if) 11.9551 Tj +-426 TJm +(\(bzerror) 47.8205 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(BZ_IO_ERROR\)) 71.7307 Tj +-426 TJm +({) 5.97756 Tj +102.732 301.269 Td +(BZ2_bzWriteClose) 95.641 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +102.732 289.314 Td +(/) 5.97756 Tj +108.709 287.571 Td +(*) 5.97756 Tj +118.931 289.314 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +193.172 287.571 Td +(*) 5.97756 Tj +199.15 289.314 Td +(/) 5.97756 Tj +94.2439 277.359 Td +(}) 5.97756 Tj +90 265.404 Td +(}) 5.97756 Tj +90 241.494 Td +(BZ2_bzWriteClose\() 101.619 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 229.538 Td +(if) 11.9551 Tj +-426 TJm +(\(bzerror) 47.8205 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(BZ_IO_ERROR\)) 71.7307 Tj +-426 TJm +({) 5.97756 Tj +94.2439 217.583 Td +(/) 5.97756 Tj +100.221 215.84 Td +(*) 5.97756 Tj +110.443 217.583 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +184.684 215.84 Td +(*) 5.97756 Tj +190.662 217.583 Td +(/) 5.97756 Tj +89.9999 205.628 Td +(}) 5.97756 Tj +[1 0 0 1 72 190.086] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -180.124] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 168.168 Td +/F130_0 9.9626 Tf +(And) 17.1556 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(read) 17.1456 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le:) 15.5018 Tj +[1 0 0 1 72 166.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -115.16] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9513] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9513 Td +/F130_0 9.9626 Tf +(25) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 29 29 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -392.164] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 370.61 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 367.024] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(FILE) 23.9102 Tj +113.91 709.888 Td +(*) 5.97756 Tj +132.62 711.631 Td +(f;) 11.9551 Tj +90 699.676 Td +(BZFILE) 35.8654 Tj +125.865 697.933 Td +(*) 5.97756 Tj +136.087 699.676 Td +(b;) 11.9551 Tj +90 687.721 Td +(int) 17.9327 Tj +-2130 TJm +(nBuf;) 29.8878 Tj +90 675.766 Td +(char) 23.9102 Tj +-1704 TJm +(buf[) 23.9102 Tj +-426 TJm +(/) 5.97756 Tj +165.018 674.023 Td +(*) 5.97756 Tj +175.24 675.766 Td +(whatever) 47.8205 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(you) 17.9327 Tj +-426 TJm +(like) 23.9102 Tj +305.79 674.023 Td +(*) 5.97756 Tj +311.767 675.766 Td +(/) 5.97756 Tj +-426 TJm +(];) 11.9551 Tj +90 663.811 Td +(int) 17.9327 Tj +-2130 TJm +(bzerror;) 47.8205 Tj +90 651.856 Td +(int) 17.9327 Tj +-2130 TJm +(nWritten;) 53.798 Tj +90 627.945 Td +(f) 5.97756 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(fopen) 29.8878 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +("myfile.bz2",) 77.7083 Tj +-426 TJm +("r") 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +90 615.99 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(!f) 11.9551 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +98.488 604.035 Td +(/) 5.97756 Tj +104.466 602.292 Td +(*) 5.97756 Tj +114.687 604.035 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +188.929 602.292 Td +(*) 5.97756 Tj +194.906 604.035 Td +(/) 5.97756 Tj +90 592.08 Td +(}) 5.97756 Tj +90 580.125 Td +(b) 5.97756 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ2_bzReadOpen) 83.6858 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(f,) 11.9551 Tj +-426 TJm +(0,) 11.9551 Tj +-426 TJm +(NULL,) 29.8878 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 568.169 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +98.488 556.214 Td +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +98.488 544.259 Td +(/) 5.97756 Tj +104.466 542.516 Td +(*) 5.97756 Tj +114.687 544.259 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +188.929 542.516 Td +(*) 5.97756 Tj +194.906 544.259 Td +(/) 5.97756 Tj +90 532.304 Td +(}) 5.97756 Tj +90 508.394 Td +(bzerror) 41.8429 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_OK;) 35.8654 Tj +90 496.438 Td +(while) 29.8878 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(/) 5.97756 Tj +252.948 494.695 Td +(*) 5.97756 Tj +263.17 496.438 Td +(arbitrary) 53.798 Tj +-426 TJm +(other) 29.8878 Tj +-426 TJm +(conditions) 59.7756 Tj +419.364 494.695 Td +(*) 5.97756 Tj +425.341 496.438 Td +(/\)) 11.9551 Tj +-426 TJm +({) 5.97756 Tj +98.488 484.483 Td +(nBuf) 23.9102 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ2_bzRead) 59.7756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b,) 11.9551 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(/) 5.97756 Tj +319.478 482.74 Td +(*) 5.97756 Tj +329.7 484.483 Td +(size) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(buf) 17.9327 Tj +396.23 482.74 Td +(*) 5.97756 Tj +402.208 484.483 Td +(/) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +98.488 472.528 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +106.976 460.573 Td +(/) 5.97756 Tj +112.953 458.829 Td +(*) 5.97756 Tj +123.175 460.573 Td +(do) 11.9551 Tj +-426 TJm +(something) 53.798 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(buf[0) 29.8878 Tj +-426 TJm +(..) 11.9551 Tj +-426 TJm +(nBuf-1]) 41.8429 Tj +321.989 458.829 Td +(*) 5.97756 Tj +327.966 460.573 Td +(/) 5.97756 Tj +98.4879 448.618 Td +(}) 5.97756 Tj +90 436.663 Td +(}) 5.97756 Tj +90 424.707 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(BZ_STREAM_END) 77.7083 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +102.732 412.752 Td +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +102.732 400.797 Td +(/) 5.97756 Tj +108.709 399.054 Td +(*) 5.97756 Tj +118.931 400.797 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +193.172 399.054 Td +(*) 5.97756 Tj +199.15 400.797 Td +(/) 5.97756 Tj +90 388.842 Td +(}) 5.97756 Tj +-426 TJm +(else) 23.9102 Tj +-426 TJm +({) 5.97756 Tj +102.732 376.887 Td +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 364.932 Td +(}) 5.97756 Tj +[1 0 0 1 72 349.39] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -339.427] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 314.637 Td +/F122_0 20.6585 Tf +(3.5.) 34.4584 Tj +-278 TJm +(Utility) 57.3893 Tj +-278 TJm +(functions) 92.9633 Tj +[1 0 0 1 72 310.361] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -300.398] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 284.016 Td +/F122_0 17.2154 Tf +(3.5.1.) 43.0729 Tj +[1 0 0 1 119.858 284.016] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -284.016] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 284.016 Td +/F392_0 17.2154 Tf +(BZ2_bzBuffToBuffCompress) 247.902 Tj +[1 0 0 1 367.76 284.016] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -295.76 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -96.6376] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 95.6413 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 92.0548] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -272.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 272.318 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzBuffToBuffCompress\() 149.439 Tj +-426 TJm +(char) 23.9102 Tj +289.771 270.575 Td +(*) 5.97756 Tj +333.944 272.318 Td +(dest,) 29.8878 Tj +217.319 260.363 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +287.317 258.62 Td +(*) 5.97756 Tj +297.538 260.363 Td +(destLen,) 47.8205 Tj +217.319 248.408 Td +(char) 23.9102 Tj +241.23 246.664 Td +(*) 5.97756 Tj +285.403 248.408 Td +(source,) 41.8429 Tj +217.319 236.453 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-852 TJm +(sourceLen,) 59.7756 Tj +217.319 224.498 Td +(int) 17.9327 Tj +-4686 TJm +(blockSize100k,) 83.6858 Tj +217.319 212.542 Td +(int) 17.9327 Tj +-4686 TJm +(verbosity,) 59.7756 Tj +217.319 200.587 Td +(int) 17.9327 Tj +-4686 TJm +(workFactor) 59.7756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 185.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -175.083] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 163.128 Td +/F130_0 9.9626 Tf +(Attempts) 36.5329 Tj +-442 TJm +(to) 7.7509 Tj +-442 TJm +(compress) 37.6287 Tj +-443 TJm +(the) 12.1743 Tj +-442 TJm +(data) 16.5977 Tj +-442 TJm +(in) 7.7509 Tj +[1 0 0 1 216.87 163.128] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.87 -163.128] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.87 163.128 Td +/F134_0 9.9626 Tf +(source[0) 47.8205 Tj +-600 TJm +(..) 11.9551 Tj +-1200 TJm +(sourceLen-1]) 71.7307 Tj +[1 0 0 1 366.31 163.128] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -366.31 -163.128] cm +[1 0 0 1 0 0] Tm +0 0 Td +370.715 163.128 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-442 TJm +(the) 12.1743 Tj +-442 TJm +(destination) 43.7259 Tj +-443 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +40 TJm +(,) 2.49065 Tj +[1 0 0 1 486.202 163.128] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -486.202 -163.128] cm +[1 0 0 1 0 0] Tm +0 0 Td +486.202 163.128 Td +/F134_0 9.9626 Tf +(dest[0) 35.8654 Tj +-600 TJm +(..) 11.9551 Tj +72 149.429 Td +(*) 5.97756 Tj +77.9776 151.173 Td +(destLen-1]) 59.7756 Tj +[1 0 0 1 137.753 151.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -151.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.753 151.172 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1393 TJm +(If) 6.63509 Tj +-379 TJm +(the) 12.1743 Tj +-379 TJm +(destination) 43.7259 Tj +-379 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-378 TJm +(is) 6.64505 Tj +-379 TJm +(big) 12.7322 Tj +-379 TJm +(enough,) 31.8205 Tj +[1 0 0 1 318.486 151.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -318.486 -151.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +318.486 149.429 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +324.464 151.173 Td +(destLen) 41.8429 Tj +[1 0 0 1 366.307 151.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -366.307 -151.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +370.081 151.172 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-379 TJm +(set) 11.0684 Tj +-379 TJm +(to) 7.7509 Tj +-378 TJm +(the) 12.1743 Tj +-379 TJm +(size) 15.4918 Tj +-379 TJm +(of) 8.29885 Tj +-379 TJm +(the) 12.1743 Tj +-379 TJm +(compressed) 47.0334 Tj +-379 TJm +(data,) 19.0883 Tj +72 139.217 Td +(and) 14.386 Tj +[1 0 0 1 89.5273 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -89.5273 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +89.5273 139.217 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 119.415 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.415 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.556 139.217 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-315 TJm +(returned.) 35.686 Tj +-1012 TJm +(If) 6.63509 Tj +-315 TJm +(the) 12.1743 Tj +-316 TJm +(compressed) 47.0334 Tj +-315 TJm +(data) 16.5977 Tj +-315 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-316 TJm +(\002t,) 10.7995 Tj +[1 0 0 1 313.322 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -313.322 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +313.322 137.474 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +319.3 139.217 Td +(destLen) 41.8429 Tj +[1 0 0 1 361.143 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -361.143 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +364.284 139.217 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-315 TJm +(unchanged,) 45.6486 Tj +-332 TJm +(and) 14.386 Tj +[1 0 0 1 440.551 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -440.551 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +440.551 139.217 Td +/F134_0 9.9626 Tf +(BZ_OUTBUFF_FULL) 89.6634 Tj +[1 0 0 1 530.215 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -530.215 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.355 139.217 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +72 127.262 Td +(returned.) 35.686 Tj +[1 0 0 1 72 127.163] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -117.2] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 105.344 Td +/F130_0 9.9626 Tf +(Compression) 52.5826 Tj +-297 TJm +(in) 7.7509 Tj +-297 TJm +(this) 14.396 Tj +-297 TJm +(manner) 29.8778 Tj +-297 TJm +(is) 6.64505 Tj +-297 TJm +(a) 4.42339 Tj +-297 TJm +(one-shot) 34.3112 Tj +-297 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ent,) 14.6649 Tj +-309 TJm +(done) 19.3673 Tj +-297 TJm +(with) 17.7135 Tj +-297 TJm +(a) 4.42339 Tj +-297 TJm +(single) 23.8007 Tj +-297 TJm +(call) 14.386 Tj +-297 TJm +(to) 7.7509 Tj +-297 TJm +(this) 14.396 Tj +-297 TJm +(function.) 35.696 Tj +-903 TJm +(The) 15.4918 Tj +-297 TJm +(resulting) 34.8691 Tj +-297 TJm +(compressed) 47.0334 Tj +72 93.3892 Td +(data) 16.5977 Tj +-296 TJm +(is) 6.64505 Tj +-296 TJm +(a) 4.42339 Tj +-296 TJm +(complete) 36.5229 Tj +[1 0 0 1 147.988 93.3892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.988 -93.3892] cm +[1 0 0 1 0 0] Tm +0 0 Td +147.988 93.3892 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 177.875 93.3892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.875 -93.3892] cm +[1 0 0 1 0 0] Tm +0 0 Td +180.825 93.3892 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-296 TJm +(data) 16.5977 Tj +-296 TJm +(stream.) 29.0509 Tj +-897 TJm +(There) 23.2328 Tj +-296 TJm +(is) 6.64505 Tj +-296 TJm +(no) 9.9626 Tj +-296 TJm +(mechanism) 45.3796 Tj +-296 TJm +(for) 11.6164 Tj +-296 TJm +(making) 29.8878 Tj +-296 TJm +(additional) 39.8504 Tj +-296 TJm +(calls) 18.2614 Tj +-296 TJm +(to) 7.7509 Tj +-296 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-296 TJm +(e) 4.42339 Tj +15 TJm +(xtra) 15.4918 Tj +72 81.434 Td +(input) 20.4831 Tj +-250 TJm +(data.) 19.0883 Tj +-620 TJm +(If) 6.63509 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(kind) 17.7135 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(mechanism,) 47.8703 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +[1 0 0 1 72 79.2772] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -28.4254] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 30 30 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-223 TJm +(the) 12.1743 Tj +-224 TJm +(meaning) 34.3112 Tj +-223 TJm +(of) 8.29885 Tj +-224 TJm +(parameters) 43.7059 Tj +[1 0 0 1 195.306 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -195.306 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +195.306 710.037 Td +/F134_0 9.9626 Tf +(blockSize100k) 77.7083 Tj +[1 0 0 1 273.015 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -273.015 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +273.015 710.037 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 277.784 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.784 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +277.784 710.037 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 331.583 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.583 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +333.808 710.037 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 350.42 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -350.42 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +350.42 710.037 Td +/F134_0 9.9626 Tf +(workFactor) 59.7756 Tj +[1 0 0 1 410.196 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.196 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +410.196 710.037 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-229 TJm +(see) 12.7222 Tj +[1 0 0 1 429.913 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -429.913 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +429.913 710.037 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 537.509 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 710.037 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -697.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 688.12 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-410 TJm +(guarantee) 38.7246 Tj +-410 TJm +(that) 14.9439 Tj +-410 TJm +(the) 12.1743 Tj +-410 TJm +(compressed) 47.0334 Tj +-410 TJm +(data) 16.5977 Tj +-410 TJm +(will) 15.5018 Tj +-410 TJm +(\002t) 8.30881 Tj +-410 TJm +(in) 7.7509 Tj +-410 TJm +(its) 9.41466 Tj +-410 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +40 TJm +(,) 2.49065 Tj +-450 TJm +(allocate) 30.9837 Tj +-410 TJm +(an) 9.40469 Tj +-410 TJm +(output) 25.4644 Tj +-410 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-411 TJm +(of) 8.29885 Tj +-410 TJm +(size) 15.4918 Tj +-410 TJm +(1%) 13.2801 Tj +-410 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-410 TJm +(than) 17.1556 Tj +-410 TJm +(the) 12.1743 Tj +72 676.164 Td +(uncompressed) 56.996 Tj +-250 TJm +(data,) 19.0883 Tj +-250 TJm +(plus) 16.6077 Tj +-250 TJm +(six) 11.6264 Tj +-250 TJm +(hundred) 32.6474 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xtra) 15.4918 Tj +-250 TJm +(bytes.) 23.5217 Tj +[1 0 0 1 72 674.007] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -664.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 654.247 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 227.417 654.247] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -227.417 -654.247] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.553 654.247 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-315 TJm +(not) 12.7322 Tj +-315 TJm +(write) 20.4731 Tj +-314 TJm +(data) 16.5977 Tj +-315 TJm +(at) 7.193 Tj +-315 TJm +(or) 8.29885 Tj +-315 TJm +(be) 9.40469 Tj +15 TJm +(yond) 19.9252 Tj +[1 0 0 1 362.484 654.247] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -362.484 -654.247] cm +[1 0 0 1 0 0] Tm +0 0 Td +362.484 654.247 Td +/F134_0 9.9626 Tf +(dest[) 29.8878 Tj +392.372 652.503 Td +(*) 5.97756 Tj +398.349 654.247 Td +(destLen]) 47.8205 Tj +[1 0 0 1 446.17 654.247] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -446.17 -654.247] cm +[1 0 0 1 0 0] Tm +0 0 Td +446.17 654.247 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-331 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-315 TJm +(in) 7.7509 Tj +-315 TJm +(case) 17.1456 Tj +-314 TJm +(of) 8.29885 Tj +-315 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +72 642.291 Td +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er\003o) 18.2614 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 642.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -632.229] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 620.374 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 620.274] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -168.369] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 167.372 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 163.786] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -610.909] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 610.909 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 598.954 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 586.999 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 575.044 Td +(if) 11.9551 Tj +-426 TJm +(dest) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(destLen) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 563.088 Td +(or) 11.9551 Tj +-426 TJm +(blockSize100k) 77.7083 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(1) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(blockSize100k) 77.7083 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(9) 5.97756 Tj +98.4879 551.133 Td +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(4) 5.97756 Tj +98.4879 539.178 Td +(or) 11.9551 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(250) 17.9327 Tj +90 527.223 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 515.268 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 503.313 Td +(BZ_OUTBUFF_FULL) 89.6634 Tj +98.4879 491.357 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(exceeds) 41.8429 Tj +341.655 489.614 Td +(*) 5.97756 Tj +347.633 491.357 Td +(destLen) 41.8429 Tj +90 479.402 Td +(BZ_OK) 29.8878 Tj +98.4879 467.447 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 451.905] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -441.943] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 421.284 Td +/F122_0 17.2154 Tf +(3.5.2.) 43.0729 Tj +[1 0 0 1 119.858 421.284] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -421.284] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 421.284 Td +/F392_0 17.2154 Tf +(BZ2_bzBuffToBuffDecompress) 268.56 Tj +[1 0 0 1 388.419 421.284] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.419 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -84.6824] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 83.6862 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 80.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -409.587] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 409.587 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzBuffToBuffDecompress\() 161.394 Tj +-426 TJm +(char) 23.9102 Tj +301.726 407.843 Td +(*) 5.97756 Tj +345.899 409.587 Td +(dest,) 29.8878 Tj +225.807 397.632 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +295.805 395.888 Td +(*) 5.97756 Tj +306.026 397.632 Td +(destLen,) 47.8205 Tj +225.807 385.676 Td +(char) 23.9102 Tj +249.718 383.933 Td +(*) 5.97756 Tj +293.891 385.676 Td +(source,) 41.8429 Tj +225.807 373.721 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-852 TJm +(sourceLen,) 59.7756 Tj +225.807 361.766 Td +(int) 17.9327 Tj +-4686 TJm +(small,) 35.8654 Tj +225.807 349.811 Td +(int) 17.9327 Tj +-4686 TJm +(verbosity) 53.798 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 334.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -324.306] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 312.351 Td +/F130_0 9.9626 Tf +(Attempts) 36.5329 Tj +-358 TJm +(to) 7.7509 Tj +-359 TJm +(decompress) 47.0334 Tj +-358 TJm +(the) 12.1743 Tj +-358 TJm +(data) 16.5977 Tj +-359 TJm +(in) 7.7509 Tj +[1 0 0 1 221.259 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -221.259 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.259 312.351 Td +/F134_0 9.9626 Tf +(source[0) 47.8205 Tj +-600 TJm +(..) 11.9551 Tj +-1200 TJm +(sourceLen-1]) 71.7307 Tj +[1 0 0 1 370.698 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -370.698 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +374.268 312.351 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-358 TJm +(the) 12.1743 Tj +-359 TJm +(destination) 43.7259 Tj +-358 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +40 TJm +(,) 2.49065 Tj +[1 0 0 1 486.202 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -486.202 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +486.202 312.351 Td +/F134_0 9.9626 Tf +(dest[0) 35.8654 Tj +-600 TJm +(..) 11.9551 Tj +72 298.653 Td +(*) 5.97756 Tj +77.9776 300.396 Td +(destLen-1]) 59.7756 Tj +[1 0 0 1 137.753 300.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -300.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.753 300.396 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1123 TJm +(If) 6.63509 Tj +-334 TJm +(the) 12.1743 Tj +-334 TJm +(destination) 43.7259 Tj +-334 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-334 TJm +(is) 6.64505 Tj +-334 TJm +(big) 12.7322 Tj +-334 TJm +(enough,) 31.8205 Tj +[1 0 0 1 312.554 300.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -312.554 -300.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +312.554 298.653 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +318.531 300.396 Td +(destLen) 41.8429 Tj +[1 0 0 1 360.374 300.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.374 -300.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.701 300.396 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-334 TJm +(set) 11.0684 Tj +-334 TJm +(to) 7.7509 Tj +-334 TJm +(the) 12.1743 Tj +-334 TJm +(size) 15.4918 Tj +-333 TJm +(of) 8.29885 Tj +-334 TJm +(the) 12.1743 Tj +-334 TJm +(uncompressed) 56.996 Tj +-334 TJm +(data,) 19.0883 Tj +72 288.441 Td +(and) 14.386 Tj +[1 0 0 1 89.5273 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -89.5273 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +89.5273 288.441 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 119.415 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.415 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.556 288.441 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-315 TJm +(returned.) 35.686 Tj +-1012 TJm +(If) 6.63509 Tj +-315 TJm +(the) 12.1743 Tj +-316 TJm +(compressed) 47.0334 Tj +-315 TJm +(data) 16.5977 Tj +-315 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-316 TJm +(\002t,) 10.7995 Tj +[1 0 0 1 313.322 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -313.322 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +313.322 286.698 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +319.3 288.441 Td +(destLen) 41.8429 Tj +[1 0 0 1 361.143 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -361.143 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +364.284 288.441 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-315 TJm +(unchanged,) 45.6486 Tj +-332 TJm +(and) 14.386 Tj +[1 0 0 1 440.551 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -440.551 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +440.551 288.441 Td +/F134_0 9.9626 Tf +(BZ_OUTBUFF_FULL) 89.6634 Tj +[1 0 0 1 530.215 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -530.215 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.355 288.441 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +72 276.486 Td +(returned.) 35.686 Tj +[1 0 0 1 72 276.386] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -266.424] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 254.568 Td +/F134_0 9.9626 Tf +(source) 35.8654 Tj +[1 0 0 1 107.865 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -107.865 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +110.981 254.568 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-313 TJm +(assumed) 34.3112 Tj +-312 TJm +(to) 7.7509 Tj +-313 TJm +(hold) 17.7135 Tj +-313 TJm +(a) 4.42339 Tj +-313 TJm +(complete) 36.5229 Tj +[1 0 0 1 237.04 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -237.04 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +237.04 254.568 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 266.928 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -266.928 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +270.044 254.568 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-313 TJm +(data) 16.5977 Tj +-312 TJm +(stream.) 29.0509 Tj +[1 0 0 1 353.446 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -353.446 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +353.446 254.568 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 508.863 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -508.863 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.978 254.568 Td +/F130_0 9.9626 Tf +(tries) 17.1556 Tj +-313 TJm +(to) 7.7509 Tj +72 242.613 Td +(decompress) 47.0334 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(entirety) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(stream) 26.5603 Tj +-250 TJm +(into) 15.5018 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 240.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -230.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 220.695 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(meaning) 34.3112 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(parameters) 43.7059 Tj +[1 0 0 1 196.631 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.631 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.631 220.695 Td +/F134_0 9.9626 Tf +(small) 29.8878 Tj +[1 0 0 1 226.519 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.519 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.01 220.695 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 245.887 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.887 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.887 220.695 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 299.685 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -299.685 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.685 220.695 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(see) 12.7222 Tj +[1 0 0 1 319.879 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -319.879 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +319.879 220.695 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 439.431 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -439.431 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +439.431 220.695 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 218.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -208.576] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 198.777 Td +/F130_0 9.9626 Tf +(Because) 33.1954 Tj +-250 TJm +(the) 12.1743 Tj +-249 TJm +(compression) 50.3609 Tj +-250 TJm +(ratio) 18.2614 Tj +-249 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-249 TJm +(compressed) 47.0334 Tj +-250 TJm +(data) 16.5977 Tj +-249 TJm +(cannot) 26.5603 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(kno) 14.9439 Tj +25 TJm +(wn) 12.1743 Tj +-249 TJm +(in) 7.7509 Tj +-250 TJm +(adv) 14.386 Tj +25 TJm +(ance,) 20.7421 Tj +-249 TJm +(there) 19.9152 Tj +-250 TJm +(is) 6.64505 Tj +-249 TJm +(no) 9.9626 Tj +-250 TJm +(easy) 17.7035 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-249 TJm +(to) 7.7509 Tj +-250 TJm +(guarantee) 38.7246 Tj +72 186.822 Td +(that) 14.9439 Tj +-286 TJm +(the) 12.1743 Tj +-287 TJm +(output) 25.4644 Tj +-286 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-287 TJm +(will) 15.5018 Tj +-286 TJm +(be) 9.40469 Tj +-286 TJm +(big) 12.7322 Tj +-287 TJm +(enough.) 31.8205 Tj +-838 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-287 TJm +(may) 17.1556 Tj +-286 TJm +(of) 8.29885 Tj +-287 TJm +(course) 26.0024 Tj +-286 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-286 TJm +(arrangements) 53.6685 Tj +-287 TJm +(in) 7.7509 Tj +-286 TJm +(your) 18.2614 Tj +-287 TJm +(code) 18.8094 Tj +-286 TJm +(to) 7.7509 Tj +-286 TJm +(record) 25.4445 Tj +-287 TJm +(the) 12.1743 Tj +-286 TJm +(size) 15.4918 Tj +-287 TJm +(of) 8.29885 Tj +72 174.867 Td +(the) 12.1743 Tj +-250 TJm +(uncompressed) 56.996 Tj +-250 TJm +(data,) 19.0883 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(mechanism) 45.3796 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(be) 9.40469 Tj +15 TJm +(yond) 19.9252 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(scope) 22.6848 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 172.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -162.747] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 152.949 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 227.417 152.949] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -227.417 -152.949] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.553 152.949 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-315 TJm +(not) 12.7322 Tj +-315 TJm +(write) 20.4731 Tj +-314 TJm +(data) 16.5977 Tj +-315 TJm +(at) 7.193 Tj +-315 TJm +(or) 8.29885 Tj +-315 TJm +(be) 9.40469 Tj +15 TJm +(yond) 19.9252 Tj +[1 0 0 1 362.484 152.949] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -362.484 -152.949] cm +[1 0 0 1 0 0] Tm +0 0 Td +362.484 152.949 Td +/F134_0 9.9626 Tf +(dest[) 29.8878 Tj +392.372 151.206 Td +(*) 5.97756 Tj +398.349 152.949 Td +(destLen]) 47.8205 Tj +[1 0 0 1 446.17 152.949] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -446.17 -152.949] cm +[1 0 0 1 0 0] Tm +0 0 Td +446.17 152.949 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-331 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-315 TJm +(in) 7.7509 Tj +-315 TJm +(case) 17.1456 Tj +-314 TJm +(of) 8.29885 Tj +-315 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +72 140.994 Td +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er\003o) 18.2614 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 140.894] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -130.932] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 119.076 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 118.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -68.1248] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(27) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 31 31 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -344.462 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +420.96 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 498.449 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -498.449 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.449 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 546.269 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0365 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -248.702] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 227.148 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 223.562] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 687.721 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 675.766 Td +(if) 11.9551 Tj +-426 TJm +(dest) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(destLen) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 663.811 Td +(or) 11.9551 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(1) 5.97756 Tj +98.4879 651.856 Td +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(4) 5.97756 Tj +90 639.9 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 627.945 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 615.99 Td +(BZ_OUTBUFF_FULL) 89.6634 Tj +98.4879 604.035 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(exceeds) 41.8429 Tj +341.655 602.291 Td +(*) 5.97756 Tj +347.633 604.035 Td +(destLen) 41.8429 Tj +90 592.08 Td +(BZ_DATA_ERROR) 77.7083 Tj +98.4879 580.125 Td +(if) 11.9551 Tj +-426 TJm +(a) 5.97756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(integrity) 53.798 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected) 47.8205 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +90 568.169 Td +(BZ_DATA_ERROR_MAGIC) 113.574 Tj +98.4879 556.214 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(doesn't) 41.8429 Tj +-426 TJm +(begin) 29.8878 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(right) 29.8878 Tj +-426 TJm +(magic) 29.8878 Tj +-426 TJm +(bytes) 29.8878 Tj +90 544.259 Td +(BZ_UNEXPECTED_EOF) 101.619 Tj +98.4879 532.304 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(ends) 23.9102 Tj +-426 TJm +(unexpectedly) 71.7307 Tj +90 520.349 Td +(BZ_OK) 29.8878 Tj +98.4879 508.394 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 492.852] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -482.889] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 458.099 Td +/F122_0 20.6585 Tf +(3.6.) 34.4584 Tj +[1 0 0 1 112.201 458.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -112.201 -458.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +112.201 458.099 Td +/F392_0 20.6585 Tf +(zlib) 49.5804 Tj +[1 0 0 1 161.781 458.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.781 -458.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.524 458.099 Td +/F122_0 20.6585 Tf +(compatibility) 127.422 Tj +-278 TJm +(functions) 92.9633 Tj +[1 0 0 1 72 453.823] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -443.86] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 436.181 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(oshioka) 30.9936 Tj +-604 TJm +(Tsuneo) 29.3299 Tj +-604 TJm +(has) 13.2801 Tj +-604 TJm +(contrib) 28.224 Tj +20 TJm +(uted) 17.1556 Tj +-604 TJm +(some) 21.031 Tj +-604 TJm +(functions) 37.0808 Tj +-604 TJm +(to) 7.7509 Tj +-604 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-604 TJm +(better) 22.6848 Tj +[1 0 0 1 356.347 436.181] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -356.347 -436.181] cm +[1 0 0 1 0 0] Tm +0 0 Td +356.347 436.181 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 380.257 436.181] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -380.257 -436.181] cm +[1 0 0 1 0 0] Tm +0 0 Td +386.275 436.181 Td +/F130_0 9.9626 Tf +(compatibility) 53.1405 Tj +65 TJm +(.) 2.49065 Tj +-1372 TJm +(These) 23.7907 Tj +-604 TJm +(functions) 37.0808 Tj +-604 TJm +(are) 12.1643 Tj +[1 0 0 1 72 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzopen) 59.7756 Tj +[1 0 0 1 131.776 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.776 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 144.283 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -144.283 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +144.283 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzread) 59.7756 Tj +[1 0 0 1 204.059 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.059 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.059 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 216.566 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.566 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.566 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzwrite) 65.7532 Tj +[1 0 0 1 282.32 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.32 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +282.32 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 294.827 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.827 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.827 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzflush) 65.7532 Tj +[1 0 0 1 360.581 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.581 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.581 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 373.088 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -373.088 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +373.088 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzclose) 65.7532 Tj +[1 0 0 1 438.842 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.842 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.842 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 451.349 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -451.349 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +451.349 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzerror) 65.7532 Tj +[1 0 0 1 517.102 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -517.102 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +525.614 424.226 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 72 412.271] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -412.271] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 412.271 Td +/F134_0 9.9626 Tf +(BZ2_bzlibVersion) 95.641 Tj +[1 0 0 1 167.641 412.271] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.641 -412.271] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.641 412.271 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1420 TJm +(Thes) 19.3673 Tj +1 TJm +(e) 4.42339 Tj +-384 TJm +(functions) 37.0808 Tj +-383 TJm +(are) 12.1643 Tj +-383 TJm +(not) 12.7322 Tj +-383 TJm +(\(yet\)) 18.8094 Tj +-384 TJm +(of) 8.29885 Tj +25 TJm +(\002cially) 27.6761 Tj +-383 TJm +(part) 15.4918 Tj +-383 TJm +(of) 8.29885 Tj +-383 TJm +(the) 12.1743 Tj +-384 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-1419 TJm +(If) 6.63509 Tj +-383 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-384 TJm +(break,) 24.6176 Tj +-416 TJm +(you) 14.9439 Tj +-383 TJm +(get) 12.1743 Tj +-384 TJm +(to) 7.7509 Tj +72 400.316 Td +(k) 4.9813 Tj +10 TJm +(eep) 13.8281 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(pieces.) 27.3872 Tj +-620 TJm +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(think) 20.4831 Tj +-250 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-250 TJm +(ok.) 12.4533 Tj +[1 0 0 1 72 398.159] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -48.8169] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 47.8207 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 44.2341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -388.794] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 388.794 Td +/F134_0 9.9626 Tf +(typedef) 41.8429 Tj +-426 TJm +(void) 23.9102 Tj +-426 TJm +(BZFILE;) 41.8429 Tj +90 364.884 Td +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +152.286 363.14 Td +(*) 5.97756 Tj +162.508 364.884 Td +(BZ2_bzlibVersion) 95.641 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(void) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 349.342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -339.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 327.424 Td +/F130_0 9.9626 Tf +(Returns) 30.9936 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(string) 22.6948 Tj +-250 TJm +(indicating) 39.8504 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ersion.) 26.8392 Tj +[1 0 0 1 72 325.267] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -315.902] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 315.902 Td +/F134_0 9.9626 Tf +(BZFILE) 35.8654 Tj +130.109 314.159 Td +(*) 5.97756 Tj +140.331 315.902 Td +(BZ2_bzopen) 59.7756 Tj +-852 TJm +(\() 5.97756 Tj +-426 TJm +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +281.103 314.159 Td +(*) 5.97756 Tj +287.08 315.902 Td +(path,) 29.8878 Tj +-426 TJm +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +383.498 314.159 Td +(*) 5.97756 Tj +389.476 315.902 Td +(mode) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +90 303.947 Td +(BZFILE) 35.8654 Tj +130.109 302.204 Td +(*) 5.97756 Tj +140.331 303.947 Td +(BZ2_bzdopen) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +-3408 TJm +(fd,) 17.9327 Tj +-1704 TJm +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +369.629 302.204 Td +(*) 5.97756 Tj +375.607 303.947 Td +(mode) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 288.405] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -278.443] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 266.488 Td +/F130_0 9.9626 Tf +(Opens) 25.4544 Tj +-243 TJm +(a) 4.42339 Tj +[1 0 0 1 106.713 266.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -106.713 -266.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +106.713 266.488 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 130.624 266.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -130.624 -266.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +133.041 266.488 Td +/F130_0 9.9626 Tf +(\002le) 12.7322 Tj +-243 TJm +(for) 11.6164 Tj +-242 TJm +(reading) 29.8778 Tj +-243 TJm +(or) 8.29885 Tj +-243 TJm +(writing,) 31.2726 Tj +-244 TJm +(using) 21.589 Tj +-243 TJm +(ei) 7.193 Tj +1 TJm +(ther) 15.4918 Tj +-243 TJm +(its) 9.41466 Tj +-243 TJm +(name) 21.579 Tj +-242 TJm +(o) 4.9813 Tj +-1 TJm +(r) 3.31755 Tj +-242 TJm +(a) 4.42339 Tj +-243 TJm +(pre-e) 20.4632 Tj +15 TJm +(xisting) 27.1282 Tj +-243 TJm +(\002le) 12.7322 Tj +-242 TJm +(descriptor) 39.8404 Tj +55 TJm +(.) 2.49065 Tj +-615 TJm +(Analogous) 43.1679 Tj +-243 TJm +(to) 7.7509 Tj +[1 0 0 1 510.112 266.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -510.112 -266.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.112 266.488 Td +/F134_0 9.9626 Tf +(fopen) 29.8878 Tj +[1 0 0 1 540 266.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -266.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 254.532 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 88.8767 254.532] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -88.8767 -254.532] cm +[1 0 0 1 0 0] Tm +0 0 Td +88.8767 254.532 Td +/F134_0 9.9626 Tf +(fdopen) 35.8654 Tj +[1 0 0 1 124.742 254.532] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -124.742 -254.532] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.742 254.532 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 252.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -243.633] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 243.633 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzread) 59.7756 Tj +-852 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +226.528 241.89 Td +(*) 5.97756 Tj +236.749 243.633 Td +(b,) 11.9551 Tj +-426 TJm +(void) 23.9102 Tj +276.859 241.89 Td +(*) 5.97756 Tj +287.08 243.633 Td +(buf,) 23.9102 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +90 231.678 Td +(int) 17.9327 Tj +-426 TJm +(BZ2_bzwrite) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +228.261 229.935 Td +(*) 5.97756 Tj +238.483 231.678 Td +(b,) 11.9551 Tj +-426 TJm +(void) 23.9102 Tj +278.592 229.935 Td +(*) 5.97756 Tj +288.814 231.678 Td +(buf,) 23.9102 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 216.136] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -206.174] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 194.219 Td +/F130_0 9.9626 Tf +(Reads/writes) 51.4668 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(from/to) 29.8878 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(pre) 12.7222 Tj +25 TJm +(viously) 29.3399 Tj +-250 TJm +(opened) 28.772 Tj +[1 0 0 1 259.903 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.903 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +259.903 194.219 Td +/F134_0 9.9626 Tf +(BZFILE) 35.8654 Tj +[1 0 0 1 295.769 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -295.769 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +295.769 194.219 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-500 TJm +(Analogous) 43.1679 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 359.141 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -359.141 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +359.141 194.219 Td +/F134_0 9.9626 Tf +(fread) 29.8878 Tj +[1 0 0 1 389.029 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -389.029 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +391.519 194.219 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 408.396 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -408.396 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +408.396 194.219 Td +/F134_0 9.9626 Tf +(fwrite) 35.8654 Tj +[1 0 0 1 444.261 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.261 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +444.261 194.219 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 192.062] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -182.697] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 182.697 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-852 TJm +(BZ2_bzflush) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +232.505 180.954 Td +(*) 5.97756 Tj +242.727 182.697 Td +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 170.742 Td +(void) 23.9102 Tj +-426 TJm +(BZ2_bzclose) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +234.239 168.998 Td +(*) 5.97756 Tj +244.46 170.742 Td +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 155.2] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -145.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 133.282 Td +/F130_0 9.9626 Tf +(Flushes/closes) 57.5639 Tj +-250 TJm +(a) 4.42339 Tj +[1 0 0 1 138.968 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.968 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +138.968 133.282 Td +/F134_0 9.9626 Tf +(BZFILE) 35.8654 Tj +[1 0 0 1 174.833 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.833 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +174.833 133.282 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 179.815 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -179.815 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.815 133.282 Td +/F134_0 9.9626 Tf +(BZ2_bzflush) 65.7532 Tj +[1 0 0 1 245.568 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.568 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +248.059 133.282 Td +/F130_0 9.9626 Tf +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(actually) 31.5416 Tj +-250 TJm +(do) 9.9626 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(ything.) 27.9551 Tj +-620 TJm +(Analogous) 43.1679 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 425.472 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -425.472 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +425.472 133.282 Td +/F134_0 9.9626 Tf +(fflush) 35.8654 Tj +[1 0 0 1 461.338 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.338 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +463.828 133.282 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 480.705 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -480.705 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +480.705 133.282 Td +/F134_0 9.9626 Tf +(fclose) 35.8654 Tj +[1 0 0 1 516.57 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -516.57 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +516.57 133.282 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 131.125] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -121.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 121.761 Td +/F134_0 9.9626 Tf +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +152.286 120.017 Td +(*) 5.97756 Tj +162.508 121.761 Td +(BZ2_bzerror) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +282.836 120.017 Td +(*) 5.97756 Tj +288.814 121.761 Td +(b,) 11.9551 Tj +-426 TJm +(int) 17.9327 Tj +327.19 120.017 Td +(*) 5.97756 Tj +333.167 121.761 Td +(errnum) 35.8654 Tj +-426 TJm +(\)) 5.97756 Tj +[1 0 0 1 72 106.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -96.2563] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 84.3011 Td +/F130_0 9.9626 Tf +(Returns) 30.9936 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(string) 22.6948 Tj +-250 TJm +(describing) 41.5042 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(recent) 24.3386 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(status) 22.6948 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 303.858 84.3011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.858 -84.3011] cm +[1 0 0 1 0 0] Tm +0 0 Td +303.858 84.3011 Td +/F134_0 9.9626 Tf +(b) 5.97756 Tj +[1 0 0 1 309.835 84.3011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -309.835 -84.3011] cm +[1 0 0 1 0 0] Tm +0 0 Td +309.835 84.3011 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(also) 16.0497 Tj +-250 TJm +(sets) 14.9439 Tj +[1 0 0 1 367.668 84.3011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -367.668 -84.3011] cm +[1 0 0 1 0 0] Tm +0 0 Td +367.668 82.5576 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +373.645 84.3011 Td +(errnum) 35.8654 Tj +[1 0 0 1 409.511 84.3011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.511 -84.3011] cm +[1 0 0 1 0 0] Tm +0 0 Td +412.001 84.3011 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(its) 9.41466 Tj +-250 TJm +(numerical) 39.8404 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue.) 19.0883 Tj +[1 0 0 1 72 82.1443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.3298] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -495.734 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +536.307 50.9514 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 455.161 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0365 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 32 32 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 704.93 Td +/F122_0 20.6585 Tf +(3.7.) 34.4584 Tj +-278 TJm +(Using) 57.3893 Tj +-278 TJm +(the) 30.9877 Tj +-278 TJm +(librar) 51.6669 Tj +-10 TJm +(y) 11.4861 Tj +-278 TJm +(in) 18.3654 Tj +-278 TJm +(a) 11.4861 Tj +[1 0 0 1 322.501 704.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -322.501 -704.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +322.501 704.93 Td +/F392_0 20.6585 Tf +(stdio) 61.9755 Tj +[1 0 0 1 384.477 704.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -384.477 -704.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.477 704.93 Td +/F122_0 20.6585 Tf +(-free) 44.767 Tj +72 680.139 Td +(en) 24.1085 Tj +40 TJm +(vir) 25.2653 Tj +20 TJm +(onment) 74.5978 Tj +[1 0 0 1 72 679.881] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -669.983] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 649.583 Td +/F122_0 17.2154 Tf +(3.7.1.) 43.0729 Tj +-278 TJm +(Getting) 60.2539 Tj +-278 TJm +(rid) 22.0013 Tj +-278 TJm +(of) 16.2513 Tj +[1 0 0 1 232.721 649.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.721 -649.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +232.721 649.583 Td +/F392_0 17.2154 Tf +(stdio) 51.6462 Tj +[1 0 0 1 284.367 649.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.367 -3.8303] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -635.855] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 627.73 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +-319 TJm +(a) 4.42339 Tj +-319 TJm +(deeply) 26.5603 Tj +-319 TJm +(embedded) 40.9463 Tj +-319 TJm +(application,) 46.7644 Tj +-336 TJm +(you) 14.9439 Tj +-319 TJm +(might) 23.2527 Tj +-319 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-319 TJm +(to) 7.7509 Tj +-319 TJm +(use) 13.2801 Tj +-319 TJm +(just) 14.396 Tj +-319 TJm +(the) 12.1743 Tj +-319 TJm +(memory-to-memory) 80.7967 Tj +-319 TJm +(functions.) 39.5714 Tj +-1035 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-319 TJm +(can) 13.8281 Tj +-319 TJm +(do) 9.9626 Tj +-319 TJm +(this) 14.396 Tj +72 615.775 Td +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(eniently) 32.0995 Tj +-327 TJm +(by) 9.9626 Tj +-327 TJm +(compiling) 40.4083 Tj +-327 TJm +(the) 12.1743 Tj +-327 TJm +(library) 26.5603 Tj +-327 TJm +(with) 17.7135 Tj +-328 TJm +(preproces) 38.7246 Tj +1 TJm +(sor) 12.1743 Tj +-328 TJm +(symbol) 29.3399 Tj +[1 0 0 1 336.046 615.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -336.046 -615.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +336.046 615.775 Td +/F134_0 9.9626 Tf +(BZ_NO_STDIO) 65.7532 Tj +[1 0 0 1 401.799 615.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -401.799 -615.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.057 615.775 Td +/F130_0 9.9626 Tf +(de\002ned.) 31.8205 Tj +-1083 TJm +(Doing) 24.9065 Tj +-327 TJm +(this) 14.396 Tj +-327 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-327 TJm +(you) 14.9439 Tj +-327 TJm +(a) 4.42339 Tj +72 603.819 Td +(library) 26.5603 Tj +-250 TJm +(containing) 42.0621 Tj +-250 TJm +(only) 17.7135 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-250 TJm +(eight) 19.9252 Tj +-250 TJm +(functions:) 39.8504 Tj +[1 0 0 1 72 601.662] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -591.764] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 581.966 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 179.596 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -179.596 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.596 581.966 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 199.079 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -199.079 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +199.079 581.966 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 282.765 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.765 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +282.765 581.966 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 302.247 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -302.247 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.247 581.966 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 403.866 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 14.0915 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -417.958 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +417.958 581.966 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 537.509 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 581.966 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 570.011 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 167.641 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.641 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.641 570.011 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 172.144 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.144 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.144 570.011 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 285.719 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.611 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +287.611 570.011 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 431.073 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.073 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.073 570.011 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 435.577 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -435.577 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +435.577 570.011 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 590.994 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -518.994 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -558.579] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 548.158 Td +/F130_0 9.9626 Tf +(When) 23.7907 Tj +-250 TJm +(compiled) 37.0808 Tj +-250 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-250 TJm +(this,) 16.8866 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(ignore) 25.4544 Tj +[1 0 0 1 272.526 548.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.526 -548.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +272.526 548.158 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 326.324 548.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -326.324 -548.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +328.815 548.158 Td +/F130_0 9.9626 Tf +(settings.) 32.9364 Tj +[1 0 0 1 72 546.001] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -536.103] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 517.601 Td +/F122_0 17.2154 Tf +(3.7.2.) 43.0729 Tj +-278 TJm +(Critical) 58.3602 Tj +-278 TJm +(err) 22.9653 Tj +20 TJm +(or) 17.2154 Tj +-278 TJm +(handling) 71.7366 Tj +[1 0 0 1 72 513.771] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -503.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 495.748 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 119.821 495.748] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.821 -495.748] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.529 495.748 Td +/F130_0 9.9626 Tf +(contains) 33.2053 Tj +-473 TJm +(a) 4.42339 Tj +-472 TJm +(number) 30.4357 Tj +-473 TJm +(of) 8.29885 Tj +-472 TJm +(internal) 30.4357 Tj +-473 TJm +(assertion) 35.417 Tj +-472 TJm +(checks) 27.1082 Tj +-473 TJm +(which) 24.3486 Tj +-472 TJm +(should,) 29.0609 Tj +-529 TJm +(needless) 33.7533 Tj +-472 TJm +(to) 7.7509 Tj +-473 TJm +(say) 13.2801 Tj +65 TJm +(,) 2.49065 Tj +-528 TJm +(ne) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-473 TJm +(be) 9.40469 Tj +-472 TJm +(acti) 14.386 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ated.) 19.0883 Tj +72 483.793 Td +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-533 TJm +(if) 6.08715 Tj +-476 TJm +(an) 9.40469 Tj +-476 TJm +(assertion) 35.417 Tj +-476 TJm +(should) 26.5703 Tj +-476 TJm +(f) 3.31755 Tj +10 TJm +(ail,) 12.4533 Tj +-532 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +-476 TJm +(depends) 32.6474 Tj +-476 TJm +(on) 9.9626 Tj +-476 TJm +(whether) 32.0895 Tj +-476 TJm +(or) 8.29885 Tj +-477 TJm +(not) 12.7322 Tj +-476 TJm +(the) 12.1743 Tj +-476 TJm +(library) 26.5603 Tj +-476 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-476 TJm +(compiled) 37.0808 Tj +-476 TJm +(with) 17.7135 Tj +[1 0 0 1 72 471.838] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -471.838] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 471.838 Td +/F134_0 9.9626 Tf +(BZ_NO_STDIO) 65.7532 Tj +[1 0 0 1 137.753 471.838] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -471.838] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.244 471.838 Td +/F130_0 9.9626 Tf +(set.) 13.5591 Tj +[1 0 0 1 72 470.528] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -460.63] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 449.985 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(normal) 28.224 Tj +-250 TJm +(compile,) 34.5901 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(assertion) 35.417 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(ailure) 22.6848 Tj +-250 TJm +(yields) 23.8007 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(message:) 36.5229 Tj +[1 0 0 1 72 447.828] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -437.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 428.131 Td +/F130_0 9.9626 Tf +(bzip2/libbzip2:) 60.3335 Tj +-310 TJm +(internal) 30.4357 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(N.) 9.68365 Tj +[1 0 0 1 72 425.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -416.077] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 406.278 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-332 TJm +(is) 6.64505 Tj +-331 TJm +(a) 4.42339 Tj +-332 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-332 TJm +(in) 7.7509 Tj +-331 TJm +(bzip2/libbzip2,) 60.0546 Tj +-352 TJm +(1.0.5) 19.9252 Tj +-332 TJm +(of) 8.29885 Tj +-332 TJm +(10) 9.9626 Tj +-332 TJm +(December) 40.9363 Tj +-331 TJm +(2007.) 22.4159 Tj +-555 TJm +(Please) 25.4544 Tj +-332 TJm +(report) 23.7907 Tj +-332 TJm +(it) 5.53921 Tj +-331 TJm +(to) 7.7509 Tj +-332 TJm +(me) 12.1743 Tj +-332 TJm +(at:) 9.9626 Tj +-473 TJm +(jse) 11.0684 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard@bzip.or) 49.8429 Tj +18 TJm +(g.) 7.47195 Tj +-1110 TJm +(If) 6.63509 Tj +-332 TJm +(this) 14.396 Tj +72 394.323 Td +(happened) 38.1767 Tj +-297 TJm +(when) 21.579 Tj +-298 TJm +(you) 14.9439 Tj +-297 TJm +(were) 19.3573 Tj +-297 TJm +(using) 21.589 Tj +-297 TJm +(some) 21.031 Tj +-298 TJm +(program) 33.7533 Tj +-297 TJm +(which) 24.3486 Tj +-297 TJm +(uses) 17.1556 Tj +-297 TJm +(libbzip2) 32.6574 Tj +-298 TJm +(as) 8.29885 Tj +-297 TJm +(a) 4.42339 Tj +-297 TJm +(component,) 46.7644 Tj +-309 TJm +(you) 14.9439 Tj +-298 TJm +(should) 26.5703 Tj +-297 TJm +(also) 16.0497 Tj +-297 TJm +(report) 23.7907 Tj +-297 TJm +(this) 14.396 Tj +-298 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +72 382.368 Td +(to) 7.7509 Tj +-264 TJm +(the) 12.1743 Tj +-264 TJm +(author\(s\)) 35.965 Tj +-264 TJm +(of) 8.29885 Tj +-264 TJm +(that) 14.9439 Tj +-264 TJm +(program.) 36.2439 Tj +-703 TJm +(Please) 25.4544 Tj +-264 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-264 TJm +(an) 9.40469 Tj +-264 TJm +(ef) 7.74094 Tj +25 TJm +(fort) 14.386 Tj +-264 TJm +(to) 7.7509 Tj +-264 TJm +(report) 23.7907 Tj +-263 TJm +(this) 14.396 Tj +-264 TJm +(b) 4.9813 Tj +20 TJm +(ug;) 12.7322 Tj +-271 TJm +(timely) 25.4644 Tj +-264 TJm +(and) 14.386 Tj +-264 TJm +(accurate) 33.1854 Tj +-264 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-264 TJm +(reports) 27.6661 Tj +-264 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(entually) 32.0995 Tj +72 370.413 Td +(lead) 16.5977 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(higher) 25.4544 Tj +-250 TJm +(quality) 27.6761 Tj +-250 TJm +(softw) 22.1369 Tj +10 TJm +(are.) 14.655 Tj +-620 TJm +(Thanks.) 31.8205 Tj +-620 TJm +(Julian) 23.8007 Tj +-250 TJm +(Se) 9.9626 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard,) 15.2129 Tj +-250 TJm +(10) 9.9626 Tj +-250 TJm +(December) 40.9363 Tj +-250 TJm +(2007.) 22.4159 Tj +[1 0 0 1 72 368.256] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.801] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -348.557] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 338.758 Td +/F130_0 9.9626 Tf +(where) 24.3386 Tj +[1 0 0 1 98.8312 338.758] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -98.8312 -338.758] cm +[1 0 0 1 0 0] Tm +0 0 Td +98.8312 338.758 Td +/F134_0 9.9626 Tf +(N) 5.97756 Tj +[1 0 0 1 104.809 338.758] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -104.809 -338.758] cm +[1 0 0 1 0 0] Tm +0 0 Td +107.302 338.758 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(error) 19.3573 Tj +-251 TJm +(code) 18.8094 Tj +-250 TJm +(number) 30.4357 Tj +55 TJm +(.) 2.49065 Tj +-621 TJm +(If) 6.63509 Tj +[1 0 0 1 230.81 338.758] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -230.81 -338.758] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.81 338.758 Td +/F134_0 9.9626 Tf +(N) 5.97756 Tj +-600 TJm +(==) 11.9551 Tj +-600 TJm +(1007) 23.9102 Tj +[1 0 0 1 284.608 338.758] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.608 -338.758] cm +[1 0 0 1 0 0] Tm +0 0 Td +284.608 338.758 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(also) 16.0497 Tj +-251 TJm +(prints) 22.6948 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xtra) 15.4918 Tj +-250 TJm +(te) 7.193 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(advising) 33.7633 Tj +-251 TJm +(the) 12.1743 Tj +-250 TJm +(reader) 24.8866 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(unreliable) 39.8404 Tj +72 326.803 Td +(memory) 33.2053 Tj +-425 TJm +(is) 6.64505 Tj +-424 TJm +(often) 20.4731 Tj +-425 TJm +(associated) 40.9463 Tj +-425 TJm +(with) 17.7135 Tj +-424 TJm +(internal) 30.4357 Tj +-425 TJm +(error) 19.3573 Tj +-424 TJm +(1007.) 22.4159 Tj +-834 TJm +(\(This) 21.031 Tj +-425 TJm +(is) 6.64505 Tj +-425 TJm +(a) 4.42339 Tj +-424 TJm +(frequently-observ) 70.8241 Tj +15 TJm +(ed-phenomenon) 64.189 Tj +-425 TJm +(with) 17.7135 Tj +-425 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +72 314.848 Td +(1.0.0/1.0.1\).) 48.4282 Tj +[1 0 0 1 72 313.065] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -303.167] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 292.995 Td +/F134_0 9.9626 Tf +(exit\(3\)) 41.8429 Tj +[1 0 0 1 113.843 292.995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -292.995] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.334 292.995 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(then) 17.1556 Tj +-250 TJm +(called.) 26.2813 Tj +[1 0 0 1 72 291.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -282.001] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 271.142 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +[1 0 0 1 95.0933 271.142] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -95.0933 -271.142] cm +[1 0 0 1 0 0] Tm +0 0 Td +95.0933 271.142 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 124.981 271.142] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -124.981 -271.142] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.981 271.142 Td +/F130_0 9.9626 Tf +(-free) 18.7994 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(assertion) 35.417 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(ailures) 26.5603 Tj +-250 TJm +(result) 22.1369 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(call) 14.386 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(function) 33.2053 Tj +-250 TJm +(declared) 33.7433 Tj +-250 TJm +(as:) 11.0684 Tj +[1 0 0 1 72 268.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -259.62] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 259.62 Td +/F134_0 9.9626 Tf +(extern) 35.8654 Tj +-426 TJm +(void) 23.9102 Tj +-426 TJm +(bz_internal_error) 101.619 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(errcode) 41.8429 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 244.078] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.4846] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -234.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 222.225 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(rele) 14.9339 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant) 12.1743 Tj +-250 TJm +(code) 18.8094 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(passed) 26.5603 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(parameter) 39.8305 Tj +55 TJm +(.) 2.49065 Tj +-620 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(supply) 26.5703 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(function.) 35.696 Tj +[1 0 0 1 72 220.068] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -210.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 200.372 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +-294 TJm +(either) 22.6848 Tj +-294 TJm +(case,) 19.6363 Tj +-306 TJm +(once) 18.8094 Tj +-294 TJm +(an) 9.40469 Tj +-294 TJm +(assertion) 35.417 Tj +-294 TJm +(f) 3.31755 Tj +10 TJm +(ailure) 22.6848 Tj +-294 TJm +(has) 13.2801 Tj +-295 TJm +(occurred,) 37.3398 Tj +-305 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +[1 0 0 1 306.541 200.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -306.541 -200.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +306.541 200.372 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 360.339 200.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.339 -200.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.271 200.372 Td +/F130_0 9.9626 Tf +(records) 29.3199 Tj +-294 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +20 TJm +(olv) 12.7322 Tj +15 TJm +(ed) 9.40469 Tj +-294 TJm +(can) 13.8281 Tj +-295 TJm +(be) 9.40469 Tj +-294 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(arded) 22.1269 Tj +-294 TJm +(as) 8.29885 Tj +-294 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +25 TJm +(alid.) 17.4346 Tj +72 188.417 Td +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(attempt) 29.8878 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(resume) 28.772 Tj +-250 TJm +(normal) 28.224 Tj +-250 TJm +(operation) 37.6287 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(them.) 22.4159 Tj +[1 0 0 1 72 186.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -176.362] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 166.564 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-299 TJm +(may) 17.1556 Tj +65 TJm +(,) 2.49065 Tj +-310 TJm +(of) 8.29885 Tj +-299 TJm +(course,) 28.493 Tj +-311 TJm +(change) 28.2141 Tj +-298 TJm +(critical) 27.6661 Tj +-299 TJm +(error) 19.3573 Tj +-298 TJm +(handling) 34.8691 Tj +-299 TJm +(to) 7.7509 Tj +-298 TJm +(suit) 14.396 Tj +-299 TJm +(your) 18.2614 Tj +-298 TJm +(needs.) 25.1755 Tj +-912 TJm +(As) 11.0684 Tj +-298 TJm +(I) 3.31755 Tj +-299 TJm +(said) 16.0497 Tj +-298 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-311 TJm +(critical) 27.6661 Tj +-299 TJm +(errors) 23.2328 Tj +-298 TJm +(indicate) 31.5416 Tj +-299 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +72 154.608 Td +(in) 7.7509 Tj +-263 TJm +(the) 12.1743 Tj +-263 TJm +(library) 26.5603 Tj +-263 TJm +(and) 14.386 Tj +-263 TJm +(should) 26.5703 Tj +-263 TJm +(not) 12.7322 Tj +-263 TJm +(occur) 22.1269 Tj +55 TJm +(.) 2.49065 Tj +-697 TJm +(All) 12.7322 Tj +-263 TJm +("normal") 36.3535 Tj +-263 TJm +(error) 19.3573 Tj +-263 TJm +(situations) 38.1966 Tj +-263 TJm +(are) 12.1643 Tj +-263 TJm +(indicated) 36.5229 Tj +-263 TJm +(via) 12.1743 Tj +-263 TJm +(error) 19.3573 Tj +-263 TJm +(return) 23.7907 Tj +-263 TJm +(codes) 22.6848 Tj +-263 TJm +(from) 19.3673 Tj +-263 TJm +(functions,) 39.5714 Tj +72 142.653 Td +(and) 14.386 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ered) 17.1456 Tj +-250 TJm +(from.) 21.8579 Tj +[1 0 0 1 72 142.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -132.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 107.965 Td +/F122_0 20.6585 Tf +(3.8.) 34.4584 Tj +-278 TJm +(Making) 71.1685 Tj +-278 TJm +(a) 11.4861 Tj +-278 TJm +(Windo) 63.1117 Tj +15 TJm +(ws) 27.5584 Tj +-278 TJm +(DLL) 40.1601 Tj +[1 0 0 1 72 103.369] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -93.4708] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 86.112 Td +/F130_0 9.9626 Tf +(Ev) 11.0684 Tj +15 TJm +(erything) 33.2053 Tj +-328 TJm +(related) 27.1082 Tj +-327 TJm +(to) 7.7509 Tj +-328 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-328 TJm +(has) 13.2801 Tj +-327 TJm +(been) 18.8094 Tj +-328 TJm +(contrib) 28.224 Tj +20 TJm +(uted) 17.1556 Tj +-328 TJm +(by) 9.9626 Tj +-327 TJm +(Y) 7.193 Tj +110 TJm +(oshioka) 30.9936 Tj +-328 TJm +(Tsuneo) 29.3299 Tj +-328 TJm +(\() 3.31755 Tj +[1 0 0 1 378.139 86.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -378.139 -86.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +378.139 86.112 Td +/F134_0 9.9626 Tf +(tsuneo@rr.iij4u.or.jp) 125.529 Tj +[1 0 0 1 503.668 86.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -503.668 -86.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +503.668 86.112 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-347 TJm +(so) 8.85675 Tj +-328 TJm +(you) 14.9439 Tj +72 74.1568 Td +(should) 26.5703 Tj +-250 TJm +(send) 18.2614 Tj +-250 TJm +(your) 18.2614 Tj +-250 TJm +(queries) 28.772 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(him) 15.5018 Tj +-250 TJm +(\(b) 8.29885 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(perhaps) 30.9837 Tj +-250 TJm +(Cc:) 13.8381 Tj +-310 TJm +(me,) 14.6649 Tj +[1 0 0 1 287.958 74.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.958 -74.1568] cm +[1 0 0 1 0 0] Tm +0 0 Td +287.958 74.1568 Td +/F134_0 9.9626 Tf +(jseward@bzip.org) 95.641 Tj +[1 0 0 1 383.6 74.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -383.6 -74.1568] cm +[1 0 0 1 0 0] Tm +0 0 Td +383.6 74.1568 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +[1 0 0 1 72 72] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.1482] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.9738] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -51.071] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 51.071 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 33 33 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(My) 13.8381 Tj +-367 TJm +(v) 4.9813 Tj +25 TJm +(ague) 18.8094 Tj +-367 TJm +(understanding) 56.4481 Tj +-367 TJm +(of) 8.29885 Tj +-367 TJm +(what) 19.3673 Tj +-368 TJm +(to) 7.7509 Tj +-367 TJm +(do) 9.9626 Tj +-367 TJm +(is:) 9.41466 Tj +-544 TJm +(using) 21.589 Tj +-367 TJm +(V) 7.193 Tj +60 TJm +(isual) 18.8194 Tj +-367 TJm +(C++) 17.8829 Tj +-367 TJm +(5.0,) 14.9439 Tj +-397 TJm +(open) 19.3673 Tj +-367 TJm +(the) 12.1743 Tj +-367 TJm +(project) 27.6661 Tj +-367 TJm +(\002le) 12.7322 Tj +[1 0 0 1 432.966 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -432.966 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +432.966 710.037 Td +/F134_0 9.9626 Tf +(libbz2.dsp) 59.7756 Tj +[1 0 0 1 492.742 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -492.742 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +492.742 710.037 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-396 TJm +(and) 14.386 Tj +-368 TJm +(b) 4.9813 Tj +20 TJm +(uild.) 17.9925 Tj +72 698.082 Td +(That') 21.579 Tj +55 TJm +(s) 3.87545 Tj +-250 TJm +(all.) 12.4533 Tj +[1 0 0 1 72 697.983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -688.02] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 676.164 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-284 TJm +(you) 14.9439 Tj +-284 TJm +(can') 17.1456 Tj +18 TJm +(t) 2.7696 Tj +-285 TJm +(open) 19.3673 Tj +-284 TJm +(the) 12.1743 Tj +-284 TJm +(project) 27.6661 Tj +-284 TJm +(\002le) 12.7322 Tj +-284 TJm +(for) 11.6164 Tj +-285 TJm +(some) 21.031 Tj +-284 TJm +(reason,) 28.493 Tj +-293 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-284 TJm +(a) 4.42339 Tj +-284 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-284 TJm +(one,) 16.8766 Tj +-293 TJm +(naming) 29.8878 Tj +-284 TJm +(these) 20.4731 Tj +-284 TJm +(\002les:) 19.3773 Tj +[1 0 0 1 424.505 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -424.505 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +424.505 676.164 Td +/F134_0 9.9626 Tf +(blocksort.c) 65.7532 Tj +[1 0 0 1 490.259 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -490.259 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +490.259 676.164 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 495.666 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -495.666 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +495.666 676.164 Td +/F134_0 9.9626 Tf +(bzlib.c) 41.8429 Tj +[1 0 0 1 537.509 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 676.164 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 664.209 Td +/F134_0 9.9626 Tf +(compress.c) 59.7756 Tj +[1 0 0 1 131.776 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.776 664.209 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 136.436 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -136.436 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +136.436 664.209 Td +/F134_0 9.9626 Tf +(crctable.c) 59.7756 Tj +[1 0 0 1 196.211 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.211 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.211 664.209 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 200.871 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -200.871 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +200.871 664.209 Td +/F134_0 9.9626 Tf +(decompress.c) 71.7307 Tj +[1 0 0 1 272.602 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.602 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +272.602 664.209 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 277.262 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.262 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +277.262 664.209 Td +/F134_0 9.9626 Tf +(huffman.c) 53.798 Tj +[1 0 0 1 331.06 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.06 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +331.06 664.209 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 335.72 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -335.72 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +335.72 664.209 Td +/F134_0 9.9626 Tf +(randtable.c) 65.7532 Tj +[1 0 0 1 401.473 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -401.473 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +403.562 664.209 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 420.037 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -420.037 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +420.037 664.209 Td +/F134_0 9.9626 Tf +(libbz2.def) 59.7756 Tj +[1 0 0 1 479.812 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -479.812 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +479.812 664.209 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-593 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-210 TJm +(will) 15.5018 Tj +-209 TJm +(also) 16.0497 Tj +72 652.254 Td +(need) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(name) 21.579 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(header) 26.5503 Tj +-250 TJm +(\002les) 16.6077 Tj +[1 0 0 1 190.415 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -190.415 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +190.415 652.254 Td +/F134_0 9.9626 Tf +(bzlib.h) 41.8429 Tj +[1 0 0 1 232.258 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.258 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.748 652.254 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 251.625 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -251.625 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +251.625 652.254 Td +/F134_0 9.9626 Tf +(bzlib_private.h) 89.6634 Tj +[1 0 0 1 341.289 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -341.289 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +341.289 652.254 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 650.72] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -640.757] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 630.336 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(VC++,) 27.5665 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(need) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(de\002ne) 24.3486 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(proprocessor) 51.4568 Tj +-250 TJm +(symbol) 29.3399 Tj +[1 0 0 1 363.634 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.634 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.634 630.336 Td +/F134_0 9.9626 Tf +(_WIN32) 35.8654 Tj +[1 0 0 1 399.5 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -399.5 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +399.5 630.336 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 628.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -618.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 608.418 Td +/F130_0 9.9626 Tf +(Finally) 28.234 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 104.568 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -104.568 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.568 608.418 Td +/F134_0 9.9626 Tf +(dlltest.c) 53.798 Tj +[1 0 0 1 158.366 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.366 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +160.856 608.418 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(sample) 28.224 Tj +-250 TJm +(program) 33.7533 Tj +-250 TJm +(using) 21.589 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(DLL.) 21.8579 Tj +-500 TJm +(It) 6.08715 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(project) 27.6661 Tj +-250 TJm +(\002le,) 15.2229 Tj +[1 0 0 1 388.58 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -388.58 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +388.58 608.418 Td +/F134_0 9.9626 Tf +(dlltest.dsp) 65.7532 Tj +[1 0 0 1 454.333 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -454.333 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +454.333 608.418 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 606.262] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -596.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 586.501 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(just) 14.396 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(mak) 17.1556 Tj +10 TJm +(e\002le) 17.1556 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(V) 7.193 Tj +60 TJm +(isual) 18.8194 Tj +-250 TJm +(C,) 9.1357 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(look) 17.7135 Tj +-250 TJm +(at) 7.193 Tj +[1 0 0 1 292.212 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -292.212 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +292.212 586.501 Td +/F134_0 9.9626 Tf +(makefile.msc) 71.7307 Tj +[1 0 0 1 363.943 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.943 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.943 586.501 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 584.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -574.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 564.583 Td +/F130_0 9.9626 Tf +(Be) 11.0684 Tj +-291 TJm +(a) 4.42339 Tj +15 TJm +(w) 7.193 Tj +10 TJm +(are) 12.1643 Tj +-291 TJm +(that) 14.9439 Tj +-291 TJm +(if) 6.08715 Tj +-291 TJm +(you) 14.9439 Tj +-291 TJm +(compile) 32.0995 Tj +[1 0 0 1 192.069 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.069 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.069 564.583 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 221.958 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -221.958 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.857 564.583 Td +/F130_0 9.9626 Tf +(itself) 19.9252 Tj +-291 TJm +(on) 9.9626 Tj +-291 TJm +(W) 9.40469 Tj +40 TJm +(in32,) 20.2042 Tj +-301 TJm +(you) 14.9439 Tj +-291 TJm +(must) 19.3773 Tj +-291 TJm +(set) 11.0684 Tj +[1 0 0 1 346.841 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -346.841 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +346.841 564.583 Td +/F134_0 9.9626 Tf +(BZ_UNIX) 41.8429 Tj +[1 0 0 1 388.685 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -388.685 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +391.583 564.583 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-291 TJm +(0) 4.9813 Tj +-291 TJm +(and) 14.386 Tj +[1 0 0 1 427.399 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.399 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +427.399 564.583 Td +/F134_0 9.9626 Tf +(BZ_LCCWIN32) 65.7532 Tj +[1 0 0 1 493.153 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.153 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.052 564.583 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-291 TJm +(1,) 7.47195 Tj +-301 TJm +(in) 7.7509 Tj +-291 TJm +(the) 12.1743 Tj +72 552.628 Td +(\002le) 12.7322 Tj +[1 0 0 1 87.2227 552.628] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -87.2227 -552.628] cm +[1 0 0 1 0 0] Tm +0 0 Td +87.2227 552.628 Td +/F134_0 9.9626 Tf +(bzip2.c) 41.8429 Tj +[1 0 0 1 129.066 552.628] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -129.066 -552.628] cm +[1 0 0 1 0 0] Tm +0 0 Td +129.066 552.628 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(before) 25.4445 Tj +-250 TJm +(compiling.) 42.899 Tj +-310 TJm +(Otherwise) 40.9463 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(resulting) 34.8691 Tj +-250 TJm +(binary) 25.4544 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-250 TJm +(correctly) 35.4071 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 550.471] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -540.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 530.71 Td +/F130_0 9.9626 Tf +(I) 3.31755 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(en') 12.7222 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(tried) 18.2614 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(stuf) 14.9439 Tj +25 TJm +(f) 3.31755 Tj +-250 TJm +(myself,) 29.6088 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(looks) 21.589 Tj +-250 TJm +(plausible.) 38.4656 Tj +[1 0 0 1 72 528.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -477.701] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(30) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 34 34 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 701.916 Td +/F122_0 24.7902 Tf +(4.) 20.675 Tj +-278 TJm +(Miscellanea) 139.172 Tj +[1 0 0 1 72 701.606] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.1347] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -14.1161] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -678.355] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 658.006 Td +/F122_0 17.2154 Tf +(T) 10.5186 Tj +80 TJm +(ab) 20.0904 Tj +10 TJm +(le) 14.3576 Tj +-278 TJm +(of) 16.2513 Tj +-278 TJm +(Contents) 74.5943 Tj +[1 0 0 1 72 649.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.7401] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -637.443] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 637.443 Td +/F130_0 9.9626 Tf +(4.1.) 14.9439 Tj +-310 TJm +(Limitations) 45.9475 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(format) 26.5603 Tj +[1 0 0 1 255.231 637.443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.212 -637.443] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.154 637.443 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 637.443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -637.443] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 637.443 Td +/F130_0 9.9626 Tf +(31) 9.9626 Tj +[1 0 0 1 516.09 637.443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -625.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 625.488 Td +/F130_0 9.9626 Tf +(4.2.) 14.9439 Tj +-310 TJm +(Portability) 42.0721 Tj +-250 TJm +(issues) 23.8007 Tj +[1 0 0 1 158.395 625.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.376 -625.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.03 625.488 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 625.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -625.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 625.488 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 516.09 625.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -613.533] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 613.533 Td +/F130_0 9.9626 Tf +(4.3.) 14.9439 Tj +-310 TJm +(Reporting) 39.8504 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +[1 0 0 1 150.993 613.533] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.975 -613.533] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.115 613.533 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 613.533] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -613.533] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 613.533 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 516.09 613.533] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -601.578] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 601.578 Td +/F130_0 9.9626 Tf +(4.4.) 14.9439 Tj +-310 TJm +(Did) 14.9439 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(get) 12.1743 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(right) 18.8194 Tj +-250 TJm +(package?) 37.0609 Tj +[1 0 0 1 212.602 601.578] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -218.778 -601.578] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.109 601.578 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 601.578] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -601.578] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 601.578 Td +/F130_0 9.9626 Tf +(33) 9.9626 Tj +[1 0 0 1 516.09 601.578] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -589.623] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 589.623 Td +/F130_0 9.9626 Tf +(4.5.) 14.9439 Tj +-310 TJm +(Further) 29.3299 Tj +-250 TJm +(Reading) 33.2053 Tj +[1 0 0 1 155.058 589.623] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.039 -589.623] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.361 589.623 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 589.623] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -589.623] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 589.623 Td +/F130_0 9.9626 Tf +(34) 9.9626 Tj +[1 0 0 1 516.09 589.623] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.1348] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -568.7] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 558.901 Td +/F130_0 9.9626 Tf +(These) 23.7907 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(just) 14.396 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(random) 30.4357 Tj +-250 TJm +(thoughts) 34.3212 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(mine.) 22.4159 Tj +-620 TJm +(Y) 7.193 Tj +110 TJm +(our) 13.2801 Tj +-250 TJm +(mileage) 31.5416 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(ary) 12.7222 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 556.744] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -547.113] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 524.48 Td +/F122_0 20.6585 Tf +(4.1.) 34.4584 Tj +-278 TJm +(Limitations) 110.192 Tj +-278 TJm +(of) 19.5016 Tj +-278 TJm +(the) 30.9877 Tj +-278 TJm +(compressed) 121.699 Tj +-278 TJm +(\002le) 29.8515 Tj +-278 TJm +(f) 6.87928 Tj +20 TJm +(ormat) 57.3893 Tj +[1 0 0 1 72 520.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -510.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 502.893 Td +/F134_0 9.9626 Tf +(bzip2-1.0.X) 65.7532 Tj +[1 0 0 1 137.753 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.753 502.893 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 143.405 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.405 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.405 502.893 Td +/F134_0 9.9626 Tf +(0.9.5) 29.8878 Tj +[1 0 0 1 173.293 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.293 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.453 502.893 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 194 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -194 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +194 502.893 Td +/F134_0 9.9626 Tf +(0.9.0) 29.8878 Tj +[1 0 0 1 223.888 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -223.888 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +227.048 502.893 Td +/F130_0 9.9626 Tf +(use) 13.2801 Tj +-317 TJm +(e) 4.42339 Tj +15 TJm +(xactly) 24.3486 Tj +-317 TJm +(the) 12.1743 Tj +-318 TJm +(same) 20.4731 Tj +-317 TJm +(\002le) 12.7322 Tj +-317 TJm +(format) 26.5603 Tj +-317 TJm +(as) 8.29885 Tj +-318 TJm +(the) 12.1743 Tj +-317 TJm +(original) 30.9936 Tj +-317 TJm +(v) 4.9813 Tj +15 TJm +(ersion,) 26.8392 Tj +[1 0 0 1 455.801 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -455.801 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +455.801 502.893 Td +/F134_0 9.9626 Tf +(bzip2-0.1) 53.798 Tj +[1 0 0 1 509.599 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -509.599 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +509.599 502.893 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1023 TJm +(This) 17.7135 Tj +72 490.938 Td +(decision) 33.2053 Tj +-222 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-222 TJm +(made) 21.579 Tj +-222 TJm +(in) 7.7509 Tj +-221 TJm +(the) 12.1743 Tj +-222 TJm +(interests) 33.2053 Tj +-222 TJm +(of) 8.29885 Tj +-222 TJm +(stability) 32.1095 Tj +65 TJm +(.) 2.49065 Tj +-601 TJm +(Creating) 34.3112 Tj +-222 TJm +(yet) 12.1743 Tj +-222 TJm +(another) 29.8778 Tj +-222 TJm +(incompatible) 52.0247 Tj +-221 TJm +(compressed) 47.0334 Tj +-222 TJm +(\002le) 12.7322 Tj +-222 TJm +(format) 26.5603 Tj +-222 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-222 TJm +(create) 23.7807 Tj +72 478.983 Td +(further) 27.1082 Tj +-250 TJm +(confusion) 39.2925 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(disruption) 40.4083 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(users.) 22.9638 Tj +[1 0 0 1 72 476.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -467.194] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 457.396 Td +/F130_0 9.9626 Tf +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-234 TJm +(this) 14.396 Tj +-229 TJm +(is) 6.64505 Tj +-230 TJm +(not) 12.7322 Tj +-229 TJm +(a) 4.42339 Tj +-230 TJm +(painless) 32.0995 Tj +-229 TJm +(decision.) 35.696 Tj +-606 TJm +(De) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(elopment) 37.0808 Tj +-230 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-230 TJm +(since) 20.4731 Tj +-229 TJm +(the) 12.1743 Tj +-230 TJm +(release) 27.6562 Tj +-229 TJm +(of) 8.29885 Tj +[1 0 0 1 407.317 457.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -407.317 -457.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +407.317 457.396 Td +/F134_0 9.9626 Tf +(bzip2-0.1) 53.798 Tj +[1 0 0 1 461.115 457.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.115 -457.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +463.402 457.396 Td +/F130_0 9.9626 Tf +(in) 7.7509 Tj +-230 TJm +(August) 28.782 Tj +-229 TJm +(1997) 19.9252 Tj +-230 TJm +(has) 13.2801 Tj +72 445.441 Td +(sho) 13.8381 Tj +25 TJm +(wn) 12.1743 Tj +-226 TJm +(comple) 29.3299 Tj +15 TJm +(xities) 21.589 Tj +-226 TJm +(in) 7.7509 Tj +-225 TJm +(the) 12.1743 Tj +-226 TJm +(\002le) 12.7322 Tj +-226 TJm +(format) 26.5603 Tj +-226 TJm +(which) 24.3486 Tj +-226 TJm +(slo) 11.6264 Tj +25 TJm +(w) 7.193 Tj +-225 TJm +(do) 9.9626 Tj +25 TJm +(wn) 12.1743 Tj +-226 TJm +(decompression) 59.7656 Tj +-226 TJm +(and,) 16.8766 Tj +-231 TJm +(in) 7.7509 Tj +-226 TJm +(retrospect,) 41.7732 Tj +-230 TJm +(are) 12.1643 Tj +-226 TJm +(unnecessary) 48.6872 Tj +65 TJm +(.) 2.49065 Tj +-604 TJm +(These) 23.7907 Tj +-226 TJm +(are:) 14.9339 Tj +[1 0 0 1 72 443.284] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.0613] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -414.222] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 414.222 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 414.222] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -414.222] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 414.222 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-265 TJm +(run-length) 41.5042 Tj +-266 TJm +(encoder) 31.5316 Tj +40 TJm +(,) 2.49065 Tj +-269 TJm +(which) 24.3486 Tj +-265 TJm +(is) 6.64505 Tj +-265 TJm +(the) 12.1743 Tj +-266 TJm +(\002rst) 15.5018 Tj +-265 TJm +(of) 8.29885 Tj +-265 TJm +(the) 12.1743 Tj +-266 TJm +(compression) 50.3609 Tj +-265 TJm +(transformations,) 65.0259 Tj +-269 TJm +(is) 6.64505 Tj +-265 TJm +(entirely) 30.4357 Tj +-266 TJm +(irrele) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant.) 14.6649 Tj +-711 TJm +(The) 15.4918 Tj +-266 TJm +(original) 30.9936 Tj +86.944 402.267 Td +(purpose) 31.5416 Tj +-301 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-301 TJm +(to) 7.7509 Tj +-301 TJm +(protect) 27.6661 Tj +-301 TJm +(the) 12.1743 Tj +-301 TJm +(sorting) 27.6761 Tj +-301 TJm +(algorithm) 38.7446 Tj +-301 TJm +(from) 19.3673 Tj +-301 TJm +(the) 12.1743 Tj +-301 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-301 TJm +(w) 7.193 Tj +10 TJm +(orst) 14.9439 Tj +-301 TJm +(case) 17.1456 Tj +-301 TJm +(input:) 23.2527 Tj +-412 TJm +(a) 4.42339 Tj +-301 TJm +(string) 22.6948 Tj +-301 TJm +(of) 8.29885 Tj +-301 TJm +(repeated) 33.7433 Tj +-301 TJm +(symbols.) 35.706 Tj +-927 TJm +(But) 14.396 Tj +86.944 390.312 Td +(algorithm) 38.7446 Tj +-274 TJm +(steps) 19.9252 Tj +-275 TJm +(Q6a) 16.5977 Tj +-274 TJm +(and) 14.386 Tj +-274 TJm +(Q6b) 17.1556 Tj +-275 TJm +(in) 7.7509 Tj +-274 TJm +(the) 12.1743 Tj +-274 TJm +(original) 30.9936 Tj +-275 TJm +(Burro) 23.2427 Tj +25 TJm +(ws-Wheel) 40.3884 Tj +1 TJm +(er) 7.74094 Tj +-275 TJm +(technical) 35.965 Tj +-274 TJm +(report) 23.7907 Tj +-274 TJm +(\(SRC-124\)) 43.7259 Tj +-275 TJm +(sho) 13.8381 Tj +25 TJm +(w) 7.193 Tj +-274 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-274 TJm +(repeats) 28.2141 Tj +-275 TJm +(can) 13.8281 Tj +86.944 378.357 Td +(be) 9.40469 Tj +-250 TJm +(handled) 31.5416 Tj +-250 TJm +(without) 30.4457 Tj +-250 TJm +(dif) 11.0684 Tj +25 TJm +(\002culty) 25.4644 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(block) 22.1369 Tj +-250 TJm +(sorting.) 30.1668 Tj +[1 0 0 1 269.617 378.357] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -197.617 -21.5867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -356.77] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 356.77 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 356.77] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -356.77] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 356.77 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-293 TJm +(randomisation) 57.006 Tj +-293 TJm +(mechanism) 45.3796 Tj +-293 TJm +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-294 TJm +(really) 22.6848 Tj +-293 TJm +(need) 18.8094 Tj +-293 TJm +(to) 7.7509 Tj +-293 TJm +(be) 9.40469 Tj +-293 TJm +(there.) 22.4059 Tj +-879 TJm +(Udi) 14.9439 Tj +-294 TJm +(Manber) 30.9837 Tj +-293 TJm +(and) 14.386 Tj +-293 TJm +(Gene) 21.0211 Tj +-293 TJm +(Myers) 25.4544 Tj +-293 TJm +(published) 38.7446 Tj +-294 TJm +(a) 4.42339 Tj +-293 TJm +(suf) 12.1743 Tj +25 TJm +(\002x) 10.5205 Tj +86.944 344.815 Td +(array) 20.4632 Tj +-238 TJm +(construction) 49.2551 Tj +-239 TJm +(algorithm) 38.7446 Tj +-238 TJm +(a) 4.42339 Tj +-238 TJm +(fe) 7.74094 Tj +25 TJm +(w) 7.193 Tj +-239 TJm +(years) 21.0211 Tj +-238 TJm +(back,) 21.3 Tj +-241 TJm +(which) 24.3486 Tj +-238 TJm +(can) 13.8281 Tj +-238 TJm +(be) 9.40469 Tj +-239 TJm +(emplo) 24.9065 Tj +10 TJm +(yed) 14.386 Tj +-238 TJm +(to) 7.7509 Tj +-238 TJm +(sort) 14.9439 Tj +-239 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-238 TJm +(block,) 24.6275 Tj +-241 TJm +(no) 9.9626 Tj +-238 TJm +(matter) 25.4544 Tj +-238 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-239 TJm +(repetiti) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +86.944 332.86 Td +(in) 7.7509 Tj +-229 TJm +(O\(N) 17.7035 Tj +-230 TJm +(log) 12.7322 Tj +-229 TJm +(N\)) 10.5105 Tj +-230 TJm +(time.) 20.2042 Tj +-606 TJm +(Subsequent) 45.9375 Tj +-230 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-229 TJm +(by) 9.9626 Tj +-230 TJm +(K) 7.193 Tj +15 TJm +(unihik) 25.4644 Tj +10 TJm +(o) 4.9813 Tj +-229 TJm +(Sadakane) 38.1767 Tj +-229 TJm +(has) 13.2801 Tj +-230 TJm +(produced) 37.0708 Tj +-229 TJm +(a) 4.42339 Tj +-230 TJm +(deri) 15.4918 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ati) 9.9626 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-229 TJm +(O\(N) 17.7035 Tj +-230 TJm +(\(log) 16.0497 Tj +-229 TJm +(N\)^2\)) 23.4818 Tj +-230 TJm +(algorithm) 38.7446 Tj +86.944 320.905 Td +(which) 24.3486 Tj +-250 TJm +(usually) 28.782 Tj +-250 TJm +(outperforms) 48.6972 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(Manber) 30.9837 Tj +20 TJm +(-Myers) 28.772 Tj +-250 TJm +(algorithm.) 41.2352 Tj +[1 0 0 1 314.189 320.905] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -242.189 -11.7883] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -309.116] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 299.318 Td +/F130_0 9.9626 Tf +(I) 3.31755 Tj +-248 TJm +(could) 22.1369 Tj +-248 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-248 TJm +(changed) 33.1954 Tj +-248 TJm +(to) 7.7509 Tj +-248 TJm +(Sadakane') 41.4942 Tj +55 TJm +(s) 3.87545 Tj +-248 TJm +(algorithm,) 41.2352 Tj +-249 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-248 TJm +(I) 3.31755 Tj +-248 TJm +(\002nd) 15.5018 Tj +-248 TJm +(it) 5.53921 Tj +-248 TJm +(to) 7.7509 Tj +-248 TJm +(be) 9.40469 Tj +-248 TJm +(slo) 11.6264 Tj +25 TJm +(wer) 14.9339 Tj +-248 TJm +(than) 17.1556 Tj +[1 0 0 1 392.444 299.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.444 -299.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.444 299.318 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 422.332 299.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.332 -299.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +422.332 299.318 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +-248 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +-248 TJm +(algorithm) 38.7446 Tj +-248 TJm +(for) 11.6164 Tj +-248 TJm +(most) 19.3773 Tj +86.944 287.363 Td +(inputs,) 26.8492 Tj +-370 TJm +(and) 14.386 Tj +-345 TJm +(the) 12.1743 Tj +-346 TJm +(randomisation) 57.006 Tj +-346 TJm +(mechanism) 45.3796 Tj +-345 TJm +(protects) 31.5416 Tj +-346 TJm +(adequately) 43.158 Tj +-345 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-346 TJm +(bad) 14.386 Tj +-346 TJm +(cases.) 23.5117 Tj +-1194 TJm +(I) 3.31755 Tj +-345 TJm +(didn') 21.031 Tj +18 TJm +(t) 2.7696 Tj +-346 TJm +(think) 20.4831 Tj +-346 TJm +(it) 5.53921 Tj +-345 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-346 TJm +(a) 4.42339 Tj +-346 TJm +(good) 19.9252 Tj +86.944 275.408 Td +(tradeof) 28.2141 Tj +25 TJm +(f) 3.31755 Tj +-262 TJm +(to) 7.7509 Tj +-261 TJm +(mak) 17.1556 Tj +10 TJm +(e.) 6.91404 Tj +-690 TJm +(P) 5.53921 Tj +15 TJm +(artly) 18.2614 Tj +-262 TJm +(this) 14.396 Tj +-261 TJm +(is) 6.64505 Tj +-262 TJm +(due) 14.386 Tj +-261 TJm +(to) 7.7509 Tj +-262 TJm +(the) 12.1743 Tj +-262 TJm +(f) 3.31755 Tj +10 TJm +(act) 11.6164 Tj +-261 TJm +(that) 14.9439 Tj +-262 TJm +(I) 3.31755 Tj +-261 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-262 TJm +(not) 12.7322 Tj +-262 TJm +(\003ooded) 29.8878 Tj +-261 TJm +(with) 17.7135 Tj +-262 TJm +(email) 22.1369 Tj +-261 TJm +(complaints) 43.7259 Tj +-262 TJm +(about) 22.1369 Tj +[1 0 0 1 479.557 275.408] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -479.557 -275.408] cm +[1 0 0 1 0 0] Tm +0 0 Td +479.557 275.408 Td +/F134_0 9.9626 Tf +(bzip2-0.1) 53.798 Tj +[1 0 0 1 533.355 275.408] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -533.355 -275.408] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.355 275.408 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +86.944 263.453 Td +(performance) 50.341 Tj +-250 TJm +(on) 9.9626 Tj +-250 TJm +(repetiti) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(data,) 19.0883 Tj +-250 TJm +(so) 8.85675 Tj +-250 TJm +(perhaps) 30.9837 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(isn') 14.9439 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(problem) 33.2053 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(real) 14.9339 Tj +-250 TJm +(inputs.) 26.8492 Tj +[1 0 0 1 72 261.296] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -251.664] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 241.866 Td +/F130_0 9.9626 Tf +(Probably) 35.9749 Tj +-289 TJm +(the) 12.1743 Tj +-288 TJm +(best) 16.0497 Tj +-289 TJm +(long-term) 39.2925 Tj +-289 TJm +(solution,) 34.6001 Tj +-298 TJm +(and) 14.386 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(one) 14.386 Tj +-288 TJm +(I) 3.31755 Tj +-289 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-289 TJm +(incorporated) 50.351 Tj +-288 TJm +(into) 15.5018 Tj +-289 TJm +(0.9.5) 19.9252 Tj +-289 TJm +(and) 14.386 Tj +-288 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +14 TJm +(e,) 6.91404 Tj +-298 TJm +(is) 6.64505 Tj +-289 TJm +(to) 7.7509 Tj +-288 TJm +(use) 13.2801 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +86.944 229.911 Td +(sorting) 27.6761 Tj +-451 TJm +(algorithm) 38.7446 Tj +-452 TJm +(initially) 31.0036 Tj +65 TJm +(,) 2.49065 Tj +-501 TJm +(and) 14.386 Tj +-452 TJm +(f) 3.31755 Tj +10 TJm +(all) 9.9626 Tj +-451 TJm +(back) 18.8094 Tj +-452 TJm +(to) 7.7509 Tj +-451 TJm +(a) 4.42339 Tj +-451 TJm +(O\(N) 17.7035 Tj +-452 TJm +(\(log) 16.0497 Tj +-451 TJm +(N\)^2\)) 23.4818 Tj +-451 TJm +(algorithm) 38.7446 Tj +-452 TJm +(if) 6.08715 Tj +-451 TJm +(the) 12.1743 Tj +-452 TJm +(standard) 33.7533 Tj +-451 TJm +(algorithm) 38.7446 Tj +-451 TJm +(gets) 16.0497 Tj +-452 TJm +(into) 15.5018 Tj +86.944 217.956 Td +(dif) 11.0684 Tj +25 TJm +(\002culties.) 34.0422 Tj +[1 0 0 1 72 217.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.4871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -196.369] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 196.369 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 196.369] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -196.369] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 196.369 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-299 TJm +(compressed) 47.0334 Tj +-299 TJm +(\002le) 12.7322 Tj +-299 TJm +(format) 26.5603 Tj +-299 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-300 TJm +(ne) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-299 TJm +(designed) 35.417 Tj +-299 TJm +(to) 7.7509 Tj +-299 TJm +(be) 9.40469 Tj +-299 TJm +(handled) 31.5416 Tj +-299 TJm +(by) 9.9626 Tj +-299 TJm +(a) 4.42339 Tj +-299 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-312 TJm +(and) 14.386 Tj +-299 TJm +(I) 3.31755 Tj +-299 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-299 TJm +(had) 14.386 Tj +-299 TJm +(to) 7.7509 Tj +-299 TJm +(jump) 20.4831 Tj +-300 TJm +(though) 27.6761 Tj +-299 TJm +(some) 21.031 Tj +86.944 184.414 Td +(hoops) 23.8007 Tj +-278 TJm +(to) 7.7509 Tj +-277 TJm +(produce) 32.0895 Tj +-278 TJm +(an) 9.40469 Tj +-278 TJm +(ef) 7.74094 Tj +25 TJm +(\002cient) 24.9065 Tj +-277 TJm +(implementation) 62.5452 Tj +-278 TJm +(of) 8.29885 Tj +-278 TJm +(decompression.) 62.2563 Tj +-786 TJm +(It') 9.40469 Tj +55 TJm +(s) 3.87545 Tj +-278 TJm +(a) 4.42339 Tj +-277 TJm +(bit) 10.5205 Tj +-278 TJm +(hairy) 20.4731 Tj +65 TJm +(.) 2.49065 Tj +-786 TJm +(T) 6.08715 Tj +35 TJm +(ry) 8.29885 Tj +-278 TJm +(passing) 29.8878 Tj +[1 0 0 1 468.269 184.414] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468.269 -184.414] cm +[1 0 0 1 0 0] Tm +0 0 Td +468.269 184.414 Td +/F134_0 9.9626 Tf +(decompress.c) 71.7307 Tj +[1 0 0 1 540 184.414] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -184.414] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 172.459 Td +/F130_0 9.9626 Tf +(through) 30.9936 Tj +-268 TJm +(the) 12.1743 Tj +-268 TJm +(C) 6.64505 Tj +-268 TJm +(preprocessor) 50.8989 Tj +-269 TJm +(and) 14.386 Tj +-268 TJm +(you') 18.2614 Tj +10 TJm +(ll) 5.53921 Tj +-268 TJm +(see) 12.7222 Tj +-268 TJm +(what) 19.3673 Tj +-268 TJm +(I) 3.31755 Tj +-268 TJm +(mean.) 24.0696 Tj +-729 TJm +(Much) 23.2427 Tj +-268 TJm +(of) 8.29885 Tj +-269 TJm +(this) 14.396 Tj +-268 TJm +(comple) 29.3299 Tj +15 TJm +(xity) 15.5018 Tj +-268 TJm +(could) 22.1369 Tj +-268 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-268 TJm +(been) 18.8094 Tj +-268 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +20 TJm +(oided) 22.1369 Tj +-269 TJm +(if) 6.08715 Tj +-268 TJm +(the) 12.1743 Tj +86.944 160.503 Td +(compressed) 47.0334 Tj +-250 TJm +(size) 15.4918 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(each) 18.2515 Tj +-250 TJm +(block) 22.1369 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(recorded) 34.8492 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 368.754 160.503] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -296.754 -21.5867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -138.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 138.917 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 138.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -138.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 138.917 Td +/F130_0 9.9626 Tf +(An) 12.1743 Tj +-250 TJm +(Adler) 22.6848 Tj +20 TJm +(-32) 13.2801 Tj +-250 TJm +(checksum,) 42.3311 Tj +-250 TJm +(rather) 23.2328 Tj +-250 TJm +(than) 17.1556 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(CRC32) 29.8978 Tj +-250 TJm +(checksum,) 42.3311 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(compute.) 36.8018 Tj +[1 0 0 1 424.934 138.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -352.934 -11.7883] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -127.128] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 117.33 Td +/F130_0 9.9626 Tf +(It) 6.08715 Tj +-349 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-349 TJm +(be) 9.40469 Tj +-349 TJm +(f) 3.31755 Tj +10 TJm +(air) 10.5105 Tj +-348 TJm +(to) 7.7509 Tj +-349 TJm +(say) 13.2801 Tj +-349 TJm +(that) 14.9439 Tj +-349 TJm +(the) 12.1743 Tj +[1 0 0 1 201.979 117.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -201.979 -117.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.979 117.33 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 231.867 117.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -231.867 -117.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +235.342 117.33 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-349 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-349 TJm +(frozen) 25.4445 Tj +-348 TJm +(before) 25.4445 Tj +-349 TJm +(I) 3.31755 Tj +-349 TJm +(properly) 33.7533 Tj +-349 TJm +(and) 14.386 Tj +-349 TJm +(fully) 18.8194 Tj +-349 TJm +(understood) 44.2738 Tj +-348 TJm +(the) 12.1743 Tj +-349 TJm +(performance) 50.341 Tj +72 105.375 Td +(consequences) 54.7744 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(doing) 22.6948 Tj +-250 TJm +(so.) 11.3474 Tj +[1 0 0 1 72 103.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -93.5867] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 83.7883 Td +/F130_0 9.9626 Tf +(Impro) 24.3486 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ements) 28.224 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(able) 16.5977 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(incorporate) 45.3697 Tj +-250 TJm +(into) 15.5018 Tj +-250 TJm +(0.9.0,) 22.4159 Tj +-250 TJm +(despite) 28.224 Tj +-250 TJm +(using) 21.589 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(same) 20.4731 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(format,) 29.0509 Tj +-250 TJm +(are:) 14.9339 Tj +[1 0 0 1 72 81.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -30.7796] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(31) 9.9626 Tj +[1 0 0 1 453.269 50.8519] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 35 35 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 116.328 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.4 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.728 749.245 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 266.071 749.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -7.0936] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -31.5168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 710.037 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 710.037 Td +/F130_0 9.9626 Tf +(Single) 25.4644 Tj +-202 TJm +(array) 20.4632 Tj +-201 TJm +(implementation) 62.5452 Tj +-202 TJm +(of) 8.29885 Tj +-202 TJm +(the) 12.1743 Tj +-201 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(erse) 16.0398 Tj +-202 TJm +(BWT) 22.1369 Tj +74 TJm +(.) 2.49065 Tj +-403 TJm +(This) 17.7135 Tj +-202 TJm +(signi\002cantly) 49.2651 Tj +-201 TJm +(speeds) 26.5603 Tj +-202 TJm +(up) 9.9626 Tj +-202 TJm +(decompression,) 62.2563 Tj +-211 TJm +(presumably) 46.4855 Tj +-202 TJm +(because) 31.5316 Tj +86.944 698.082 Td +(it) 5.53921 Tj +-250 TJm +(reduces) 30.4258 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(cache) 22.6749 Tj +-250 TJm +(misses.) 29.0609 Tj +[1 0 0 1 240.496 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -168.496 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 676.164 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 676.164 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(aster) 18.8094 Tj +-314 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(erse) 16.0398 Tj +-315 TJm +(MTF) 20.4831 Tj +-314 TJm +(transform) 38.7346 Tj +-315 TJm +(for) 11.6164 Tj +-314 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-315 TJm +(MTF) 20.4831 Tj +-314 TJm +(v) 4.9813 Tj +25 TJm +(alues.) 22.9638 Tj +-504 TJm +(The) 15.4918 Tj +-314 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-314 TJm +(implementation) 62.5452 Tj +-315 TJm +(is) 6.64505 Tj +-314 TJm +(based) 22.6848 Tj +-315 TJm +(on) 9.9626 Tj +-314 TJm +(the) 12.1743 Tj +-315 TJm +(notion) 25.4644 Tj +-314 TJm +(of) 8.29885 Tj +-315 TJm +(sliding) 27.1282 Tj +86.944 664.209 Td +(blocks) 26.0123 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues.) 22.9638 Tj +[1 0 0 1 153.932 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -81.9321 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 642.291 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 642.291 Td +/F134_0 9.9626 Tf +(bzip2-0.9.0) 65.7532 Tj +[1 0 0 1 152.697 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -152.697 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.412 642.291 Td +/F130_0 9.9626 Tf +(no) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-272 TJm +(reads) 21.0211 Tj +-273 TJm +(and) 14.386 Tj +-272 TJm +(writes) 24.3486 Tj +-273 TJm +(\002les) 16.6077 Tj +-272 TJm +(with) 17.7135 Tj +[1 0 0 1 282.68 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.68 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +282.68 642.291 Td +/F134_0 9.9626 Tf +(fread) 29.8878 Tj +[1 0 0 1 312.568 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -312.568 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +315.282 642.291 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 332.383 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -332.383 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +332.383 642.291 Td +/F134_0 9.9626 Tf +(fwrite) 35.8654 Tj +[1 0 0 1 368.248 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -368.248 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +368.248 642.291 Td +/F130_0 9.9626 Tf +(;) 2.7696 Tj +-284 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-272 TJm +(0.1) 12.4533 Tj +-273 TJm +(used) 18.2614 Tj +[1 0 0 1 441.882 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.882 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.882 642.291 Td +/F134_0 9.9626 Tf +(putc) 23.9102 Tj +[1 0 0 1 465.792 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -465.792 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +468.507 642.291 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 485.607 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -485.607 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +485.607 642.291 Td +/F134_0 9.9626 Tf +(getc) 23.9102 Tj +[1 0 0 1 509.517 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -509.517 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +509.517 642.291 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-755 TJm +(Duh!) 20.4731 Tj +86.944 630.336 Td +(W) 9.40469 Tj +80 TJm +(ell,) 12.4533 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(li) 5.53921 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(learn.) 22.4059 Tj +[1 0 0 1 184.248 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -112.248 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -618.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 608.418 Td +/F130_0 9.9626 Tf +(Further) 29.3299 Tj +-304 TJm +(ahead,) 25.7234 Tj +-318 TJm +(it) 5.53921 Tj +-305 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-304 TJm +(be) 9.40469 Tj +-305 TJm +(nice) 16.5977 Tj +-304 TJm +(to) 7.7509 Tj +-305 TJm +(be) 9.40469 Tj +-304 TJm +(able) 16.5977 Tj +-304 TJm +(to) 7.7509 Tj +-305 TJm +(do) 9.9626 Tj +-304 TJm +(random) 30.4357 Tj +-305 TJm +(access) 25.4445 Tj +-304 TJm +(into) 15.5018 Tj +-305 TJm +(\002les.) 19.0983 Tj +-946 TJm +(This) 17.7135 Tj +-305 TJm +(will) 15.5018 Tj +-304 TJm +(require) 28.2141 Tj +-304 TJm +(some) 21.031 Tj +-305 TJm +(careful) 27.6562 Tj +-304 TJm +(design) 26.0123 Tj +-305 TJm +(of) 8.29885 Tj +72 596.463 Td +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(formats.) 32.9264 Tj +[1 0 0 1 72 594.306] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -584.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 561.71 Td +/F122_0 20.6585 Tf +(4.2.) 34.4584 Tj +-278 TJm +(P) 13.7792 Tj +40 TJm +(or) 20.6585 Tj +-20 TJm +(tability) 66.5823 Tj +-278 TJm +(issues) 64.3099 Tj +[1 0 0 1 72 557.434] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -547.472] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 539.793 Td +/F130_0 9.9626 Tf +(After) 21.0211 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(consideration,) 56.1691 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(decided) 30.9837 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(GNU) 21.579 Tj +[1 0 0 1 303.231 539.793] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.231 -539.793] cm +[1 0 0 1 0 0] Tm +0 0 Td +303.231 539.793 Td +/F134_0 9.9626 Tf +(autoconf) 47.8205 Tj +[1 0 0 1 351.052 539.793] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -351.052 -539.793] cm +[1 0 0 1 0 0] Tm +0 0 Td +353.542 539.793 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(con\002gure) 37.6287 Tj +-250 TJm +(0.9.5) 19.9252 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(1.0.) 14.9439 Tj +[1 0 0 1 72 537.636] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -527.673] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 517.875 Td +/F134_0 9.9626 Tf +(autoconf) 47.8205 Tj +[1 0 0 1 119.821 517.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.821 -517.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.821 517.875 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-502 TJm +(admirable) 39.8404 Tj +-452 TJm +(and) 14.386 Tj +-452 TJm +(w) 7.193 Tj +10 TJm +(onderful) 33.7533 Tj +-452 TJm +(though) 27.6761 Tj +-452 TJm +(it) 5.53921 Tj +-452 TJm +(is,) 9.1357 Tj +-502 TJm +(mainly) 27.6761 Tj +-452 TJm +(assists) 25.4644 Tj +-452 TJm +(with) 17.7135 Tj +-452 TJm +(portability) 41.5142 Tj +-452 TJm +(problems) 37.0808 Tj +-452 TJm +(between) 33.1954 Tj +-452 TJm +(Unix-lik) 33.7633 Tj +10 TJm +(e) 4.42339 Tj +72 505.92 Td +(platforms.) 40.6773 Tj +-1398 TJm +(But) 14.396 Tj +[1 0 0 1 144.784 505.92] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -144.784 -505.92] cm +[1 0 0 1 0 0] Tm +0 0 Td +144.784 505.92 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 174.672 505.92] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.672 -505.92] cm +[1 0 0 1 0 0] Tm +0 0 Td +178.455 505.92 Td +/F130_0 9.9626 Tf +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-380 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-379 TJm +(much) 22.1369 Tj +-380 TJm +(in) 7.7509 Tj +-380 TJm +(the) 12.1743 Tj +-379 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-380 TJm +(of) 8.29885 Tj +-380 TJm +(portability) 41.5142 Tj +-379 TJm +(problems) 37.0808 Tj +-380 TJm +(on) 9.9626 Tj +-380 TJm +(Unix;) 22.6948 Tj +-444 TJm +(most) 19.3773 Tj +-380 TJm +(of) 8.29885 Tj +-380 TJm +(the) 12.1743 Tj +-379 TJm +(dif) 11.0684 Tj +25 TJm +(\002culties) 31.5516 Tj +72 493.964 Td +(appear) 26.5503 Tj +-297 TJm +(when) 21.579 Tj +-296 TJm +(po) 9.9626 Tj +-1 TJm +(r) 3.31755 Tj +1 TJm +(ting) 15.5018 Tj +-297 TJm +(to) 7.7509 Tj +-297 TJm +(the) 12.1743 Tj +-297 TJm +(Mac,) 20.1942 Tj +-308 TJm +(or) 8.29885 Tj +-297 TJm +(to) 7.7509 Tj +-297 TJm +(Microsoft') 42.61 Tj +55 TJm +(s) 3.87545 Tj +-296 TJm +(operating) 37.6287 Tj +-297 TJm +(systems.) 34.0422 Tj +[1 0 0 1 361.339 493.964] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -361.339 -493.964] cm +[1 0 0 1 0 0] Tm +0 0 Td +361.339 493.964 Td +/F134_0 9.9626 Tf +(autoconf) 47.8205 Tj +[1 0 0 1 409.16 493.964] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.16 -493.964] cm +[1 0 0 1 0 0] Tm +0 0 Td +412.116 493.964 Td +/F130_0 9.9626 Tf +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-297 TJm +(help) 17.1556 Tj +-296 TJm +(in) 7.7509 Tj +-297 TJm +(those) 21.031 Tj +-297 TJm +(cases,) 23.5117 Tj +-308 TJm +(and) 14.386 Tj +72 482.009 Td +(brings) 24.9065 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(whole) 24.3486 Tj +-250 TJm +(load) 17.1556 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(comple) 29.3299 Tj +15 TJm +(xity) 15.5018 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 479.852] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -469.89] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 460.091 Td +/F130_0 9.9626 Tf +(Most) 20.4831 Tj +-392 TJm +(people) 26.5603 Tj +-392 TJm +(should) 26.5703 Tj +-393 TJm +(be) 9.40469 Tj +-392 TJm +(able) 16.5977 Tj +-392 TJm +(to) 7.7509 Tj +-392 TJm +(compile) 32.0995 Tj +-393 TJm +(the) 12.1743 Tj +-392 TJm +(library) 26.5603 Tj +-392 TJm +(and) 14.386 Tj +-392 TJm +(program) 33.7533 Tj +-393 TJm +(under) 22.6848 Tj +-392 TJm +(Unix) 19.9252 Tj +-392 TJm +(straight) 29.8878 Tj +-392 TJm +(out-of-the-box,) 60.5925 Tj +-428 TJm +(so) 8.85675 Tj +-392 TJm +(to) 7.7509 Tj +-393 TJm +(speak,) 25.1755 Tj +72 448.136 Td +(especially) 39.8404 Tj +-250 TJm +(if) 6.08715 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(GNU) 21.579 Tj +-250 TJm +(C) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable.) 29.0509 Tj +[1 0 0 1 72 445.979] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -436.017] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 426.218 Td +/F130_0 9.9626 Tf +(There) 23.2328 Tj +-259 TJm +(are) 12.1643 Tj +-258 TJm +(a) 4.42339 Tj +-259 TJm +(couple) 26.5603 Tj +-258 TJm +(of) 8.29885 Tj +[1 0 0 1 159.561 426.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.561 -426.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.561 426.218 Td +/F134_0 9.9626 Tf +(__inline__) 59.7756 Tj +[1 0 0 1 219.337 426.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -219.337 -426.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.913 426.218 Td +/F130_0 9.9626 Tf +(directi) 25.4544 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-259 TJm +(in) 7.7509 Tj +-258 TJm +(the) 12.1743 Tj +-259 TJm +(code.) 21.3 Tj +-671 TJm +(GNU) 21.579 Tj +-259 TJm +(C) 6.64505 Tj +-258 TJm +(\() 3.31755 Tj +[1 0 0 1 352.587 426.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -352.587 -426.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +352.587 426.218 Td +/F134_0 9.9626 Tf +(gcc) 17.9327 Tj +[1 0 0 1 370.52 426.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -370.52 -426.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +370.52 426.218 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-259 TJm +(should) 26.5703 Tj +-258 TJm +(be) 9.40469 Tj +-259 TJm +(able) 16.5977 Tj +-258 TJm +(to) 7.7509 Tj +-259 TJm +(handle) 26.5603 Tj +-259 TJm +(them.) 22.4159 Tj +-671 TJm +(If) 6.63509 Tj +-259 TJm +(you') 18.2614 Tj +50 TJm +(re) 7.74094 Tj +72 414.263 Td +(not) 12.7322 Tj +-279 TJm +(using) 21.589 Tj +-279 TJm +(GNU) 21.579 Tj +-279 TJm +(C,) 9.1357 Tj +-279 TJm +(your) 18.2614 Tj +-279 TJm +(C) 6.64505 Tj +-279 TJm +(compiler) 35.417 Tj +-279 TJm +(shouldn') 34.8691 Tj +18 TJm +(t) 2.7696 Tj +-279 TJm +(see) 12.7222 Tj +-279 TJm +(them) 19.9252 Tj +-279 TJm +(at) 7.193 Tj +-279 TJm +(all.) 12.4533 Tj +-794 TJm +(If) 6.63509 Tj +-279 TJm +(your) 18.2614 Tj +-279 TJm +(compiler) 35.417 Tj +-279 TJm +(does,) 20.7521 Tj +-286 TJm +(for) 11.6164 Tj +-279 TJm +(some) 21.031 Tj +-279 TJm +(reason,) 28.493 Tj +-287 TJm +(see) 12.7222 Tj +-279 TJm +(them) 19.9252 Tj +-279 TJm +(and) 14.386 Tj +72 402.308 Td +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-283 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-283 TJm +(them,) 22.4159 Tj +-291 TJm +(just) 14.396 Tj +[1 0 0 1 164.167 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.167 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.167 402.308 Td +/F134_0 9.9626 Tf +(#define) 41.8429 Tj +[1 0 0 1 206.01 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.8196 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -208.829 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.829 402.308 Td +/F134_0 9.9626 Tf +(__inline__) 59.7756 Tj +[1 0 0 1 268.605 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -268.605 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +271.425 402.308 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-283 TJm +(be) 9.40469 Tj +[1 0 0 1 294.22 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.22 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.22 402.308 Td +/F134_0 9.9626 Tf +(/) 5.97756 Tj +300.197 400.565 Td +(*) 5.97756 Tj +-600 TJm +(*) 5.97756 Tj +318.13 402.308 Td +(/) 5.97756 Tj +[1 0 0 1 324.108 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -324.108 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +324.108 402.308 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-818 TJm +(One) 16.5977 Tj +-283 TJm +(easy) 17.7035 Tj +-283 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-283 TJm +(to) 7.7509 Tj +-283 TJm +(do) 9.9626 Tj +-283 TJm +(this) 14.396 Tj +-283 TJm +(is) 6.64505 Tj +-283 TJm +(to) 7.7509 Tj +-283 TJm +(compile) 32.0995 Tj +-283 TJm +(with) 17.7135 Tj +-283 TJm +(the) 12.1743 Tj +-283 TJm +(\003ag) 14.9439 Tj +[1 0 0 1 72 390.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -390.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 390.353 Td +/F134_0 9.9626 Tf +(-D__inline__=) 77.7083 Tj +[1 0 0 1 149.709 390.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -390.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +149.709 390.353 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(understood) 44.2738 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(most) 19.3773 Tj +-250 TJm +(Unix) 19.9252 Tj +-250 TJm +(compilers.) 41.7831 Tj +[1 0 0 1 72 388.196] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -378.233] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 368.435 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-321 TJm +(you) 14.9439 Tj +-321 TJm +(still) 14.9539 Tj +-322 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-321 TJm +(dif) 11.0684 Tj +25 TJm +(\002culties,) 34.0422 Tj +-339 TJm +(try) 11.0684 Tj +-321 TJm +(compiling) 40.4083 Tj +-321 TJm +(with) 17.7135 Tj +-322 TJm +(t) 2.7696 Tj +1 TJm +(he) 9.40469 Tj +-322 TJm +(macro) 24.8965 Tj +[1 0 0 1 310.295 368.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -310.295 -368.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.295 368.435 Td +/F134_0 9.9626 Tf +(BZ_STRICT_ANSI) 83.6858 Tj +[1 0 0 1 393.981 368.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -393.981 -368.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +397.18 368.435 Td +/F130_0 9.9626 Tf +(de\002ned.) 31.8205 Tj +-524 TJm +(This) 17.7135 Tj +-321 TJm +(should) 26.5703 Tj +-321 TJm +(enable) 26.0024 Tj +-321 TJm +(you) 14.9439 Tj +-322 TJm +(to) 7.7509 Tj +72 356.48 Td +(b) 4.9813 Tj +20 TJm +(uild) 15.5018 Tj +-321 TJm +(the) 12.1743 Tj +-321 TJm +(library) 26.5603 Tj +-322 TJm +(in) 7.7509 Tj +-321 TJm +(a) 4.42339 Tj +-321 TJm +(strictly) 27.6761 Tj +-321 TJm +(ANSI) 23.2427 Tj +-321 TJm +(compliant) 39.8504 Tj +-322 TJm +(en) 9.40469 Tj +40 TJm +(vironment.) 43.4469 Tj +-1047 TJm +(Building) 34.8791 Tj +-321 TJm +(the) 12.1743 Tj +-321 TJm +(program) 33.7533 Tj +-322 TJm +(itself) 19.9252 Tj +-321 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-321 TJm +(this) 14.396 Tj +-321 TJm +(is) 6.64505 Tj +-321 TJm +(dangerous) 40.9463 Tj +-322 TJm +(and) 14.386 Tj +72 344.525 Td +(not) 12.7322 Tj +-260 TJm +(supported,) 41.7831 Tj +-263 TJm +(since) 20.4731 Tj +-260 TJm +(you) 14.9439 Tj +-260 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +[1 0 0 1 204.498 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.498 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.498 344.525 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 234.386 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.386 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.386 344.525 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +-260 TJm +(checks) 27.1082 Tj +-260 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-261 TJm +(compressi) 40.3983 Tj +1 TJm +(ng) 9.9626 Tj +-261 TJm +(directories,) 44.5428 Tj +-262 TJm +(symbolic) 36.5329 Tj +-261 TJm +(links,) 21.8679 Tj +-262 TJm +(de) 9.40469 Tj +25 TJm +(vices,) 22.9638 Tj +-263 TJm +(and) 14.386 Tj +-260 TJm +(other) 20.4731 Tj +72 332.57 Td +(not-really-a-\002le) 62.5253 Tj +-250 TJm +(entities.) 31.2726 Tj +-620 TJm +(This) 17.7135 Tj +-250 TJm +(could) 22.1369 Tj +-250 TJm +(cause) 22.1269 Tj +-250 TJm +(\002lesystem) 40.4083 Tj +-250 TJm +(corruption!) 44.8217 Tj +[1 0 0 1 72 330.413] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -320.45] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 310.652 Td +/F130_0 9.9626 Tf +(One) 16.5977 Tj +-392 TJm +(other) 20.4731 Tj +-391 TJm +(thing:) 23.2527 Tj +-594 TJm +(if) 6.08715 Tj +-391 TJm +(you) 14.9439 Tj +-392 TJm +(create) 23.7807 Tj +-391 TJm +(a) 4.42339 Tj +[1 0 0 1 210.879 310.652] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.879 -310.652] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.879 310.652 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 240.767 310.652] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.767 -310.652] cm +[1 0 0 1 0 0] Tm +0 0 Td +244.669 310.652 Td +/F130_0 9.9626 Tf +(binary) 25.4544 Tj +-392 TJm +(for) 11.6164 Tj +-391 TJm +(public) 24.9065 Tj +-392 TJm +(distrib) 25.4644 Tj +20 TJm +(ution,) 22.9738 Tj +-427 TJm +(please) 24.8965 Tj +-392 TJm +(consider) 33.7533 Tj +-391 TJm +(linking) 28.234 Tj +-392 TJm +(it) 5.53921 Tj +-391 TJm +(statically) 35.9749 Tj +-392 TJm +(\() 3.31755 Tj +[1 0 0 1 522.067 310.652] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -522.067 -310.652] cm +[1 0 0 1 0 0] Tm +0 0 Td +522.067 310.652 Td +/F134_0 9.9626 Tf +(gcc) 17.9327 Tj +72 298.697 Td +(-static) 41.8429 Tj +[1 0 0 1 113.843 298.697] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -298.697] cm +[1 0 0 1 0 0] Tm +0 0 Td +113.843 298.697 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +-620 TJm +(This) 17.7135 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +20 TJm +(oids) 16.6077 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(sorts) 18.8194 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(library-v) 34.8591 Tj +15 TJm +(ersion) 24.3486 Tj +-250 TJm +(issues) 23.8007 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(others) 24.3486 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(encounter) 39.2825 Tj +-250 TJm +(later) 17.7035 Tj +-250 TJm +(on.) 12.4533 Tj +[1 0 0 1 72 296.54] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -286.577] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 276.779 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-296 TJm +(you) 14.9439 Tj +-296 TJm +(b) 4.9813 Tj +20 TJm +(uild) 15.5018 Tj +[1 0 0 1 122.709 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -122.709 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.709 276.779 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 152.596 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -152.596 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.545 276.779 Td +/F130_0 9.9626 Tf +(on) 9.9626 Tj +-296 TJm +(W) 9.40469 Tj +40 TJm +(in32,) 20.2042 Tj +-307 TJm +(you) 14.9439 Tj +-296 TJm +(must) 19.3773 Tj +-296 TJm +(set) 11.0684 Tj +[1 0 0 1 254.965 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.965 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +254.965 276.779 Td +/F134_0 9.9626 Tf +(BZ_UNIX) 41.8429 Tj +[1 0 0 1 296.808 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -296.808 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.756 276.779 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-296 TJm +(0) 4.9813 Tj +-296 TJm +(and) 14.386 Tj +[1 0 0 1 335.72 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -335.72 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +335.72 276.779 Td +/F134_0 9.9626 Tf +(BZ_LCCWIN32) 65.7532 Tj +[1 0 0 1 401.473 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -401.473 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +404.422 276.779 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-296 TJm +(1,) 7.47195 Tj +-307 TJm +(in) 7.7509 Tj +-296 TJm +(the) 12.1743 Tj +-296 TJm +(\002le) 12.7322 Tj +[1 0 0 1 467.159 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -467.159 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +467.159 276.779 Td +/F134_0 9.9626 Tf +(bzip2.c) 41.8429 Tj +[1 0 0 1 509.002 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -509.002 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +509.002 276.779 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-307 TJm +(before) 25.4445 Tj +72 264.824 Td +(compiling.) 42.899 Tj +-310 TJm +(Otherwise) 40.9463 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(resulting) 34.8691 Tj +-250 TJm +(binary) 25.4544 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-250 TJm +(correctly) 35.4071 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 262.667] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -252.704] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 230.071 Td +/F122_0 20.6585 Tf +(4.3.) 34.4584 Tj +-278 TJm +(Repor) 59.6824 Tj +-20 TJm +(ting) 37.867 Tj +-278 TJm +(b) 12.6223 Tj +20 TJm +(ugs) 36.7308 Tj +[1 0 0 1 72 225.474] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -215.512] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 208.153 Td +/F130_0 9.9626 Tf +(I) 3.31755 Tj +-228 TJm +(tried) 18.2614 Tj +-228 TJm +(pretty) 23.2427 Tj +-228 TJm +(hard) 17.7035 Tj +-228 TJm +(to) 7.7509 Tj +-228 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-228 TJm +(sure) 16.5977 Tj +[1 0 0 1 196.25 208.153] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.25 -208.153] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.25 208.153 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 226.138 208.153] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.138 -208.153] cm +[1 0 0 1 0 0] Tm +0 0 Td +228.409 208.153 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-228 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-228 TJm +(free,) 17.9725 Tj +-232 TJm +(both) 17.7135 Tj +-228 TJm +(by) 9.9626 Tj +-228 TJm +(design) 26.0123 Tj +-228 TJm +(and) 14.386 Tj +-228 TJm +(by) 9.9626 Tj +-228 TJm +(testing.) 29.0609 Tj +-605 TJm +(Hopefully) 40.3983 Tj +-228 TJm +(you') 18.2614 Tj +10 TJm +(ll) 5.53921 Tj +-228 TJm +(ne) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-228 TJm +(need) 18.8094 Tj +-228 TJm +(to) 7.7509 Tj +-228 TJm +(read) 17.1456 Tj +72 196.198 Td +(this) 14.396 Tj +-250 TJm +(section) 28.224 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(real.) 17.4246 Tj +[1 0 0 1 72 196.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -186.136] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 174.28 Td +/F130_0 9.9626 Tf +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-313 TJm +(if) 6.08715 Tj +[1 0 0 1 137.751 174.28] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.751 -174.28] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.751 174.28 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 167.639 174.28] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.639 -174.28] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.634 174.28 Td +/F130_0 9.9626 Tf +(dies) 16.0497 Tj +-301 TJm +(with) 17.7135 Tj +-300 TJm +(a) 4.42339 Tj +-301 TJm +(se) 8.29885 Tj +15 TJm +(gmentation) 44.8317 Tj +-300 TJm +(f) 3.31755 Tj +10 TJm +(ault,) 17.4346 Tj +-314 TJm +(a) 4.42339 Tj +-300 TJm +(b) 4.9813 Tj +20 TJm +(us) 8.85675 Tj +-301 TJm +(error) 19.3573 Tj +-300 TJm +(or) 8.29885 Tj +-301 TJm +(an) 9.40469 Tj +-301 TJm +(internal) 30.4357 Tj +-300 TJm +(assertion) 35.417 Tj +-301 TJm +(f) 3.31755 Tj +10 TJm +(ailure,) 25.1755 Tj +-313 TJm +(it) 5.53921 Tj +-301 TJm +(wil) 12.7322 Tj +1 TJm +(l) 2.7696 Tj +-301 TJm +(ask) 13.2801 Tj +-301 TJm +(you) 14.9439 Tj +-300 TJm +(to) 7.7509 Tj +72 162.325 Td +(email) 22.1369 Tj +-242 TJm +(me) 12.1743 Tj +-243 TJm +(a) 4.42339 Tj +-242 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-243 TJm +(report.) 26.2813 Tj +-615 TJm +(Experience) 44.8118 Tj +-242 TJm +(from) 19.3673 Tj +-243 TJm +(years) 21.0211 Tj +-242 TJm +(of) 8.29885 Tj +-242 TJm +(feedback) 35.955 Tj +-243 TJm +(of) 8.29885 Tj +-242 TJm +(bzip2) 22.1369 Tj +-243 TJm +(users) 20.4731 Tj +-242 TJm +(indicates) 35.417 Tj +-243 TJm +(that) 14.9439 Tj +-242 TJm +(almost) 26.5703 Tj +-242 TJm +(all) 9.9626 Tj +-243 TJm +(these) 20.4731 Tj +-242 TJm +(problems) 37.0808 Tj +-243 TJm +(can) 13.8281 Tj +72 150.37 Td +(be) 9.40469 Tj +-250 TJm +(traced) 24.3386 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(either) 22.6848 Tj +-250 TJm +(compiler) 35.417 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(hardw) 24.8965 Tj +10 TJm +(are) 12.1643 Tj +-250 TJm +(problems.) 39.5714 Tj +[1 0 0 1 72 148.213] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -97.3611] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 36 36 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 116.328 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.4 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.728 749.245 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 266.071 749.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -7.0936] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -31.5168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 710.037 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 710.037 Td +/F130_0 9.9626 Tf +(Recompile) 43.1679 Tj +-306 TJm +(the) 12.1743 Tj +-306 TJm +(program) 33.7533 Tj +-306 TJm +(with) 17.7135 Tj +-306 TJm +(no) 9.9626 Tj +-306 TJm +(optimisation,) 52.3136 Tj +-320 TJm +(and) 14.386 Tj +-306 TJm +(see) 12.7222 Tj +-306 TJm +(if) 6.08715 Tj +-306 TJm +(it) 5.53921 Tj +-306 TJm +(w) 7.193 Tj +10 TJm +(orks.) 19.6462 Tj +-956 TJm +(And/or) 28.224 Tj +-306 TJm +(try) 11.0684 Tj +-306 TJm +(a) 4.42339 Tj +-306 TJm +(dif) 11.0684 Tj +25 TJm +(ferent) 23.2328 Tj +-306 TJm +(compiler) 35.417 Tj +55 TJm +(.) 2.49065 Tj +-956 TJm +(I) 3.31755 Tj +-306 TJm +(heard) 22.1269 Tj +-306 TJm +(all) 9.9626 Tj +86.944 698.082 Td +(sorts) 18.8194 Tj +-282 TJm +(of) 8.29885 Tj +-282 TJm +(stories) 26.0123 Tj +-282 TJm +(about) 22.1369 Tj +-283 TJm +(v) 4.9813 Tj +25 TJm +(arious) 24.3486 Tj +-282 TJm +(\003a) 9.9626 Tj +20 TJm +(v) 4.9813 Tj +20 TJm +(ours) 17.1556 Tj +-282 TJm +(of) 8.29885 Tj +-282 TJm +(GNU) 21.579 Tj +-282 TJm +(C) 6.64505 Tj +-282 TJm +(\(and) 17.7035 Tj +-282 TJm +(other) 20.4731 Tj +-283 TJm +(compilers\)) 42.61 Tj +-282 TJm +(generating) 42.0521 Tj +-282 TJm +(bad) 14.386 Tj +-282 TJm +(code) 18.8094 Tj +-282 TJm +(for) 11.6164 Tj +[1 0 0 1 472.141 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.141 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +472.141 698.082 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 502.029 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -502.029 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +502.029 698.082 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-290 TJm +(and) 14.386 Tj +-282 TJm +(I') 6.63509 Tj +50 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +86.944 686.127 Td +(run) 13.2801 Tj +-250 TJm +(across) 24.8965 Tj +-250 TJm +(tw) 9.9626 Tj +10 TJm +(o) 4.9813 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xamples) 33.2053 Tj +-250 TJm +(myself.) 29.6088 Tj +[1 0 0 1 237.767 686.127] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.767 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -674.007] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 664.209 Td +/F130_0 9.9626 Tf +(2.7.X) 22.1369 Tj +-280 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-279 TJm +(of) 8.29885 Tj +-280 TJm +(GNU) 21.579 Tj +-279 TJm +(C) 6.64505 Tj +-280 TJm +(are) 12.1643 Tj +-279 TJm +(kno) 14.9439 Tj +25 TJm +(wn) 12.1743 Tj +-280 TJm +(to) 7.7509 Tj +-280 TJm +(generate) 33.7433 Tj +-279 TJm +(bad) 14.386 Tj +-280 TJm +(code) 18.8094 Tj +-279 TJm +(from) 19.3673 Tj +-280 TJm +(time) 17.7135 Tj +-279 TJm +(to) 7.7509 Tj +-280 TJm +(time,) 20.2042 Tj +-287 TJm +(at) 7.193 Tj +-280 TJm +(high) 17.7135 Tj +-279 TJm +(optimisation) 49.823 Tj +-280 TJm +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(els.) 13.5591 Tj +-797 TJm +(If) 6.63509 Tj +-280 TJm +(you) 14.9439 Tj +86.944 652.254 Td +(get) 12.1743 Tj +-295 TJm +(problems,) 39.5714 Tj +-307 TJm +(try) 11.0684 Tj +-296 TJm +(using) 21.589 Tj +-295 TJm +(the) 12.1743 Tj +-296 TJm +(\003ags) 18.8194 Tj +[1 0 0 1 220.116 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.116 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.116 652.254 Td +/F134_0 9.9626 Tf +(-O2) 17.9327 Tj +[1 0 0 1 238.049 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.9438 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.993 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +240.993 652.254 Td +/F134_0 9.9626 Tf +(-fomit-frame-pointer) 119.551 Tj +[1 0 0 1 360.544 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.9438 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.488 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.488 652.254 Td +/F134_0 9.9626 Tf +(-fno-strength-reduce) 119.551 Tj +[1 0 0 1 483.04 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -483.04 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +483.04 652.254 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-893 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-295 TJm +(should) 26.5703 Tj +86.944 640.299 Td +(speci\002cally) 45.3796 Tj +[1 0 0 1 134.814 640.299] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -134.814 -640.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +134.814 640.299 Td +/F637_0 9.9626 Tf +(not) 12.7322 Tj +[1 0 0 1 147.546 640.299] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.546 -640.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.036 640.299 Td +/F130_0 9.9626 Tf +(use) 13.2801 Tj +[1 0 0 1 165.807 640.299] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.807 -640.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +165.807 640.299 Td +/F134_0 9.9626 Tf +(-funroll-loops) 83.6858 Tj +[1 0 0 1 249.493 640.299] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -249.493 -640.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +249.493 640.299 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 638.142] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -628.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 618.381 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-249 TJm +(may) 17.1556 Tj +-249 TJm +(notice) 24.3486 Tj +-248 TJm +(that) 14.9439 Tj +-249 TJm +(the) 12.1743 Tj +-249 TJm +(Mak) 18.2614 Tj +10 TJm +(e\002le) 17.1556 Tj +-249 TJm +(runs) 17.1556 Tj +-248 TJm +(six) 11.6264 Tj +-249 TJm +(tests) 17.7135 Tj +-249 TJm +(as) 8.29885 Tj +-249 TJm +(part) 15.4918 Tj +-249 TJm +(of) 8.29885 Tj +-248 TJm +(the) 12.1743 Tj +-249 TJm +(b) 4.9813 Tj +20 TJm +(uild) 15.5018 Tj +-249 TJm +(process.) 32.3685 Tj +-619 TJm +(If) 6.63509 Tj +-249 TJm +(the) 12.1743 Tj +-249 TJm +(program) 33.7533 Tj +-248 TJm +(passes) 25.4544 Tj +-249 TJm +(all) 9.9626 Tj +-249 TJm +(of) 8.29885 Tj +-249 TJm +(these,) 22.9638 Tj +-249 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +86.944 606.426 Td +(a) 4.42339 Tj +-250 TJm +(pretty) 23.2427 Tj +-250 TJm +(good) 19.9252 Tj +-250 TJm +(\(b) 8.29885 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(100%\)) 26.5603 Tj +-250 TJm +(indication) 39.8504 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compiler) 35.417 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(done) 19.3673 Tj +-250 TJm +(its) 9.41466 Tj +-250 TJm +(job) 12.7322 Tj +-250 TJm +(correctly) 35.4071 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 604.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -19.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 584.508 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 584.508 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 95.9558 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -95.9558 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +95.9558 584.508 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 125.844 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.844 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +128.22 584.508 Td +/F130_0 9.9626 Tf +(crashes) 29.3199 Tj +-239 TJm +(randomly) 38.1866 Tj +65 TJm +(,) 2.49065 Tj +-240 TJm +(and) 14.386 Tj +-239 TJm +(the) 12.1743 Tj +-239 TJm +(crashe) 25.4445 Tj +1 TJm +(s) 3.87545 Tj +-239 TJm +(are) 12.1643 Tj +-239 TJm +(not) 12.7322 Tj +-238 TJm +(repeatable,) 43.427 Tj +-241 TJm +(you) 14.9439 Tj +-239 TJm +(may) 17.1556 Tj +-238 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-239 TJm +(a) 4.42339 Tj +-238 TJm +(\003ak) 14.9439 Tj +15 TJm +(y) 4.9813 Tj +-239 TJm +(memory) 33.2053 Tj +-238 TJm +(subsystem.) 44.0048 Tj +[1 0 0 1 510.112 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -510.112 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.112 584.508 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 540 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 572.553 Td +/F130_0 9.9626 Tf +(really) 22.6848 Tj +-254 TJm +(hammers) 36.5229 Tj +-253 TJm +(your) 18.2614 Tj +-254 TJm +(memory) 33.2053 Tj +-253 TJm +(hierarch) 32.6375 Tj +5 TJm +(y) 4.9813 Tj +65 TJm +(,) 2.49065 Tj +-255 TJm +(and) 14.386 Tj +-253 TJm +(if) 6.08715 Tj +-254 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +-254 TJm +(a) 4.42339 Tj +-253 TJm +(bit) 10.5205 Tj +-254 TJm +(mar) 15.4918 Tj +18 TJm +(ginal,) 22.4159 Tj +-254 TJm +(you) 14.9439 Tj +-254 TJm +(may) 17.1556 Tj +-253 TJm +(get) 12.1743 Tj +-254 TJm +(these) 20.4731 Tj +-253 TJm +(problems.) 39.5714 Tj +-642 TJm +(Ditto) 20.4831 Tj +-254 TJm +(if) 6.08715 Tj +-253 TJm +(your) 18.2614 Tj +-254 TJm +(disk) 16.6077 Tj +86.944 560.598 Td +(or) 8.29885 Tj +-250 TJm +(I/O) 13.2801 Tj +-250 TJm +(subsystem) 41.5142 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(slo) 11.6264 Tj +25 TJm +(wly) 14.9439 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(ailing.) 25.1855 Tj +-620 TJm +(Y) 7.193 Tj +111 TJm +(up,) 12.4533 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(really) 22.6848 Tj +-250 TJm +(does) 18.2614 Tj +-250 TJm +(happen.) 31.2626 Tj +[1 0 0 1 345.143 560.598] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -273.143 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -548.478] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 538.68 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +35 TJm +(ry) 8.29885 Tj +-250 TJm +(using) 21.589 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(dif) 11.0684 Tj +25 TJm +(ferent) 23.2328 Tj +-250 TJm +(machine) 33.7533 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(same) 20.4731 Tj +-250 TJm +(type,) 19.6462 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(see) 12.7222 Tj +-250 TJm +(if) 6.08715 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(repeat) 24.3386 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(problem.) 35.696 Tj +[1 0 0 1 72 536.523] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -19.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -516.762] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 516.762 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 516.762] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -516.762] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 516.762 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-229 TJm +(isn') 14.9439 Tj +18 TJm +(t) 2.7696 Tj +-230 TJm +(really) 22.6848 Tj +-229 TJm +(a) 4.42339 Tj +-229 TJm +(b) 4.9813 Tj +20 TJm +(ug,) 12.4533 Tj +-234 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-229 TJm +(...) 7.47195 Tj +-303 TJm +(If) 6.63509 Tj +[1 0 0 1 212.232 516.762] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.232 -516.762] cm +[1 0 0 1 0 0] Tm +0 0 Td +212.232 516.762 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 242.12 516.762] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -242.12 -516.762] cm +[1 0 0 1 0 0] Tm +0 0 Td +244.405 516.762 Td +/F130_0 9.9626 Tf +(tells) 16.6077 Tj +-229 TJm +(you) 14.9439 Tj +-230 TJm +(your) 18.2614 Tj +-229 TJm +(\002le) 12.7322 Tj +-229 TJm +(is) 6.64505 Tj +-230 TJm +(corrupted) 38.1767 Tj +-229 TJm +(on) 9.9626 Tj +-230 TJm +(decompression,) 62.2563 Tj +-233 TJm +(and) 14.386 Tj +-229 TJm +(you) 14.9439 Tj +-230 TJm +(obtained) 34.3112 Tj +-229 TJm +(the) 12.1743 Tj +-229 TJm +(\002le) 12.7322 Tj +86.944 504.807 Td +(via) 12.1743 Tj +-262 TJm +(FTP) 17.1656 Tj +111 TJm +(,) 2.49065 Tj +-263 TJm +(there) 19.9152 Tj +-262 TJm +(is) 6.64505 Tj +-262 TJm +(a) 4.42339 Tj +-262 TJm +(possibility) 41.5241 Tj +-263 TJm +(that) 14.9439 Tj +-262 TJm +(you) 14.9439 Tj +-262 TJm +(for) 11.6164 Tj +18 TJm +(got) 12.7322 Tj +-263 TJm +(to) 7.7509 Tj +-262 TJm +(tell) 12.7322 Tj +-262 TJm +(FTP) 17.1656 Tj +-263 TJm +(to) 7.7509 Tj +-262 TJm +(do) 9.9626 Tj +-262 TJm +(a) 4.42339 Tj +-262 TJm +(binary) 25.4544 Tj +-263 TJm +(mode) 22.1369 Tj +-262 TJm +(transfer) 30.4258 Tj +55 TJm +(.) 2.49065 Tj +-694 TJm +(That) 18.2614 Tj +-262 TJm +(absolutely) 40.9562 Tj +-262 TJm +(will) 15.5018 Tj +-263 TJm +(cause) 22.1269 Tj +86.944 492.852 Td +(the) 12.1743 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(non-decompressible.) 82.7294 Tj +-620 TJm +(Y) 7.193 Tj +110 TJm +(ou') 13.2801 Tj +10 TJm +(ll) 5.53921 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(transfer) 30.4258 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(ag) 9.40469 Tj +5 TJm +(ain.) 14.6649 Tj +[1 0 0 1 351.34 492.852] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -279.34 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -480.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 470.934 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-235 TJm +(you') 18.2614 Tj +50 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-236 TJm +(incor) 20.4731 Tj +1 TJm +(p) 4.9813 Tj +-1 TJm +(or) 8.29885 Tj +1 TJm +(ated) 16.5977 Tj +[1 0 0 1 163.036 470.934] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.036 -470.934] cm +[1 0 0 1 0 0] Tm +0 0 Td +163.036 470.934 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 210.856 470.934] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.856 -470.934] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.2 470.934 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-235 TJm +(your) 18.2614 Tj +-235 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +-236 TJm +(program) 33.7533 Tj +-235 TJm +(and) 14.386 Tj +-235 TJm +(are) 12.1643 Tj +-236 TJm +(get) 12.1743 Tj +1 TJm +(ting) 15.5018 Tj +-236 TJm +(problems,) 39.5714 Tj +-238 TJm +(please,) 27.3872 Tj +-238 TJm +(please,) 27.3872 Tj +-238 TJm +(please,) 27.3872 Tj +-238 TJm +(check) 23.2328 Tj +-236 TJm +(that) 14.9439 Tj +72 458.979 Td +(the) 12.1743 Tj +-242 TJm +(parameters) 43.7059 Tj +-243 TJm +(you) 14.9439 Tj +-242 TJm +(are) 12.1643 Tj +-242 TJm +(passing) 29.8878 Tj +-243 TJm +(in) 7.7509 Tj +-242 TJm +(calls) 18.2614 Tj +-242 TJm +(to) 7.7509 Tj +-243 TJm +(the) 12.1743 Tj +-242 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-244 TJm +(are) 12.1643 Tj +-242 TJm +(correct,) 30.1468 Tj +-244 TJm +(and) 14.386 Tj +-243 TJm +(in) 7.7509 Tj +-242 TJm +(accordance) 44.8018 Tj +-242 TJm +(with) 17.7135 Tj +-243 TJm +(what) 19.3673 Tj +-242 TJm +(the) 12.1743 Tj +-242 TJm +(documentation) 59.2177 Tj +-243 TJm +(says) 17.1556 Tj +72 447.024 Td +(is) 6.64505 Tj +-250 TJm +(allo) 14.9439 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able.) 19.0883 Tj +-310 TJm +(I) 3.31755 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(tried) 18.2614 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(rob) 13.2801 Tj +20 TJm +(ust) 11.6264 Tj +-250 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(problems,) 39.5714 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(I'm) 14.386 Tj +-250 TJm +(sure) 16.5977 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(en') 12.7222 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(succeeded.) 43.427 Tj +[1 0 0 1 72 444.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -434.904] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 425.106 Td +/F130_0 9.9626 Tf +(Finally) 28.234 Tj +65 TJm +(,) 2.49065 Tj +-324 TJm +(if) 6.08715 Tj +-310 TJm +(the) 12.1743 Tj +-309 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-309 TJm +(comments) 40.9562 Tj +-310 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-309 TJm +(help,) 19.6462 Tj +-324 TJm +(you') 18.2614 Tj +10 TJm +(ll) 5.53921 Tj +-310 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-309 TJm +(to) 7.7509 Tj +-309 TJm +(send) 18.2614 Tj +-310 TJm +(me) 12.1743 Tj +-309 TJm +(a) 4.42339 Tj +-309 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-310 TJm +(report.) 26.2813 Tj +-976 TJm +(No) 12.1743 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +-324 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +-310 TJm +(just) 14.396 Tj +-309 TJm +(amazing) 33.7533 Tj +-309 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-310 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +72 413.151 Td +(people) 26.5603 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(send) 18.2614 Tj +-250 TJm +(me) 12.1743 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-250 TJm +(report) 23.7907 Tj +-250 TJm +(saying) 26.0123 Tj +-250 TJm +(something) 41.5142 Tj +-250 TJm +(lik) 10.5205 Tj +10 TJm +(e:) 7.193 Tj +[1 0 0 1 72 410.994] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -401.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 401.629 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-426 TJm +(crashed) 41.8429 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(segmentation) 71.7307 Tj +-426 TJm +(fault) 29.8878 Tj +-426 TJm +(on) 11.9551 Tj +-426 TJm +(my) 11.9551 Tj +-426 TJm +(machine) 41.8429 Tj +[1 0 0 1 72 386.087] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -376.125] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 364.169 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +-241 TJm +(absolutely) 40.9562 Tj +-241 TJm +(nothing) 30.4457 Tj +-241 TJm +(el) 7.193 Tj +1 TJm +(se.) 10.7895 Tj +-614 TJm +(Needless) 35.965 Tj +-241 TJm +(to) 7.7509 Tj +-241 TJm +(say) 13.2801 Tj +65 TJm +(,) 2.49065 Tj +-243 TJm +(a) 4.42339 Tj +-241 TJm +(such) 18.2614 Tj +-240 TJm +(a) 4.42339 Tj +-241 TJm +(report) 23.7907 Tj +-241 TJm +(is) 6.64505 Tj +[1 0 0 1 324.681 364.169] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -324.681 -364.169] cm +[1 0 0 1 0 0] Tm +0 0 Td +324.681 364.169 Td +/F637_0 9.9626 Tf +(totally) 25.4644 Tj +55 TJm +(,) 2.49065 Tj +-243 TJm +(utterly) 26.0123 Tj +55 TJm +(,) 2.49065 Tj +-242 TJm +(completely) 43.158 Tj +-241 TJm +(and) 14.9439 Tj +-241 TJm +(compr) 25.4544 Tj +37 TJm +(ehensively) 41.4942 Tj +-241 TJm +(100%) 23.2427 Tj +72 352.214 Td +(useless;) 31.5416 Tj +-257 TJm +(a) 4.9813 Tj +-255 TJm +(waste) 22.6948 Tj +-255 TJm +(of) 7.7509 Tj +-255 TJm +(your) 18.2614 Tj +-255 TJm +(time) 17.1556 Tj +10 TJm +(,) 2.49065 Tj +-256 TJm +(my) 11.6164 Tj +-255 TJm +(time) 17.1556 Tj +10 TJm +(,) 2.49065 Tj +-256 TJm +(and) 14.9439 Tj +-255 TJm +(net) 12.1743 Tj +-255 TJm +(bandwidth) 42.0721 Tj +[1 0 0 1 302.574 352.214] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -302.574 -352.214] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.574 352.214 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-650 TJm +(W) 9.40469 Tj +40 TJm +(ith) 10.5205 Tj +-254 TJm +(no) 9.9626 Tj +-255 TJm +(details) 26.0123 Tj +-255 TJm +(at) 7.193 Tj +-255 TJm +(all,) 12.4533 Tj +-256 TJm +(there') 23.2328 Tj +55 TJm +(s) 3.87545 Tj +-255 TJm +(no) 9.9626 Tj +-255 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-255 TJm +(I) 3.31755 Tj +-255 TJm +(can) 13.8281 Tj +-255 TJm +(possibly) 33.2153 Tj +-255 TJm +(be) 9.40469 Tj +15 TJm +(gin) 12.7322 Tj +72 340.259 Td +(to) 7.7509 Tj +-250 TJm +(\002gure) 23.2427 Tj +-250 TJm +(out) 12.7322 Tj +-250 TJm +(what) 19.3673 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(problem) 33.2053 Tj +-250 TJm +(is.) 9.1357 Tj +[1 0 0 1 72 338.102] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -328.14] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 318.341 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-309 TJm +(rules) 19.3673 Tj +-309 TJm +(of) 8.29885 Tj +-309 TJm +(the) 12.1743 Tj +-310 TJm +(g) 4.9813 Tj +5 TJm +(ame) 16.5977 Tj +-309 TJm +(are:) 14.9339 Tj +-428 TJm +(f) 3.31755 Tj +10 TJm +(acts,) 17.9825 Tj +-324 TJm +(f) 3.31755 Tj +10 TJm +(acts,) 17.9825 Tj +-324 TJm +(f) 3.31755 Tj +10 TJm +(acts.) 17.9825 Tj +-975 TJm +(Don') 20.4731 Tj +18 TJm +(t) 2.7696 Tj +-309 TJm +(omit) 18.2714 Tj +-309 TJm +(them) 19.9252 Tj +-309 TJm +(because) 31.5316 Tj +-309 TJm +("oh,) 16.518 Tj +-324 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-309 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-309 TJm +(be) 9.40469 Tj +-310 TJm +(rele) 14.9339 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant".) 18.7297 Tj +-974 TJm +(At) 9.9626 Tj +-310 TJm +(the) 12.1743 Tj +-309 TJm +(bare) 17.1456 Tj +72 306.386 Td +(minimum:) 41.5241 Tj +[1 0 0 1 72 306.287] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -296.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 296.922 Td +/F134_0 9.9626 Tf +(Machine) 41.8429 Tj +-426 TJm +(type.) 29.8878 Tj +-852 TJm +(Operating) 53.798 Tj +-426 TJm +(system) 35.8654 Tj +-426 TJm +(version.) 47.8205 Tj +90 284.967 Td +(Exact) 29.8878 Tj +-426 TJm +(version) 41.8429 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(bzip2) 29.8878 Tj +-426 TJm +(\(do) 17.9327 Tj +-426 TJm +(bzip2) 29.8878 Tj +-426 TJm +(-V\).) 23.9102 Tj +90 273.011 Td +(Exact) 29.8878 Tj +-426 TJm +(version) 41.8429 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compiler) 47.8205 Tj +-426 TJm +(used.) 29.8878 Tj +90 261.056 Td +(Flags) 29.8878 Tj +-426 TJm +(passed) 35.8654 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compiler.) 53.798 Tj +[1 0 0 1 72 245.514] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -235.552] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 223.597 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(we) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +40 TJm +(,) 2.49065 Tj +-254 TJm +(the) 12.1743 Tj +-252 TJm +(most) 19.3773 Tj +-253 TJm +(important) 38.7446 Tj +-253 TJm +(single) 23.8007 Tj +-253 TJm +(thing) 20.4831 Tj +-253 TJm +(t) 2.7696 Tj +1 TJm +(hat) 12.1743 Tj +-253 TJm +(will) 15.5018 Tj +-253 TJm +(help) 17.1556 Tj +-253 TJm +(me) 12.1743 Tj +-253 TJm +(is) 6.64505 Tj +-252 TJm +(the) 12.1743 Tj +-253 TJm +(\002le) 12.7322 Tj +-253 TJm +(that) 14.9439 Tj +-253 TJm +(you) 14.9439 Tj +-253 TJm +(were) 19.3573 Tj +-253 TJm +(trying) 23.8007 Tj +-252 TJm +(to) 7.7509 Tj +-253 TJm +(compress) 37.6287 Tj +-253 TJm +(or) 8.29885 Tj +-253 TJm +(decompress) 47.0334 Tj +72 211.641 Td +(at) 7.193 Tj +-304 TJm +(the) 12.1743 Tj +-305 TJm +(time) 17.7135 Tj +-304 TJm +(the) 12.1743 Tj +-304 TJm +(problem) 33.2053 Tj +-305 TJm +(happened.) 40.6673 Tj +-946 TJm +(W) 9.40469 Tj +40 TJm +(ithout) 23.2527 Tj +-304 TJm +(that,) 17.4346 Tj +-318 TJm +(my) 12.7322 Tj +-305 TJm +(ability) 25.4644 Tj +-304 TJm +(to) 7.7509 Tj +-304 TJm +(do) 9.9626 Tj +-305 TJm +(an) 9.40469 Tj +15 TJm +(ything) 25.4644 Tj +-304 TJm +(more) 20.4731 Tj +-304 TJm +(than) 17.1556 Tj +-305 TJm +(speculate) 37.0708 Tj +-304 TJm +(about) 22.1369 Tj +-304 TJm +(the) 12.1743 Tj +-305 TJm +(cause,) 24.6176 Tj +-318 TJm +(is) 6.64505 Tj +72 199.686 Td +(limited.) 30.7247 Tj +[1 0 0 1 72 199.587] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -189.624] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 164.933 Td +/F122_0 20.6585 Tf +(4.4.) 34.4584 Tj +-278 TJm +(Did) 33.2808 Tj +-278 TJm +(y) 11.4861 Tj +25 TJm +(ou) 25.2447 Tj +-278 TJm +(g) 12.6223 Tj +-10 TJm +(et) 18.3654 Tj +-278 TJm +(the) 30.9877 Tj +-278 TJm +(right) 45.9032 Tj +-278 TJm +(pac) 35.5946 Tj +20 TJm +(ka) 22.9723 Tj +10 TJm +(g) 12.6223 Tj +-10 TJm +(e?) 24.1085 Tj +[1 0 0 1 72 160.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -150.374] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 143.016 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 143.016] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -143.016] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.603 143.016 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-272 TJm +(a) 4.42339 Tj +-273 TJm +(resource) 33.7433 Tj +-272 TJm +(hog.) 17.4346 Tj +-378 TJm +(It) 6.08715 Tj +-272 TJm +(soaks) 22.1369 Tj +-273 TJm +(up) 9.9626 Tj +-272 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-273 TJm +(amounts) 33.7633 Tj +-272 TJm +(of) 8.29885 Tj +-273 TJm +(CPU) 19.3773 Tj +-272 TJm +(c) 4.42339 Tj +15 TJm +(ycles) 20.4731 Tj +-273 TJm +(and) 14.386 Tj +-272 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +-755 TJm +(Also,) 21.31 Tj +-278 TJm +(it) 5.53921 Tj +-273 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-272 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-273 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-272 TJm +(latencies.) 37.3498 Tj +72 131.06 Td +(In) 8.29885 Tj +-251 TJm +(the) 12.1743 Tj +-251 TJm +(w) 7.193 Tj +10 TJm +(orst) 14.9439 Tj +-251 TJm +(case,) 19.6363 Tj +-251 TJm +(you) 14.9439 Tj +-251 TJm +(can) 13.8281 Tj +-251 TJm +(feed) 17.1456 Tj +-251 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-251 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +4 TJm +(abyt) 17.1556 Tj +1 TJm +(es) 8.29885 Tj +-252 TJm +(of) 8.29885 Tj +-251 TJm +(uncompressed) 56.996 Tj +-251 TJm +(data) 16.5977 Tj +-251 TJm +(into) 15.5018 Tj +-251 TJm +(the) 12.1743 Tj +-251 TJm +(library) 26.5603 Tj +-251 TJm +(before) 25.4445 Tj +-251 TJm +(getting) 27.6761 Tj +-251 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-251 TJm +(compressed) 47.0334 Tj +72 119.105 Td +(output,) 27.9551 Tj +-250 TJm +(so) 8.85675 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(probably) 35.417 Tj +-250 TJm +(rules) 19.3673 Tj +-250 TJm +(out) 12.7322 Tj +-250 TJm +(applications) 48.1492 Tj +-250 TJm +(requiring) 36.5229 Tj +-250 TJm +(interacti) 32.6474 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 116.949] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -106.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 97.1875 Td +/F130_0 9.9626 Tf +(These) 23.7907 Tj +-304 TJm +(aren') 20.4632 Tj +18 TJm +(t) 2.7696 Tj +-304 TJm +(f) 3.31755 Tj +10 TJm +(aults) 18.8194 Tj +-304 TJm +(of) 8.29885 Tj +-304 TJm +(my) 12.7322 Tj +-304 TJm +(implementation,) 65.0359 Tj +-317 TJm +(I) 3.31755 Tj +-304 TJm +(hope,) 21.8579 Tj +-318 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-304 TJm +(more) 20.4731 Tj +-304 TJm +(an) 9.40469 Tj +-304 TJm +(intrinsic) 32.6574 Tj +-304 TJm +(property) 33.7533 Tj +-304 TJm +(of) 8.29885 Tj +-304 TJm +(the) 12.1743 Tj +-304 TJm +(Burro) 23.2427 Tj +25 TJm +(ws-Wheeler) 48.1293 Tj +-304 TJm +(transform) 38.7346 Tj +72 85.2323 Td +(\(unfortunately\).) 62.8042 Tj +-620 TJm +(Maybe) 27.6661 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(isn') 14.9439 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(what) 19.3673 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant.) 14.6649 Tj +[1 0 0 1 72 83.0755] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -22.2611] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(33) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 37 37 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 116.328 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.4 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.728 749.245 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 266.071 749.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -7.0936] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-275 TJm +(you) 14.9439 Tj +-274 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-275 TJm +(a) 4.42339 Tj +-274 TJm +(compressor) 45.9276 Tj +-275 TJm +(and/or) 25.4544 Tj +-275 TJm +(library) 26.5603 Tj +-274 TJm +(which) 24.3486 Tj +-275 TJm +(is) 6.64505 Tj +-274 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +40 TJm +(,) 2.49065 Tj +-281 TJm +(uses) 17.1556 Tj +-275 TJm +(less) 14.9439 Tj +-274 TJm +(memory) 33.2053 Tj +-275 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-275 TJm +(gets) 16.0497 Tj +-274 TJm +(pretty) 23.2427 Tj +-275 TJm +(good) 19.9252 Tj +-274 TJm +(compression,) 52.8516 Tj +-281 TJm +(and) 14.386 Tj +-275 TJm +(has) 13.2801 Tj +72 698.082 Td +(minimal) 33.2153 Tj +-288 TJm +(latenc) 23.7907 Tj +15 TJm +(y) 4.9813 Tj +65 TJm +(,) 2.49065 Tj +-297 TJm +(consider) 33.7533 Tj +-288 TJm +(Jean-loup) 38.7346 Tj +-288 TJm +(Gailly') 28.224 Tj +55 TJm +(s) 3.87545 Tj +-288 TJm +(and) 14.386 Tj +-288 TJm +(Mark) 21.579 Tj +-288 TJm +(Adl) 14.9439 Tj +1 TJm +(er') 11.0585 Tj +55 TJm +(s) 3.87545 Tj +-288 TJm +(w) 7.193 Tj +10 TJm +(ork,) 15.7708 Tj +[1 0 0 1 353.879 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -353.879 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +353.879 698.082 Td +/F134_0 9.9626 Tf +(zlib-1.2.1) 59.7756 Tj +[1 0 0 1 413.655 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -413.655 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +416.523 698.082 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 433.777 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -433.777 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +433.777 698.082 Td +/F134_0 9.9626 Tf +(gzip-1.2.4) 59.7756 Tj +[1 0 0 1 493.553 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.553 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.553 698.082 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-847 TJm +(Look) 21.031 Tj +-288 TJm +(for) 11.6164 Tj +72 686.127 Td +(them) 19.9252 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(http://www) 45.3896 Tj +65 TJm +(.zlib) 17.4346 Tj +40 TJm +(.or) 10.7895 Tj +18 TJm +(g) 4.9813 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(http://www) 45.3896 Tj +65 TJm +(.gzip.or) 30.4357 Tj +18 TJm +(g) 4.9813 Tj +-250 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 683.97] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -674.008] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 664.209 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-582 TJm +(something) 41.5142 Tj +-583 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +-582 TJm +(and) 14.386 Tj +-582 TJm +(lighter) 26.0123 Tj +-583 TJm +(still,) 17.4445 Tj +-665 TJm +(you) 14.9439 Tj +-582 TJm +(might) 23.2527 Tj +-583 TJm +(try) 11.0684 Tj +-582 TJm +(Markus) 30.4357 Tj +-582 TJm +(F) 5.53921 Tj +-582 TJm +(X) 7.193 Tj +-582 TJm +(J) 3.87545 Tj +-582 TJm +(Oberhumer') 48.6872 Tj +55 TJm +(s) 3.87545 Tj +[1 0 0 1 437.433 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -437.433 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +437.433 664.209 Td +/F134_0 9.9626 Tf +(LZO) 17.9327 Tj +[1 0 0 1 455.365 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -455.365 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +461.163 664.209 Td +/F130_0 9.9626 Tf +(real-time) 35.965 Tj +-582 TJm +(compres-) 37.0708 Tj +72 652.254 Td +(sion/decompression) 79.1429 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(http://www) 45.3896 Tj +65 TJm +(.oberhumer) 45.6486 Tj +55 TJm +(.com/opensource.) 70.2762 Tj +[1 0 0 1 72 650.097] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -640.135] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 617.501 Td +/F122_0 20.6585 Tf +(4.5.) 34.4584 Tj +-278 TJm +(Fur) 33.2808 Tj +-20 TJm +(ther) 39.0239 Tj +-278 TJm +(Reading) 81.4978 Tj +[1 0 0 1 72 612.905] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -602.942] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 595.583 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 595.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -595.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.923 595.583 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-305 TJm +(not) 12.7322 Tj +-304 TJm +(research) 33.1854 Tj +-305 TJm +(w) 7.193 Tj +10 TJm +(ork,) 15.7708 Tj +-318 TJm +(in) 7.7509 Tj +-305 TJm +(the) 12.1743 Tj +-304 TJm +(sense) 21.579 Tj +-305 TJm +(that) 14.9439 Tj +-304 TJm +(it) 5.53921 Tj +-305 TJm +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-305 TJm +(present) 28.772 Tj +-304 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-305 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-304 TJm +(ideas.) 22.9638 Tj +-474 TJm +(Rather) 26.5603 Tj +40 TJm +(,) 2.49065 Tj +-318 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +-305 TJm +(an) 9.40469 Tj +-305 TJm +(engineeri) 37.0708 Tj +1 TJm +(ng) 9.9626 Tj +-305 TJm +(e) 4.42339 Tj +15 TJm +(x) 4.9813 Tj +15 TJm +(ercise) 23.2328 Tj +72 583.628 Td +(based) 22.6848 Tj +-250 TJm +(on) 9.9626 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +-250 TJm +(ideas.) 22.9638 Tj +[1 0 0 1 72 581.471] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -571.509] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 561.71 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(our) 13.2801 Tj +-250 TJm +(documents) 43.1679 Tj +-250 TJm +(describe) 33.1954 Tj +-250 TJm +(essentially) 42.0621 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(ideas) 20.4731 Tj +-250 TJm +(behind) 27.1182 Tj +[1 0 0 1 298.747 561.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -298.747 -561.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +298.747 561.71 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 328.635 561.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -328.635 -561.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +328.635 561.71 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 559.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -299.875] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 298.879 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 295.293] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -550.189] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 550.189 Td +/F134_0 9.9626 Tf +(Michael) 41.8429 Tj +-426 TJm +(Burrows) 41.8429 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(D.) 11.9551 Tj +-426 TJm +(J.) 11.9551 Tj +-426 TJm +(Wheeler:) 47.8205 Tj +98.4879 538.234 Td +("A) 11.9551 Tj +-426 TJm +(block-sorting) 77.7083 Tj +-426 TJm +(lossless) 47.8205 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(compression) 65.7532 Tj +-426 TJm +(algorithm") 59.7756 Tj +102.732 526.278 Td +(10th) 23.9102 Tj +-426 TJm +(May) 17.9327 Tj +-426 TJm +(1994.) 29.8878 Tj +102.732 514.323 Td +(Digital) 41.8429 Tj +-426 TJm +(SRC) 17.9327 Tj +-426 TJm +(Research) 47.8205 Tj +-426 TJm +(Report) 35.8654 Tj +-426 TJm +(124.) 23.9102 Tj +102.732 502.368 Td +(ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.g\ +z) 382.564 Tj +102.732 490.413 Td +(If) 11.9551 Tj +-426 TJm +(you) 17.9327 Tj +-426 TJm +(have) 23.9102 Tj +-426 TJm +(trouble) 41.8429 Tj +-426 TJm +(finding) 41.8429 Tj +-426 TJm +(it,) 17.9327 Tj +-426 TJm +(try) 17.9327 Tj +-426 TJm +(searching) 53.798 Tj +-426 TJm +(at) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +102.732 478.458 Td +(New) 17.9327 Tj +-426 TJm +(Zealand) 41.8429 Tj +-426 TJm +(Digital) 41.8429 Tj +-426 TJm +(Library,) 47.8205 Tj +-426 TJm +(http://www.nzdl.org.) 119.551 Tj +90 454.547 Td +(Daniel) 35.8654 Tj +-426 TJm +(S.) 11.9551 Tj +-426 TJm +(Hirschberg) 59.7756 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(Debra) 29.8878 Tj +-426 TJm +(A.) 11.9551 Tj +-426 TJm +(LeLewer) 41.8429 Tj +98.4879 442.592 Td +("Efficient) 59.7756 Tj +-426 TJm +(Decoding) 47.8205 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(Prefix) 35.8654 Tj +-426 TJm +(Codes") 35.8654 Tj +102.732 430.637 Td +(Communications) 83.6858 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(ACM,) 23.9102 Tj +-426 TJm +(April) 29.8878 Tj +-426 TJm +(1990,) 29.8878 Tj +-426 TJm +(Vol) 17.9327 Tj +-426 TJm +(33,) 17.9327 Tj +-426 TJm +(Number) 35.8654 Tj +-426 TJm +(4.) 11.9551 Tj +102.732 418.682 Td +(You) 17.9327 Tj +-426 TJm +(might) 29.8878 Tj +-426 TJm +(be) 11.9551 Tj +-426 TJm +(able) 23.9102 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(get) 17.9327 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(electronic) 59.7756 Tj +-426 TJm +(copy) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(this) 23.9102 Tj +102.732 406.727 Td +(from) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(ACM) 17.9327 Tj +-426 TJm +(Digital) 41.8429 Tj +-426 TJm +(Library.) 47.8205 Tj +90 382.816 Td +(David) 29.8878 Tj +-426 TJm +(J.) 11.9551 Tj +-426 TJm +(Wheeler) 41.8429 Tj +102.732 370.861 Td +(Program) 41.8429 Tj +-426 TJm +(bred3.c) 41.8429 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(accompanying) 71.7307 Tj +-426 TJm +(document) 47.8205 Tj +-426 TJm +(bred3.ps.) 53.798 Tj +102.732 358.906 Td +(This) 23.9102 Tj +-426 TJm +(contains) 47.8205 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(idea) 23.9102 Tj +-426 TJm +(behind) 35.8654 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(multi-table) 65.7532 Tj +-426 TJm +(Huffman) 41.8429 Tj +-426 TJm +(coding) 35.8654 Tj +-426 TJm +(scheme.) 41.8429 Tj +102.732 346.951 Td +(ftp://ftp.cl.cam.ac.uk/users/djw3/) 203.237 Tj +90 323.041 Td +(Jon) 17.9327 Tj +-426 TJm +(L.) 11.9551 Tj +-426 TJm +(Bentley) 41.8429 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(Robert) 35.8654 Tj +-426 TJm +(Sedgewick) 53.798 Tj +98.4879 311.085 Td +("Fast) 29.8878 Tj +-426 TJm +(Algorithms) 59.7756 Tj +-426 TJm +(for) 17.9327 Tj +-426 TJm +(Sorting) 41.8429 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(Searching) 53.798 Tj +-426 TJm +(Strings") 47.8205 Tj +102.732 299.13 Td +(Available) 53.798 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(Sedgewick's) 65.7532 Tj +-426 TJm +(web) 17.9327 Tj +-426 TJm +(page,) 29.8878 Tj +102.732 287.175 Td +(www.cs.princeton.edu/~rs) 143.461 Tj +[1 0 0 1 72 259.678] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -249.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 237.76 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-239 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-238 TJm +(paper) 22.1269 Tj +-239 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-239 TJm +(v) 4.9813 Tj +25 TJm +(aluable) 28.772 Tj +-238 TJm +(additional) 39.8504 Tj +-239 TJm +(insights) 31.0036 Tj +-238 TJm +(into) 15.5018 Tj +-239 TJm +(the) 12.1743 Tj +-239 TJm +(algorithm,) 41.2352 Tj +-241 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-238 TJm +(is) 6.64505 Tj +-239 TJm +(not) 12.7322 Tj +-239 TJm +(immedi) 30.4457 Tj +1 TJm +(ately) 19.3673 Tj +-239 TJm +(the) 12.1743 Tj +-239 TJm +(basis) 19.9252 Tj +-238 TJm +(of) 8.29885 Tj +-239 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-239 TJm +(code) 18.8094 Tj +72 225.805 Td +(used) 18.2614 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(bzip2.) 24.6275 Tj +[1 0 0 1 72 223.648] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -72.7273] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 71.731 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 68.1444] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -214.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 214.283 Td +/F134_0 9.9626 Tf +(Peter) 29.8878 Tj +-426 TJm +(Fenwick:) 47.8205 Tj +102.732 202.328 Td +(Block) 29.8878 Tj +-426 TJm +(Sorting) 41.8429 Tj +-426 TJm +(Text) 23.9102 Tj +-426 TJm +(Compression) 65.7532 Tj +102.732 190.373 Td +(Proceedings) 65.7532 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(19th) 23.9102 Tj +-426 TJm +(Australasian) 71.7307 Tj +-426 TJm +(Computer) 47.8205 Tj +-426 TJm +(Science) 41.8429 Tj +-426 TJm +(Conference,) 65.7532 Tj +111.22 178.418 Td +(Melbourne,) 59.7756 Tj +-426 TJm +(Australia.) 59.7756 Tj +-852 TJm +(Jan) 17.9327 Tj +-426 TJm +(31) 11.9551 Tj +-426 TJm +(-) 5.97756 Tj +-426 TJm +(Feb) 17.9327 Tj +-426 TJm +(2,) 11.9551 Tj +-426 TJm +(1996.) 29.8878 Tj +102.732 166.463 Td +(ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps) 322.788 Tj +[1 0 0 1 72 150.921] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -140.958] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 129.003 Td +/F130_0 9.9626 Tf +(K) 7.193 Tj +15 TJm +(unihik) 25.4644 Tj +10 TJm +(o) 4.9813 Tj +-250 TJm +(Sadakane') 41.4942 Tj +55 TJm +(s) 3.87545 Tj +-250 TJm +(sorting) 27.6761 Tj +-250 TJm +(algorithm,) 41.2352 Tj +-250 TJm +(mentioned) 42.0621 Tj +-250 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +-250 TJm +(from:) 22.1369 Tj +[1 0 0 1 72 126.846] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -117.482] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 117.482 Td +/F134_0 9.9626 Tf +(http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz) 346.698 Tj +[1 0 0 1 72 89.9846] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.1702] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(34) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 38 38 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 116.328 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.4 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.728 749.245 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 266.071 749.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -7.0936] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(Manber) 30.9837 Tj +20 TJm +(-Myers) 28.772 Tj +-250 TJm +(suf) 12.1743 Tj +25 TJm +(\002x) 10.5205 Tj +-250 TJm +(array) 20.4632 Tj +-250 TJm +(construction) 49.2551 Tj +-250 TJm +(algorithm) 38.7446 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(described) 38.1767 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(paper) 22.1269 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +-250 TJm +(from:) 22.1369 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -698.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 698.516 Td +/F134_0 9.9626 Tf +(http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps) 322.788 Tj +[1 0 0 1 72 671.019] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -661.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 649.101 Td +/F130_0 9.9626 Tf +(Finally) 28.234 Tj +65 TJm +(,) 2.49065 Tj +-227 TJm +(the) 12.1743 Tj +-221 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-222 TJm +(papers) 26.0024 Tj +-221 TJm +(document) 39.2925 Tj +-221 TJm +(some) 21.031 Tj +-222 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(estig) 18.8194 Tj +5 TJm +(ations) 23.8007 Tj +-221 TJm +(I) 3.31755 Tj +-221 TJm +(made) 21.579 Tj +-222 TJm +(into) 15.5018 Tj +-221 TJm +(the) 12.1743 Tj +-221 TJm +(performance) 50.341 Tj +-222 TJm +(of) 8.29885 Tj +-221 TJm +(sorting) 27.6761 Tj +-221 TJm +(and) 14.386 Tj +-222 TJm +(decompression) 59.7656 Tj +72 637.146 Td +(algorithms:) 45.3896 Tj +[1 0 0 1 72 634.989] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -132.503] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 131.507 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 127.92] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -625.624] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 625.624 Td +/F134_0 9.9626 Tf +(Julian) 35.8654 Tj +-426 TJm +(Seward) 35.8654 Tj +102.732 613.669 Td +(On) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(Performance) 65.7532 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(BWT) 17.9327 Tj +-426 TJm +(Sorting) 41.8429 Tj +-426 TJm +(Algorithms) 59.7756 Tj +102.732 601.714 Td +(Proceedings) 65.7532 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(IEEE) 23.9102 Tj +-426 TJm +(Data) 23.9102 Tj +-426 TJm +(Compression) 65.7532 Tj +-426 TJm +(Conference) 59.7756 Tj +-426 TJm +(2000) 23.9102 Tj +111.22 589.759 Td +(Snowbird,) 53.798 Tj +-426 TJm +(Utah.) 29.8878 Tj +-852 TJm +(28-30) 29.8878 Tj +-426 TJm +(March) 29.8878 Tj +-426 TJm +(2000.) 29.8878 Tj +90 565.848 Td +(Julian) 35.8654 Tj +-426 TJm +(Seward) 35.8654 Tj +102.732 553.893 Td +(Space-time) 59.7756 Tj +-426 TJm +(Tradeoffs) 53.798 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(Inverse) 41.8429 Tj +-426 TJm +(B-W) 17.9327 Tj +-426 TJm +(Transform) 53.798 Tj +102.732 541.938 Td +(Proceedings) 65.7532 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(IEEE) 23.9102 Tj +-426 TJm +(Data) 23.9102 Tj +-426 TJm +(Compression) 65.7532 Tj +-426 TJm +(Conference) 59.7756 Tj +-426 TJm +(2001) 23.9102 Tj +111.22 529.983 Td +(Snowbird,) 53.798 Tj +-426 TJm +(Utah.) 29.8878 Tj +-852 TJm +(27-29) 29.8878 Tj +-426 TJm +(March) 29.8878 Tj +-426 TJm +(2001.) 29.8878 Tj +[1 0 0 1 72 502.486] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -451.634] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9513] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9513 Td +/F130_0 9.9626 Tf +(35) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%+ font DTUUHP+NimbusSanL-Bold +%%+ font VXAMRV+NimbusRomNo9L-Regu +%%+ font MFECUR+NimbusMonL-Regu +%%+ font ZOVMRD+CMMI10 +%%+ font ERVBFT+NimbusMonL-Bold +%%+ font BZXIEB+CMSY10 +%%+ font WWWUTU+NimbusRomNo9L-ReguItal +%%EOF diff --git a/Utilities/cmbzip2/manual.xml b/Utilities/cmbzip2/manual.xml new file mode 100644 index 000000000..f22413602 --- /dev/null +++ b/Utilities/cmbzip2/manual.xml @@ -0,0 +1,2964 @@ + + + %common-ents; +]> + + + + + bzip2 and libbzip2, version 1.0.5 + A program and library for data compression + + &bz-lifespan; + Julian Seward + + Version &bz-version; of &bz-date; + + + + Julian + Seward + + &bz-url; + + + + + + + This program, bzip2, the + associated library libbzip2, and + all documentation, are copyright © &bz-lifespan; Julian Seward. + All rights reserved. + + Redistribution and use in source and binary forms, with + or without modification, are permitted provided that the + following conditions are met: + + + + Redistributions of source code must retain the + above copyright notice, this list of conditions and the + following disclaimer. + + The origin of this software must not be + misrepresented; you must not claim that you wrote the original + software. If you use this software in a product, an + acknowledgment in the product documentation would be + appreciated but is not required. + + Altered source versions must be plainly marked + as such, and must not be misrepresented as being the original + software. + + The name of the author may not be used to + endorse or promote products derived from this software without + specific prior written permission. + + + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 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. + + PATENTS: To the best of my knowledge, + bzip2 and + libbzip2 do not use any patented + algorithms. However, I do not have the resources to carry + out a patent search. Therefore I cannot give any guarantee of + the above statement. + + + + + + + + + +Introduction + +bzip2 compresses files +using the Burrows-Wheeler block-sorting text compression +algorithm, and Huffman coding. Compression is generally +considerably better than that achieved by more conventional +LZ77/LZ78-based compressors, and approaches the performance of +the PPM family of statistical compressors. + +bzip2 is built on top of +libbzip2, a flexible library for +handling compressed data in the +bzip2 format. This manual +describes both how to use the program and how to work with the +library interface. Most of the manual is devoted to this +library, not the program, which is good news if your interest is +only in the program. + + + + describes how to use + bzip2; this is the only part + you need to read if you just want to know how to operate the + program. + + describes the + programming interfaces in detail, and + + records some + miscellaneous notes which I thought ought to be recorded + somewhere. + + + + + + + +How to use bzip2 + +This chapter contains a copy of the +bzip2 man page, and nothing +else. + + +NAME + + + + bzip2, + bunzip2 - a block-sorting file + compressor, v1.0.4 + + bzcat - + decompresses files to stdout + + bzip2recover - + recovers data from damaged bzip2 files + + + + + + + +SYNOPSIS + + + + bzip2 [ + -cdfkqstvzVL123456789 ] [ filenames ... ] + + bunzip2 [ + -fkvsVL ] [ filenames ... ] + + bzcat [ -s ] [ + filenames ... ] + + bzip2recover + filename + + + + + + + +DESCRIPTION + +bzip2 compresses files +using the Burrows-Wheeler block sorting text compression +algorithm, and Huffman coding. Compression is generally +considerably better than that achieved by more conventional +LZ77/LZ78-based compressors, and approaches the performance of +the PPM family of statistical compressors. + +The command-line options are deliberately very similar to +those of GNU gzip, but they are +not identical. + +bzip2 expects a list of +file names to accompany the command-line flags. Each file is +replaced by a compressed version of itself, with the name +original_name.bz2. Each +compressed file has the same modification date, permissions, and, +when possible, ownership as the corresponding original, so that +these properties can be correctly restored at decompression time. +File name handling is naive in the sense that there is no +mechanism for preserving original file names, permissions, +ownerships or dates in filesystems which lack these concepts, or +have serious file name length restrictions, such as +MS-DOS. + +bzip2 and +bunzip2 will by default not +overwrite existing files. If you want this to happen, specify +the -f flag. + +If no file names are specified, +bzip2 compresses from standard +input to standard output. In this case, +bzip2 will decline to write +compressed output to a terminal, as this would be entirely +incomprehensible and therefore pointless. + +bunzip2 (or +bzip2 -d) decompresses all +specified files. Files which were not created by +bzip2 will be detected and +ignored, and a warning issued. +bzip2 attempts to guess the +filename for the decompressed file from that of the compressed +file as follows: + + + + filename.bz2 + becomes + filename + + filename.bz + becomes + filename + + filename.tbz2 + becomes + filename.tar + + filename.tbz + becomes + filename.tar + + anyothername + becomes + anyothername.out + + + +If the file does not end in one of the recognised endings, +.bz2, +.bz, +.tbz2 or +.tbz, +bzip2 complains that it cannot +guess the name of the original file, and uses the original name +with .out appended. + +As with compression, supplying no filenames causes +decompression from standard input to standard output. + +bunzip2 will correctly +decompress a file which is the concatenation of two or more +compressed files. The result is the concatenation of the +corresponding uncompressed files. Integrity testing +(-t) of concatenated compressed +files is also supported. + +You can also compress or decompress files to the standard +output by giving the -c flag. +Multiple files may be compressed and decompressed like this. The +resulting outputs are fed sequentially to stdout. Compression of +multiple files in this manner generates a stream containing +multiple compressed file representations. Such a stream can be +decompressed correctly only by +bzip2 version 0.9.0 or later. +Earlier versions of bzip2 will +stop after decompressing the first file in the stream. + +bzcat (or +bzip2 -dc) decompresses all +specified files to the standard output. + +bzip2 will read arguments +from the environment variables +BZIP2 and +BZIP, in that order, and will +process them before any arguments read from the command line. +This gives a convenient way to supply default arguments. + +Compression is always performed, even if the compressed +file is slightly larger than the original. Files of less than +about one hundred bytes tend to get larger, since the compression +mechanism has a constant overhead in the region of 50 bytes. +Random data (including the output of most file compressors) is +coded at about 8.05 bits per byte, giving an expansion of around +0.5%. + +As a self-check for your protection, +bzip2 uses 32-bit CRCs to make +sure that the decompressed version of a file is identical to the +original. This guards against corruption of the compressed data, +and against undetected bugs in +bzip2 (hopefully very unlikely). +The chances of data corruption going undetected is microscopic, +about one chance in four billion for each file processed. Be +aware, though, that the check occurs upon decompression, so it +can only tell you that something is wrong. It can't help you +recover the original uncompressed data. You can use +bzip2recover to try to recover +data from damaged files. + +Return values: 0 for a normal exit, 1 for environmental +problems (file not found, invalid flags, I/O errors, etc.), 2 +to indicate a corrupt compressed file, 3 for an internal +consistency error (eg, bug) which caused +bzip2 to panic. + + + + + +OPTIONS + + + + + -c --stdout + Compress or decompress to standard + output. + + + + -d --decompress + Force decompression. + bzip2, + bunzip2 and + bzcat are really the same + program, and the decision about what actions to take is done on + the basis of which name is used. This flag overrides that + mechanism, and forces bzip2 to decompress. + + + + -z --compress + The complement to + -d: forces compression, + regardless of the invokation name. + + + + -t --test + Check integrity of the specified file(s), but + don't decompress them. This really performs a trial + decompression and throws away the result. + + + + -f --force + Force overwrite of output files. Normally, + bzip2 will not overwrite + existing output files. Also forces + bzip2 to break hard links to + files, which it otherwise wouldn't do. + bzip2 normally declines + to decompress files which don't have the correct magic header + bytes. If forced (-f), + however, it will pass such files through unmodified. This is + how GNU gzip behaves. + + + + + -k --keep + Keep (don't delete) input files during + compression or decompression. + + + + -s --small + Reduce memory usage, for compression, + decompression and testing. Files are decompressed and tested + using a modified algorithm which only requires 2.5 bytes per + block byte. This means any file can be decompressed in 2300k + of memory, albeit at about half the normal speed. + During compression, -s + selects a block size of 200k, which limits memory use to around + the same figure, at the expense of your compression ratio. In + short, if your machine is low on memory (8 megabytes or less), + use -s for everything. See + below. + + + + -q --quiet + Suppress non-essential warning messages. + Messages pertaining to I/O errors and other critical events + will not be suppressed. + + + + -v --verbose + Verbose mode -- show the compression ratio for + each file processed. Further + -v's increase the verbosity + level, spewing out lots of information which is primarily of + interest for diagnostic purposes. + + + + -L --license -V --version + Display the software version, license terms and + conditions. + + + + -1 (or + --fast) to + -9 (or + -best) + Set the block size to 100 k, 200 k ... 900 k + when compressing. Has no effect when decompressing. See below. The + --fast and + --best aliases are primarily + for GNU gzip compatibility. + In particular, --fast doesn't + make things significantly faster. And + --best merely selects the + default behaviour. + + + + -- + Treats all subsequent arguments as file names, + even if they start with a dash. This is so you can handle + files with names beginning with a dash, for example: + bzip2 -- + -myfilename. + + + + --repetitive-fast + --repetitive-best + These flags are redundant in versions 0.9.5 and + above. They provided some coarse control over the behaviour of + the sorting algorithm in earlier versions, which was sometimes + useful. 0.9.5 and above have an improved algorithm which + renders these flags irrelevant. + + + + + + + + +MEMORY MANAGEMENT + +bzip2 compresses large +files in blocks. The block size affects both the compression +ratio achieved, and the amount of memory needed for compression +and decompression. The flags -1 +through -9 specify the block +size to be 100,000 bytes through 900,000 bytes (the default) +respectively. At decompression time, the block size used for +compression is read from the header of the compressed file, and +bunzip2 then allocates itself +just enough memory to decompress the file. Since block sizes are +stored in compressed files, it follows that the flags +-1 to +-9 are irrelevant to and so +ignored during decompression. + +Compression and decompression requirements, in bytes, can be +estimated as: + +Compression: 400k + ( 8 x block size ) + +Decompression: 100k + ( 4 x block size ), or + 100k + ( 2.5 x block size ) + + +Larger block sizes give rapidly diminishing marginal +returns. Most of the compression comes from the first two or +three hundred k of block size, a fact worth bearing in mind when +using bzip2 on small machines. +It is also important to appreciate that the decompression memory +requirement is set at compression time by the choice of block +size. + +For files compressed with the default 900k block size, +bunzip2 will require about 3700 +kbytes to decompress. To support decompression of any file on a +4 megabyte machine, bunzip2 has +an option to decompress using approximately half this amount of +memory, about 2300 kbytes. Decompression speed is also halved, +so you should use this option only where necessary. The relevant +flag is -s. + +In general, try and use the largest block size memory +constraints allow, since that maximises the compression achieved. +Compression and decompression speed are virtually unaffected by +block size. + +Another significant point applies to files which fit in a +single block -- that means most files you'd encounter using a +large block size. The amount of real memory touched is +proportional to the size of the file, since the file is smaller +than a block. For example, compressing a file 20,000 bytes long +with the flag -9 will cause the +compressor to allocate around 7600k of memory, but only touch +400k + 20000 * 8 = 560 kbytes of it. Similarly, the decompressor +will allocate 3700k but only touch 100k + 20000 * 4 = 180 +kbytes. + +Here is a table which summarises the maximum memory usage +for different block sizes. Also recorded is the total compressed +size for 14 files of the Calgary Text Compression Corpus +totalling 3,141,622 bytes. This column gives some feel for how +compression varies with block size. These figures tend to +understate the advantage of larger block sizes for larger files, +since the Corpus is dominated by smaller files. + + + Compress Decompress Decompress Corpus +Flag usage usage -s usage Size + + -1 1200k 500k 350k 914704 + -2 2000k 900k 600k 877703 + -3 2800k 1300k 850k 860338 + -4 3600k 1700k 1100k 846899 + -5 4400k 2100k 1350k 845160 + -6 5200k 2500k 1600k 838626 + -7 6100k 2900k 1850k 834096 + -8 6800k 3300k 2100k 828642 + -9 7600k 3700k 2350k 828642 + + + + + + +RECOVERING DATA FROM DAMAGED FILES + +bzip2 compresses files in +blocks, usually 900kbytes long. Each block is handled +independently. If a media or transmission error causes a +multi-block .bz2 file to become +damaged, it may be possible to recover data from the undamaged +blocks in the file. + +The compressed representation of each block is delimited by +a 48-bit pattern, which makes it possible to find the block +boundaries with reasonable certainty. Each block also carries +its own 32-bit CRC, so damaged blocks can be distinguished from +undamaged ones. + +bzip2recover is a simple +program whose purpose is to search for blocks in +.bz2 files, and write each block +out into its own .bz2 file. You +can then use bzip2 -t to test +the integrity of the resulting files, and decompress those which +are undamaged. + +bzip2recover takes a +single argument, the name of the damaged file, and writes a +number of files rec0001file.bz2, +rec0002file.bz2, etc, containing +the extracted blocks. The output filenames are designed so that +the use of wildcards in subsequent processing -- for example, +bzip2 -dc rec*file.bz2 > +recovered_data -- lists the files in the correct +order. + +bzip2recover should be of +most use dealing with large .bz2 +files, as these will contain many blocks. It is clearly futile +to use it on damaged single-block files, since a damaged block +cannot be recovered. If you wish to minimise any potential data +loss through media or transmission errors, you might consider +compressing with a smaller block size. + + + + + +PERFORMANCE NOTES + +The sorting phase of compression gathers together similar +strings in the file. Because of this, files containing very long +runs of repeated symbols, like "aabaabaabaab ..." (repeated +several hundred times) may compress more slowly than normal. +Versions 0.9.5 and above fare much better than previous versions +in this respect. The ratio between worst-case and average-case +compression time is in the region of 10:1. For previous +versions, this figure was more like 100:1. You can use the +-vvvv option to monitor progress +in great detail, if you want. + +Decompression speed is unaffected by these +phenomena. + +bzip2 usually allocates +several megabytes of memory to operate in, and then charges all +over it in a fairly random fashion. This means that performance, +both for compressing and decompressing, is largely determined by +the speed at which your machine can service cache misses. +Because of this, small changes to the code to reduce the miss +rate have been observed to give disproportionately large +performance improvements. I imagine +bzip2 will perform best on +machines with very large caches. + + + + + + +CAVEATS + +I/O error messages are not as helpful as they could be. +bzip2 tries hard to detect I/O +errors and exit cleanly, but the details of what the problem is +sometimes seem rather misleading. + +This manual page pertains to version &bz-version; of +bzip2. Compressed data created by +this version is entirely forwards and backwards compatible with the +previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0, +1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and +above can correctly decompress multiple concatenated compressed files. +0.1pl2 cannot do this; it will stop after decompressing just the first +file in the stream. + +bzip2recover versions +prior to 1.0.2 used 32-bit integers to represent bit positions in +compressed files, so it could not handle compressed files more +than 512 megabytes long. Versions 1.0.2 and above use 64-bit ints +on some platforms which support them (GNU supported targets, and +Windows). To establish whether or not +bzip2recover was built with such +a limitation, run it without arguments. In any event you can +build yourself an unlimited version if you can recompile it with +MaybeUInt64 set to be an +unsigned 64-bit integer. + + + + + + +AUTHOR + +Julian Seward, +&bz-email; + +The ideas embodied in +bzip2 are due to (at least) the +following people: Michael Burrows and David Wheeler (for the +block sorting transformation), David Wheeler (again, for the +Huffman coder), Peter Fenwick (for the structured coding model in +the original bzip, and many +refinements), and Alistair Moffat, Radford Neal and Ian Witten +(for the arithmetic coder in the original +bzip). I am much indebted for +their help, support and advice. See the manual in the source +distribution for pointers to sources of documentation. Christian +von Roques encouraged me to look for faster sorting algorithms, +so as to speed up compression. Bela Lubkin encouraged me to +improve the worst-case compression performance. +Donna Robinson XMLised the documentation. +Many people sent +patches, helped with portability problems, lent machines, gave +advice and were generally helpful. + + + + + + + + + +Programming with <computeroutput>libbzip2</computeroutput> + + +This chapter describes the programming interface to +libbzip2. + +For general background information, particularly about +memory use and performance aspects, you'd be well advised to read + as well. + + + +Top-level structure + +libbzip2 is a flexible +library for compressing and decompressing data in the +bzip2 data format. Although +packaged as a single entity, it helps to regard the library as +three separate parts: the low level interface, and the high level +interface, and some utility functions. + +The structure of +libbzip2's interfaces is similar +to that of Jean-loup Gailly's and Mark Adler's excellent +zlib library. + +All externally visible symbols have names beginning +BZ2_. This is new in version +1.0. The intention is to minimise pollution of the namespaces of +library clients. + +To use any part of the library, you need to +#include <bzlib.h> +into your sources. + + + + +Low-level summary + +This interface provides services for compressing and +decompressing data in memory. There's no provision for dealing +with files, streams or any other I/O mechanisms, just straight +memory-to-memory work. In fact, this part of the library can be +compiled without inclusion of +stdio.h, which may be helpful +for embedded applications. + +The low-level part of the library has no global variables +and is therefore thread-safe. + +Six routines make up the low level interface: +BZ2_bzCompressInit, +BZ2_bzCompress, and +BZ2_bzCompressEnd for +compression, and a corresponding trio +BZ2_bzDecompressInit, +BZ2_bzDecompress and +BZ2_bzDecompressEnd for +decompression. The *Init +functions allocate memory for compression/decompression and do +other initialisations, whilst the +*End functions close down +operations and release memory. + +The real work is done by +BZ2_bzCompress and +BZ2_bzDecompress. These +compress and decompress data from a user-supplied input buffer to +a user-supplied output buffer. These buffers can be any size; +arbitrary quantities of data are handled by making repeated calls +to these functions. This is a flexible mechanism allowing a +consumer-pull style of activity, or producer-push, or a mixture +of both. + + + + + +High-level summary + +This interface provides some handy wrappers around the +low-level interface to facilitate reading and writing +bzip2 format files +(.bz2 files). The routines +provide hooks to facilitate reading files in which the +bzip2 data stream is embedded +within some larger-scale file structure, or where there are +multiple bzip2 data streams +concatenated end-to-end. + +For reading files, +BZ2_bzReadOpen, +BZ2_bzRead, +BZ2_bzReadClose and +BZ2_bzReadGetUnused are +supplied. For writing files, +BZ2_bzWriteOpen, +BZ2_bzWrite and +BZ2_bzWriteFinish are +available. + +As with the low-level library, no global variables are used +so the library is per se thread-safe. However, if I/O errors +occur whilst reading or writing the underlying compressed files, +you may have to consult errno to +determine the cause of the error. In that case, you'd need a C +library which correctly supports +errno in a multithreaded +environment. + +To make the library a little simpler and more portable, +BZ2_bzReadOpen and +BZ2_bzWriteOpen require you to +pass them file handles (FILE*s) +which have previously been opened for reading or writing +respectively. That avoids portability problems associated with +file operations and file attributes, whilst not being much of an +imposition on the programmer. + + + + + +Utility functions summary + +For very simple needs, +BZ2_bzBuffToBuffCompress and +BZ2_bzBuffToBuffDecompress are +provided. These compress data in memory from one buffer to +another buffer in a single function call. You should assess +whether these functions fulfill your memory-to-memory +compression/decompression requirements before investing effort in +understanding the more general but more complex low-level +interface. + +Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp) has +contributed some functions to give better +zlib compatibility. These +functions are BZ2_bzopen, +BZ2_bzread, +BZ2_bzwrite, +BZ2_bzflush, +BZ2_bzclose, +BZ2_bzerror and +BZ2_bzlibVersion. You may find +these functions more convenient for simple file reading and +writing, than those in the high-level interface. These functions +are not (yet) officially part of the library, and are minimally +documented here. If they break, you get to keep all the pieces. +I hope to document them properly when time permits. + +Yoshioka also contributed modifications to allow the +library to be built as a Windows DLL. + + + + + + + +Error handling + +The library is designed to recover cleanly in all +situations, including the worst-case situation of decompressing +random data. I'm not 100% sure that it can always do this, so +you might want to add a signal handler to catch segmentation +violations during decompression if you are feeling especially +paranoid. I would be interested in hearing more about the +robustness of the library to corrupted compressed data. + +Version 1.0.3 more robust in this respect than any +previous version. Investigations with Valgrind (a tool for detecting +problems with memory management) indicate +that, at least for the few files I tested, all single-bit errors +in the decompressed data are caught properly, with no +segmentation faults, no uses of uninitialised data, no out of +range reads or writes, and no infinite looping in the decompressor. +So it's certainly pretty robust, although +I wouldn't claim it to be totally bombproof. + +The file bzlib.h contains +all definitions needed to use the library. In particular, you +should definitely not include +bzlib_private.h. + +In bzlib.h, the various +return values are defined. The following list is not intended as +an exhaustive description of the circumstances in which a given +value may be returned -- those descriptions are given later. +Rather, it is intended to convey the rough meaning of each return +value. The first five actions are normal and not intended to +denote an error situation. + + + + + BZ_OK + The requested action was completed + successfully. + + + + BZ_RUN_OK, BZ_FLUSH_OK, + BZ_FINISH_OK + In + BZ2_bzCompress, the requested + flush/finish/nothing-special action was completed + successfully. + + + + BZ_STREAM_END + Compression of data was completed, or the + logical stream end was detected during + decompression. + + + + +The following return values indicate an error of some +kind. + + + + + BZ_CONFIG_ERROR + Indicates that the library has been improperly + compiled on your platform -- a major configuration error. + Specifically, it means that + sizeof(char), + sizeof(short) and + sizeof(int) are not 1, 2 and + 4 respectively, as they should be. Note that the library + should still work properly on 64-bit platforms which follow + the LP64 programming model -- that is, where + sizeof(long) and + sizeof(void*) are 8. Under + LP64, sizeof(int) is still 4, + so libbzip2, which doesn't + use the long type, is + OK. + + + + BZ_SEQUENCE_ERROR + When using the library, it is important to call + the functions in the correct sequence and with data structures + (buffers etc) in the correct states. + libbzip2 checks as much as it + can to ensure this is happening, and returns + BZ_SEQUENCE_ERROR if not. + Code which complies precisely with the function semantics, as + detailed below, should never receive this value; such an event + denotes buggy code which you should + investigate. + + + + BZ_PARAM_ERROR + Returned when a parameter to a function call is + out of range or otherwise manifestly incorrect. As with + BZ_SEQUENCE_ERROR, this + denotes a bug in the client code. The distinction between + BZ_PARAM_ERROR and + BZ_SEQUENCE_ERROR is a bit + hazy, but still worth making. + + + + BZ_MEM_ERROR + Returned when a request to allocate memory + failed. Note that the quantity of memory needed to decompress + a stream cannot be determined until the stream's header has + been read. So + BZ2_bzDecompress and + BZ2_bzRead may return + BZ_MEM_ERROR even though some + of the compressed data has been read. The same is not true + for compression; once + BZ2_bzCompressInit or + BZ2_bzWriteOpen have + successfully completed, + BZ_MEM_ERROR cannot + occur. + + + + BZ_DATA_ERROR + Returned when a data integrity error is + detected during decompression. Most importantly, this means + when stored and computed CRCs for the data do not match. This + value is also returned upon detection of any other anomaly in + the compressed data. + + + + BZ_DATA_ERROR_MAGIC + As a special case of + BZ_DATA_ERROR, it is + sometimes useful to know when the compressed stream does not + start with the correct magic bytes ('B' 'Z' + 'h'). + + + + BZ_IO_ERROR + Returned by + BZ2_bzRead and + BZ2_bzWrite when there is an + error reading or writing in the compressed file, and by + BZ2_bzReadOpen and + BZ2_bzWriteOpen for attempts + to use a file for which the error indicator (viz, + ferror(f)) is set. On + receipt of BZ_IO_ERROR, the + caller should consult errno + and/or perror to acquire + operating-system specific information about the + problem. + + + + BZ_UNEXPECTED_EOF + Returned by + BZ2_bzRead when the + compressed file finishes before the logical end of stream is + detected. + + + + BZ_OUTBUFF_FULL + Returned by + BZ2_bzBuffToBuffCompress and + BZ2_bzBuffToBuffDecompress to + indicate that the output data will not fit into the output + buffer provided. + + + + + + + + + +Low-level interface + + + +<computeroutput>BZ2_bzCompressInit</computeroutput> + + +typedef struct { + char *next_in; + unsigned int avail_in; + unsigned int total_in_lo32; + unsigned int total_in_hi32; + + char *next_out; + unsigned int avail_out; + unsigned int total_out_lo32; + unsigned int total_out_hi32; + + void *state; + + void *(*bzalloc)(void *,int,int); + void (*bzfree)(void *,void *); + void *opaque; +} bz_stream; + +int BZ2_bzCompressInit ( bz_stream *strm, + int blockSize100k, + int verbosity, + int workFactor ); + + +Prepares for compression. The +bz_stream structure holds all +data pertaining to the compression activity. A +bz_stream structure should be +allocated and initialised prior to the call. The fields of +bz_stream comprise the entirety +of the user-visible data. state +is a pointer to the private data structures required for +compression. + +Custom memory allocators are supported, via fields +bzalloc, +bzfree, and +opaque. The value +opaque is passed to as the first +argument to all calls to bzalloc +and bzfree, but is otherwise +ignored by the library. The call bzalloc ( +opaque, n, m ) is expected to return a pointer +p to n * +m bytes of memory, and bzfree ( +opaque, p ) should free that memory. + +If you don't want to use a custom memory allocator, set +bzalloc, +bzfree and +opaque to +NULL, and the library will then +use the standard malloc / +free routines. + +Before calling +BZ2_bzCompressInit, fields +bzalloc, +bzfree and +opaque should be filled +appropriately, as just described. Upon return, the internal +state will have been allocated and initialised, and +total_in_lo32, +total_in_hi32, +total_out_lo32 and +total_out_hi32 will have been +set to zero. These four fields are used by the library to inform +the caller of the total amount of data passed into and out of the +library, respectively. You should not try to change them. As of +version 1.0, 64-bit counts are maintained, even on 32-bit +platforms, using the _hi32 +fields to store the upper 32 bits of the count. So, for example, +the total amount of data in is (total_in_hi32 +<< 32) + total_in_lo32. + +Parameter blockSize100k +specifies the block size to be used for compression. It should +be a value between 1 and 9 inclusive, and the actual block size +used is 100000 x this figure. 9 gives the best compression but +takes most memory. + +Parameter verbosity should +be set to a number between 0 and 4 inclusive. 0 is silent, and +greater numbers give increasingly verbose monitoring/debugging +output. If the library has been compiled with +-DBZ_NO_STDIO, no such output +will appear for any verbosity setting. + +Parameter workFactor +controls how the compression phase behaves when presented with +worst case, highly repetitive, input data. If compression runs +into difficulties caused by repetitive data, the library switches +from the standard sorting algorithm to a fallback algorithm. The +fallback is slower than the standard algorithm by perhaps a +factor of three, but always behaves reasonably, no matter how bad +the input. + +Lower values of workFactor +reduce the amount of effort the standard algorithm will expend +before resorting to the fallback. You should set this parameter +carefully; too low, and many inputs will be handled by the +fallback algorithm and so compress rather slowly, too high, and +your average-to-worst case compression times can become very +large. The default value of 30 gives reasonable behaviour over a +wide range of circumstances. + +Allowable values range from 0 to 250 inclusive. 0 is a +special case, equivalent to using the default value of 30. + +Note that the compressed output generated is the same +regardless of whether or not the fallback algorithm is +used. + +Be aware also that this parameter may disappear entirely in +future versions of the library. In principle it should be +possible to devise a good way to automatically choose which +algorithm to use. Such a mechanism would render the parameter +obsolete. + +Possible return values: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if strm is NULL + or blockSize < 1 or blockSize > 9 + or verbosity < 0 or verbosity > 4 + or workFactor < 0 or workFactor > 250 +BZ_MEM_ERROR + if not enough memory is available +BZ_OK + otherwise + + +Allowable next actions: + + +BZ2_bzCompress + if BZ_OK is returned + no specific action needed in case of error + + + + + + +<computeroutput>BZ2_bzCompress</computeroutput> + + +int BZ2_bzCompress ( bz_stream *strm, int action ); + + +Provides more input and/or output buffer space for the +library. The caller maintains input and output buffers, and +calls BZ2_bzCompress to transfer +data between them. + +Before each call to +BZ2_bzCompress, +next_in should point at the data +to be compressed, and avail_in +should indicate how many bytes the library may read. +BZ2_bzCompress updates +next_in, +avail_in and +total_in to reflect the number +of bytes it has read. + +Similarly, next_out should +point to a buffer in which the compressed data is to be placed, +with avail_out indicating how +much output space is available. +BZ2_bzCompress updates +next_out, +avail_out and +total_out to reflect the number +of bytes output. + +You may provide and remove as little or as much data as you +like on each call of +BZ2_bzCompress. In the limit, +it is acceptable to supply and remove data one byte at a time, +although this would be terribly inefficient. You should always +ensure that at least one byte of output space is available at +each call. + +A second purpose of +BZ2_bzCompress is to request a +change of mode of the compressed stream. + +Conceptually, a compressed stream can be in one of four +states: IDLE, RUNNING, FLUSHING and FINISHING. Before +initialisation +(BZ2_bzCompressInit) and after +termination (BZ2_bzCompressEnd), +a stream is regarded as IDLE. + +Upon initialisation +(BZ2_bzCompressInit), the stream +is placed in the RUNNING state. Subsequent calls to +BZ2_bzCompress should pass +BZ_RUN as the requested action; +other actions are illegal and will result in +BZ_SEQUENCE_ERROR. + +At some point, the calling program will have provided all +the input data it wants to. It will then want to finish up -- in +effect, asking the library to process any data it might have +buffered internally. In this state, +BZ2_bzCompress will no longer +attempt to read data from +next_in, but it will want to +write data to next_out. Because +the output buffer supplied by the user can be arbitrarily small, +the finishing-up operation cannot necessarily be done with a +single call of +BZ2_bzCompress. + +Instead, the calling program passes +BZ_FINISH as an action to +BZ2_bzCompress. This changes +the stream's state to FINISHING. Any remaining input (ie, +next_in[0 .. avail_in-1]) is +compressed and transferred to the output buffer. To do this, +BZ2_bzCompress must be called +repeatedly until all the output has been consumed. At that +point, BZ2_bzCompress returns +BZ_STREAM_END, and the stream's +state is set back to IDLE. +BZ2_bzCompressEnd should then be +called. + +Just to make sure the calling program does not cheat, the +library makes a note of avail_in +at the time of the first call to +BZ2_bzCompress which has +BZ_FINISH as an action (ie, at +the time the program has announced its intention to not supply +any more input). By comparing this value with that of +avail_in over subsequent calls +to BZ2_bzCompress, the library +can detect any attempts to slip in more data to compress. Any +calls for which this is detected will return +BZ_SEQUENCE_ERROR. This +indicates a programming mistake which should be corrected. + +Instead of asking to finish, the calling program may ask +BZ2_bzCompress to take all the +remaining input, compress it and terminate the current +(Burrows-Wheeler) compression block. This could be useful for +error control purposes. The mechanism is analogous to that for +finishing: call BZ2_bzCompress +with an action of BZ_FLUSH, +remove output data, and persist with the +BZ_FLUSH action until the value +BZ_RUN is returned. As with +finishing, BZ2_bzCompress +detects any attempt to provide more input data once the flush has +begun. + +Once the flush is complete, the stream returns to the +normal RUNNING state. + +This all sounds pretty complex, but isn't really. Here's a +table which shows which actions are allowable in each state, what +action will be taken, what the next state is, and what the +non-error return values are. Note that you can't explicitly ask +what state the stream is in, but nor do you need to -- it can be +inferred from the values returned by +BZ2_bzCompress. + + +IDLE/any + Illegal. IDLE state only exists after BZ2_bzCompressEnd or + before BZ2_bzCompressInit. + Return value = BZ_SEQUENCE_ERROR + +RUNNING/BZ_RUN + Compress from next_in to next_out as much as possible. + Next state = RUNNING + Return value = BZ_RUN_OK + +RUNNING/BZ_FLUSH + Remember current value of next_in. Compress from next_in + to next_out as much as possible, but do not accept any more input. + Next state = FLUSHING + Return value = BZ_FLUSH_OK + +RUNNING/BZ_FINISH + Remember current value of next_in. Compress from next_in + to next_out as much as possible, but do not accept any more input. + Next state = FINISHING + Return value = BZ_FINISH_OK + +FLUSHING/BZ_FLUSH + Compress from next_in to next_out as much as possible, + but do not accept any more input. + If all the existing input has been used up and all compressed + output has been removed + Next state = RUNNING; Return value = BZ_RUN_OK + else + Next state = FLUSHING; Return value = BZ_FLUSH_OK + +FLUSHING/other + Illegal. + Return value = BZ_SEQUENCE_ERROR + +FINISHING/BZ_FINISH + Compress from next_in to next_out as much as possible, + but to not accept any more input. + If all the existing input has been used up and all compressed + output has been removed + Next state = IDLE; Return value = BZ_STREAM_END + else + Next state = FINISHING; Return value = BZ_FINISH_OK + +FINISHING/other + Illegal. + Return value = BZ_SEQUENCE_ERROR + + + +That still looks complicated? Well, fair enough. The +usual sequence of calls for compressing a load of data is: + + + + Get started with + BZ2_bzCompressInit. + + Shovel data in and shlurp out its compressed form + using zero or more calls of + BZ2_bzCompress with action = + BZ_RUN. + + Finish up. Repeatedly call + BZ2_bzCompress with action = + BZ_FINISH, copying out the + compressed output, until + BZ_STREAM_END is + returned. Close up and go home. Call + BZ2_bzCompressEnd. + + + +If the data you want to compress fits into your input +buffer all at once, you can skip the calls of +BZ2_bzCompress ( ..., BZ_RUN ) +and just do the BZ2_bzCompress ( ..., BZ_FINISH +) calls. + +All required memory is allocated by +BZ2_bzCompressInit. The +compression library can accept any data at all (obviously). So +you shouldn't get any error return values from the +BZ2_bzCompress calls. If you +do, they will be +BZ_SEQUENCE_ERROR, and indicate +a bug in your programming. + +Trivial other possible return values: + + +BZ_PARAM_ERROR + if strm is NULL, or strm->s is NULL + + + + + + +<computeroutput>BZ2_bzCompressEnd</computeroutput> + + +int BZ2_bzCompressEnd ( bz_stream *strm ); + + +Releases all memory associated with a compression +stream. + +Possible return values: + + +BZ_PARAM_ERROR if strm is NULL or strm->s is NULL +BZ_OK otherwise + + + + + + +<computeroutput>BZ2_bzDecompressInit</computeroutput> + + +int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small ); + + +Prepares for decompression. As with +BZ2_bzCompressInit, a +bz_stream record should be +allocated and initialised before the call. Fields +bzalloc, +bzfree and +opaque should be set if a custom +memory allocator is required, or made +NULL for the normal +malloc / +free routines. Upon return, the +internal state will have been initialised, and +total_in and +total_out will be zero. + +For the meaning of parameter +verbosity, see +BZ2_bzCompressInit. + +If small is nonzero, the +library will use an alternative decompression algorithm which +uses less memory but at the cost of decompressing more slowly +(roughly speaking, half the speed, but the maximum memory +requirement drops to around 2300k). See +for more information on memory management. + +Note that the amount of memory needed to decompress a +stream cannot be determined until the stream's header has been +read, so even if +BZ2_bzDecompressInit succeeds, a +subsequent BZ2_bzDecompress +could fail with +BZ_MEM_ERROR. + +Possible return values: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if ( small != 0 && small != 1 ) + or (verbosity <; 0 || verbosity > 4) +BZ_MEM_ERROR + if insufficient memory is available + + +Allowable next actions: + + +BZ2_bzDecompress + if BZ_OK was returned + no specific action required in case of error + + + + + + +<computeroutput>BZ2_bzDecompress</computeroutput> + + +int BZ2_bzDecompress ( bz_stream *strm ); + + +Provides more input and/out output buffer space for the +library. The caller maintains input and output buffers, and uses +BZ2_bzDecompress to transfer +data between them. + +Before each call to +BZ2_bzDecompress, +next_in should point at the +compressed data, and avail_in +should indicate how many bytes the library may read. +BZ2_bzDecompress updates +next_in, +avail_in and +total_in to reflect the number +of bytes it has read. + +Similarly, next_out should +point to a buffer in which the uncompressed output is to be +placed, with avail_out +indicating how much output space is available. +BZ2_bzCompress updates +next_out, +avail_out and +total_out to reflect the number +of bytes output. + +You may provide and remove as little or as much data as you +like on each call of +BZ2_bzDecompress. In the limit, +it is acceptable to supply and remove data one byte at a time, +although this would be terribly inefficient. You should always +ensure that at least one byte of output space is available at +each call. + +Use of BZ2_bzDecompress is +simpler than +BZ2_bzCompress. + +You should provide input and remove output as described +above, and repeatedly call +BZ2_bzDecompress until +BZ_STREAM_END is returned. +Appearance of BZ_STREAM_END +denotes that BZ2_bzDecompress +has detected the logical end of the compressed stream. +BZ2_bzDecompress will not +produce BZ_STREAM_END until all +output data has been placed into the output buffer, so once +BZ_STREAM_END appears, you are +guaranteed to have available all the decompressed output, and +BZ2_bzDecompressEnd can safely +be called. + +If case of an error return value, you should call +BZ2_bzDecompressEnd to clean up +and release memory. + +Possible return values: + + +BZ_PARAM_ERROR + if strm is NULL or strm->s is NULL + or strm->avail_out < 1 +BZ_DATA_ERROR + if a data integrity error is detected in the compressed stream +BZ_DATA_ERROR_MAGIC + if the compressed stream doesn't begin with the right magic bytes +BZ_MEM_ERROR + if there wasn't enough memory available +BZ_STREAM_END + if the logical end of the data stream was detected and all + output in has been consumed, eg s-->avail_out > 0 +BZ_OK + otherwise + + +Allowable next actions: + + +BZ2_bzDecompress + if BZ_OK was returned +BZ2_bzDecompressEnd + otherwise + + + + + + +<computeroutput>BZ2_bzDecompressEnd</computeroutput> + + +int BZ2_bzDecompressEnd ( bz_stream *strm ); + + +Releases all memory associated with a decompression +stream. + +Possible return values: + + +BZ_PARAM_ERROR + if strm is NULL or strm->s is NULL +BZ_OK + otherwise + + +Allowable next actions: + + + None. + + + + + + + + +High-level interface + +This interface provides functions for reading and writing +bzip2 format files. First, some +general points. + + + + All of the functions take an + int* first argument, + bzerror. After each call, + bzerror should be consulted + first to determine the outcome of the call. If + bzerror is + BZ_OK, the call completed + successfully, and only then should the return value of the + function (if any) be consulted. If + bzerror is + BZ_IO_ERROR, there was an + error reading/writing the underlying compressed file, and you + should then consult errno / + perror to determine the cause + of the difficulty. bzerror + may also be set to various other values; precise details are + given on a per-function basis below. + + If bzerror indicates + an error (ie, anything except + BZ_OK and + BZ_STREAM_END), you should + immediately call + BZ2_bzReadClose (or + BZ2_bzWriteClose, depending on + whether you are attempting to read or to write) to free up all + resources associated with the stream. Once an error has been + indicated, behaviour of all calls except + BZ2_bzReadClose + (BZ2_bzWriteClose) is + undefined. The implication is that (1) + bzerror should be checked + after each call, and (2) if + bzerror indicates an error, + BZ2_bzReadClose + (BZ2_bzWriteClose) should then + be called to clean up. + + The FILE* arguments + passed to BZ2_bzReadOpen / + BZ2_bzWriteOpen should be set + to binary mode. Most Unix systems will do this by default, but + other platforms, including Windows and Mac, will not. If you + omit this, you may encounter problems when moving code to new + platforms. + + Memory allocation requests are handled by + malloc / + free. At present there is no + facility for user-defined memory allocators in the file I/O + functions (could easily be added, though). + + + + + + +<computeroutput>BZ2_bzReadOpen</computeroutput> + + +typedef void BZFILE; + +BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f, + int verbosity, int small, + void *unused, int nUnused ); + + +Prepare to read compressed data from file handle +f. +f should refer to a file which +has been opened for reading, and for which the error indicator +(ferror(f))is not set. If +small is 1, the library will try +to decompress using less memory, at the expense of speed. + +For reasons explained below, +BZ2_bzRead will decompress the +nUnused bytes starting at +unused, before starting to read +from the file f. At most +BZ_MAX_UNUSED bytes may be +supplied like this. If this facility is not required, you should +pass NULL and +0 for +unused and +nUnused respectively. + +For the meaning of parameters +small and +verbosity, see +BZ2_bzDecompressInit. + +The amount of memory needed to decompress a file cannot be +determined until the file's header has been read. So it is +possible that BZ2_bzReadOpen +returns BZ_OK but a subsequent +call of BZ2_bzRead will return +BZ_MEM_ERROR. + +Possible assignments to +bzerror: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if f is NULL + or small is neither 0 nor 1 + or ( unused == NULL && nUnused != 0 ) + or ( unused != NULL && !(0 <= nUnused <= BZ_MAX_UNUSED) ) +BZ_IO_ERROR + if ferror(f) is nonzero +BZ_MEM_ERROR + if insufficient memory is available +BZ_OK + otherwise. + + +Possible return values: + + +Pointer to an abstract BZFILE + if bzerror is BZ_OK +NULL + otherwise + + +Allowable next actions: + + +BZ2_bzRead + if bzerror is BZ_OK +BZ2_bzClose + otherwise + + + + + + +<computeroutput>BZ2_bzRead</computeroutput> + + +int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len ); + + +Reads up to len +(uncompressed) bytes from the compressed file +b into the buffer +buf. If the read was +successful, bzerror is set to +BZ_OK and the number of bytes +read is returned. If the logical end-of-stream was detected, +bzerror will be set to +BZ_STREAM_END, and the number of +bytes read is returned. All other +bzerror values denote an +error. + +BZ2_bzRead will supply +len bytes, unless the logical +stream end is detected or an error occurs. Because of this, it +is possible to detect the stream end by observing when the number +of bytes returned is less than the number requested. +Nevertheless, this is regarded as inadvisable; you should instead +check bzerror after every call +and watch out for +BZ_STREAM_END. + +Internally, BZ2_bzRead +copies data from the compressed file in chunks of size +BZ_MAX_UNUSED bytes before +decompressing it. If the file contains more bytes than strictly +needed to reach the logical end-of-stream, +BZ2_bzRead will almost certainly +read some of the trailing data before signalling +BZ_SEQUENCE_END. To collect the +read but unused data once +BZ_SEQUENCE_END has appeared, +call BZ2_bzReadGetUnused +immediately before +BZ2_bzReadClose. + +Possible assignments to +bzerror: + + +BZ_PARAM_ERROR + if b is NULL or buf is NULL or len < 0 +BZ_SEQUENCE_ERROR + if b was opened with BZ2_bzWriteOpen +BZ_IO_ERROR + if there is an error reading from the compressed file +BZ_UNEXPECTED_EOF + if the compressed file ended before + the logical end-of-stream was detected +BZ_DATA_ERROR + if a data integrity error was detected in the compressed stream +BZ_DATA_ERROR_MAGIC + if the stream does not begin with the requisite header bytes + (ie, is not a bzip2 data file). This is really + a special case of BZ_DATA_ERROR. +BZ_MEM_ERROR + if insufficient memory was available +BZ_STREAM_END + if the logical end of stream was detected. +BZ_OK + otherwise. + + +Possible return values: + + +number of bytes read + if bzerror is BZ_OK or BZ_STREAM_END +undefined + otherwise + + +Allowable next actions: + + +collect data from buf, then BZ2_bzRead or BZ2_bzReadClose + if bzerror is BZ_OK +collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused + if bzerror is BZ_SEQUENCE_END +BZ2_bzReadClose + otherwise + + + + + + +<computeroutput>BZ2_bzReadGetUnused</computeroutput> + + +void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b, + void** unused, int* nUnused ); + + +Returns data which was read from the compressed file but +was not needed to get to the logical end-of-stream. +*unused is set to the address of +the data, and *nUnused to the +number of bytes. *nUnused will +be set to a value between 0 and +BZ_MAX_UNUSED inclusive. + +This function may only be called once +BZ2_bzRead has signalled +BZ_STREAM_END but before +BZ2_bzReadClose. + +Possible assignments to +bzerror: + + +BZ_PARAM_ERROR + if b is NULL + or unused is NULL or nUnused is NULL +BZ_SEQUENCE_ERROR + if BZ_STREAM_END has not been signalled + or if b was opened with BZ2_bzWriteOpen +BZ_OK + otherwise + + +Allowable next actions: + + +BZ2_bzReadClose + + + + + + +<computeroutput>BZ2_bzReadClose</computeroutput> + + +void BZ2_bzReadClose ( int *bzerror, BZFILE *b ); + + +Releases all memory pertaining to the compressed file +b. +BZ2_bzReadClose does not call +fclose on the underlying file +handle, so you should do that yourself if appropriate. +BZ2_bzReadClose should be called +to clean up after all error situations. + +Possible assignments to +bzerror: + + +BZ_SEQUENCE_ERROR + if b was opened with BZ2_bzOpenWrite +BZ_OK + otherwise + + +Allowable next actions: + + +none + + + + + + +<computeroutput>BZ2_bzWriteOpen</computeroutput> + + +BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f, + int blockSize100k, int verbosity, + int workFactor ); + + +Prepare to write compressed data to file handle +f. +f should refer to a file which +has been opened for writing, and for which the error indicator +(ferror(f))is not set. + +For the meaning of parameters +blockSize100k, +verbosity and +workFactor, see +BZ2_bzCompressInit. + +All required memory is allocated at this stage, so if the +call completes successfully, +BZ_MEM_ERROR cannot be signalled +by a subsequent call to +BZ2_bzWrite. + +Possible assignments to +bzerror: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if f is NULL + or blockSize100k < 1 or blockSize100k > 9 +BZ_IO_ERROR + if ferror(f) is nonzero +BZ_MEM_ERROR + if insufficient memory is available +BZ_OK + otherwise + + +Possible return values: + + +Pointer to an abstract BZFILE + if bzerror is BZ_OK +NULL + otherwise + + +Allowable next actions: + + +BZ2_bzWrite + if bzerror is BZ_OK + (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless) +BZ2_bzWriteClose + otherwise + + + + + + +<computeroutput>BZ2_bzWrite</computeroutput> + + +void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len ); + + +Absorbs len bytes from the +buffer buf, eventually to be +compressed and written to the file. + +Possible assignments to +bzerror: + + +BZ_PARAM_ERROR + if b is NULL or buf is NULL or len < 0 +BZ_SEQUENCE_ERROR + if b was opened with BZ2_bzReadOpen +BZ_IO_ERROR + if there is an error writing the compressed file. +BZ_OK + otherwise + + + + + + +<computeroutput>BZ2_bzWriteClose</computeroutput> + + +void BZ2_bzWriteClose( int *bzerror, BZFILE* f, + int abandon, + unsigned int* nbytes_in, + unsigned int* nbytes_out ); + +void BZ2_bzWriteClose64( int *bzerror, BZFILE* f, + int abandon, + unsigned int* nbytes_in_lo32, + unsigned int* nbytes_in_hi32, + unsigned int* nbytes_out_lo32, + unsigned int* nbytes_out_hi32 ); + + +Compresses and flushes to the compressed file all data so +far supplied by BZ2_bzWrite. +The logical end-of-stream markers are also written, so subsequent +calls to BZ2_bzWrite are +illegal. All memory associated with the compressed file +b is released. +fflush is called on the +compressed file, but it is not +fclose'd. + +If BZ2_bzWriteClose is +called to clean up after an error, the only action is to release +the memory. The library records the error codes issued by +previous calls, so this situation will be detected automatically. +There is no attempt to complete the compression operation, nor to +fflush the compressed file. You +can force this behaviour to happen even in the case of no error, +by passing a nonzero value to +abandon. + +If nbytes_in is non-null, +*nbytes_in will be set to be the +total volume of uncompressed data handled. Similarly, +nbytes_out will be set to the +total volume of compressed data written. For compatibility with +older versions of the library, +BZ2_bzWriteClose only yields the +lower 32 bits of these counts. Use +BZ2_bzWriteClose64 if you want +the full 64 bit counts. These two functions are otherwise +absolutely identical. + +Possible assignments to +bzerror: + + +BZ_SEQUENCE_ERROR + if b was opened with BZ2_bzReadOpen +BZ_IO_ERROR + if there is an error writing the compressed file +BZ_OK + otherwise + + + + + + +Handling embedded compressed data streams + +The high-level library facilitates use of +bzip2 data streams which form +some part of a surrounding, larger data stream. + + + + For writing, the library takes an open file handle, + writes compressed data to it, + fflushes it but does not + fclose it. The calling + application can write its own data before and after the + compressed data stream, using that same file handle. + + Reading is more complex, and the facilities are not as + general as they could be since generality is hard to reconcile + with efficiency. BZ2_bzRead + reads from the compressed file in blocks of size + BZ_MAX_UNUSED bytes, and in + doing so probably will overshoot the logical end of compressed + stream. To recover this data once decompression has ended, + call BZ2_bzReadGetUnused after + the last call of BZ2_bzRead + (the one returning + BZ_STREAM_END) but before + calling + BZ2_bzReadClose. + + + +This mechanism makes it easy to decompress multiple +bzip2 streams placed end-to-end. +As the end of one stream, when +BZ2_bzRead returns +BZ_STREAM_END, call +BZ2_bzReadGetUnused to collect +the unused data (copy it into your own buffer somewhere). That +data forms the start of the next compressed stream. To start +uncompressing that next stream, call +BZ2_bzReadOpen again, feeding in +the unused data via the unused / +nUnused parameters. Keep doing +this until BZ_STREAM_END return +coincides with the physical end of file +(feof(f)). In this situation +BZ2_bzReadGetUnused will of +course return no data. + +This should give some feel for how the high-level interface +can be used. If you require extra flexibility, you'll have to +bite the bullet and get to grips with the low-level +interface. + + + + + +Standard file-reading/writing code + +Here's how you'd write data to a compressed file: + + +FILE* f; +BZFILE* b; +int nBuf; +char buf[ /* whatever size you like */ ]; +int bzerror; +int nWritten; + +f = fopen ( "myfile.bz2", "w" ); +if ( !f ) { + /* handle error */ +} +b = BZ2_bzWriteOpen( &bzerror, f, 9 ); +if (bzerror != BZ_OK) { + BZ2_bzWriteClose ( b ); + /* handle error */ +} + +while ( /* condition */ ) { + /* get data to write into buf, and set nBuf appropriately */ + nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf ); + if (bzerror == BZ_IO_ERROR) { + BZ2_bzWriteClose ( &bzerror, b ); + /* handle error */ + } +} + +BZ2_bzWriteClose( &bzerror, b ); +if (bzerror == BZ_IO_ERROR) { + /* handle error */ +} + + +And to read from a compressed file: + + +FILE* f; +BZFILE* b; +int nBuf; +char buf[ /* whatever size you like */ ]; +int bzerror; +int nWritten; + +f = fopen ( "myfile.bz2", "r" ); +if ( !f ) { + /* handle error */ +} +b = BZ2_bzReadOpen ( &bzerror, f, 0, NULL, 0 ); +if ( bzerror != BZ_OK ) { + BZ2_bzReadClose ( &bzerror, b ); + /* handle error */ +} + +bzerror = BZ_OK; +while ( bzerror == BZ_OK && /* arbitrary other conditions */) { + nBuf = BZ2_bzRead ( &bzerror, b, buf, /* size of buf */ ); + if ( bzerror == BZ_OK ) { + /* do something with buf[0 .. nBuf-1] */ + } +} +if ( bzerror != BZ_STREAM_END ) { + BZ2_bzReadClose ( &bzerror, b ); + /* handle error */ +} else { + BZ2_bzReadClose ( &bzerror, b ); +} + + + + + + + + +Utility functions + + + +<computeroutput>BZ2_bzBuffToBuffCompress</computeroutput> + + +int BZ2_bzBuffToBuffCompress( char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int blockSize100k, + int verbosity, + int workFactor ); + + +Attempts to compress the data in source[0 +.. sourceLen-1] into the destination buffer, +dest[0 .. *destLen-1]. If the +destination buffer is big enough, +*destLen is set to the size of +the compressed data, and BZ_OK +is returned. If the compressed data won't fit, +*destLen is unchanged, and +BZ_OUTBUFF_FULL is +returned. + +Compression in this manner is a one-shot event, done with a +single call to this function. The resulting compressed data is a +complete bzip2 format data +stream. There is no mechanism for making additional calls to +provide extra input data. If you want that kind of mechanism, +use the low-level interface. + +For the meaning of parameters +blockSize100k, +verbosity and +workFactor, see +BZ2_bzCompressInit. + +To guarantee that the compressed data will fit in its +buffer, allocate an output buffer of size 1% larger than the +uncompressed data, plus six hundred extra bytes. + +BZ2_bzBuffToBuffDecompress +will not write data at or beyond +dest[*destLen], even in case of +buffer overflow. + +Possible return values: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if dest is NULL or destLen is NULL + or blockSize100k < 1 or blockSize100k > 9 + or verbosity < 0 or verbosity > 4 + or workFactor < 0 or workFactor > 250 +BZ_MEM_ERROR + if insufficient memory is available +BZ_OUTBUFF_FULL + if the size of the compressed data exceeds *destLen +BZ_OK + otherwise + + + + + + +<computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput> + + +int BZ2_bzBuffToBuffDecompress( char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int small, + int verbosity ); + + +Attempts to decompress the data in source[0 +.. sourceLen-1] into the destination buffer, +dest[0 .. *destLen-1]. If the +destination buffer is big enough, +*destLen is set to the size of +the uncompressed data, and BZ_OK +is returned. If the compressed data won't fit, +*destLen is unchanged, and +BZ_OUTBUFF_FULL is +returned. + +source is assumed to hold +a complete bzip2 format data +stream. +BZ2_bzBuffToBuffDecompress tries +to decompress the entirety of the stream into the output +buffer. + +For the meaning of parameters +small and +verbosity, see +BZ2_bzDecompressInit. + +Because the compression ratio of the compressed data cannot +be known in advance, there is no easy way to guarantee that the +output buffer will be big enough. You may of course make +arrangements in your code to record the size of the uncompressed +data, but such a mechanism is beyond the scope of this +library. + +BZ2_bzBuffToBuffDecompress +will not write data at or beyond +dest[*destLen], even in case of +buffer overflow. + +Possible return values: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if dest is NULL or destLen is NULL + or small != 0 && small != 1 + or verbosity < 0 or verbosity > 4 +BZ_MEM_ERROR + if insufficient memory is available +BZ_OUTBUFF_FULL + if the size of the compressed data exceeds *destLen +BZ_DATA_ERROR + if a data integrity error was detected in the compressed data +BZ_DATA_ERROR_MAGIC + if the compressed data doesn't begin with the right magic bytes +BZ_UNEXPECTED_EOF + if the compressed data ends unexpectedly +BZ_OK + otherwise + + + + + + + + +<computeroutput>zlib</computeroutput> compatibility functions + +Yoshioka Tsuneo has contributed some functions to give +better zlib compatibility. +These functions are BZ2_bzopen, +BZ2_bzread, +BZ2_bzwrite, +BZ2_bzflush, +BZ2_bzclose, +BZ2_bzerror and +BZ2_bzlibVersion. These +functions are not (yet) officially part of the library. If they +break, you get to keep all the pieces. Nevertheless, I think +they work ok. + + +typedef void BZFILE; + +const char * BZ2_bzlibVersion ( void ); + + +Returns a string indicating the library version. + + +BZFILE * BZ2_bzopen ( const char *path, const char *mode ); +BZFILE * BZ2_bzdopen ( int fd, const char *mode ); + + +Opens a .bz2 file for +reading or writing, using either its name or a pre-existing file +descriptor. Analogous to fopen +and fdopen. + + +int BZ2_bzread ( BZFILE* b, void* buf, int len ); +int BZ2_bzwrite ( BZFILE* b, void* buf, int len ); + + +Reads/writes data from/to a previously opened +BZFILE. Analogous to +fread and +fwrite. + + +int BZ2_bzflush ( BZFILE* b ); +void BZ2_bzclose ( BZFILE* b ); + + +Flushes/closes a BZFILE. +BZ2_bzflush doesn't actually do +anything. Analogous to fflush +and fclose. + + +const char * BZ2_bzerror ( BZFILE *b, int *errnum ) + + +Returns a string describing the more recent error status of +b, and also sets +*errnum to its numerical +value. + + + + + +Using the library in a <computeroutput>stdio</computeroutput>-free environment + + + +Getting rid of <computeroutput>stdio</computeroutput> + +In a deeply embedded application, you might want to use +just the memory-to-memory functions. You can do this +conveniently by compiling the library with preprocessor symbol +BZ_NO_STDIO defined. Doing this +gives you a library containing only the following eight +functions: + +BZ2_bzCompressInit, +BZ2_bzCompress, +BZ2_bzCompressEnd +BZ2_bzDecompressInit, +BZ2_bzDecompress, +BZ2_bzDecompressEnd +BZ2_bzBuffToBuffCompress, +BZ2_bzBuffToBuffDecompress + +When compiled like this, all functions will ignore +verbosity settings. + + + + + +Critical error handling + +libbzip2 contains a number +of internal assertion checks which should, needless to say, never +be activated. Nevertheless, if an assertion should fail, +behaviour depends on whether or not the library was compiled with +BZ_NO_STDIO set. + +For a normal compile, an assertion failure yields the +message: + +

+bzip2/libbzip2: internal error number N. +This is a bug in bzip2/libbzip2, &bz-version; of &bz-date;. +Please report it to me at: &bz-email;. If this happened +when you were using some program which uses libbzip2 as a +component, you should also report this bug to the author(s) +of that program. Please make an effort to report this bug; +timely and accurate bug reports eventually lead to higher +quality software. Thanks. Julian Seward, &bz-date;. +
+ +where N is some error code +number. If N == 1007, it also +prints some extra text advising the reader that unreliable memory +is often associated with internal error 1007. (This is a +frequently-observed-phenomenon with versions 1.0.0/1.0.1). + +exit(3) is then +called. + +For a stdio-free library, +assertion failures result in a call to a function declared +as: + + +extern void bz_internal_error ( int errcode ); + + +The relevant code is passed as a parameter. You should +supply such a function. + +In either case, once an assertion failure has occurred, any +bz_stream records involved can +be regarded as invalid. You should not attempt to resume normal +operation with them. + +You may, of course, change critical error handling to suit +your needs. As I said above, critical errors indicate bugs in +the library and should not occur. All "normal" error situations +are indicated via error return codes from functions, and can be +recovered from. + + + + + + + +Making a Windows DLL + +Everything related to Windows has been contributed by +Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp), so +you should send your queries to him (but perhaps Cc: me, +&bz-email;). + +My vague understanding of what to do is: using Visual C++ +5.0, open the project file +libbz2.dsp, and build. That's +all. + +If you can't open the project file for some reason, make a +new one, naming these files: +blocksort.c, +bzlib.c, +compress.c, +crctable.c, +decompress.c, +huffman.c, +randtable.c and +libbz2.def. You will also need +to name the header files bzlib.h +and bzlib_private.h. + +If you don't use VC++, you may need to define the +proprocessor symbol +_WIN32. + +Finally, dlltest.c is a +sample program using the DLL. It has a project file, +dlltest.dsp. + +If you just want a makefile for Visual C, have a look at +makefile.msc. + +Be aware that if you compile +bzip2 itself on Win32, you must +set BZ_UNIX to 0 and +BZ_LCCWIN32 to 1, in the file +bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly. + +I haven't tried any of this stuff myself, but it all looks +plausible. + + + + + + + + +Miscellanea + +These are just some random thoughts of mine. Your mileage +may vary. + + + +Limitations of the compressed file format + +bzip2-1.0.X, +0.9.5 and +0.9.0 use exactly the same file +format as the original version, +bzip2-0.1. This decision was +made in the interests of stability. Creating yet another +incompatible compressed file format would create further +confusion and disruption for users. + +Nevertheless, this is not a painless decision. Development +work since the release of +bzip2-0.1 in August 1997 has +shown complexities in the file format which slow down +decompression and, in retrospect, are unnecessary. These +are: + + + + The run-length encoder, which is the first of the + compression transformations, is entirely irrelevant. The + original purpose was to protect the sorting algorithm from the + very worst case input: a string of repeated symbols. But + algorithm steps Q6a and Q6b in the original Burrows-Wheeler + technical report (SRC-124) show how repeats can be handled + without difficulty in block sorting. + + The randomisation mechanism doesn't really need to be + there. Udi Manber and Gene Myers published a suffix array + construction algorithm a few years back, which can be employed + to sort any block, no matter how repetitive, in O(N log N) + time. Subsequent work by Kunihiko Sadakane has produced a + derivative O(N (log N)^2) algorithm which usually outperforms + the Manber-Myers algorithm. + + I could have changed to Sadakane's algorithm, but I find + it to be slower than bzip2's + existing algorithm for most inputs, and the randomisation + mechanism protects adequately against bad cases. I didn't + think it was a good tradeoff to make. Partly this is due to + the fact that I was not flooded with email complaints about + bzip2-0.1's performance on + repetitive data, so perhaps it isn't a problem for real + inputs. + + Probably the best long-term solution, and the one I have + incorporated into 0.9.5 and above, is to use the existing + sorting algorithm initially, and fall back to a O(N (log N)^2) + algorithm if the standard algorithm gets into + difficulties. + + The compressed file format was never designed to be + handled by a library, and I have had to jump though some hoops + to produce an efficient implementation of decompression. It's + a bit hairy. Try passing + decompress.c through the C + preprocessor and you'll see what I mean. Much of this + complexity could have been avoided if the compressed size of + each block of data was recorded in the data stream. + + An Adler-32 checksum, rather than a CRC32 checksum, + would be faster to compute. + + + +It would be fair to say that the +bzip2 format was frozen before I +properly and fully understood the performance consequences of +doing so. + +Improvements which I was able to incorporate into 0.9.0, +despite using the same file format, are: + + + + Single array implementation of the inverse BWT. This + significantly speeds up decompression, presumably because it + reduces the number of cache misses. + + Faster inverse MTF transform for large MTF values. + The new implementation is based on the notion of sliding blocks + of values. + + bzip2-0.9.0 now reads + and writes files with fread + and fwrite; version 0.1 used + putc and + getc. Duh! Well, you live + and learn. + + + +Further ahead, it would be nice to be able to do random +access into files. This will require some careful design of +compressed file formats. + + + + + +Portability issues + +After some consideration, I have decided not to use GNU +autoconf to configure 0.9.5 or +1.0. + +autoconf, admirable and +wonderful though it is, mainly assists with portability problems +between Unix-like platforms. But +bzip2 doesn't have much in the +way of portability problems on Unix; most of the difficulties +appear when porting to the Mac, or to Microsoft's operating +systems. autoconf doesn't help +in those cases, and brings in a whole load of new +complexity. + +Most people should be able to compile the library and +program under Unix straight out-of-the-box, so to speak, +especially if you have a version of GNU C available. + +There are a couple of +__inline__ directives in the +code. GNU C (gcc) should be +able to handle them. If you're not using GNU C, your C compiler +shouldn't see them at all. If your compiler does, for some +reason, see them and doesn't like them, just +#define +__inline__ to be +/* */. One easy way to do this +is to compile with the flag +-D__inline__=, which should be +understood by most Unix compilers. + +If you still have difficulties, try compiling with the +macro BZ_STRICT_ANSI defined. +This should enable you to build the library in a strictly ANSI +compliant environment. Building the program itself like this is +dangerous and not supported, since you remove +bzip2's checks against +compressing directories, symbolic links, devices, and other +not-really-a-file entities. This could cause filesystem +corruption! + +One other thing: if you create a +bzip2 binary for public distribution, +please consider linking it statically (gcc +-static). This avoids all sorts of library-version +issues that others may encounter later on. + +If you build bzip2 on +Win32, you must set BZ_UNIX to 0 +and BZ_LCCWIN32 to 1, in the +file bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly. + + + + + +Reporting bugs + +I tried pretty hard to make sure +bzip2 is bug free, both by +design and by testing. Hopefully you'll never need to read this +section for real. + +Nevertheless, if bzip2 dies +with a segmentation fault, a bus error or an internal assertion +failure, it will ask you to email me a bug report. Experience from +years of feedback of bzip2 users indicates that almost all these +problems can be traced to either compiler bugs or hardware +problems. + + + + Recompile the program with no optimisation, and + see if it works. And/or try a different compiler. I heard all + sorts of stories about various flavours of GNU C (and other + compilers) generating bad code for + bzip2, and I've run across two + such examples myself. + + 2.7.X versions of GNU C are known to generate bad code + from time to time, at high optimisation levels. If you get + problems, try using the flags + -O2 + -fomit-frame-pointer + -fno-strength-reduce. You + should specifically not use + -funroll-loops. + + You may notice that the Makefile runs six tests as part + of the build process. If the program passes all of these, it's + a pretty good (but not 100%) indication that the compiler has + done its job correctly. + + If bzip2 + crashes randomly, and the crashes are not repeatable, you may + have a flaky memory subsystem. + bzip2 really hammers your + memory hierarchy, and if it's a bit marginal, you may get these + problems. Ditto if your disk or I/O subsystem is slowly + failing. Yup, this really does happen. + + Try using a different machine of the same type, and see + if you can repeat the problem. + + This isn't really a bug, but ... If + bzip2 tells you your file is + corrupted on decompression, and you obtained the file via FTP, + there is a possibility that you forgot to tell FTP to do a + binary mode transfer. That absolutely will cause the file to + be non-decompressible. You'll have to transfer it + again. + + + +If you've incorporated +libbzip2 into your own program +and are getting problems, please, please, please, check that the +parameters you are passing in calls to the library, are correct, +and in accordance with what the documentation says is allowable. +I have tried to make the library robust against such problems, +but I'm sure I haven't succeeded. + +Finally, if the above comments don't help, you'll have to +send me a bug report. Now, it's just amazing how many people +will send me a bug report saying something like: + + +bzip2 crashed with segmentation fault on my machine + + +and absolutely nothing else. Needless to say, a such a +report is totally, utterly, completely and +comprehensively 100% useless; a waste of your time, my time, and +net bandwidth. With no details at all, there's no way +I can possibly begin to figure out what the problem is. + +The rules of the game are: facts, facts, facts. Don't omit +them because "oh, they won't be relevant". At the bare +minimum: + + +Machine type. Operating system version. +Exact version of bzip2 (do bzip2 -V). +Exact version of the compiler used. +Flags passed to the compiler. + + +However, the most important single thing that will help me +is the file that you were trying to compress or decompress at the +time the problem happened. Without that, my ability to do +anything more than speculate about the cause, is limited. + + + + + +Did you get the right package? + +bzip2 is a resource hog. +It soaks up large amounts of CPU cycles and memory. Also, it +gives very large latencies. In the worst case, you can feed many +megabytes of uncompressed data into the library before getting +any compressed output, so this probably rules out applications +requiring interactive behaviour. + +These aren't faults of my implementation, I hope, but more +an intrinsic property of the Burrows-Wheeler transform +(unfortunately). Maybe this isn't what you want. + +If you want a compressor and/or library which is faster, +uses less memory but gets pretty good compression, and has +minimal latency, consider Jean-loup Gailly's and Mark Adler's +work, zlib-1.2.1 and +gzip-1.2.4. Look for them at +http://www.zlib.org and +http://www.gzip.org +respectively. + +For something faster and lighter still, you might try Markus F +X J Oberhumer's LZO real-time +compression/decompression library, at +http://www.oberhumer.com/opensource. + + + + + + +Further Reading + +bzip2 is not research +work, in the sense that it doesn't present any new ideas. +Rather, it's an engineering exercise based on existing +ideas. + +Four documents describe essentially all the ideas behind +bzip2: + +Michael Burrows and D. J. Wheeler: + "A block-sorting lossless data compression algorithm" + 10th May 1994. + Digital SRC Research Report 124. + ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz + If you have trouble finding it, try searching at the + New Zealand Digital Library, http://www.nzdl.org. + +Daniel S. Hirschberg and Debra A. LeLewer + "Efficient Decoding of Prefix Codes" + Communications of the ACM, April 1990, Vol 33, Number 4. + You might be able to get an electronic copy of this + from the ACM Digital Library. + +David J. Wheeler + Program bred3.c and accompanying document bred3.ps. + This contains the idea behind the multi-table Huffman coding scheme. + ftp://ftp.cl.cam.ac.uk/users/djw3/ + +Jon L. Bentley and Robert Sedgewick + "Fast Algorithms for Sorting and Searching Strings" + Available from Sedgewick's web page, + www.cs.princeton.edu/~rs + + +The following paper gives valuable additional insights into +the algorithm, but is not immediately the basis of any code used +in bzip2. + +Peter Fenwick: + Block Sorting Text Compression + Proceedings of the 19th Australasian Computer Science Conference, + Melbourne, Australia. Jan 31 - Feb 2, 1996. + ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps + +Kunihiko Sadakane's sorting algorithm, mentioned above, is +available from: + +http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz + + +The Manber-Myers suffix array construction algorithm is +described in a paper available from: + +http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps + + +Finally, the following papers document some +investigations I made into the performance of sorting +and decompression algorithms: + +Julian Seward + On the Performance of BWT Sorting Algorithms + Proceedings of the IEEE Data Compression Conference 2000 + Snowbird, Utah. 28-30 March 2000. + +Julian Seward + Space-time Tradeoffs in the Inverse B-W Transform + Proceedings of the IEEE Data Compression Conference 2001 + Snowbird, Utah. 27-29 March 2001. + + + + + + + diff --git a/Utilities/cmbzip2/mk251.c b/Utilities/cmbzip2/mk251.c new file mode 100644 index 000000000..39e94c057 --- /dev/null +++ b/Utilities/cmbzip2/mk251.c @@ -0,0 +1,31 @@ + +/* Spew out a long sequence of the byte 251. When fed to bzip2 + versions 1.0.0 or 1.0.1, causes it to die with internal error + 1007 in blocksort.c. This assertion misses an extremely rare + case, which is fixed in this version (1.0.2) and above. +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include + +int main () +{ + int i; + for (i = 0; i < 48500000 ; i++) + putchar(251); + return 0; +} diff --git a/Utilities/cmbzip2/randtable.c b/Utilities/cmbzip2/randtable.c new file mode 100644 index 000000000..068b76367 --- /dev/null +++ b/Utilities/cmbzip2/randtable.c @@ -0,0 +1,84 @@ + +/*-------------------------------------------------------------*/ +/*--- Table for randomising repetitive blocks ---*/ +/*--- randtable.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + + +/*---------------------------------------------*/ +Int32 BZ2_rNums[512] = { + 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, + 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, + 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, + 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, + 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, + 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, + 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, + 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, + 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, + 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, + 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, + 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, + 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, + 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, + 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, + 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, + 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, + 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, + 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, + 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, + 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, + 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, + 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, + 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, + 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, + 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, + 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, + 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, + 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, + 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, + 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, + 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, + 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, + 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, + 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, + 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, + 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, + 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, + 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, + 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, + 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, + 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, + 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, + 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, + 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, + 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, + 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, + 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, + 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, + 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, + 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, + 936, 638 +}; + + +/*-------------------------------------------------------------*/ +/*--- end randtable.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/Utilities/cmbzip2/sample1.bz2 b/Utilities/cmbzip2/sample1.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4edda362a3cd974d3650da59fd1b3c253ce138fc GIT binary patch literal 32558 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 G<7-O%y{}CG literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample1.rb2 b/Utilities/cmbzip2/sample1.rb2 new file mode 100644 index 0000000000000000000000000000000000000000..4edda362a3cd974d3650da59fd1b3c253ce138fc GIT binary patch literal 32558 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 G<7-O%y{}CG literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample1.ref b/Utilities/cmbzip2/sample1.ref new file mode 100644 index 0000000000000000000000000000000000000000..dc869ee6dc80495d06c15fd60514e6ccc6bcbf24 GIT binary patch literal 98869 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 literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample1.tst b/Utilities/cmbzip2/sample1.tst new file mode 100644 index 0000000000000000000000000000000000000000..dc869ee6dc80495d06c15fd60514e6ccc6bcbf24 GIT binary patch literal 98869 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 literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample2.bz2 b/Utilities/cmbzip2/sample2.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8e54297c94624655491553a88273d7845ccafc39 GIT binary patch literal 74143 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

kR5+A2=Trl}Per=I2;c3{of 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 literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample2.rb2 b/Utilities/cmbzip2/sample2.rb2 new file mode 100644 index 0000000000000000000000000000000000000000..8e54297c94624655491553a88273d7845ccafc39 GIT binary patch literal 74143 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

3H}WnzR% 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 VJ0*EgpUwT#r0D3~ndjWE{{_CL%K88R literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample2.tst b/Utilities/cmbzip2/sample2.tst new file mode 100644 index 0000000000000000000000000000000000000000..40e5b58f2ef897f74fcc64df10991e5f23e024d2 GIT binary patch literal 212610 zcma%^37i~dng2sqPv8Rq1dPfh5p+pp5^{hL6f`7+M3``7z#~NM%=FB(>FFN3dy-59 z6b}$3k*1`!VZZZ=O*fZHQ zS5DbuU|`BL)|=Wlyk^6^`M0iYH7b3rTDjRwx&{Uo)k@W|W~JHgT7KEy?Y~Axl;RT` zrCNVEKC{x|nes84uil$g+b_TM+SAMH8R-unsKR7 zj@Ng})xP?0xqr^4O+?pLDCn>TOSf9zwM^v@+z z?%eqePt82(f8Q}SW!I+`*n_r@xj%a2Xth$RwWDhXR+iUa{H0fv8vUC$U%mTfmu+J6 zv);I*JW^`3w1F?ZqLuIz=VwP?lTEJdtCVYf<8F+r%ORO{;um76@& z9rw&z5HCFSWS%-{Ga%7!zIfd0pE~N1$6vQ0-3{ArwdT$JWwX4V9lY}mea$(;rP`cQ z-<;94oJ9Xzxzn?thJUVn?qK2QiHTo6wa5RiU9@b<4F2)Q--Y8h!Tj7?7OiQv8l}G0 z=Fhz3{2SfVd)9CK$Q|Kny-@@g3nzMqD$OLSeto1ga`B=&IM+y{+$`5F{`x{dE@bzY zo0Y+u4pxd;)Du)(GHSBtE3-FW4fO3Z!=*;0I+heiFRauqXN@xS)gQO&aj6OEwc<+6 z76q=QYPDRgG#v@C`m$1UE!eG!a5&vaqdwRu4L9esqhCMWJ5){z@A`TA&B1c5+$ce` z?5L{qoRCO@DUZY>rl1r8U)Z%#Y&HW?6eH#bIYL zUmqEY8|AP_|7f46J&Bsl;Zh&)8LHIEbJ|_6x%>FBxHVdXS@Q7W$U`s}%R{fj^_t&G zU#VFJ-pdYU^-6zrto{5kpX+W%y+2(Kw90V_%Bhqgr+Bb_>7qO8asN2aj>P4L?HhXQ z)Gz(|!gc(hQ|fTWL4Gjc*KU+c0JK%K-69V9}(n^Z2SlKGA)ft=diPchbu-;jpqC7?_&eg5})d<+s-oQr_F#0o+D2U6-0U@IPhu>FFfU%{_hO`_?&{v?f9 zn~c|0jL`Usn5>SdfRg5H-m?1@2N zPKdTrtJOP>?zLcZj^E1CN~6hvJ#9T1uZLvHyiFfJri-F^K~rH_?{#*2r(5ALnU>zkd?W~Wu}^w&F_&9+rG zE^!O+Vy6tP);bk1Fl0KxSX&aNubf1;E`=jbAK(v$qA z;JBn&uZl&o6`{@1s;R5!{#zR5zEPy{Iw2$OuMY#dxcn|B7a;$p@P{a?k0AMA7Q{$@ zpowy0I4K-(eIsbUxH*OxAMQ>HE2=s@m>B9tl?QiDH9BgJb$!}{(v4-N5?(wa&Y z1ecqBRUS;Dh3Br3cpYN}G@pd*x(fVyKA)1=gPGXS$${u}!SGvXeKoXt(^dv+$ zCW3m`0LQVoG};1^0vF$iO}a`x2$tA4{-ne8CX6{9m9is@#>Q;C6*yFjcgllMHmtD! z?3bZ*p^jVTZEpYlW9KcewHoz{mkxNbyZKuC<-{^udbSY@5P$36YW3Re-Ak>c(A~cs z`|yEQ*^pMNylWK6GgJZ`lClAsh=fMDKZ)M+$r7kQSUT0fCf#mLnAJP=xV&McQ?3Q7 z((k>-$jPUmAquxO1N#d#Q|^_Hb%J1|(t-j!XBK|6GsM^@juvv7qX_?u0X$5NY=%ls z=qJ&mFM>20xHUMP&z8Z1*pSmr?8T(%>}t8x?=2fJbk13Zp(dNFOFmbf zp<5pv9O{Ivi9y-d%N`8&P%WqL)=Tw338tZtIk7l_MKFK5Js#O|Qh3v8!=<%GQ`m>W zGJqUGrb!G5lmWn@|2j?4tYD!)=;xeXHh~uG2q?ao{6XM@G9_7RtS22`tplU=`UXOI zeJ#dpZ+a6XHti$BDX%PgwUwmU{o_hM`WyOb+z5Gz?4<0#5d^oaT$2|u7XMo;8==$! ze@!g^RhyQbx^V91_DeQCySjU`xOdCW-<)#clqonOZ-4&EExRl@0+Y49>tSoQ{QYl@ zr*`||!*gp>y0AU%Um5F1-h{2*-s3G-JT>*9_{!6#?94CquZ+{9uJ0L33g^77G;;Y- z2h^+eK?If=YdUs+eQZjL-}&em+}SL*qyjJ)&%Vv@xxP}Z8ZA#l*Kv%^TXw-p zg>}k}q;UP6>v&IQJBricTckL0@lgkq8_@KD14ElP2Xp(9DSw{$<-|x;Y&aGpFbYq8 zuoU+>V#4T*8+AAkKxt>EFJHO1U3l`{i1<#uIx1j;z`raL(Ru-7OkJ)yv)LB+#u4V_ zJ-cF|p~JksnVOR?V(nF%PF)6e7Hn=G^5ws-234oR zD+}juZol+`J66xx{2AFE_RgDRCtzQH=BJry*F9eN##=d$Gq1a)yeByVMx@)x+j1l9 z171vuAA2OTiJ+^ezXgF|Yz~@C@oL{m^7M3QPoRW(pPtCb6+bju_tzbn_+om@hJR+) zhdotlNwILocJ{rO+FsQ+0o3uMjiZm+JpQuHj|y!3ZQ;Dloz)m5k2X(r{(!-)S^)#4 z#u#Ge!=4En*t{lSQdQ$IjSYloZIn=U5NPq7z07Dviv{BGNW#&cy{ubjZ^vY1FD$l~UB@43D94}74q#uK>j#!Y{#|D~g z7Tlh36=HF85a+KpXvSnK9y76o#wcS}hNsFKQp5(Sg-|_xuT(#nCJfpWoo4z7B{|xd z)86@q|FKBcbgd+ZJD!G-8}?@^5ZH52r^4COUhjlz8(5h?dmi;`V2)ADBWChTgCjFi zw<@j-XFF?nABzR!)*MU^gMnm9Qh4)Dsi$0O49chgPXkUrgJC^@7%uHl;dnozGZeNh zHi@o!m$)mO0O{?G5J~g0OarVgk2`13bcVb+!|Ulv-fk{clfol~Dvsf33FQy1?Rv(d zcHw7FXI=wN0A{MQNbp|<%3cqPJW?1yCv5HHJGC{i*KZ;+)o_Npx~vZQoY0CHu~5%j zuR&+Xnn&+SRT_dnHdeQ=m5>pHNiK5i|^miD~VSR+Y{j@(G}k( zRKW?p@!Oo|3=agu>x%E2tt5&lnV$#N<@9QO?4_DT1c-jfzqC^;yrAt)?*);|h$EG& z(w8So1W$jay4ob&sb*sNnz;3O*^{(G4B=rXJ3B>wulu|5L*wGJF?t55^s(YJN26P=ZHEO z>dhOmQ%e5I=t`nPZZ+$y8Q1F04X>fYnl35^nE?!$6Bc_w#G_d76ys?*c>q$q&y5@^ z{Kw1XW?gje5QZA?1@5J0bCk#*hPjk5Xm@5a8^)!8M>uly(oXPCa>1^g=-|;@M)krJTqY-7xd-!-|8l*U=l(dofJv4QN4v4qsDym@MgPeQ+%s4uWkZn68!@!FP;?t`m~$ z)iHJ~CwVxD-dsRlNPV}Q@^&~7Jo_4>M39HeGVD_#tJzEYf6Gb2dadqPa^4jNzuZcU zR;VX)29Z^V-;9Da$2c5IL|Shk6B^C#@#wMRFKBy*J1h z!6{6gAH7%Jt=`C@Kd3`QS#2<^Za@!^>r0}&u1X#0;WD072T6)efhESLU$)yBm=(qS zk9>=nV2*7D%D6QB;IPx5k_+ZVm8cPhWK#Iyc%?O7_|_8~W4PJvyuUFbFoX-s%?`{5 zB1VW9)>wJUr+O?VC%;FkQ6UK@lEp(wVf=MHNUZpcb*y`5Sj<~6ckW!XBeLk67yI$M zoiIhqnUiG;^%-XW;A#nWbz@%hToKMh-!#uqG8D9G4#%Q=i|6Qlda~+ z1hAcWL9lm)_TCpmD8W>UpXzz!>J?KI$;MC6zXbDJt%X~AhD#&ygiyA%XP{o~Z%jZK z&=+c?KQ5)FLJ3)aKIA@Fj>Uwd!;Tcuc2}Iw5r{^#B+z6ReR(R`2npwuHNJ5Pq1;K- z93a{+rG&gMtp9-oU|&hvt0bt8Ng`JI$}R+$w>bbT-W|e6#}n+rVgZEg;gGK^YDdFU zg8Q9B!!I?~kqaj6D>qE9BgCr}^DVO-_HDBsyZgu?vLSq=RI!7>T4h?F?NcFASzc9( zi9rJc1Qmu5yu*g$l)04&GC4D1x_~fPP_y_fNEP?bMM`iL`1fD==hfRKxRmMm$9t9X za514duuJj8n@?F+Zmg@6*JGOe0A$G&TRMQ-v1Om({ak>kSE+*Ymp8DSFk66;k)<>w zl$Z);Ic18-z`h+>vra9=L{q_!K9FTJ6dRk~D^VA)(v3|Eg#h)I^f2ES!zvWqjGtQ3 zns(ta`7{gExn{${tt%GQYNZM9cj-*THnoc+ia$2rL@Q#8Sc@W75Dg|Cp*F<{y_C_SS;3p3F@=Y|h}5s9R7 zPLCR=0#-P}wwsx4`V9U`e%Yj0e%%6;?zBS}wTu0~cEO?s={&6(unva>%TE|jWif_m zU!!7-WRU^4TfSf@DRw{p8m)ke7#+kFZ14Njp{voyjeE7Nd`Qtn^(>f92$$@F0#g0r zV}qq~oFD%=Cvt%+WPjKJt37v{!?!4_GHig9PBfQ9O54^8Ck_iF(QZeCH4yOoz6gt> zIXW^@9n&lC93^&Cu31>*EPd8?b1Tr`8(%Lfnv^WKGzY zK<@+#B0RsPCXuPQztpn)BUw15q5@H+T=bVaju5x73E>~DQ9S&Wm{j=yMn0?s78}Db zuTOLPv$%MA5}j8yQUpG!oeGbbRpjJI%2FZOpopoZ8vIIW!a>3#vn?~bDaQsf-DONF z?&Mg-?Dm{TH*l5L!IoZ6osz=9Rn;6W5JoJsV7spZ{ZJ&0q=4e19(&+@*=NX0mWADD`C#o}jogeG!dG*X#NLxt%T z9yU{~X#rGu5O6?7ySNH>9K6^Pv)kvNCNCECot;J}5c{POQcZGXGAS(mi^xJ?cxq6< zFIqpfseryeEY3_ccwlOnw4--lEZc;9I=Ml4&?qb)bs($SwbxxIC~u~Bu!*28m$7kQ z3Q`|^FY79aPJN{ii{39GVQ`F0u2oH$S@^ckSurF)<%W`8TD8f7ex-gnqx*lOg8^*5 ziHYn`$sv1X&Un|X&#rKxXS7{e(PYl{!Sm#GCQ*IwES01apmOJQV97iLlfrHFBW0fS zjW!9P$DGz|9b}E?P8q5{a8XEp%l@ktg;aisH_&{_FS*jw1vb7Sp~EHljx{@ zT}{Av@w{)G;v9bGxv{>>HqGhilb~D_r(~*p0(~f8UYU?2T09m^Lu~4PG$TmIpMru; zDF{k#ZO1<44P;9~g3Y8rSWCZmIg6z5)&KP?dNBsT@BZNkfgo9T5*cLXm9Bzjf<-_a zDTwY)CJ&*Id8W=Sw26cvBm^P8>(@Sy8nelxm0;0xxkz_D(hN9K(H{7`)~^hib|gJS ziA3J|8M`(_=1BVVl}BWG8qSDNk-iYsWOzdiEFb8pAi+2mUSR-->A$3~=YgW#k`6v* z9D+7C56xJWJe34t3`dpG41HF6UB?6h{f+v4--St z2~2iDSW1Nh!IXbYb5e@3H`Gd;uK4QrmC)h+mPB8pq&|{~;NF)%*9*H;Wr_)!!}7}d zIkg!{lyArl6mR!S#K>K1d|d7t)P$-*T1ZS@(a0WKqH>XN2tHyx1`Qf za8lZ!8k=x>#hW9@7&l7Z6#4?HmKcEYMWS__C8b8es$$qF6-PT4!jeHh3IYH>DV}|| zM1VPA{XnKB6Q7ul+Zhs5CV-ysl&n|+%J=l2h(-Ors8HbR>k)bHcnjxMK!kj-qCD`5 z-W5_+eZ{h60xY0EYVIc%)i3#xH|>dS`4!E$NDBAwV*~@HTLN`Gu30!4JaRgGX*5sn z>{`sh3s&2?i@@~#1&apwMTrR{#hKBhJf*oQAw6b^QL-%9q`Y@bd+MTlw)V_CY}Q0~ zQmp{L45Jpl(AV3eDNbSN}%bk%k5PY6g{`)Ma#tCW^_8ji_B;(a)0B&~{CgA*9=H`l-gQQ);&WScB z#maZx+vUCPX-s|1{*Az;A^w%3ty5(DPaSuN2oTyfAV{G_O+{lXm%%2?+2t^YJXke4a!73;?43kyMl0w1-UGW zRNkP1*hw+!Qq`7HOr9_`)e#MMqDe1HHo81%E=PST!j7f!0|sYl+qMqW7L>Psj5CW| zGqG>Dl=hKvLTU0a)x8!+1_yR9XfcUCxxCddw^>54MmREfwpk2DRYU0EZ?2#Mf?D5p z^zEevH7g4Xi>Wff>Y|e9RsUmW0gZxu%iI?V4PW&?CN7U@7mt0P-cLUS2%QbY(zBlT z@;0n1Rx(V>u%V>(9(NK0|5_ycu|MxMc`E;roR5c!iei*5(RcJ`QZFKCJGP4#8Xya| zpV=q6gc5#qD>k=x`v#>M^eRdVKif``-!PtHSj=#cM0bz&OQp%|$kz#t^NZ1up)%oK zSD1@(Uh<<}d4S$7r}~i7Ij?{eQ&^Udi##SBei9DF=XRRZYI)#L3xKHv3I!!AqP(Hp zAjb#<(#^XFcMzHuTQh6bma@W~q|kdPSQC-UMDD}Z-6%U~5&*%QMoXBJuE2i*+P1y!nMO32Il-msX%t>(h?M=;Lcr^=adJ+S; z$)&wRB$9r6lcN&qDc7RApaTRh1)ZJX_*BQjiuzg-eQRINYz0hanc!K=a0P;1{0p4Z z*gx_PUK*`dXEz~sD_)XCYT#4RE)0cxV}WddrPAGC>mIXt%Zu+lMaAov>=f#2Jp&o0?%+A+VJaA`|K5<5{TQ&K#3SHX!5H$|UB=m$Ye z@%(49ssnfmiDZ>YMoL-;uffP#OGI-YO+yRLnJ~km4@k|&fbXuTPOS*PPT}U<)bi!s;_&`pL zV5)O%Ul0wkq#JO+Ej;;&$rU|N&tJ|miNV5SBNi@}%wav34bFcl-HcUw-jjEYum&L~ zQKyh7?>_m0(C8~uY(eaUszOh~w~i#m2X3$zXCL2=ZaQbNe>;h8`t+(zi?X08bU9^c z5oTrZdovuQ=W}tt;+}s(CyRXQ;CGug1F=Ssl!i8;Vsp9MwOs2gogal!Jdyar;%375U z5^|xz!4M*93NG^TMJalfL{xlULN=F}n*R`T$sO4hT}z+_=9~;q6Ih1Y(fzr2R>+Mq2%e1<*!=x1Ip zAujzHw5B(G!zvTQ1{937`1j7fl76Wois0+(ejqOPuw^e+$f$Y`;1bBo0XZxO%_W8R z+!$bHH5lkIr_^y^U9F0@zS-pC7cY0BB5d3n34#%cr? zDu6L6oXG>bOTDQmTZWc{9h%4j1C?p~_>J|US`$Zgb`#6Hnl4f;DSIp`>o3hFt&0{K zFI>3Ks!cq9^pR9Re0w3;t->|0AZxC!4hmd5Yt$v8NC723lSD??S&)<#?Sk)L2$rx^ zQoNGVQYSt+g$qTbZX4LAcmza2`CZYiX@7=~7>4ilRI2oR&0dB-S*1X%*!6xQaa1fJ z2uOYtrt{otroJRBN3TC1g&hbLHUf(;9FQmalGBKX3hEgEu?Xz$meEns)6?Kkl%^9c`HB^!hyTWaf4w^VU| zl%eTLbN%V3u96;TPQ()y~m^a209@Qxjo-=Mx3lcO#OdWD0hae#nwv`g4 zq<+AVOPcLS&f zVj*Yy$1^RiZ{D>ExlpWtlqx`3+IHA%rKGs;MwNC3tuiYRj8P{}DwSMj+0W; zqmu!j6VW;BB!yeXvaDi=zDeVEOy4UoAy^}R0%4_^nM3MqKD1+X8(UsZ&BY~C9((7b z^EYp{8jc7P{a^TJ|LC98aFF2m+kU@twne)r3qO~zA?vpiIg>>1pU6pxe4a-cvB6K8 zsy7n@ht@TmvXq+oAT(IGutidqSS17n<6?x300p11ntGP$PZ-#g1H3v^Ay9^)DSJ+P zqPb4LN}?ZK%5Ju?lX7Y@llWpTGxdaGE#WLKjLsLo>>-OX8^ILM|CI1$)^%*b6ZP0+ zzA7v)w$n$QdE$vmiz-s>3aiz#a3paebur>T^j8SY`^HC>B9<@1IbyCE$xVv6mym$TCSP6LpV=&{GZ zq}86dDr@sWwV;EnRf?mpJi6hnkIgy-^Ukl6hE2A!=VPiIB>)v`M5Kbg`Y6_o9L$$J zC>wSgGCR2>Gb^Y0%oBX+h&MmHp&HCI%dN>NL($MTvo4^uOnpP)%-{L#x9TJMB|s@x z(VAyl)TY!=9*hiD!!;07>W8-k%pZQ{O~gf9G!z1Hm7wE=tJVa~V{TNLvPNZTZh1Q) zGXf+daUIpc!Bk|w7RgX9k5E*q{!C>htRvNvoU=`mXk<%j`?;3u(Gj%71$5~E^Acg% z%%$=ftZ+KXbh++%ab$^06`*j+wH|N76vXyRODZJ;F^MI7{wuib{$;rTV=ZDoatOFGypCCs%msDw=)#Y%fcWD5EjuD&wq1P z9c9i^D%_QjmxCbQ(1voIuwezgpg80!w>s4@d=5-%ZiA~cbZmtnF`gPJ4O+&j)YpKH z{8=b_eE#q}h||!8OBi#8)XqbF)tqt7!v6jIt0cuwAQnT6M@Cjfgns|pmDVI#t&^G| zMANU%1-F}U2<=L=R^0o|ZfDzw!JM>puZ$ zcYEpuXOo%6GOUjVAf$TJ)4ag0gJ={%+VD@nN1q4{K{9M5hmR-f?@}4x_?C_)6^n3@ zXw!j(0vCBB%eYpi89D|BTp@c{``(|0ldzPW+)-i%q(wGaF|%g{p_6q$>xtFgn;t~XF~{ZHg|%=gkJ(Y4C4OdJW^lHvfB zyE8)i$fYbGzAU_IA5;JT8gkSK3jCtr(2)krEn23+;FCAv?N1Jj!6)Ckc)7Y{Q4b-B zg)sc~U7UfKg;>{h(z|fD5eK_mKLmg{^z>d!AD~rTFN39fjKS;MN9uB_=dTyOeBK<4 zD9N%#q714X9~1P2d9^Y@7Lb)KZYUZYRh`gtA3g7f%mW8 z-n5)HXX1^d@a!$YOts!49GNWSo<$aeb)Z%{2_$D8u!ikJqJf=oEahe?c6TwXHk)4% zHs7m{eefPj-I0*T3MT*W>q8ytN!MQWerFPP!?Jo>v`U%6kFPU4(S729D1}X6WW4Zr z5zv|T#}L3%HixyNI{J?DDrui-IM`N^Jk$rM*3h?{3j`JW<#^#gUk^A#L?Naqrf~ab zPpsq9A`PCc^pqP4iCCSDt)bqKa!0ff1S%1IIC?z#<_tj%m{&o9GIRP5HYQ;eb@g;4 zPjR;$*=SAWYBIGj_PAb$V3qz)X-gtbun^(OUd1Ft#sq;uqz8w>ui?DE!tke%$ipQH z%3Bl=h}79I5UR9h`&DNn)8oD|qIAX+7!<)!UIgs_>%EROR7cMX!~?B7$z-i!jZELr zd1I1Yqq4m2U(fpEyr!}YK336L)9ONTEfL3;94bHA1U2>9Mrhd?iOiZmS$z59(yJ2M z{pD%wU(N%CR1{X|h>~Cg?nP|%w2{ok8#u!LGh}!2%q>)JF}Q$;PWN5qK3Blqj!yo; z$fdVj249eGR>hQtE^N_I9(!lLuWMh)dG)NmQ>m%fc`R4nB|?r4#L#rC=8M3@0?0;F zve35j6jC}aPmx5)e>KNy7vH$JRoZ}^Tvp~Hn(=BU6inLrVII-xFVc*T#u%lXTE<$9 z=+JZB-$pB)ii$UVM<>S953dopWT}!A&Oi=2C_<}mT@h+q+r_J}O0|bj;2O)tGk>&! zU^xEEs;uN3vgFbEGCR$WaiqmA!%E}Dg~y_-hpG7JKYr^9M1ULdapPh>`S35co$@h3 zjNn7vfUUE2g=;Yrf<`Vr=~i`^*?wq#dGCZuY()5c)bc)Q)o!e|YuB=7%H2E{^dE%; z+GA_;HmUb%beJbm?RO?*9Jwiz^1&6ZepqX0ZR~&6g-uHR?<8TX*oAfUbvBSpGUF%L z5^jSxlEURT5XE<`WNea#!#XIgDc)ZlFFb#_pb}5Gs2RWKccLK#u_~J-DJ((92HMd@ z-*Z)qRH;aALOJ3~>)GY}(ztF}3xN~Rv+*?cI*?RhlY}j-Yg|ZHdwOr$85-~eJ@Q-P z`C&H1XY!f9TyjBF>M*f^l7~XMFwu{i$FW6Jm4@ri_7kMGHSx@u!HKU*Fk5)WbZJuj z`59JEF6%*@KDk~Tv6$MsbJ{azoYUk;%`}Y1vFM&yB3n($T1kvaT^(D&qwLuxl{G~2 zSKt|4dgEe0EGO&(lV<2b22hoouv+mK*AhlbiXTjTYFZi@y{x)4tI*rJ0xQr+aYHMf za6^WSdQ80A!OR83Ilk|E-tUP1-Vlpma+^R4U4{THE1pT?JzIN#a0{O_o-mS<4W%@Jh6}?>{JqlaaCN zP{|U?_K-?=8u(*UevH0BLK$?ebJhFRs>LyQD9(29C0kd(Me9KZ$%%IKac7=7Tp~$| zOI{7Jz$^HgW={I1%AD3rf$mBzw8yPI0Pf6Em6o4;|9IEyzmfKjqi$4&1OuXOzy^`* zFmc5yj(to}#X)V}8zM9x__=8Xw@LIrGt;bd<}MpUgaUm%v#zpnc4;>MtFNRuZ%=JL zL1}j?BPi8N3%nm0IrN|3WwYehSjN%2)(G&2 z`k_!414TXZ=`=|jmJQlOngDkD_RgT2+VF?dZ8+ziXn^rvOFgH-RzTcfo$~##SU8x( z>W!km;0`Y(2f~rHMh=q9U?9pl*YqEB}xACa{K01+y)Hdsnj^JDy{z~rZHlOK-^ykNDH zkb@{*v5%9q;b^1j_TZ8yUcQ{nIQ9139eX(-MR2Bv@E?3leNuAK10urVV3Zp^{Q@nE zL_$*tQnH*xJM}`(=sUx`G+ESTrh-vFd}Yx@#Z7#6*?&aHGl|6dB2;-ADm{%J{(9P;=hso}g(7ZzoNu?~gN+xy z_zpE{at!%~-+hxD9T19@#~S7r`d@cw0(J#lIN)aM+mim9LdpC&^XDAlP$1J$2{_Ou zA1U3L9yt;*wcnA9WV82g;YX^?I`QTujxN-HJ5awI#|F2oQGcgDlk-p@0_(@MS0|_z ze#1dd&p}>qc(w0!WdD5FyENu{0k|}O;bYXY0Ro}BDh%w7XN~&Q5${5cxtW~|<`jjX z96;~Rr*EHJ|K+tZOIRwb>ghZwF1#V_@{$NKAxSJ&y};^^g(*sYdm&{hvgQhXk|IAjT4rw&ed)oiJ#*s;uNmUA=vcw-&zt#p z7|{H|CMCA^%nNIVS5QGWlg#s01?Die1PpU9objvQELYG0YeZvKEoS6`qJ@ih)kAzm z28AiDoTvhcN#WCH7{`L=$%vF`YXY~lmO3M*N#uN_c;=gytyns18}N%$0RM_yX%`qg z`3DGhBFhxjB1CtLlEq$zCxs>Vvng-p=R2h3Iy%8w0Xg~VG056JkP12b65|4n&k#)g z@m)PMC4gis=35f}I|~E1>y@wd-FG1_M_#6%h`9EUgGSvI07{p^f=RUB)p|faq(W=8 zF!{={g_5rgM2f=exg_KMf3=L1bOm-83}%cLaE#KpeSabZP@|&o001)vE51sAqW_q7 z*ZSw#y^+?2c)qqi^;O?lgbcrZ|4G~2M)c#XZ{D0Gwio!scJW`xYV*kJZhzs#wxSAn zS4p&pS~gP|P0LFfKx8$B=$Ykpe6SsY%I#Lvj%h4l^;J<(=_F-F=|VQ=Zsl=N8IwLV zM2Dj(8b_ZZe^F@EMl-okn_4Z_Rr(1t08ec#hZ=e1GN5+7e`S5V@beE4Mniij%HI*v z$skW-&bRZCPz5c1>B=jJtJz2|zhrLbs)PIUhf=BOJF3LZ2w>Wah;3A>d~&Y`dO4x% zNaH6UH8ebDEp0v@1Ltn-IhhJ2NspQHV~6EzPOb~97neR|OrAkm`U|GV;36Vkvw6Sb zTYV|-B!>bBUn*lUAxKRzA%Q0;JoaneQs)vHLZ*&Y1gO}`eb1&!aiZN%(urv8XfYI3 zaY?s;2N5N<#pyQ*tFFV!NSH9y^qZWJ)K(Rop_I$iN{ucU47VosiX7Q9ez3LY?FwKW zsDkdWCd<*GbL-6mIDTedhZTe@J|$fa?9N!V!8m(tb%-hGm;BtXGoj*2S=?uxDJ^=| zU_DezI=D|9jL~u4nKIDaiyMMA7;~yXKh33F1vkGmY)gn-Y&#wu_*Idfd_oHciSUjj zX2`5+8#4tJ5RDG)IPyd$k(DBge$keS(MK`t-+E>^@YbGpznyNcTaq(Y&F!AMn#t zYr{*5GthhThUGd!4&DN_h6RFGX{+T633ySi$@lT-ReMSyd;j+J?czySIaywnJv;L` z7uj|74z7WVCosugwOf8|gh8gAv}dgkklg%`q_FurY|<$O&02ROfkg^UfJZc6MTG`W zS5yiqbWDDu3e;I3ounn*G$1s`u}do|tM)xpX{WB5hn$ZNZ^0DsFqHGL6Wurj*EsD4 zI=H7Q=}e0pNg{?-t+n8wUcRh^*&Ulr$GA+n%s)3Sfj{U3gQFF54|Kr+Kd?DL+AB25 zwB6gXfWPF6MSvtRoJ)bQFyk}$sSac;?3_l1k#Hb!YXGT5j|mjN<_~61dgyHvGi?{o zTht3x=rP+Bu=nXJNhR^EHa;?%p56o@)?D<#7XxuiONDWj&e<2heN|d6;+z zofgZGE^Mf@YV8-jlNG!1jCOpRN~tg*B{xt)xps_b_-~J0y|qW7RWabwy3W5QJ~r-I z>;J5SF6=%2Z2h`t?IKtBlKtTLc+KWd@(9a>MNVwg*V-z5wodj}Ep_5~MO#Wgt@l$w zwM3#4klO#P;oE(Ivr0+V_2;I}x@>by1$L#K$f%XAqemu0$@o&@J`vas6po^U27_Av z_|%oxv5vlxGpX?yisne;&T-K=Df z$`>Y-V=cuC=UI@>>of1#`KLIsD4Sp~#tLKB6itFTL) zbgh%x?b`c;h~L4bSwKYUS?UCZf{t}f06GkrkWBh`B&dC7|1ZBV)&o-YlsQb~vWv6k z<n;ryA=acU08Ju4BEND*zR4?b(Lk(=KbGy~Te!VcV~{swr2} zk)Z_(>XaqkuOa`5IVx0YOMZ8LS0E1Zq!CY|z@5n1JmGQP)3pmGQMTEbUuiSv8t=Kw{a_?50W-n+kL*_cLI^RIf-_7E7LR)l*)gv)o&Kq-mis^Jif< zi`R&h6|R}XAj93Bed2VVDP^U9?t$vPiIuoAr=7-y1t8`fr+Mw62*CClL=J^?2l*Y%UzVZS0)C#Z|kTuqor^qb4W{{F-`Iyk{>_g4P2qensaXfCVdAKm-vNaie^2HN)sSi^!zdQ!FbfyzzeM zNb8wq7cla67{`D=y~N_%h2|M5M%P%cP!69<5X(fE-mB;dKv2o98F-V^wn_1jPp3u% zDOT~IwF(AlnTt{YHN{Oh^5ARB8#JCorv^555H_6@{_x*cg%2Ries<$E!qyNqGp^U! z{<&3X$u|WNyhTrY&tcyCK*W4^2GGR$WQ0d*X_C#gI^SStYWji{&U^(gzW?VHX3wX~ z27^Vw(QZbXWl|ZlbG+iLeVS48*37EXYAlddGU_kcY0mKDW_Xn1V`6?0g3%MIknY_@ zDkoPVovJVI-wCT*dsZQf5$HVYH>-%tOrjQ0cHd1J%wb@aLzfgTe1lD^a(-k8sc#d& z#vfNpGyLFj=brZAp)BrWzVyEPYZq>3Vh$r`IEBI-1s>ltPJFpUCrv}MpgN`glrN+d zU6R?TE?t)XqNMPOmpRjaM{&#O`#YbY5k6j{tC%1gWNmoZX0)phN<-yK-epPhr0}An zL=#R$nNceb9>L(FdLF)*Dwz}bb{s%_E<>A5>E{6CJimZaMXRn>?6J7#x3{%7Tpfik zInd@N3#xz|1vj8|!j{u}?aZo+ge>{|33JT}Jz-vVe8PPF-p}|rVZk{QGL`wqx}Ebi z5BT-)$N?iutaw6;#*D#1~1l15_SCs$oOk% zbf#@JIo!3&-;E?F$8=>omIU|VO&wzU2q&AFr_H>;i46AcRFgO3c+WMlV_CW2WPYT8 zdhG42^Z)ts^H#Hb*Y_tTFaP`hXIQhq%?mCM>JO&{DcJR{UNMJQ6dz9ol49FQ;kn)5PQ_~oWsD;h z&UkwWvjEQx^Ez|p%;{{XLA+?z7heZfcy!Wl!fF$qOC;9O2B(aBlFohJ8Q7|#rA;i4 z2;|V)y2b8niAdB)%Ia>IBr}Lx9 zIeC8!DHQuDAukPR2%RGMRFtmC~Y7dW=rU*^{Wa8NkYnz^+4Q8DFt|G0VC7tS0snmyly`8D0!+F&l(6!&NVztEDlj02p<}nO9_g$nbwt!Z|j9|Ss^fE!qJVRhLi9j>RDG?C><`>nJ zA|3tpVTXiPil>|doMlZo7?**gkA3isunl=KpYZpMneZdrv{nrc*;P9^IAd2Ix~x|L zf!c{y@8duzeC9UG_EZ{S(!%CZQ-f~zWtzD64Y*t`Itr+(oYS@HOW+wS%`|rLav8<% zI~M6}V3F&UBcX6sJ6;mK^x|!RVjN=etMx;650mUe)TLV*q`JZNR=b-jIX*BR4Scs6 zYRXOWDd?3g9%T-=tcKr@+$07Z5-BM z{r4*kQ2HdIWYS0F5(x64yg85L;6{M^u$W`%BwBLmWUhuty({i^+0mrWQ_HUNmdFtS z630-D+y_#Ow3JX>{vMa$G}g#dziZ)}*5?6$?i2>12hW8{AtyR)QUw#XnPpW-c&+>~ zyK`YUmx52lsSn@*0vCQ1^||n4YSN{?rPVML-eyyq07JnNLAU=?|U}0Y!4Ps zsi_N7B$y#MVyQOdiZ}(aumB=i#Dzc3$cV~-AyP1q=2Vvr;Wh-iB8Cuxvar?U1p5&_ z!LCc*{)K;5eeC~8u!kXUZbIv{E0!YElESYa_SG*);XkZG?uO$Um2+HhVHeOKZbDHe zu&~poNp?H`Z|}~Z-)m`GB?Sbjl1>;AyL)FT@oP8xBq{v%Zb@Fk6&;O|1Fn`iQ0qui z_|`$97vK-i4Qs}*`b4FiX|3%CWA{Cy=#IFln|!;jFjb~>%G(zEIuI`8wzQ;WT~K0G zQ`{Sl+0dLtsA5CYe{EtpQQ>dA&53BqMm4XP1e}NP%gJl8vZ9fWedZy7!+)H}a8u1WCR>29 zC|=+RMpAU}eny*Hd$b{33li>{LRiwhj_~8KWvbj%`+V!Kx_zYDYUzq7;n`LRS-j@C zNhSlx_eD)Pyka=~VE6=geUxic@*5M8C(+L}1XoxwlZ#JLsDkc7cu@A~?3^5A0IIAB z2O9$~s%I`HS)c{QBVP3+_qQmwi65b@o9#`oL}E-Xfp}a^sN9<)#>y@4GzNypB=DK| z!^AnvpGvz6UW6zYGFtHTDVUW^o*DunW{cYWZU@b<>R7O}&1l`?;iqTH3}a#RhfuAd z$A@%tT-1*vX%(LzGfz44i`M3HeH7+VlQ~6tR`Z5aLh{Y&P$DYY#t~ z@A_frbk*2Up+|kO96|GcVkkn6Gl3szk8t}r;zcN=WM21j`04>;Q+-2hx@xtm0*;O6 z>InQM{CuXdFD)oDW;DBD;`lIp6t*R9PM>roPEEH$WuU$HZ{A!}{hDL>1tfJv|9wpW~XsEPCcBRtkFF8`^ldAkn{H%PS; zWCW(Eg)q&M8EGZaNA{MOsZ}U&>N@AM%TySc9a)FMSGTfvSF#_jrxUN+O@Ar3I2m9D z0>;uyrmLZ0`jfJ=6->3}UWbDnU_i8Lg`yIwB1u(o8cE86u=s+C#Sp>D-#9Vs_eHf4 zGZBJZz-)7^g`w(K3tATG2+Jb%*iFop0jW48lK5^K-ksd1IKE5wH}hprG{aimvWyWL z$(vkMWwU9VCu$+_S(Zsh{CSL7_6)e1<=# z__8a}`jY6QPs0g*jSO7*$X)F z?D_hidHl~@{?&i=g9UoPZ$mL1qZ{^8K9uG_NQpvutch$EC}}Q@l%4HkN5I>kREMmz zUXkVeosD|MqreV_#IBJu1H<^o*Vkc?iy5FRgQQ;yJ{l#5o?0Q2HAwxN&ei@3pWsSL z;D|;R@N+yDYR^>{NrR5UVZZl5KsG0>69%69^SaL^#ZP>Ta%CLQuALbFC~mPf3l)jv z(I#mxzfxfJp?+5&ok|8rHVWs?lvPzc??>h>6pwzwL(7ylOAz$!oUv;4IWa@FmFJS0 z;iq%EJCsTjyu9GG%QV(3kQ}>L;k1ieD*%9~HF@F1j9oEc$TyBHf<{w)QNU*_suHj!VHYheg-NXQZk#v$K}M(0kA3ZT)3zq`V?aRZp0smPBVB zX)-~67~;y-Fg#k7T1xp4{($-@wN5#W93to1EHFX5!=py;>%>_lT(0CH8?7d5`G66Q zV_fQDakv4@WH5FxeY`}GvRUmtx^FvHTG2(lX6ZZpddW=Ta2A>rT|DX6;rHRV`XyU7 zeqz72z^*SINMG{GcqWi7&r?B+g+ychwKmJ1-sgf#DpZEDjE5ksD=SQ9i*!i{FC!;- zAWI_~A6&B2-noyV(qHg9m+Z9vKl#u$AKCJf({FHT$cbK=RC^730V5=8+OKnSW~ZT1 zwG5ll>N;6;cO7C{;U*RIi()PG14Y~1EyJOBs>#SC>ZFv0qhqC?KZqHy`F(smUO>eH z6%4PqGS_i3=QXa9{&a78V_y&t;o`TN_};mpWG{AHORw`3FTaf-Eu%%T-pPEjN!Qoo zeF>Q?N-~Rby*2?E5>QsG91fF)V+)^njY%)u4}a+36lk_z^z>J;U9(u2MAoh#)+<>v zD$__YP*f$ZBFp222hR;^i`G^CpVn1ZFoUoq^o}hsrb*83%&H+O?lOyN3zSuszGyOZ z!Gr?W?HmQTshDDdnq|@1$PXWoeD-Hl(Xo!~Wf?0wTgUsahQKu?`bs63guz@hj+_&{ zJE;ml(*+>rv=l|vv}=E;^k+W5zUa)8d-Wg{gMzFPv~=vElglMHq!ALgr2C>3b<)%l zv@>%r&C;8bf0Cxc2ry(rhiyPL)%(yT!nSj* zDj}q(Z`p|T2S8m=#T;neuS+NpjqXar`R{H%?`<$O*U!M1ebhKX)NU0&dFkqpIN!3y zJBHc(xUyrg%@2^w;HGB-*!+8wAs2oafR{cj*(9I?=2^)>Uz@3zKD3uA@bosxEE7TF z;cDPWM8TgzYv_H&bHDUR30sH6%|L-^#mhGQ#Ssj&>IBq~$(R>G4|^^%qF zhikb)l+AUa>io*$i0T4NP*P@^0c*Q(R$SDSccA)We{oRG`61)nZ7#3pc-13pLs?n9 zZl+q&D&E+NN9})vO!rs)Ngkw~)6_+@B94nE)n}9c7e@Hn*mR2P+=PdoH50SCnb>3n%ywe;CgbvdA9N_6Rg0G7I3X_Y zq@{|u=MTjK8(PFxw#|3iJ zm^Aj(I8r*Osg9piqz)berG$ApHZqckGl6Ex07$M0V%8wqS+(gTt|XtgxqaZwA5#Z6 zSpzR{J)dk;YIm{qdm`y6|2C4PqcGp-X^$PbkM~<`t_r>b<{q{H-f?b%fpj!8Q1I_dB-!?;krQ-tP+?@fC)|E>wz6+}&C;c`+A|ZjVod`7Y z_rusYlECQZ{)E*ucIp?uPlNoZ73MoTjZBpL7r&Q*O-q%j-BezBYRkTfsw({c2uL9; z3;d*WGFcrc)CaVtVGe0@2G(*a9AtP(f-kDoPGEj9K+aUPem-+ew+bHhyF>L$>{@AZ z)O@Js&;M3C$+SEZ6WcG{@}$+h>8EF#?nhk1F*2T;-P`=?#MMe`@poJ4zFRJlw(N#5;AdFq3ge|tWY~T@j&Uk;5w_?q#Z4t zj^h=*?hJ{P$^4M?02I zier5~k=GrcTEGHrrHHsha8A*hED4b$SeNJ>g;dAxn|h8s&!Iy}jqr?|Q~H3_d0x;v zaaY5-yA{|>D?Q-1$YYB}2t-6by+1$Im&ES-bgaqC(_oq{UK(cc!p5cEuu=`f8iYXZ z==nf{ti@cf2P5AGM5+u*$P%$OokDO!>9)p;@5QFkO|{say5kmeQN>cUo-&VU?HD!w zxmr@T3qvFB`*0aH%?eRO?uyiq@Ct%o2#5hR{>sq!LB4VsZzqi8mO1?@O z(ZVqM|C%&~M1aX^beNxgARI6pUW+fUk7*a{^RxI}p_di}NB|@mklxiI z=GC}WCmK^EiEFzyT*KWCnhAko(&Z*Xn~rI_6wo| zBVDiG9ui#dyiU!4h^<6TT&wTf{%(SH1pfS4N$2Kd2`tYgba+tC_Y4F z8vOw)6-!a=Un#rd68Vh0@_}3EF4tRR1ivW`aG~exKHoncsZ?e85(R;!!y_BzD*bm@pm20`yP6#Y1 zeE&&DV|K(;=}4*vwI~DJ+%WNpQgVSZvZ-{ndQ#Z>wQMJpHu?Sr%stO4x^wR7J&pFm zKzXZN;7ev7@tA1HqH|KMXpprfeM+x{GT6W+O8n_H$0eS1ti=pcPnQX_SiJ6Yt^z|M zE{RU~T56DCjMque+2K=z8nMi#5a<|luzb24yw9M)@xp=^jn*oJO&RR|j?<97-LmUs z-y#q-7QO7Jpj%%HE|iT9<3d_RTA6fYlauV2)}W9?N8C@*+<5f5n>2!{9UXDEJI}0~ zkdTvvTnHvVG-rE+Eg@lRHn#-_M=9|$e}i#LNp!ugg6E24mFji<@#Uw;A#jQ`dT_o` zuxZ>>VdRugz{Ie8&av^RQ{-G26V76y&ag$l+$-*}goWG>kkr9h;Ocr%CM(Oz*dS|X zhd3=17BxFvUa18S5ei7us=wAbo$c;p5q7R#QR>nM8D=dS#OvpRB0j+i;9%rce7r`x zIx)_r4@!a%S%tkkPoz91tJ0KV*akbrWnNLIgfS_;yVp!(?y`})SvLx{8Tz11wcO)8 zAzNC873ak&7#zlbu&Qtog}bG;)St4Li{vKp>`Ev?ZfUAM?Q9QQL;F`p6@j3)_{S}~@!YJapn_a_MU;iqhNhevPnT&IPXCb3 zfSwC0wp2=`iBbP?l{G@Fhx4%!wIwVi<;zSqIh7qZK?D619Q?mmolp}CrsuUg$bH&y zJo>{c-K7uk#qA%nxCG5A0~F)r>~^KyI(a(Lv-EefK}of+LrWgI+&=5>EZ4U zJ;0)QCBSW5gK(@2zuYb%=|g^`=5$gIxoL|CeK}~EW|e@Q*0R|`4w)L%S6rx~%rI&( z99+Xo{&5o2LK4bQDrYoMhf{JPIE9=KRwyiT)N<9yV~AzIP7f}s;MUwLQ#*F@G(x!j zzgEhA2#yS^5WmD@8IM-oz)N22;va@>a`Lw@RUxa$5$9#wNuqc5()yJX`MPV)=1gK5 z!WeI{tF#*BL6WwLSCvvRgqo@N!Idsz;DxL}A_c?w9MH7BB%1cEC~w;Nv8X+D&R_gp z%E{EjzioVCK|f?85AVpFBYIOEgBMbeQH%RR^Bx?61;vY|ahgGxF&Z_jgiZs=8JO{$PdQmT1UGgSE5$SsR%3_9cZAUp;BOP6&>rhoG)cR92g9 z)tX@k*;=mY(!%mMIjiH@$HneP=Jc$dczt{4(&H;f_t1Ue-RFRLBw*9EeTcKNT(Xsl zIvbH|3-?Ns=pfL>X6N)`=8PD;0xpHZu(1GkWZoaYrmd4d6z%A~rb$q7^#$gR0A&cw zrLLR#Ofuy|B?S$wLC>TJ)E{oAAZmlWGy@A8GJFZYvk&eXNy!|?rSPkFC>UwdR;9w* zz*L2M(+*k*Wv$w@Y?;!}FFokE)pW!>`Rd>zawR9)Dx8r7Md1yJ8+eiW8gRZqoPM9= z!2Rd&49Jh)j-Q&t z-Qs1eC8-nV(kp@;u04mDS8dWJn98F~qzt{nA`po5$8RA?RrvYd;uFt&4RN#)#2^#7 z7?b61G!Dj+S^IeSXrXMr04kTOEPkbBaxt475kf9Dz+`(|SbYOqHfzQY(3jwzwI=9f zm&cRy4Rg*JFpRYHIkKa>uA^{h zIn_yVm&csM^Gi6Xtk@8SE;rVgAi`9g`pm55AwUsg+;(A=*~n&@k4JBOQ1>vajz|?5 z8bD3~8%-9PjVe6ZwUzE{@^n#HKXk zjB^axHzOL1;4rN%`&2F&u?M>cFT?kaS+kSNL;0G`{>nhQ;553H)uX!aYdKvKy{xIN z24E68h3S3N35&_@qJyaXYBr_;|4d4o`%VH76?IMumwiDi0S&@)8UyD;2cqb(Jh&3o zO-8YG1JnC%HQh!#^y;)Xh}^i6{jzP|?Xx|hSq!#Ttq&jKAYq|#U5aHZ(zpTn8}Gtv z%++h?o}@Yy7X-6U9yN^Wm8H9E(n4cq#&r&hhQwm_*+`f{%wx zPmVM=^9$@r*FsoqAndIl-SNBg<=|V_C;X|uYuVahX;8>9G7DEz6aP-{gv^VJ6vMtK zw%GanSH3gl*M3|U0D=9{w$lpt?^97(E$(d22ggH__5;jY*_$Ew>Br5(}emw-9 zxXf~Vz)V5d5OLR|F1BwH!$J&Bw1u4oJ3^#(`-g-+ca1Gy$1@h0Og?USUZqDr`V|Zm z7HS$fy8Bi!h4y$YP#um-eN;in)eEJV#gkiEeXI>D@)S!NT+_d1t0ZT0Hn;mVz9eVo zf2|}Z{`5a7$su;hctn$$*dkL;`fIN%#=GYM<*nIoNM2`DY=YH=*39MJG1++0Sa$81MyuppN5<7>68Zg!w( z%C|R8Ca;*3lX|^0GXg)1jvJ~M?IY%XC|HYMLmJX78L^6Ue0W&C9G0}EH$yUdC_A(y zly;2rjT^rvj6ce~^>eh|Cf7ouF~$n&s}gTj1}yJC)8uy9`f{ z={mft_Zi;Lt;!>Mi2fD7FoHl<9@`zL>l!_zRNPQtgl{6ExQA=)dVX#{g#5I#iIvJ3 zntw@~);k_|D&J)+1Igw}{(QwH5ExLjLQ1Ee;nO#FjYmIT*H;=IVVY*w``cS`Mwt&;2mq5B z!Dm_*$%c3=-e`>_Iy0puzuiOo;@qkgF8&sM?K5~GaDY@$!?wF<&i6UsSZ(bY(5!HU z=5psIpa_(E?xW8N2jA-#pZDchA)aE`AwiVelHQt-SU0zs>g|qhtrBK|V3v-NBuf`F)7j(#?au^U#g4)1cb*9~uUUB-wD|u%tsC;VJKXqW zy!h-Z12vMNZ@yVoO&m%ZvWfY{Pf{9%Us4+NhY5M9q;TJ}DX{`Tssu!(xbY^Hg@ zfW%Tsa`o~Z**CQcP0 z>Yl|3*n0Y+i*Mh|dD2w0RqPe7xn3n)mtU~I>ht8Nqvhq<3~TI|)?P!bSp?PLeoKVN zP-z`krfUL@KQYgYM>}7k3Vw)>2|S%pFQ1W}NWJjGUL}L>+^EV%b+9_U&CQBVC^D}m zP&82i#MUfs*}F1>oi<0kLz>GcRm1LsSuo)Ryr1^e zwdb=xGm1wMp~#=Gwm)ah{Gjnd^EcMs7Oxk};H2{(JOVU2VdG9^K>R<-HJ;`22-4CL z)m)t`84S-@m|r3|m_$k8*bTWO`buE=P);$R@Kd$jjEzQ+E;%U}a^sGuB!+XO0#D>_ zr4(vSyaW=n^)TDA$JPzoP~|*7@d$VHyDr68%Na}bdol>yA>ETv1-!2 zbE#A^0|Nb|0P{{Ce3NrAoNkhRK9pHlTYJa=?R&Icvh4MU-yW1vQO&lqtt4qsM*GbZ z7%jr+;=Kg4P@(>)+&fo1Vd_~*F><-q&Y!zrnTr$HZPA!l7yrpx^Vou&hdSlK4n2b% z)hVHbu`RegO?LX;o8^V&Ffkk*-r;^2%NXCzR2bO)W@bMk(oy6_leWiyCFX!OfFf zXzaH=MQxkOkDfR%%|`gxqHqaR7&ga+>Y}&Fig>a@vyTH0E@f5Av3Ex@`GEzx^{fuxgh2>UvcytNZs}3wA}jXk*jWo3tin!>LYPI z4b)n*zMCt!H>svM6X+QY87p`>IR#Im13F;ApWq=G3*0a!q7ojux8i!0FsnZg` zJMC~2{np@@iVEcAy*v4gDxHK1uUbXgHcJN#v#id`BhppSL<*=hQM8h%4u z2u#ZQCkC?mk&?#KgtgcM%ir>8S58a!{C5>a%Ps4~Pi{ly{@1s=uD$noq$l}=FaVd` zr_fb}d=lMyNN$zf=BQy)bxlRZ_`iODUr-cVu>_V-7i_PvztsLpqSJp82xO8bT=O~! zalLD6frym292<+SN?D0O)}zD->u>ob1JXeLjGK>F>#GfSwjG5agcY2Hec3EX9dq3R z%aPYyIkF*ZGq#tDNwXuX=e25@@D0wdLF1k5`fl-A;Ww|fQbkmDQ1zk|h<)1EdKEn! zFZ|)tMjJHAQRAsO*mmSVPa@^8yYMNIq)v#&AxWiH<1C`UfIrJ;p{#=))!hjx0>-3b zB{L0T@3&kT`p?sumC|zSbi218J3#p+deot$W%+3Ji0=4d;^VTNCqMm?yZ_Elje}U2 zV>q-aKxPf9S?Bu7Q8!{NI_k~vPMcvBb!j|f91WP?GVxp#cSb*7mX zQA33jtA)Fk2%ssw1!-iWIE|>|#{J|M@JxCQonzVnccssteSABO?L>r|Ipsl+t_Xtn z;nrCBPhReY#lk(QXt|G+Je^M7jWm)Gjdo6GRy8Ol1aho^m`@o~jt*^Ak9QkoQI4&6fkCb0hg^Cv zWIV%pD=jn9D9&;(X^N9s35L{p+YPQlx2dht@Cb(_g}eSoFV-6vO)|6GjAjKXkcFN4 zh|2pQ23I<4v#{cj?r_Q{#l1CF@8}kY6^lXTjf+iLlGM9?Vx}c2<;iR1TS$EcgZ+azpE2GSFc?{m?6dq$QWO#SAE26~4D9e4mbrVgg6;a=3ySza}<7Q5W_4@RzhhTRcy#L|PV^k}X$Ev)2+OC-^K-*GV` zD^Y>wN?0ti#8ngO*3mPm2vm?may+a<0XBkeNNu)!Shfx5pZ2#W5fQ*}ae8Eea*Z=Y zZej`J76iE^L{kE{Mh+=P(uHMQa7%t^6}Y!}+|#)<-h4dn_Rg1`7Vg*+2L#H`_(bvQ z3(w+vlq$MnMlGg$rQ&nbUJ7VF%?`Q-isXr~><*WVZrDXjhVv`bR9yB=r#UV90gi{j zDC6ht-W7BT-s;j?pQJN}hRrd%^m3e~M!C(KOtPq1-H|rO^fE$7O2+)=QVT#SGv#79 zTPc=){(!qiS6FD8o7QPz3pB4r*8OmFn6$y;Y%krN7hOr=KNqB26eMWQaW#KyYfoQz zKa*3WnSfo%+3Xw01yJ~e%^ zBw({L=VA?7_sEcuY_3AmeP}-5@76jCOk5 z$hJ8B8NOsB35+zr5ebF0t%_Qh4!Ah38*B3he^kY5^q?JyCDV^l?9wCWFf|Aankp`42pkfW2 z&5ft9|FECHyv#W}EG01W7$)&#R{z9e2!T@7JKN1RFIHf7SH&b~d6U+NCMjI~sD%P} z2O6>VBy;deF?uJhjBj&gS&||}F;r+^-r94Bx>iSi zC=<@WK>dP3wty3|c;HtYHnRXGXU~uF+4EgUaQzGa+F|I?DUtr?z(#F^UrPCbm?7pZ(0A)ipK=L_Q7AfdQ1K*o6+=-T)I1i1Ch|L z#MJ(xmBG~Yx9fTdu&;wS_hPq!Id&~tGz)M2Bud(1C@fDlFSv8Pa_rA?ldrP)FjJD_Cl*+F0U|sXai*^k-3{)PMhjM5h)l2)X{wZo&OG|} zO(SuQJ~i5f`_Eq)COMk&2)YY5gz?@3pLOK?WA^2BP8Vt;Bh67tfCcX-tBoGY zhB=k~^@7NH5aK%A+4ZOI*{k(*@7}y^83J#-Qu%%GO;~ZCq(5`#RZfHS_OUJ`)kIyHHd_l4ERVF|Yz~`?`2nxUWm>5jF26=IAzRDa0AqUg8qA;le zs@-OvLJSQI^YY{Wbc#nJ%riU2YXA8NgoHU~-SI4AC9GUajp9)+*#x*LHbykjuZDL* zZeJlAiq=hYYnigkZu)1BYFQ*iw3;e$;td5~xCk|N#n`r@$EGRdb)%w=&w9?7{NruggEt|G~({P&wvADZSZx)Yox`mc7M zM5o;wqdhRG^kgI(eJ1Y4_^59pVu8jev`^iQeiM`@S}^m8&KVN8ZVaVwi^G4*Xa++oK2M?aPDz z_BgfvZvgiT+$Az()-8YA)-?$D>2m;cFJ^`tAW|9@VU?`%=I_fX!}qkEl-x)7m*Q}Xl`MW;>bY~>q9S?@^#OqEC1L*@Qg>Z%}B?21yoElt9wpoLD zr%y&pn4a%3h;<;V-adTpCGorK`144Y{lVL4O{}zZ3K-7abHK{+(x>*|Ud@9dWyOB) z$q-&6M3#>ENV`-3eD@p);;5P=38VmGY3+wu#$g3=OeFyWweT=%(H#26N4J8W;aNkb zaCrG-|N8It3c;hNKCpwE2+$9n;rxygp|bC%K2Xdm%gT>EAQ{PSi)O1lgp2Mpr=y-I zy870`o9xEtB7Z{g(?XHCa-g!ZIfs#~2oFM^F*UMHw?fbxV5SG4X;p+Mp$P1S8fR(rlDJ;Vd5N!A}inirzq2>5)_*~u0Ct_ zDIjA?a}5kf%3qj|;qfO+rpwCZb8|(;&Iw6z&w)9kWCIkTuj>jCF{37vzritV-GUK` z=KP~iz*Y$Syz=E-Syq{W#FgG2ibx%>e9%LRQ6TWSFnT<%((^_(C?H)ow5pZdrF%8G z-|`Nf$;+xcETp+f3dG&Vy(aw;mEteg1c%vp>7h@W&x~!7$d;l%@`a|R;gvm)U8O)z z7r*JBJFL2U(>&wKbo)i2`0wKjzz?Yf>6`KJCPLpJ`KkD~31*iUY(mM!f<}s?1*f8C zj?5|zv>Qr%x?L)SqBTFh*AUww+^aMSqtAHooR3K|nzvNh4Hosv%I99=c|R^fnKq;(0UBkH*(mBeDJ@#rEYdD2L68Ae?)sn<0m?#Hy5&``XI{Y@c~ZKt z_1XV;AoK&8+BL{AFL_By1Gy&gkn&OwUt)*%q$9O311JKQ_(DJ#(UkKuh`&*RwnOHK+QTb}R zv!j2y9~Wr}ZQ^*6c09f~J>Id{pBq_mE6>>kGoE{KQ_pxI)OT-G)m=lm4@yOXv=v)* zy%j4-gA@Zzti4b)0SDW>kwBZ^qkvunj*@qQ0D*yjyi~%_9+(Pm(WYLt;7k&Ef)>Ax zYsJ^H@^7waqH4Vvc$s631WHk1AQ|S1iZ(SU#Z9Cw)BDh@JaC`lW`v5^Th0iL{RMj9 zlF;R69{xm|+FixMxboY!Afvb#R+tD8Z)xIbeNXMoW*#{wM>(n5+J{9xh{kGOx%Q!x z3j3+|$R&PW@}HnM^Bo@o=@X<`I0?->(aMeX1jSl{-wd&uf$sDgkVWrcBg^vw0DYl*vZ zts;0TBQ9r^on9TxOxv8=kb}DNNfF2mcp;UA4=S4FwvNd|z?;oHquXk~9k>hYyL{zC z0ZEO;SRD@t0vSzEsDN(+@E1*ixVN7E@tG?=Itdp7rK11L{NWdLGwflbC47dQczRq# zCx`T=xR@VQIQ3$Kc;m&5j*fY7f)_mCsioRcQ@k`koD&D>NpZ1wvhtt1R!y2F|A~Iq zSxnveQkxATC?!J=DvN!xC!I1K*F ztZNaE3;Qo{O0P=ENK@^>2Pb=AiJ@G8?65Lf<*1&kNTZZ&@m<;Z?g(zI^Xpf%{8d zQ8i<>7_w|2BnqiiTE>^*S(RoKMZ}Lw@l7SBZqZjsT8D+~{}7mM)*If1P}%R%Tb}I} z_K(`MmID9`eiiO>i|#er0Imos-Hkl8(xcyVzNw@NWl>Yl2Dq)3!g5&jZKVsR`Jl~g zmfRV|#_O}*e4Z=7KmDK}9P(kcCT)!5m=T}%%o|UV!hTc}QUH_ZgmOvvrYmdSrX>nk zk^BRW2;%>WGwZ_Btu=4UA2czVKdV)nY7dg{Y@z(_xZ+kEGViV#{oK;>$!=Mu5hYYHu`QY@YUc+7@B>Wu`^wK&U7V_>&LX8usy+T!Kt=J zb&-kg8CPBLF1;JqXl(?UKI7H}7Z;hOExYOSKPkw0Td7qmHL8n|`Pb}QzQDYq?ikEw zp3==la1Zdd@4k%da(yZ()yV}`xJhTDDjCx;@ESs_S$V%D;`{^FRf~ow(Ax;PgS`V| z0~eyGx_w@+yl{atMUCUDuA^z3_CNOGv5s|gb*}cBPNOBA(PZVf+yQdvxrtCt7*&FX z(tbhBkcvU)zv!BYnuWG5{$M^}0@TDm$`jVd%j)N2x{80en6xs92|F5wh17E8t`{02 z2y;y%jW8-YawT8noHdRHWi9>YN=qx0L0}t#lIrEFR{{-myTFV9#S}aWC^ZRp1R*I` zS^2?9!HpsKOi=6~Q&iw<$6>&EBKG1JfbJJ2i2_q-balVyV$o)u7wSIoB=?`?y!`m)lu`Xhe}iS5O` zk(W4gOCc}uzmF1+NO+R)BJ43>W>)^??~P@fptWA#o-j1cn-QZz7SEt{pwKObRt#DB zqn~Ai0rbe#^0(hBOTu89zTaqxN}a|bLmU2i8N%~Swv5J8o8LhB$G5(2z2uf{(Ri;D zPY7Tq)rsdOCg}v_2VN2QZ(3ANsB*0q^wFFP>$z!BIMQ$eQ-Gj=m6aYN0$>~C`jWP> z9bMOa7)CTwI-Wkp%pFQs3R5Hu!6S!r^Jb#pu0PQ`r3y`zPrcuj8ml~wL>}7=e*M>5 z&o0E)bT6oVR^lr6qmCms6)BO#z-v3EN11r>(}4$uS)Ln}!O6Ha^H2v`vr&T6c>i5M zechr$DU$Ny%xD6#d>x#Swd&R4_AH|{EB#mJcCSgKK?~EGGGLR6Ad>H~uEj2zg{}ET zWtF`@>kmw_zfk)3{b)M~pW6 z^N9#a5AQ)G{k`%sHTNC_IhW8?6J5v*8uog5Sv-(1v+}FcbWu~e zk3lrpyb*9kE*1qtzzvG^4L8J0_R8c7dEO1%SvV}3m{VX%`GVEOP?9^h+vVM&R-pBT z>QX+Sk$mRA_L#gE>v%KydgYpLSnM!azo%=6PCnc(@wEVcNyfwX)E)z@qTe}K$~m{= zNJm^;v(Q1|@nog|ri> zV(b!b8P=Pi&>fDo8M!wy*D%g;EOH<8E6vt3_KLN}Lo%zZNu=u-GDbouE-a}F(u^R9 zH`TWS1p~0BVcHxxwQmSxW#p-o8fJd$9VnH?2K9yKq$&oju->cyx}!(r@3R39xU{d! z>{mK8)hr8}xVKe_zIizdE8~|%KQ;>?`>`8a3p>)g{%#{u< zAMR?pa~_eXc6OR(r%GkJ$=pf`lC$at+A!2i{g-JqqVZhsRD;RgbjJJFD|}s zE@`TsX4d>05@Q=L-*CK#DI|}{TCuoZOtpX$N|A61=jdN~18VT30%9+M&B|Zh4WAQD zzbJAxzNNI_SCNz>7H2UA3o@C{S51!;7dK9yZ-6V#KdjBQ z=I^J!X>Ah!TD5Vx~E;DM}TV<7v^_g#cx|+@0=>g+JV(L=iqG!(g_6kqA z6k7RC$Vp#KEFqfs5r!}_Za{arCO|*^ml=uiS8LaCRMqSEeuuf&b# zF=`NwEG22v;*f|fU@qsR;#vvF5^7`#!4Sl-7@i_q1_raI(i|*f$iQiwsb0DAD^~A! z%7GTn&_#DLQb9gb1D44UHE6UCg$St2g_y%78DcBq;ltK$Tx{DjdkZ1W{P}*Raxn_OVcIBOeiS^4pURtgsqJUGO?(o zx23V;p1cH}0vgih!Ha&h-nJE@Td_ZBW#Y`nECoaIhKPR0WH0#NetA69UgC!O8P^HU z7+qr)QeB{1w*OqXcAoP<#I+HWCa4zQiwL#D_X3j;Go4SBXb)*@j9v*LuM*=?*6Y}MVnH=WsY@-K2QiLN9`OdD2PNr zA||E96H<3(GdCOq$tYEfeBWL7eqlad#Bo#AZe9SX0YGu3c*?B&`?HGYnjquhCGR$6 zLu@NVeMLG0vIz}tVN7Dq(bfx~Aed^UVI2TS5CbWyjV@**(X)f!o?lfUpi6X|2X%#q zROU0tl(@TM9^RBD#M({Eo7znzkd?bK$1B6%-F_F5osWIQl}XK?M6H0uvzJjd5*wgl ziz^vENu+5Wjj13g)>-A=mqE7ED?iB`R`!DzMWYQ#tJc`C2x;_JF(b4cupC$#f%%4H#9*z^}TbxNU2Q|D( z&;^H9U_F8=={t`~!g5j9TvKd#kd8VY%9s79$}?44Q?k~>U^fFOf6L%S!lBG4o22L?7Q{v)>W4ewl54}oYmpwNo6*ec!7E>Ae;0&D zBS&7k80ESc-I+KhgmdJ#;5434yER-w~BYQ@=qM56lwL31YPJ?XFN5Z?56$ z5FWh^(W;f~&PumFDk6zg0ZNBfdC=1kgF^BITrG)$A&bo`svy@c#M*q26C|cre4hX?l zQ{lzRR}BvgE(*VRqkge^a8Z5ExtFa8&q`eAVf&jNUR?ae>dF7)7pCVLEW+R2O%VPz+3vT*T@#E2j*e-^+YHy3|)_O+Gju*zKu5h?lA$uxaQ|1&TF#Ee7L4Odk znfF3h3vzE;0lH+tO!RmM=n|lIb+sSl%xayEJy0 zcwe10!unxpB3v$xAPLF9ta8AIL_Y4W7#`@$KLU4I$5NGZ-{@vci#7!W){MHfHrl_| z1cpR*Tve=GtCnZ(t5q$IA(6~lt9eha+cx{vv9GfK%vDVZR18nY958aSe%67G^Z~Yj zoiT!0uzHYRPu|B^+5sB6wdNfQ-&UDpILO9j>|&ke+2w$qw5_ak@L>}nS{4SbI-Kp3 zlK~BTzWY;VRz~oOfBs8XGKSObM_IKX@%GLlCU9dnyc~Hh-{eS5rZkp~BLg<4jJ< z$^~?m18TS3(i}8feZ;mE!piaTDQkmeW=J|VVdE2pIE*-9?lc!7O*E`KWb--fvYy{w zQ|cg1KedG}xkpXq(k?Jh?E8(S3zrtcz;@`itkm*LyPDFx7r8CnhN5oVmH?G{BBujM zN`$4x>>TB<-@0vu@u=n-F~*ct)-Ic1nkjwjuxHpLGTL+2?HDfq=_(})4gV}=cAT;q zPM1WlL}ko}u|i6~KpmR=cVjwPn6?s2JzNcpQ93qgd=N62`2$K`o%>}oPmjSYeqp9P znl|oe42GuQlxWOCr+hQ)E1JjK!_PzX5h(S%_`TuKiI4@D<44*556$N7gkftC3zg+ z6%KV{iTtIe)B{u%;r3NaPj0P>xQu%K$wLReThgNjo7+qdj2y9$`M3)LaT}8~m z13QAsKOyE1lF4lHEGxG@YNS*?p%i|#8UWxk(#Mo7rRl4pCmhI{jO>}NiJeG2w1r8W zEg#jlUEvVZj3ql3HzqMOvC-s*3T?X}5fOBX`o5L?u&naRyY1ZAQ_$bE$g2KJpzG{+ zegkxkn=>L2Npb`$_n z&-LcF3SNaZjEMUXPbw@`=Fh9G*DWkV_Ih;tFxIbl?2_^MVH~+0?M^9FoPLBT~+S zr^GQ}3WYgpEUgR$n}>_WHS5nUt@Lf4{r5HXWrPd2eX8mWmBXgd76N9?dTN4sz&SC7 zG_1Hk-)&Yox=Q6K(a_<6e(a*KVHSSVFG(17UqXmGSeQXIMBqLpEonfZvkIUp2I96| zb@&Px*67yyF0cK>wlghG5&pKQQ3VC53n9a~qg5O`93%YqGK>%jyi+h7C zTv>pn{@zFem%xo0!-AS{gV2v6UpB~aYhwsoua{4pWoiUiEVmIuzh`MVr3C;eCG4(2 zi6$mzA2dLWh2JE~jrUe0cyJ;SeC39}nXzAPdrPdRJ7ag*D>AI%OVp7L5%EeAo^R9d zqh3B^cR(2zx72%9)pS6iMv)$cOco|{?~1$da@J6&unNdfo8K?{%Dd-zyeD3EM`Ejp zlC1RoSBcUkh^>M!)CubMfC(3?&M7X?r|R{b8FBmkT|V2mf1aU{;hVTfiigmL&`1KI zC`aEAU92FuSKPO23j>IMz8fVJdYw|UAw_~Ck&@w#iKv+7nm^#}E1ciBjpT>tm2_%vX+=qpo%8fnT?o}cs!9d@US$wfEJ6uH@2kwDZ7bL)d4T8&$a7SWvU zV`l-Il%v9%@jX3E!ZQc=CZoWPaoSd77=2L2IvJ##Z(&a`j5Zyy?jn8KOcmHZt-A(4BZ{V8eY8R*Pu(>nw;{DH^Q)G z1r%hj9U1Q&9bQf20S>p!!XjdMyiwjh4+bfJab9H+hC|Ei_VnDm1^AKP0=z9MftFws z21=Mch1LTC3*K-duA5j4jRDOSXJ_^}#6e>kD#EC@G|B<8^w^#7(-lk{l(@;kdXL^) zW+V|I1%l#{l@_=15u6WtEZ{ZKOQd?=JNu=@l-vB&U^UaDwsj3BNM} zl%Jd&iE1+P)Oa5ntabG&4Gj7JZ;L_;l=8|myrMP*l#(|OHK3<|0Jm%?aYT%?PJc=< z^AOxHHe?lR_WAJm?n_i;f7fk6oWV?!gl~?LPi2u@7g;SK~t^ZX+*jey>)g z!%c5n5zi!s{JEPf1w>H~?mM{1L!nvTM8oAmY;jcj2I*A5Lk(p3;X>9aJuoUd3PRB0 z{L20WQ2tO`zZ^D|&$Wv!i298Vp$g%J8={_;hX3QQPq9V7>u&-zt^d>yQ=CM~q2XX& zCn?S>tV9!v3p#Go#g{|=X*a}4R{qjKgyD?mB2<#n#GwQEBgvc0k+3z{E4wU;ehk?q zMsg)AUXL*S(Ga8`cx>2#YX zVuM$J|Ci?$#ipJ*Z(KR=X44WcSL-F5O+j#h`h>194eb&&r#J4DfFbu60DJ!(G)0m! zf5~qCC%aJuPnsMjn8m>(L2IDmymZ)u!aUF3Rg~I6Vv_}Wb_3D@I2L+}rxLR?OxHja1s#CeJ76=6!QW)H-nK%`wwheA)hnn?#GK{8r!xN{Ag-h|5%Cvgyl{D4w^@b ztQQvrVdo6y`A^=^-OwzZ(JS>m|2J}s*0WEiMiOli>RYdG#h^gz>0MPD`6S1`u7}_l z!#H|KWGTKvfmdVw8$*@T`{RFfdT3rR!Jn9#DQ0yRfVXOfcx7~BkmdvsgQ)AAXK1^xBWfRs0o%2 zrvR0ltEx!*-C3O^rBLgDy6|^(31_LW_C4*px0gyGf>~m*;(t*g;Jf1&wC4^vV^kmd zy57THj@~KL{*w`aV_fbWAAH@;S3yEzzI3^@^OBm^8}ugMoPn;DEExZba%3 z)xb~vN4&Q<;5)ImkW=UKr@$UcPc2cCumW=|wo8c&Qj^r7<$b#*({jCBnoaN=GBAfp z;0r2t#|A!FuNPv0C^Whg7$o`#C^B{?$0e&UKH7W_mTjK^0Ez?;p^?03zo$XVBCY z9n};S(WGE05(ShC{GQPg5(1uyMESC36$q;WB&*N~^psUDe_MKmNcdZ3ojS~bcl9M4 zq1#X>!>7WOi}Df$iSv=cF|h%smaw2T&SQ?(=7gcB29?u}Pq|jQNTiMi$4jcj#&L>k zTedvVk$mV0oio98lM^G>4;nFl!rSS@WD>(dFs8g?hmvq>nR2)zuRr7vb`RBkKMU{fTN%vEm~vg@by>=odFF>^!t@%c15|Ih4H}I=^u! z5YT^W{3k}QmkCkV=*ju!T%GicBW}KEwQ*?Yz=lKJakJ*x*9{-mJNbtvFS@>QC_+Vx z*5+?_&6($YE9|xTFnV)s6kWJ_5+UZB?!_%UD(AR}F#q+C|2kx|7}F+B6qt7K^E7Iq zt6I2Gd0w#VmvN2ZH)BKoPiZ|1u?(7G9_{i~yyPpUwUB zkYT7x%3WxLXC@)Dt;j7#%g@SfN5z%Yz{*0My<0Hp29=s&<0iy0Z`dz4t>g1R!tG0@ z*OlM(&AfLz=}zRKi25<&3e0d!9uw2{JI5@$&5&KqB;ry^bE5UZ?Er=RY)j|i<9q+T zY?+{@yZXsLi7(LOK-0Y8H$myg3a1Z?A^->65j}+YO*ty-TRXkr?eA_`g@39oS=I0+ zVQ@267>ZkT$0{rI$mG`=5$kL7n~*+lqZDKf1G0Bvbt)I#t;C(64C4y*COpWIq1#OZ z2UXY=emf}`L~0N{8UZU#L$C@9K0*stMqnOq8N&i-suAV3T?%*v6Ui!@KWu*YqRDb3 zIDzvp#*x9n<@L(uGvM%f#p1NZ1f7n+`g#Wz5Vj;@ry-nL@>z_7*d`BnEOy$}?`%^Ul> zmC<&>)zC(Shcy{4z2(-}qL`KG&%vx^OgZF-VO#W}S*EiEe|3o9d4DyTb38M%9lYj(fM<{ zgOt{2Zx*kids7Q3G{uW3th|Gh=h zYBe+;_*bE~sZ!*cS`ITjrw{IA3RP3usTFTHf=Bd+$4o2~>Ki9FXZxhS6D*UI{X{J0 zLe#qjcbs-syr3Q75|JQiL{G1=n+`N$KNqg1X~}1~nGh|ScDd*YFJ{%~&^nvIhkb%{ zCO3vuF)Ts?Ar=$JgB|FXQXDR%B-Y!jL3=g+<0Q%4aiG0B%j*sq=Ug7Ik>1# zmp-(y=A^`hM~|eQwQ$*B@J9~z$7lQXMX~AFt>x7(wZIjYZw--*q?PPIv=qg$#oh5j zC^;ErTiN`-_=RpdUcdb0Zdwk7&$JLU3y9KmXSa-vH^`snW(85 z9}GWZcB(bKE{2Wprw4bqO)~G00wH@JxW`e?F)cQ3E61~}@|qWz7d=m@<4u$lnl%PEQNv^$`ZZP;>>Asc}gP_~(Zn;EqH~<<;Ln;*5N&4Dt z#l;Gj=Cg!#yK>4jJcYMbm6l!fz%N=99Pqn6HwXM-@7%rv-h3x_ELnKu!bLU!ye+Aj z8vNZ9ydg)wdt(kQ8!#}4dTb5sxvN68^eG{m>flA41aYSUu;F<`TWf_EF^6&1OJ{LO zxgS4d+VF*}{Gq$0hlT7sg6^trR2MRU3bBiV^nVzQ$I`4L>Tf_=9-=BX>#L1R5&X++YCgr*3Yep&eljI{9zt${E)}P3W z%9yK2!;G*a=m5F_5x|sbtrmB=qcnGRbr(uFs1C3s$kG)z@i*o219S6O-X--7ibPN>L-H}aH2U$cd0|1CMB zTiOJMRCzeBLFf75>PYVH6sI%kq1+FRFb)u=y`TE*b7^f@1(-WIY(v{n|5^dGT^^(A z>IbfF!FKidB~*KKll#2=-908&gFV`)_C((jf0ajAPuu0RxJ9KW_}`#9w6O7c-s;Pi zlEWY@Wrt)n_ej}vcOHQr%~CfQa1)*$lw5eA9FA$*Yx;Po)%?HwKAPyH4fGdkwZkTY zX}@x$7kiCNz010b+(mo}Gow-Mu&Np-7h=Ct2{cd)T~$iAzg-k%BS7<--e?rG*frz5 z!%mP3(#Q~O{ObNvByhKS-V`piup-+Lvf%}S;D|^+9BGs!1o`Z+EpHhYua*s|4;Oo5 zxvPSF?XZ{;lP3^q#-(*W5gKk=v4%tu(^#|({z+2(TC6kuE4U^o8nceK9tK&n)-f!i zh|O7F+i)z2x9Wdvgd{@!r_nNRUPFdOGuo|5nl`*4TuHkeBmcRCfefBnD2PcnNoO6v zEi0wNKxjvwdM(gVI68S^`))1VZBg6{bk+nnuZ^S+a(Um|?D%p+$S+EGSdvyu!NRC^ zA5_>tzaHl#Leo@vl*FU6D>1haaxHk_$;8_4AJ)KwBADwhI6#w_t$tNr&V0yF_&7LL zdB@ZFXT`ijXi0aXa)|JM!~^R)Uoy}ZWvbrOk(|-S@UI`qoLe9NRp*dGr%d=r{U4Jx zYuBhRnEAv_;v5TiYBibyjQ%ZajcexHyTADJAyPDJ|Nn0PT0dBmD{Lul{^z@*pSGlkC zYqRpzUr$`S2d{7}Qg9ZpkD4nX?KrHKE| za7z^yONuiT!sXu607nnn0et7$bNFahx^(|(E@X;C5-^Ie4xlhGwclxR@Q2-ya|ajr zIdP)`#G-r}KIA_q!DSb!WpTrrR60LJP!M?f15RGkD8kQc^dbLD&;0t!k9#0rwCMvD zPTJ$^Pxi(i5-t>9s7_j9?GB$VzPY~svbUX-9@ofI?KCknPMx}hpj1)P{@RO~B5F76 z&AimriTJ4;t8!KKQ(2CRjf*Q4AZkr1WtP5xKJ)FV9j}-^PB+LVu;3I-BTAVlv|7qdB^YxE;@=fABK+R6>Y|q+knLjV& z;OpOhiOQ3<>wEW3yXW_3|L_ZpSTQ=?1-yGF#*znM8~GLizr_F#Y;3i)=u2~67pz?M zYg%`sC%H=CD&xLGr51!b8+3pk3DiMzkg*Xlc?Kjy=Caa>SShLnsGyNcpVq_rgp6ln zl&^e|QFn*T;VbT2Wf1@uP8tOjE@P?<*Ui_V**Yd}8 zhS)Ro?z;MG-gLYDeqDTgUA^O&mEl*>TSnizzfw{W7AAA;OVT)iyIr`2c2$QQiknQb z#w)fk4=QSM<3zZt{o?#V(Y4}YD4UCqmi!Jp#91$Wo=^&K(Rp7oSWWdyv?C3T2UNk8 z8sWudRX~YmKK3HdsvC`3LD;(m6!lRHI-#}14WK7p|2#(Uj|Wf7nXA+^>q$?FHlRAA7=lK*NAy%)dF57pADtQT zt!(fOyV3Lb! z5DB~b=~sjsG;1F6hWCvDuXA<+^T9mQ^oOXnptB{!gFgu8ntB!$_g5L3(K#@JA9O)4 z)`^Mq%H1#1x5+w|V@#?!8}xSDaZH=^_dZIg)2`^CC7^Nhl`GAv!DnQ&@%1n0Z9w1* zy9uIf3FW*O&$ngI?$!KM-r0uTxE-#`L(v=Jq; zsGFLZIeD8eP#g&NF}U-ZTf&8dseLHD+ORr$?9)k>rC zz|VMP)k|PD+w)LTZYuT|co>y!cD}I*A-EElrVCzhQH9`zUe)s3*s$cfh_FeVvs;c%_*`+Qr+-aZ@s}!yu(Av_| zJ*`Untkq=YsRG4 zk6hG)ZzLoqBLpl3T2ep+RaFzQ?R%KORvD!eK_f)g5+SH%JD>i#c*k7+W@|YEqJs<0 zBm+``38`awSV^CX>U`4Wl|6aW^J{BEkOAP@80I=9xUNs?Wn2b3)FZ<)JyH^fc1pc_b`HxGQ{x~#g;oAJjH4J=hiAb`_F)xk!g48SdcckaT zf2}wGfhQ-DvR$z+$GT!4CphmhFNO2QZ2jONqM+xa?lC~(t}O=%Z@PiUerY${ONAr) zjmi0%HJKAzf+meEX~M)?MkOtT!s}Tlm3J3R(8w;*S|@W)K~(=4NDs~nVN3PS(=vpw0gX>;k3!hfd>@4G{;4^ z?L6%X*-dBFA59Y8L#ke7Umigptb%!H388$FZ@b@FisGJY(g1BCZdUrY1BH074zSA$ zGOe(Hm+}TR(H!FgrY1l)&;jrs>8|EE>&jU`-9GS{Qfh^Dq`F=2iovg>jPmKC5Y|KiJ+z(ZPGfDLO z5kt8a%vub#IsOjWJaKLaa|-pGS;tS}T3(&N6fM^2>gFNIA3%~=hXcK8tcOu*IhtWT z)oz;cOIb3RkiQ75M@%H*bTAYP7_Yw;4imTL3X)7n-TZ5ofZOBcGp;plp|KfPsdSLO zuGn3SzH&;hR^zm;vGomda0seN`xoKb$T233vHdxNs8d|N68T{bli@^CsRW{N3V~20 zRwI2Q*7109jbc{KN|QWXB;n|L{7p~ARAKb_(&=|dZ(GlOH6=?Z-DYxq#wB*4 zgtIf`n{3Xe?dM+09ids!<-KD<&e8-ByTZtaxxo;jqyP-s&}ajd?MRiJ6?O68ETTf#2z%5kRO%D22{=5f@x>G zvtR*uA=o*q7WhJUQB1PYnk~*FTHZlx?vd>U@yyfCXNA6~%jr|iXTz}5!OV?Xf5k03 zvpi?8lf^$xQL8vTn>7?(y!8e>#{POT$Czmj5uWJfiEv15Km4{j-Fu4-cfu3v^YfZ|7ABuzQH91bf;%EsQdP%OAflmZtj`HHNirAC&2WdXJ8sS>W&7velJ76> z-_Ljbfsb5WbQv!VF5~S>5ICPX54Z0vmgnQ1M`Pj+rPq|N(TNms=F?DeT^e>Q2b{6~ zLWY{|MK)h#!D!``3-@xaEBy=ql>9~FGRE_Xf8>c;^^Phc9J zO8<#`Mr82s-Eq=;?sy-)($(~cLWOaJ=U@X7O*QrRtNMEpA*HOJ*G zfgoJzRNY08#w{cqpJ7P&T}cZz zqoOJ3G)NdNpjhG75N=N%;1`cWnaNpUtC}0X^WWJjLdqPT(U&RhmF1Lrw-|M&Q z2W$p8$9N|txF(#>Dzn@ZUOcaUX&QCxwt^FzG?&+r3@JKFkm*S4nM-cF`m+JLUGbei zeW)o+Qd0p7F&?mIU{^f2B$bpNyW6^(StL+OpyulJ>=p{oA}EMl8l$669`8;{pE8LT z6A4JZGuh;^SF=YXbnsHCuV-ToS^x7J)-12FCeITiE)CH2P9alFzoB+!2hI?C2_a+N zkja^1Ez3PmOlR1^I?*v=K+{N_^1BA*!z#b)%)(iV7H>MQY+g|HW~!Q6LjIYAK(z-M zpu|#Ibzl%j7=|iy0g?_&M#3nj3nzo`L2vN63OhEl)qu3W$G^Dc}!ql{WdA_h57eG=}~ zmFkHT-9JPoGg@^Jy)=_Exm;ajwlAYgmG5X`+L8t6bztQM)azJYo9m|ecLIVoNa$~@ z=~y&hZCwduHAtv1#i@Ssn=3KdpWn}yyRKs~f0sJT!CR_}j^(4;G~cx_W|P*W$EJMK z350Jho)6CG6QQXj2}1nV>Sa0>u?7Cvx8l~0#X>gA=y=uc_r))J9^7;OXjsF@jSPqY1=QlwSA3t9nX09+)JiAV}!TCHNc&> z&wS*F4u=gt+0F%E#asOXmc;jTPyW0;r7zl3nQAn6y3w)JRIc<`$B_w^Y;i5aruN)s z7kS5Oc>!d0O9T*5=&Kfzq+1mw`3$XJKh6w;3)upIDXi!1b6)kGylq#m@9}b%l$5dGpP?LlJdNVCr!Mh1 z0W=y_c_4gKJeJ@ouE?-xH$5=KVv#jkLJ?ZvlM1uhiUNFQzIiI3Wuho&lRw$K0VhmT z<3^EDYcZ%fuTBz(o0$$wNGg9$QBZvZnMm0M(i%6)dQ5Bd7P8QX(U*CIXl<;2;u!WV}lQ3~A{Mwd1k@ z(50WT<@?@A3r>7ges9sS#SF;H(4@Nh+2E!g+Q{LaZ1COZUAAq7&d3G&X!=-M&ljdR z3*v_1y^WJFDFDmw?@(?~x5wsD(${Yl^3!cOyAbKyYbf+8dXfRgO5Q z$njWfs<+E9o2!hbAsDjhYoTV>y@0ly?I+zYlxIz<_V_2i-O{$Jl2?tdaJ$S6a)$zw zsz|jmgo%V1x0qhZO251ebCNAj+i?_y{}21ZX13QZTei%S&@kIJ%cipOBd7GsIwv%e z5VzTBT)^Kv241UnlPVB*Xa<*tQg8mMm}0o%CTNx4wedn(pTH_og-Id>Z1jtsbR#mh z=pK!Ml$94QEkv=^v2DX%Y?>A}7}yAj&Un@_ZXHG~$haI2w~J$=a?uaM_81HG{l^Cs zVw9@NE)ix;ReAHVL*wS6ZL4SFF(=b*HuK{LPS~t+rEkz~7Mp8U`)N?DP8qmLLI$HE z&>^nILFD}X`@VF)juNZ|g@CIbn=$&gT@A?ZDDG5r$Hdjdj!aimuEzEI=EKc$9n3c1 zl(zQh>JzO4P3+5T~PGP2YfIilwH>LK3m{;ZcLwR|#8ouKHy6Xq$NWl_FYj7{e z%!0tyyG`9zZ#YS__zquIwrD|j-~GXu_RSXpsZNd#h47}rbM^6o@xR|U$nhbq4g~Pe!Fxt z+Un~niF+yQIOj47X4tfIXVv&@etNW4Ga!qIW1yN#M9nLPszrf;SLzBPHPRdF)`Y4oi6XfB6PWQFbU=wnG*zZD3RSu#-E6cv!BTyEy(v;_$@P+=UH0{lJB-_44so8$l`C zPk&57H?eXOF?%|Cl#IpB#(;uwG%gyHPx$_?ZssJNBug1Hhk`BTFm$#O%NqAbT!$*+ zjvkEbfEqH# znpr1EZ_S;JT`FYn%yG?BPU@LlVx=xF+(p)=1)lQ?A#8KnfA#x!3^RB1sm?A-&9KN& zR%-iEfLJJ^GQ_mkF}BLz`#?JwsVnrPi_Vc${vCOpYP}Aw2yx}=mUC)*JJ561Al+lL zxNL{5`QJnS|OT{dCQCghj^0zC5pwZFLQaN-h5s zMGeBRP!(xD8&M~Ojv!^95|mwzC^|PlEv`cC&9(j?e@t>Ey3@^&F&4dk1V4a$-fEPswp6XNM^f7*?P=}t>1>|p$C#I0>|Hi;zO>L zf;xQ=*B>vnC$Xv_^?V^fEy2yt)YKz$SsjDaW-N#h6SgNXY5H9G4QPVeAY; zdQF=EGJm}EmY;UXE^Q2>_lEeRgDK;gpuoxtmFnT4=^tNkj=TxgZ$1#_pcR zMe2HTkj4OsT4nK?Nm~<=tYY8r&_F7(ppv`vf`_7b$G%wcO$3N_XSbE7K`!%KdEh7= zhBdsJKkktZbfw3Sbb9qn=Mb=X=7VVQv^If?IBPJkB*kHH-DqM^6BB-i^k_SH=x?4p9C0gAa55@+Z3s zvZc6_9IW$^Bw#!mslH*r&HsooT=c^)S{mH&dp+H z?_!YO3r{A`BBdPayCK;MKaz99I#f$gO`lV4u}zUHf9>oE*Zpa%Oazyagit)r z%@ZorpQL47wuR+PM`mLvXvG%)BEvDI{)3VtbA?{xlc(Mvg4&Md{SCCN~RIWkV4r$ z+iJp87KX0W)iBuKjN|;to}B&2Qig8Kx|?o^ewYVJzEZcCuE^&h5}vX2#efW z$LOrd{7gw$BDt6<#wBK@WxtGs8KkEc)@K@wYCu}3Wk6};lf=YEYR1?^A-Fw^OK1l{ z{S%JFGlG>*9tSchAnSa5i2Mbc(39gHvuj4bH9WQ@tVQdgb zUh8K1qnp%}ktJH-azsT*=fsJZ6Dno5VWmK;LS%QcKP$HhdW}G)$tu6?RSOTL)iy5R zr+)hK#?CDQ4r-Mc6QI&`XIV0|`Q_QZ)NR--9TXrsQk4GuK~y9x9j=i?h+g!4?(c8! zwwPw%Y+LT$7N8B6e-X#oTt{~;**HoKRv_-vhqK`bz}eTaAVQKWpCPST-hGz zO|Exs0rP?aEA`ST}ZK;eh)>Dt{UiVcSrh#YZH+JVU5&diJ|cQwUQ<^0|( zDX+_1ETj_B6IL+s_l$EZgN`$d4O`4H=EN*nc$D-}j~|FMq@rySpV7*=po=Qn5#e`J z6*LVo*2PV<;folG1FTBVTu8fiTvd5QF)RJ;kCytX^Az(JUd ziA7C{LkdId2K8yE-1r3)`m{+XHLLvS5Asbe<^E!xg&B4Fj6%kWxTECr9SI}1qOFam zNt|%CvWPLm1w;}N@QkmufsT9Mx6*n^fyYm;6oy%Xka*W)mnX=8?*1)nOk|#*xIyz& z@mbi>%@5$?%fHLkjN_6@sZ*y6>Q%(C7dIwa>36PRsHy$~- z9n9brNfi_7Q!9sCYr_Hb=VWE6lDzpkXh1y-n+QAj1!$XY$=uiPMgk zo_@Yh6js$T$~gTHLg78E;Cc7RguvAWpO+39d3+*+bhSjy`8XtiuGWn*PloxKM`(y2P-CILXMV!?NqC0PV2`4WbQ@ zGUUk1Jx9MeWw3=Kk8s4z$E98dT2|$&3s{pOa%Ncz5&-chCxZYomiw*D#GFJ9&bTuL z%xQoAqg-HXVv@N8EgamBURkJqhE$w%E%+AC5owpo5H4cIR}dOm>4^`?uc*-Jqy-`r z@IQx|j;L4&q?%rjie)Vbbs;i_i252}LRrIs?^~D>`j6ULublkpP&Pw}wI@&DkgEV70q>FthVamJZiEfwX1KE(oRLG(fp!tWBQA+$RjD zd)u!}1hEv=&ZY%{caxt;6(rTH^iOZ`YHZInV1?^HCgsdkO*dZ?g-sGP!m~6qbYUXD z^GJKUxv3K{%cob==otFmC~zMSvL-C1w|`%SJMgB zLp&Fv-a(>*+7P65*Gs$WKu&)7XX%b{_03vzAlVo4y+;-x z*q0wZQ5G0Zy+moM?-^nSU0&r1q7UI2TKHpc+9f^K>VpBejW~{;3ET^tn-VGLiH@c% zytN~9JN5FMvn;nGE6-`ycQo=%s8w|6qGrIs;7HmP;fj5*_kbA9CR(|^>eg@6a zPDjRzA{I;nFmBTN%%Mlzo9^7v(A;k=ZZ5yPtn}$UTsF|$2XejpxB9eKvxhMrF?b>w zqCdv$(ZE%wu8D_GfjH-JC^?vV_G13kf@whd)`GqA{C6C}p8swv*Jhl?E)JiVqq15-BxAzB>d=f^N10n-W`h@_DeUT3WG-uW{hueTL&=PE zpgEoE>Yt}vBRPI4XIPfEs!@)g$BoXGI0?n3%cYIn+ zXoaaCRqpGi^ih3Nc|e=e=UNN>U$e@a{wh9XfRG#1(#<5kq09@z;Ip02KQ|`n-+zrE zT%e{1mb5|QL5~DWFNr81+u`nV$gO^+WrTRbLsjJ!FF3!rq6D}BB`ry3-$AOUDX%;RQX zBIHhZ&68U|R(xFH#$tA$u4^n_)~tK}o6;zFe(KfML1JCgFk2Xsw(fukg?-yO0pC|E z)#(o5eZhT-b%QxhZIp1??$_}T_oju>*&Vd?v@n^q4CnBgGA_+N9e7Dn1-iig~Z$5A!(@MD?Ns(^kae{yRJJm?UydKn$_+ zqRUUk&Zu6VthMF(3m_&BB;1K*32r`&R~=CW7%*An}RmO!9+wdKFu)h zTG*IaHTBHA9oOT{tn&UF=)^6>iI=x1c}^Oxq+;d$tzN8%=tE1j%+Gq|iN`}oM|V6? zNd6+Y9@h=}L00+$bzHm+jC52sZ88pfXuS03@9nojCga!%pHPtDC3@FB#L42a++0vt z$PaiuXVj@x6*|!9q$ZVLxnDA31oCZ9yf8{wHQ%isv5$7x{MtQti@S**a8Kx@?MzPG zDm`*qkd+aK72PyvRzOuR7GiJHa4=&GCMNS+kX88E+jN*|Ua)6%l``c;1qCNRSg1SG z_Z5vx4RKI4&9CY2TJR5DDrj|mX4}{VKY*dD;xF-%oLr@FRxLr&gh9K!iAw!%l{Fun zLhQsNgY1V4N!LxMN<({tvez{&9n!lN&2O|obT$5~1WK4LzJ7s!r&m96gg?SiJV|gp z)o)Mr&zmQwf-`WiF8*kqkkEMgJX=o8+w-jK-~IYG{gR`gw{wina-20%VTfT!bF>sj z_3_~qrubR%*xxT>pdbIQe;(O1v#gkCAQx$#;*?bmIm;;rx+8?`#KR(n^(cm9Q8E}X zP=vS0Af1iFsfM>7i=Zh;bz}%qJ@2^%sowPGX9-em>gn3d%&xZw%4ib4!V)0O<*;4Y zQssB6Ot9;DA!Dkh6K4bE3q81{?@5M*%*Hfru2`BNq7jwnkhrXrnYmGw^~nEK@w*Cw@S zX7{RL4fvDSKx$X&1C)-JwjzL<2IawEYQE0jGX~0ZQK_;kygFg2f1*r613hSwBIl8w zUMs4`7wGKCi0S-}MUvdzi(EB$4J8H8UT9K5FYlJnbzIUNt*F5qn8o%2voxejyr!jp z0i!oM7JCfN-!PXiZ#V_lk7+-l=_h@-uwK8dN5eo{Z&9NIverR{W}n8_EgOudQLPjl zud3vi)p+D4g90%3{=Hdw!JnK>zotiQ3U=gSasMSlD1Vnaby&w;2C4t06y%{}h zGe$@y1G4f3AB<_K7?Ha0xZDMoPgvj#b{A+!f<64%x6pBcm1zvc75S{ret6>owM_4C z9Nt(Yq5qkaB-YCB-w!iVhBLImr(C17>;?k2rYGtzId&w8_u4r@;yH-ob_)1bOeH{> zdh)-Nr4Uwve$7a$oOy*&mn=I-NX*Hk3OR0u>j28d30s2)#7V1470gGVj@@1t)_42hS3_ET04*Ax&qJU8SL%;7Cb6J8r$*PVpm@Ae^km)WXk&`U0U8h0 zO#~@TRbk>#qs9Fd3kJFujHdf&cm1kp5aMNmIfM|A@$%;HrhMAQ zqlrv%tj#|NgknT%Dw51yr}^e%nY~N0cW^I_NEgglnncne9;T6Hux_CC>0FlgO`v74u(>)Q^;*wdc}IF+9{m0c$D);?yYn{Q3(S7@flm6&dCwqI7pJNC^~2U9qx8IrmEhg3P> zeeQY>a5C#NPiKkC=7hwiF8QEI(^fMp9Jm+GH{ed&IY)j>GR+J?h+Umo25MY-c)JFr|I*LQiV~mF)tHW^ueWH;eg;hgmRM3gsG2bX;&9B`nMxNFn^n@D|$U_}|x= z6Ui9VPOa@H1hj@ybl!F5n6W};tD299YB{F#kZ{3~x8Sg+yOpqFHRRn9AJ+%kJ@UL*w% zL`TTR!6Bb6K`iUTpGdSJj4nFzau+h6D1U1tp9vJIz^5<<-7d#gn}*fTHKFT}ePQ%nPP~S=mcD(!-zCIg%o*O#O5sHDAGKk)miCi3(q2Apvc)BIV$_ z6Nv2Z4$WQY#TAsIBF(b>IeUWEZ#e&1JweQhK*A@1B1}o{{UUdE=SJYdHSbbx{5e%w z7!#K-%AH5XK$BBy!y$hThfr0nxswV^dF{u(Y?XXF9sSe&axYWRBz|;gyx-bp^7T#L z1$@a>OmKirS#vAZ8Yh_=DK=67Dr)J5FX{Do4>^Ms{g6}4MgGUn&`^W*hCdg?_T=lL zBPXsHkRUp7mKMF7Xnm#I-)ii^wZ76RGcsMx6LfM~x+8tsEm81ogui7(s zAwf=<09)LldyIj9L~jF6Opca#hJkMHNYdoSg0=A_k>*%Bx6*XOfyaW&DhSB43$Z_j z(O+Sr&+=6~YnRYP6n)|#(-sNBXij6cQ&Ld8v@x4`*v*ldH&r;+cRBMC7t7fDQ6_6` z*}`f#F!Libx&H(=lSAdt>}|>m_$u%{=jR#|^U;=rok z6+((1)i%R9+oH5^M(E0)Wv+$VQ6FSfi?@(WAV{P~B*IiV=`Hekd~HxEK;;kJ!<|t6 z>uxr{OCFQu{03DoCH|SxqR&Vf$tuTQWAPRe2Rw(_P?D2MWw0cTOaCMW@8XOs8GaTZ zV<)S)!(L0tp}{~_{>|K|PNw8e{ZjszJULGvS8~FYziskok_whk0R6Oh{wx*8r~at)dCU?D$E3D&bsid!G*?h6`=8pHAS%I=m5;3JYsjB^`N)5ceAn;9 zSuvm%A9gZxy=oFkB^-hxu;lVNwnZ}o;ai*1sxo@RI7sxAT8L7%QZrDND{zrjb|#`X z$;mtGk;_e{aSFe|Fx~z_5wuXBUBxT1BbV;~Z@w3~W790m!amGhr4k2Gra)x5g6XJM z66{IqS^2nI41UMm7~qGX9lt`Ga!fRJlyN|aNE2zU2pbkfHQ3xmhL-(ZhLzT#!@6_u zdHezjza$vBm`B<5n5I`_@^@3ej@^3AcI}NeTcgoo!RmsDiG8@H`VN`{2NR2q3Xy}o zo?GPL{qNd-_cP!mnfAY#Vw@cAK{Tt@Fo80Dq>oxnm?N;}?EY+M;67X;u!PQUd zraoEj#)7*gwxX!KY)_DjOWx@DNzsIWiw-Q)bw=%s>ji8fGtPuXD0|L(E8{jUU3Vgg zryz4L5f{R+1Q-7Dd318?qb*8?9pJ@to!i3qp?bElo6V}jKp0DHc)>`x)`AOSDos{y zc^@Pev5h`5F-aXl^dvKKQc2+lvCe)Kuwv8XuvUA)Yl{;oH3%U$s`5SMomDnHBN8sy z31Cr3GopVry)CX6e@79prd&je8-=#WT*b!UvTc=RxZ=u&1)4GM!Y}Ye=BMLPk7?>H zsYd(1JOx~OqEEOllnjvH@og)?Olc@1{ctFFuGCcia$yr&Wo5Wc$iqQn4`(&zTph|v zpShAV<#BVlCgdj>8VJ`OXYVnuNJ^v!M+SDa_(+6XR+{%nXH^}`2k6$ABtJ^dxiFdl zoO)^A?UtQqNkkT7fi29Xx*tAFuC5l*0Vr`Vq>cK`C`s?$M|6weh>`_0fo+S5%>!2< zsdtOJe%D;Fs%!Hx;P-(q-;1VLmC6r&XJWpbMVv=>ja%Nj03n&i%cmZz+Gg%!%z7V; z1!$3zC3NH0e&;fd&t8Hg8B5662!UKJxuvJ8w-d&F%gc4Mwo()D#VWbmM|V0kvLd{O zEO|duc7?V*wT=->{bQ?fmsXXQmCw1c+EFD1xTk~XH@>Ro@)=b1oL|)Z9+}pmsEDeL z0lIG!!vc9@HwW#o2^movZ(eP@lyqp|ZZ-8$52Zpz3rN!HFyZ`^fv8M3!jSMD$+KL| z;Gf=rSkjXkTdfKh?wG{6s9OI7w)3z z8#k#yS^IB?y_M?o3ha$M!md#>(hZ?)6iU=UbN59b5nQ=Jj{o9Lk(xL;oi0if4_mUt*Js0c$mzy6URrxLo=7IJ6Z1hYx%X}YXU=D2n|C1ZAz=*jOKopnq zWaX^V{ZAlStS^Jh)@tmJ2ADYOtO>jF%O>u%8#l%)kkMN<&dv-NN%lkKv=fqS;hpzh zs>_Xxf)Ng~6bw3f-d}ih*V2_q?zO8?aBca;8aurhEp>OYqiqceMytkRV`Zr;%n-HW^Nms3-7g5Py;Jul>^>f*aK?t?3X@v(zuQCX>3GbKp&w_*wD3J zIrsFDe!wt1LdA|sH*yTtwnldr7f?bip6BZN9uhtw6e}WAKa8NUZ$$YPcYuuKo5Sa{ z{2fhM_3Uh@i?6W17o44&O-&n$ngpMk(u*lvVK4%-(gimh$+ca6w-61+ZN!BekdAnv zM~8S{!Ntr3Mi4ICdRR<%56hc(FF)7?P9Yc(iphP`J}j-xVVAZVft9MurKL;z;Cd;x zrh#Vxw6ay_qd7D2+}W68c)NJmJwI*cVL;N#PO)DN^j*DG9Jm-M;MtbiF#gZ<6^NDMql$D-H zE`TS+C1OM+0!AoVUhxY%oJ1O(BHYw54klq;*eP1rmtS;Zpy49qVCy4RQQ)B&Q%a*;$Mk?vU z3U8ArvfYOmvg8lp4h>836N#(Ud1@f4wS1~gh?9qvraaRT*!skZ0eXSVZu!2T?qb0- z18WyubbhJ&LEdn2!lJ5yRpxzjybRA`tehYopj8<%d4N6bv13s<2m~hAl_lE{;q`{n zgj_oc)opw^D;>2Z<_xgBSWMQuq+U#q3Urc$?||2hCKsxms#lXL>vAmm-APOd^+XylMXUjBC{5V{d8B|O8{9Ksv6pjO=GJF}QmaK$G#y5Sz( zgipJTL7(a^u5_v@tPupK^XudYu}YDCc(ZxYUBvcu8#BZj!GUXFFgb3D;ARzyP@=7r z8l$p$>DNc&7RZ5K2omeI#P*{(=Je{CxAlf9cIhelY0r!)JTT>~eE)L6Atwh@nE^70 zzPss4NMHcLrCSv_>Lc(n&xSYvvAwK(?Ar@=8dOEWIqG_zkv~~OK|82izO$!P<>8u* z!QG~oo=hqIqbWsFF@pmo8iVR4BK^@kd4KypUObclrQ2vsP?vNY+nrYPr4F2{6Ar60 zs{Dc=>Ul2!QC&>;&iA%0p}Iztq)HyEdQ@vW#Dt`rEs5rqm7n>w1UL%$1M}KhR$^6E zQdZx?cU;}@AQ?qv?6NV)OdkL`plV`UN353JZBz%Dq4DwuuBvt5OJZ;hAcHD>VvVkF zY>)@^IW<~B8s2`&iKF@zxoKvgTTcL6QeJ}b%EgCLWNh{dl_r88-S3O!O7&dmn?-|- zs^*?rUkYoJ5SAh9ZM<~e@>+6!YMp+}&mxl;V^6GwIN+*HUmdIUyk6fF*NMl(O5_lP zf!=eRr@HDI3d&CIrr~H;Eh;z~h~oK7OE4^j^SYIQJisRzcXYx4_Y{mx>CR@iN@M8_ zHayD62?I5?jOo2vpY0OU6+5quY`|J!TXC0i2CYA&`F!*#l62-u;!dKu;_3r9C$$|F zoeB;c*-(1xU(MlSP-IEya>|l+<$YaOTyf2l3zj|nvO8LF66e>br}! zZmrKg?uiLqj+vjG1A}apAl*Sn9uSMDmfFx5T{h!AFpPf(GVahBO;%cYgT;Dfp^S`TqA>X+ z9S1x5{-aEHMF8ja3pfhhuqn7#Tu%L_H$39$s0FRm62}bRWS<$s=n=nACwBxDK zYr!;;(x)e%MH`Pw-(oc!)1EE!PfO z5wi|axR9k%?s>YeiVuat`@*G)Wr725ng_VeD$=d_XS6B2zFx0M5eO_lF|9tRbOd%x zqn3LVC6mvzW-a*eFud@OO2W0YU`Wots3XMwKd=J5$619e5q^BP$2fs-D^yBjWzmebz+5|ir=@M`v|M>TIHd;CDbA4UL)vL6hb2FA#+_W)|p_`DNM9=CGQNu!6>5t!YC5e_y zT%TU44kyo#8F3JIL9aFKvFXYJGT}@Uzpjklr30WFga!#F(&?y0!jujQc3^rlO?>B* zzII|&D9Ib~J7P=b{xtZ3O96Vw9iUf;69`Q7S(PA#z}lgoz$aH!x2*4K=oey@@*beO zG`Aw|tPWdYo2YImylwb?A z7M&g1K$?0Uud&aYA&i$FJPN{TY#b9L$GpuQ=C(tK%DMuC^dr^#c-dtl!uNt5B| z@?*QCBv(_DtKGv`V`e@0&heV={V2g~*HGLZkw>L3F>ADHjYh02yqpdKdvx^pRl;nB z?{{!YR2!=M-CNd1<9vf%?NC9FiHq_F*tVeXtbE67`|!~NE)yCGhrr=?z7jHU?Ueie zSqJ<^PoflAVV6DuKC>*q+{`G|4N38$=Wh9ya~)UJQ7n(E1P_n+g0RARD1c=VOC~Vv zcnyI8W%Q@2{=%**-`nbDfHt%0HMWKPLvW34D-8LRv7_r~Oaz~(>b(_nNnk|E8b9sb zGG4k-(vUsjt->ux&9!!iO?8T!b_@yZ`<}iV(Wdh4 z#}atPR2Yj{5M!3l<~5_~isG8|nUKo5ZH19FQSSlqIN)oDN4twbLevddPSq|NH;}5% z9bG%T-aHCrO?a#vGq7#Na4cZvO-_QpyYiM1*DwW2dCprjp)apqF|IGxYhb%(_VF|R zdB%+H?iuTzx%Qf!zrX7h#Ef?ty6BoGpBQ?0=G)5S=gpXj=B)pd_I%_gq&@F(?$!T( zMnA|j;&f46!I^}6VZ%_hPf9fUXN+@cgXw?{}f7Aa|`=52Y|Gx(EG;zyXA5N2z$ZzX04v$X^y3k9LfWTn>MY*1v44WTrt z58e>QN9S<_;{JGQz0~?OuZ)A6p)lY>Kn|?8#-~`HVKH9W#QR7Q z6n44m=j8D|b_K_7?eDJ=hP61FwH6K^I7|6XF!l33JTQdA1=^HHj#EY$310OX?>zWL zTd$j(-*9xuZ`d0&dG`O=>63SDKfgh~U`EB51R{z4D#PNU{FV$B0F8s0wQ7RAps_#| z3mZ~D4fBbv`j~kZmWWZaagiZ6XQSf8iJKj&;ZcSfLVNvQF!?6li;XW0>dMf!p+q zhD5P-{WU)bGHjYhZM|b{QMJY@z9dD)Qkv`;zU5k*$~b}q3aU=iw{5BU{%M{R!_#BK zR=AiSaB(WLu_hWphZ(ON^%CxILQSupM2!zlON%aw%}djrFE@^O2@e*oBz8RVPS2G? zA4YzeLTxnXK|%MVejPR{SBS0d-^Rn{Im)YJYGh|y7-DJeft)5<8Wl-2r79FSL%ni$# zexJ=e@`G0Kw6MO*MdukVaCc)icvVqlD4Dn^);|bn%+#& z;v`NzS?TawLkgl_Di#3-pC=0=t0mwdsBgSW*%AJi;Hj1O%21p?gx!UF=JG2ZvMi>W z&oKzs6Ff0OoT9H6rqxUAL*s$SB_oW$N1TYlqPEZI*vv{te?#a6{dOKqcud3z>_VxU zSg>W_DXV#=`9VN?$Fhp1!Qx<1rsR>FAa?b6&FyH zO_X*4aTyix&x{U=+n}N{MsY+%L52V4`@ZL#d#lq8%x~s-{?FgX89Paqgd9&tj^&W(l*{ZBbLm?{n)+i%V zY8)<{fTHsA2Vbs!jWEHr@t@m@(MofpQ4tB-Z94mQ`xiA|!B=X|(|%8R6mG(;2o9Sb z#d4Mom^D3ov_sw1LC*(}pOoCGLcL~B+aO^{iVDr#k*+{6Ag(lEQ%Ppkc6r~SmPyle zC1DeisZ6B_To#6^5+G|Ww3S&w!GCG9$C|m9#y7-Tz2MjiU$-`szJpu|0y!n z+t&1u1=Z2dhzqo@FtlJ{ZRd^GwiCgSUY;DxX-@|D=8hQ~W)KrEzv+W&n}c($hfzEP za&g;9$Y?5~SrLKoHo&m0H&3cpYK@Q*rU-}WnrZh%k3&SGTY`aljZ5aW%;Nwh1;2|s zjB)rCf(!$K7G2Vgfus3UQlh|e{s+p(Q+mUH6*aF~`J{JOE!)s?ieYTm?c>f$0Ch4;*=k*b!K+3jDQi&hFi>dOQdM>YxSKnGoB|y4 z@mylT_gcR|5$Y*}WVqh)A226SPpic_rDy~TYvsp3tAYe@M9dpkRmg9G-pqJtZ#~SU zTs)@qgYqvB_#t1KtwUJk*0f&GZG%QHzj0}BCbe;W@>LQO@}NA1Mnpew#2e@mQJ8&& z#M*HA{Ig;((i^=}ieT<9^->{YQZ()-G{GJ=lwz%>4bWRd=p4efO2jl+a;c+(k5a9{`jMH%Zm7mn z=x|CiLdn_d?oCrH-~DHc?ABPv-wNDp`4I}nZ@LWMKxh}?S(5XEpvG1Y@Tgb`45t7ULOdz2_tZ#H@>lv|b zZnQ4;9hxB=#m#T9mIr<%r*P(rY?5M=K9<6ZL%APuQ&uPm)I!*YL$U@Z6V31(3-*LBTR%-1A zcK_vr$B^YBbIn{e2p49PB`3AsMXfG<_z;x_Q#v!k)f~(bja02x`t$AHQHiG|<-G;G zn^oWglu$>J37xg$-eoy$eyx2MQw`YC2?qib%TR|4LXi~UhJmtNyHbyL$m@~NHngoG zOTC%=C>~-Kz-a7Mz=!J%$$Ft1>1g^uyAr1B4XH@he3yy@>0u)rivdlXweC07(2F2_ zWB8;IS!M!R2Ls)`VAtuc8f#DhS><$KFFWFAd(V8m9*av|xS_s~$bYr`gHM-bm<^hGYjtL~606!ylpv1_DVO@#3(%>n3MUu~atqalv4yy?;O1J1 zbYS-f!rrc23{AA9Fp%I4x5GVY>WiB~$-F3PhG;!`RXH-ge9cUIP7If%xlr~db%*Wa z-8Pd|L)rwhKsen>Ro=0Shm{Ctm7}hJ-=NW|!H4L!0L{ufiFBYXsBt{Y39_wd3u+@B zeI3Z>2p{OMa`<6(*GUnS@V=xpR;{gd_P@B($i2QA+1Jz8+P=Tu5!bVgjLaN8*SmD< z5@S78MiuB_d1F6A5jdHcM5t-vqLU<+OVJ~VL^dyavayEp@olJ!(9;!%CXa!cP-YvA z%uJ9rn=$YSE)Un`J^4jDi|6%ZLdFUxH(x4;Un{Qi_j{sfNjLZf3f%(+Zph32 z`)!W7a9p_uC*1Egc~*Y?rDm4f6_cC*mR|G66l6{sUua=tfsQYiDu9 z0bT3|jx*e?eJ3Mq#B_OZp%HuFsPF6LJxrSmrw;>whAaJ#*v@^!b^MUPg`^zNox4ET z*gMd#<*g!7j%-bo1PcborASoeBV(jw16Y8a9BIp=aQkm`*48{4Uz4@9Xamy@C9^T~ zyL&C$52-=KpSvD=#0~wduYs@(!Wsl!>&VXibcAtF4YIC3Ch}Oa0(55-uZ*zAIU23IuhR*B#}}wj3Tg7 z#FC;p2zQHcubQ))lE{@`!!@G48R5{CB`;hQOK=9M37YUdK|@Nlbddn`xZWB8Uiu0@ z0x_qoU(y{bCDDs?PkXJ9v(HN<^PsVER7}xS;L{tJ8hA}LpwF>DTZf|Ro5%-`|Jq!? zAny__e=L9@gNI~6bA~ij{0#Ih#9rFEb=#{5CSEn+moI;8&XFOQwdV^*vUp-F1_=w9GH#wIBgI^*#;i9@%BZdBTih3X(Xl{D3LA zWt!S9w}noAC?f?(wbs{IbK{q6>vjKnR^H{dAoM_4v@VwBk2P|9bB~%+$K9E;Eh~5a zd%)^ix$|Bh>|@H^?oS5(T}YhM)3$%#D=7k|B!+A!r4)<&d}&M)Aq>_}XE7xrH$rvh z;5sK4!JNw2y_SvPf;y#nhZRL~;uf5w!Rakti&gN3KT3O0R+wnT;EV{q;)muJuw>X) zC4)K@%9G~vvZ`o_{3r&Oj*l%6&ORVAZEH;$N1ZmC$u*Awh?+$_Y@^?>#G5ZzvA&6de^TH-%fuSImw5_vsbYEtN`V!V#BV z!cM|*6F6W6Z~iFCU3tdtTy?Z@%#&`+-dhFmGGnyC;a8q>k0F@vtsXWeVJ>u4ns`>e zXILHCr0lqM=pj9EEb?_?4-K&fHmFEbFuMHdG|(=bh?NvFzUE;yGBCQ&dodveJzEjoyk}L_gLSvRTdP zA1pmbZWIJ%DJJU10?bN>z0K{q<&?~;(`xCg3wE?1cX*LFxc#>HqEX0`mEL?(d?TC- zzJRh~Q%-Y?ivm@4wI)B!QEYn^y=yfEt^DY|L5UX_6E8aFz%ePt-q20<387<^Qi3wk z(Jn6Kb$elp5McS8h9hN)I`j1f4tFT0>l(!-bvPOa(u-=0d~D00v1O58yuKZnioCfyCjeqnLi)u~xPYqg0)^z`Oc~EsI zkfTjx#P`d;!E?6*$jQ-9XI>>dQIH)|(uXp}|{OoTBFV0JTD*7;KafNA4d`O)hQGv)57?AhziE%iD}J$cTf zya(oV@d-;wsekl(?#)AZt+q8HEZ(J9zHCp4g1R&uj1809e&MYVsX%>V(Bh4og+3m3 z!kRec?IKGUj80lrJ0gwTjF=wDz#Orae>%?<*_6JStk9V2f&D0ekf+Csyxp9|(8(d& z6w#@0BU$M$9iSbz;9l(LbX25%Ncey!HPBOm^defesm?wtU42zNPi{2fOO?aA{D*h! zz|%{gUXIr}wy=qNR2^?Rtn_B-H9;HBqe4l?qemKz!L5@x{4H|+YKz*Xh3UKpultR9 zhl^bB^NjgaL&#J$FlyC%di+ z`A^*;#%`C?>b{cbc27=SSd6!b440IuhO_eapRLZ3v2dOH6HSrR0}6P}+tCiBox2`k z`j~0vVKo_bq{+#9UAUCgz^+4M7nwL%Uu6Q&=S9w8UZhutk1X|$G%=Q0{@oZ6yk!2!d1E=@78i6!}h=Bbvmgtf@Rpm=rWPwVmH5X1?(G(OpnjEH!Q{07dv%Si5}D zfNvAWxB}UB-EfH1uD@U+oADX1JR*|e?RPN>qM}l`YdF~(&ktsd-!W;Tyd>ZeC{X&I zzunrMc`i`6e98IKKT{<`)lAF;*ASX>`G~_&U&xa?;##vx^5jJP#ihpR*lpaXa$Ok1 zc5jYwM0-fC=F%jN+|d>>JogK@Wu#ZYw99{dg@PBOdMMi_(V~S!S^1M+%VFWkqj87D z%r6B#y4%c?795X-P)kTznmqr$V8vEm`E~fH{O9-p*(z>|wiL4D%ZR~B%*S;oCgSo4 z9^iAA%^!7cAGHTAD&F*2>2FFC;8fjPK-{3Qw_#8xnBsB-72JtwT_}L;udad!>_^x> zTvqUORmzw33`$s?M+sTSM(+0LU2;GmuE;SW9+WyQrC_KwtBowIHU0Hl@ao+4>(=ye z<@M+KBvW);ye-H$(R&N_o(~-L|FwqvrhX2gB;oH0s1GZaLOS`HJC=&zY`45JD}C{M z)|bKygLGv-j|_L`W5#dLUt%#lrhFUFJ!H!XmSPeY2V04=?CQG$2YUJd(OBju(#vA*-PNOO zO~+rmSiSewd$FVGC~-ksDJxGtC`w=T6DBFc1i*mYu|hB%G-)(uK7reuW$M(w$paNl zrnuBCWF@-Zg}BZte!AiHfp*bGDw)UVEmPl6mDp?f&C z9@0?a&FT&s&BMtAYWMuoZ=;`C;#B&M>kQhN zqO3)C$O|}C3{6IscHs!+va|AA@0F^HfzYkkRM@SOSHbt~%Qhl7${&0MJ#I~Ca8GZ& zH~I!7)%BGt5m=Gt(kq;<+X~s`%YGg=`Et2n8eHW@GfJ&%@R%=hvG18KHhV+l(r|ra zyvA17Yzth?DJRXt)*7Z8UEt}J#mClYJ*#kxP4zs;?xT~e2^8%o#y*@p>haf+-yJ+r zJ9bGH#Xzlc?u?*82v2}`R0id>QmT=AkXn-j9?kzP3YBC=aW^ll?#3N1Qt4t={?0`r zz4hV&0kO&VT}B%gv3zYsH~#m3(J4|wryj17RHg74%qo&fxEG{`#WxBl<~w|ejj&HU zbSfIxETK5W!YoC_ydEarFYoACxsrJ@{Mau0EK7^f+)8^uX5}h>hAe>ijOHqgv8F8$ zpGo((NZC%D{7=6$g8k-UjR+uq(znLjSfjSjp9ljA?jcpELPo}OB4qFb^$fOqFuehN zNkR?1N7`c(9%X6dq?4c(jkisV#M{(DJ&oqn2BmE?pKWeAD-4cMFWAs>$-XyeM9Asq zo96_0F-tFp*QS=ZNW_q1s8U_MEwN4Ax{;r%8$!s(;&D=qK@aK&EaqlvazQT*0uiY$ zi3mECeslt?G%G#uHM4SXN3b#kLG6kME|px)XMkAZ)bONMdf;~Ppa@a4TH$~hf6bV} z;G?&{L#>!L!?q>MMfHm)q!^S?+D5k73hnAYg&^C45M+DViwm+nQGLN6TYhN~$HQFV z9q!8`W~!?i_r?mi9xkrN0Hplh3V7}~;QhGF5h9K2+DiZ}x)&zKGw-JU#dSD5M_rb% zpX+MES_HjMsf~KJ6gW9mR>Wiw5I=_X>9(o-?a*ARRXM!591{{he;`1CKs}_LDy!z{ zCGKD4-lQT?oLkhr%$j!3chPH5D?R%QAzyI%l3R21m{FJquUV%N?x2G8DsuB06@j^n z7J0H9jnI6+_?(B^go)V4la5+>V_?~rVF|_)YjV0bN?|C6S74dxZNFrhMuiAsksw3@k>K6qNGWM)X zD*7R4*GEQjXm+V`BZa}RmLQC1Hz^Phj$U+Rc%;`cLg8NP-=jlN?=gR?>OG2iAmU88 z&zE$f{q-8tG+R}HyP_X6jK0h!&AZDj+F1StHjz|O!gC(A~<0Ey*No z($XC`ri>j}!0+D^Lc>|*$~(wcCpAS{C>RRtDEJtpPH$mt@}9Gti#sBRrP!mP=Cw2U zOBIM=<}z_}c&yMB6AMqOu5o0465{y?#=I8(ZcTwH2Lmf;5}n8MD|;NELRgtUg@gk9 z4=?@6^3biDeQtuZ~m$3wDm$v$=0nvxct8WX6v}vJa;ux60=_kLeHxyuinh;%aWUsTAtaS6| zCBN+KDN0`m;m9{E#_5|1Ug8uEtCep40M=C4Vxm0j{ut_4`$_Ch?7(a3f@tR=*X0b| z_b#=<&5o7a`x@HhwNE4erL%4+74oPe()2q1%zwc!asLOuu!pTASmA*D8HUhknK8a$ z4zGU`#0D^YKp>6?cei|7>jiEyUd>G}cS{K5GmcvTrT z=xS~$vRJIR)ZJ0G22QJRjm&m=!~=l2i>xyFenVbJ16>+4`s4SON}(ae1x_BWDP0iy z(d73UK0v0&u5H|ASk>l=XH8H1XEFMV@4@z}bL!R@P5IGfbZoMmEIYj;b3CS{B{Y5G zIdyPzYm*@8oc^WcfpQe@!zSOUfN1&0K*Jh)8*ZR#S>m{;#^iNY{w0Bbb*FbZ;-nU0 z_p)zo3sDkS@=?6{B=H))jn|)*&--hjmI87_6tHidNo_xE&HLZ^3UQlyM@>JfCel%S z3|h}BOCF9XF-7aqn3loK{dvYy;6Asi2BTjs;$v!q<@xo~Yh?48^x}Z`)#(zWEHd>i zps1OOh*s={($E&Wa${2}fyEtwtFex^gE%n#`SfJS@CbJrJUUtF@Aos-m7-`;W5itH zUrHTbg+5N;|`z^=fM2k+DMDerX}g z$!?!7=nca!s(U{6rj~e7FpBM1L-HCzSWWm zoC5{7;M^gCPsj`c0WRq(BV=k#bFU2a*7Sw%5bSE2Hzh=RZEHmuLuN3Jgq;N}3cCsK zBKF)W${PorCS8=Jnxx8}2jY=Vt;oUxVL5=0=jsC~FN4je_GEm{KSM_;xotqUPu-_0 zFc9+7UZ+xUR<>(cQccb0zD~Cq>ySk=pu~nl%<&8sK{n<@4kRlv2V#@OKy}#M*YUso zo7Fl$vJVA@xM@QG;9-w?hN~*TVKvfF(F{nYZ0%9g9YW?NMjMr)!%Zn7+BM^W&FkO4 zq?7Vn>I>SscWqN#H>8jE)bAz-PJP!bb+4cstq`bwJ2l1FlQX1RZ;n5%j;KR~Y#;8k zcV_GW!;4fZ>HW~e#?BS`kW^K(_=0H9^Y%efWub8xWtF-&88)Z*J1*6aG_wa172x^M z=;x=3{U}hL5S4s?rj2Cfo!_MF0<*x%yIw(Cf@J12v~1uRT~lA`dk^>VmxUGOj{oNL z;z?RD>dJq5G>^fk(ET*XYFFg|x= z)^O!ba}8afT5=Vzn_y__8v`QD8UhZSga$TwBC+`bl>K&C8#fRyWQ1OU^M5VH%G2m9 znpm*h=gxp%hRhyGRld)gY=%h8M`uacp!|wI;L8=v989i(s^z$&c+>sQ#XVbex==?o z(Aq_@CS_D-e}fWTX~$`gu|6=*%?qn141@6Ac4EgS#f$VxZpR#kY(z9MCIo$+Jzd&8 zpQEs6&f6zj$(+G~ZQ61Gl}4%`jGk8R6e6-CCTNO-viFUy>Z$q^k*%a2D}La70#4js zNF(CQtn}$7KNBap?=xZ{)+$Oruy~^~EMTJ+!y`Xc{e_?+dAh{|YtzT=6L!)X<<6)99v`9dXrY$F@6X;}9d&9JQX)Hn8cO0Q#fC4cpqG2$Bn1_l3%_eFF5+cPxXsxUGmiOBb%uU&4z0rnJH~!Ajy`TCDk^ms6$c)?#_byA zvLuJ%jxRU$_@wU6f$*;8W9KjhR+%oF>c{#_`@G6($Di}~wEDpZ+Yb&tIG%Z|=Xzh% zE*OOT|J??Tt!l>kvDSmf4=rEd64VgTGq_~)yC_1gI^%h_9T-%7RsL%OoWNZCsCQcK z`^`U3FM0vsh$SkV@M7K)eW&6)S!KmF;#%r`gFCB(aQuy3s5i7$tJe6=3VY!R)RgkC zphKsKzfq9%Z@J)%=uS1p$$~J(ta9+amhu`xb1`dJ*0hCo;GM=I6=-ums*Vwtl3tya z-v3v4iH}boQK<1V=Zj$TUdUc+rpRd<-A-&7Js|dKPrKb1*Q9mic{`heQYgTP?J%lz zWrM+>&b_imJ;=GYRcWqGL5ZT*QSk_hTwD*G1IB385_%)sfK$aSu@CA~tppCeVxLR% zX30l**$sNHUt*fq7|wvr0Ehi*CJU`$E_$fPYyY9S^2dC zh*zMGe8Fdrax=4#$`q9g<%b;mcR?wsCUPLf`DF2IYL#8hnl`>n`l|Z61t%m0s)KQW zH<>w_wxCmkvn)a_newd*uZ_zIK4hW&lmjfH7s`(9^+U1yQseq+VgHvp4j}8ywWiPyT)Rpk)d7<^7oLp!I)m@Yzu@ zs?f(RUu+%ga60uLPnrMp2lt;f-Y7C<4R8Xs5kX?tg~E+K zvp3MiqBOO@@(Vz4%P$>u5P@s^DZL}K%Fp{X#Pzx2>@ zra-y*_>O@^o-i6d&=ZU5oi5+MIP>DxIsWI{F4%w=(2*vd_rrI!cKfFXKJ(>iL16M{ zbC~4Odaf_YKkJki+L5N|qhj$E%KnyGx&AZenrX9Kc=qrEAc&>AtuD*!ITrJLx1lXoFVN1ryW zv4U?%dzg6mW4;H}V$uynx>XR<(w?0HO+Vdelx3UV?UcCby*5S)&Mkz971(!H+_~4K z@&&6;_Ffxlb5h$$sH`IsZRyVJ|TyyE&;=XX%(mG6HJ^D&U$r^@ZVip`B^5se986SZ%j& zk5pHDhk+KTxi(T?b=I_c_-*~dLv4{o0Fuhe!V`yHq!m#p-*N4@OD>MHd30MB@!xP^ z#f{DUzuXx6dBOKLY}lT@q-9S-AY*C;Ow#85yI2uUp`~&tO&=3V6F&OLtH*@Wiv{z9 z=e8{xa{)U|U6^!{f!DBa%$?2rzuQ@W^Ydk%~GPQcwluFH8XDH03|-S~_ODhcD*JtIEA2bJ-IY7|QB##j|;H2nP(y!3HK`uNC zM^mQgf+cttv_H?aL+!Ca>!*riv`~J6mx& zX@=M_CW-9IZA)2bH}3hv`$8f@xCK!Qo)nkz z;Ys@HDQob611#lo`PHj~6UFqC0DajC1<=Qo$xio{3GUW8jp$|qGB?6hy3Z7T81<$7 zaVUKKGS64nh@$eUZ?yJkDA%mIdN3{fjJ$X=$jk1e_iWPC@`b{_H5sz>`x6kzirAPJ zoSb1&4I&!I$L=!^*jj_FGWhJqDD zGUULJw2QD7VGnc%I{v)%Vg)^v=qaTnq(aG>7}IV5K<5$`RnJhGp^*)$C&QA7kZP5q zt_xF~CufH&$y8FECQH_dpS^2mMFZ#?@+*|AwHbI@3%3D~BFw#|j$^HJ9f6g74mDfFN5i-RV zDX&#Mg(F#H61B?f-eYIOP#KCHVuR(GRgPThN^`ZNz8a>)5SrdD)d+=-YZe)o@3)_< z(#h{Q<#e%x9Dp(gv+{2a3SozS%isYqP|gYA^r_djSim?qCx!!TUwvlErcf+ieA0B; zI21*U#=6UcZsu6Te~|j1tZpBq;kp^o>}CHVc}C%K9Bp3ubA8I=-O27_{EuJg<@)-HvuXnq7{%C(&`QxeT4Y>|^?LAgr3stigP zIxvqQj}Yh0(vB;a{az+nryBWL3fsDXvG`=I7u|4q$y5^tS^0HmZ(rtTvRh^@aUL-Y zm3}f@y9Q~JCew|V=18i-A98b_%q#Q+ZF%A~CFt%G%~^pjpWlG^fF$HHh3J?Yz+$O_ zao8i~m+mm%l?A`GF70~)b`}#8K#|aX(A*9og=-~^p2|<$YWNcvZLR#o#t~2dAdpq~ z4R#Ox_f^6HwZ+KaL6Zc+e8#9nR>7{RmV4^8y*%K-8fQd%@5!)$I%S%3Yv7DXwb zk`M)^S`~?$QFrN1@+kByGuhE4iYE>ny){w7;|xk7#6`Ur<0dkdkE%Css!y+Po>s>+ z*i@g%U&!w$xXtP!Vy_gClfGjn``Bs$*j?ukqF{*;gLt;29 zzwcp#bMti4DTm9S-T=Qww~E1X)MOi@NF0%DH~Qrjf&Srd}G?;t6!6;uBf<&waKRCETkc z7XI_?r*@K)X0-zyE!$7+3j5Zlhjz>v>S#ICKJ@$-+vAwU=%Z$&9qDdAS}@}E!?!pL z%xzQ}a*2s9Le-EY#gILGIwW5)>Y74WGVLiG^~+lBD8bpY@}7T@2r-c8$FOUiL98GQ z#%1;#8D?aN#kGC5s;$H;v(oA}<2*txdncI!3CW3b+1Vn{bp#gsDQS^jfdlWS--;Ev zu*@)i7o3UkRgdl2_ z(UGfZHww_J&Iz#D6k)RDsu~>jbbqLHT?-7wd-4`~G0V9!{4u%TU>!KK3B6PA&x*J+ z6~O{=jW?}tHI)Tg-RU!(i$e1*G?%!$uoyh}xc#i$(IZN7kAu|m@VWD-0Sa*9+Rh{j z^0nwLt_50m!{d&3b%rwexK1f=*`ZDWt8{OWKIVk;*Tx+m*J-24eXY01TFTXQ* zw&z=8DEdh)?Ny&A8by1nWaWzcM5dT6SibvnW4KSbO->W?q2aCVs^#=7P2q2f>?Jg( zeeG1AXPHLROWFZ?u=gu}Z5XMIDg*P9b6OpvEL17(Ya1g-!0*hQV&j9#TrkvRNR>6W zQ^*o2)!yIOoX|cJqea@_4ya8zo1bB7O zKSCe|`9X4KkHQWK7I>SeL8OnCXu(>^>B$F zd=B(9t`nFNtD-WX>dSm=@WssuzPP<#*b&DQrGxg~!4oGt^dFaMybT5w(%fWbR{r-d zId^1st*Hx;QUZ`+S`;OaWYfcB599Xs)DQ{ST-#Do!_4b}1=wkY#b~2J!zOKq8a*jC zm5vkSHN_C(GpmTUj?d5?aMV5kqS<>Mg6Bnf5=YQz4IM}oqG`WMZ1|}*$dgL!Fn(te zwNnA=mwaG~EoV#sCW*&7#uh*x8sQD|na#1N4q2Iup$^jWsL%5gvw@WNC1ZyRk9jjN z!mP6UwvgkMuGiXpdOe^+bkw#uAuWSGa6QD_-j^v>RQh}D?lkK_H?b#_W(-ga$>Lw zc-_&Ydtbj&wP5kM1A|IWOWNJ(djs#RviBF=cTC$5K-!7_TXbRqfiBqM6Q;H5x1PiR zOOX#>w<}FVY}d2bTsAu$sWl#V$aFuAQ0ID`m*$LABMh|!*Mn`nfLamSIgwk^V_oaP zDo?Rh#WfTc+#7|$Psu?iT$4iajC{&^*Bz8FJ1|H+DuiR;bF7oW#1L7at$pDP1f$y? zL*$G~Sf!Rs>e2{6Xd1Q2eMxm^voo!=a^fdI`{h42>@-pn{!(HHDvCGhoFRS(ZLRn+ z2O@qKG=X+HJQ7n3MIe1^s_<=-)DibK$7<<>ZMhc7_|c=;d*tv%u4dYX>a3$!P9PC& zMR@6GmAlruGGfCtR&CjS^3hvsO_Qr5XQ2r^cZ*u|x|^jRKM!4WUUkbNrbN}P8JaW_ z({YOZT;!Xh2mpc@;65PB{`TR@`p1lEYw#Zi|95LV(_7{1b>?@VoVlN@P4=NVU=hDg z^?zpNKWs>kyA2>Lv*sXu>jz;5AV^Bmg1t3gEZxh~gKP#wxCAsD5=Bva7~6IiQjA^8x#1p=>OIh4QBL)S~PN6kT#+k3fRULNz}zzY9I%-o@tET~)T4cfg^`rS7X(6sRhFP;wvwtA~Z{wK^T58{rC8a?5F%#RF zH}1KteALH_rPj*Ng?pN@o019-r=x1E^8Ry|DnUKUnt%iDkSpJIh82fU_Ji&L+c3|E zjp5ObsQ^>4zU9Hq1Qp05mOAJSRbnBF!#gW~?~AIcA0&G@`So18h~}54e6A{pu1A&fYy={h26o+QG6>r(2~Yn)9VN$R?)MRGw`! zFta<;!(jQFK28Q8${t>=C`s`VhzC>Hqb!oRUgX@zyNO{&S*!ibl{v{^!ZOzDLlonE z2?wnQ|E4O0=~e=6l=^J!gh*5YFJAQ}A>trP4SvzFZh_6|r{;DE38{?U<lUfRD;5hPiC|Cd?)EXez%Jx03_S)P`73%Y+{d@{>E}wKnhxLoJ$CW+(U3Ds|qQ z-R&zqQiFVOapZn042;e76Nm{6SpzvVkGD`{r#J#C5aR~IJ-KaVOGczc##L*E)rbW6 zh|b79u9&K;5|S64&6F{vc{Dl+muQPs2RaBD-u14uBRK-fKmDGRpO6qIqyTf!t_sfqxOMd zmh@sumnN!oS38I{xx$C-joXhx1TkQJT4ZpP?$B;2t|=$m%QwT5a$$gvRNgG{sfL(k ztup;TqQfrwmuux$+{d$t=Hs&B!8l*t(@q7Lz-F!hxq7OW$gaL=c^`ekfThdsurOe) zv~8hZpUDf{jvUJ^mFVHs{vsF~B!zgS!F)O468BlLO2$W zE|s`=wLX1bgrp~=nAo!JMlXG4?o6}n(%qH5dPBIl`iOre_l{KM^o9oD#`Vx2v(isK zXL43#SkP(pIgCIk1{Mj0wx3MmA`v$xT;11&(Y9X2&{KZ}^F_k#uuWZBu!uZ`QZ|r? z0$Ri6WGjVJ=C7fs@MJe~@Mq*G1*Ed_DVqueDMv^sZ0Kfpwi->AEb`6^>_BEak_d67 zGp;GftpUHtz|dZ8Z0 z89;(TeT|GGJ)|n)R(puQ5(j9_O27JE7(l*bD^JK(2@(L4P8i^eFsZX!Z01h(*v(7*4(&RKJj%Xep8v*ui+1c^N| znvr%s0|>F#;wQT%SMo@{AIa!<;-meh(!=fME3c`;p#f>TazcoUWSX&tBnm4RMD`ZLs^t0_Z6!=l|rs?d|P8C;-`bL!ZS@}noOP*r!+mK%d$8@<=jwnO&} zSs0_cC$+SM2-7|&V$m1Nc^Gg1ebzNM(ZH* z_&@=<;!)!(?FWgaG!SfaYr9V}#peWz7?K4=?hqX`LY_*k^0`N3o~qI~X=fE39 z_nSQ++a;=}QgJg>tJ97gD<_+%y~_nJG%cmbgp}L<_WDSewgKG>O8@BhAN0Vje6IH! zk?yzydtiqh_z=$F^181#rX2zgHEvKc#*k<&B%+4i_KNdzNkd+Q9y*K%xHl+9q$LJO zHxQKo&R21_1t(7W%(Wd(JkEI!JNn1P^Ns~`dt`?bljPUmF=#PQY{tPW$?`%ou<4H= zkec13(5mq>m!croAqv=ABUE`5V&@1j(54huw%m(~tVE#K)OLEuXHP+

3H}WnzR% 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 VJ0*EgpUwT#r0D3~ndjWE{{_CL%K88R literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample3.bz2 b/Utilities/cmbzip2/sample3.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..1ebcc2aed223005f5d73a16e840878888073a2cd GIT binary patch literal 238 zcmVGUXb&m7Q)GuvY4W7DBi0bybO}v|xtYG9VxzAgamdNhLt9 z4gdr|5FoLhfC>nUzKr1g1`VTLk&Q7R%dZIV`lF`Dle(FJl_`Yl^tWMb=tO8UNUxFF oTx}0YOtffeX~>mAuu}6J02C1xSXSkxmpOF0)MXKw5ch+5i9m literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample3.rb2 b/Utilities/cmbzip2/sample3.rb2 new file mode 100644 index 0000000000000000000000000000000000000000..1c9b08c476db8fa859913a11a35fc822210de6ab GIT binary patch literal 237 zcmVMrDH9a7qC!~66GBj!GXd;m`o>K^700b&1A}!{hx>H+~L=hHLHP+b9-#wFHty(~o z7e1a9RAvm_@i;W3;6yWABwd5%;=U0wH+J$P92@gNib^y2vZ~anddUmw=r>i)d;QHA zLo%QW2#XqQ0HBD!wr2;}GHV_)i#357c5}2nG&<;#cVs{o#$kEHHHf}cB@|?}w#E-` nSl?!`oiT2# 2GB) in a reasonable amount of time. + I suggest you use the undocumented --exponential option to + bzip2 when compressing the resulting file; this saves a bit of + time. Note: *don't* bother with --exponential when compressing + Real Files; it'll just waste a lot of CPU time :-) + (but is otherwise harmless). +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#define _FILE_OFFSET_BITS 64 + +#include +#include + +/* The number of megabytes of junk to spew out (roughly) */ +#define MEGABYTES 5000 + +#define N_BUF 1000000 +char buf[N_BUF]; + +int main ( int argc, char** argv ) +{ + int ii, kk, p; + srandom(1); + setbuffer ( stdout, buf, N_BUF ); + for (kk = 0; kk < MEGABYTES * 515; kk+=3) { + p = 25+random()%50; + for (ii = 0; ii < p; ii++) + printf ( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ); + for (ii = 0; ii < p-1; ii++) + printf ( "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" ); + for (ii = 0; ii < p+1; ii++) + printf ( "ccccccccccccccccccccccccccccccccccccc" ); + } + fflush(stdout); + return 0; +} diff --git a/Utilities/cmbzip2/unzcrash.c b/Utilities/cmbzip2/unzcrash.c new file mode 100644 index 000000000..a1b75463a --- /dev/null +++ b/Utilities/cmbzip2/unzcrash.c @@ -0,0 +1,141 @@ + +/* A test program written to test robustness to decompression of + corrupted data. Usage is + unzcrash filename + and the program will read the specified file, compress it (in memory), + and then repeatedly decompress it, each time with a different bit of + the compressed data inverted, so as to test all possible one-bit errors. + This should not cause any invalid memory accesses. If it does, + I want to know about it! + + PS. As you can see from the above description, the process is + incredibly slow. A file of size eg 5KB will cause it to run for + many hours. +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include +#include +#include "bzlib.h" + +#define M_BLOCK 1000000 + +typedef unsigned char uchar; + +#define M_BLOCK_OUT (M_BLOCK + 1000000) +uchar inbuf[M_BLOCK]; +uchar outbuf[M_BLOCK_OUT]; +uchar zbuf[M_BLOCK + 600 + (M_BLOCK / 100)]; + +int nIn, nOut, nZ; + +static char *bzerrorstrings[] = { + "OK" + ,"SEQUENCE_ERROR" + ,"PARAM_ERROR" + ,"MEM_ERROR" + ,"DATA_ERROR" + ,"DATA_ERROR_MAGIC" + ,"IO_ERROR" + ,"UNEXPECTED_EOF" + ,"OUTBUFF_FULL" + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ +}; + +void flip_bit ( int bit ) +{ + int byteno = bit / 8; + int bitno = bit % 8; + uchar mask = 1 << bitno; + //fprintf ( stderr, "(byte %d bit %d mask %d)", + // byteno, bitno, (int)mask ); + zbuf[byteno] ^= mask; +} + +int main ( int argc, char** argv ) +{ + FILE* f; + int r; + int bit; + int i; + + if (argc != 2) { + fprintf ( stderr, "usage: unzcrash filename\n" ); + return 1; + } + + f = fopen ( argv[1], "r" ); + if (!f) { + fprintf ( stderr, "unzcrash: can't open %s\n", argv[1] ); + return 1; + } + + nIn = fread ( inbuf, 1, M_BLOCK, f ); + fprintf ( stderr, "%d bytes read\n", nIn ); + + nZ = M_BLOCK; + r = BZ2_bzBuffToBuffCompress ( + zbuf, &nZ, inbuf, nIn, 9, 0, 30 ); + + assert (r == BZ_OK); + fprintf ( stderr, "%d after compression\n", nZ ); + + for (bit = 0; bit < nZ*8; bit++) { + fprintf ( stderr, "bit %d ", bit ); + flip_bit ( bit ); + nOut = M_BLOCK_OUT; + r = BZ2_bzBuffToBuffDecompress ( + outbuf, &nOut, zbuf, nZ, 0, 0 ); + fprintf ( stderr, " %d %s ", r, bzerrorstrings[-r] ); + + if (r != BZ_OK) { + fprintf ( stderr, "\n" ); + } else { + if (nOut != nIn) { + fprintf(stderr, "nIn/nOut mismatch %d %d\n", nIn, nOut ); + return 1; + } else { + for (i = 0; i < nOut; i++) + if (inbuf[i] != outbuf[i]) { + fprintf(stderr, "mismatch at %d\n", i ); + return 1; + } + if (i == nOut) fprintf(stderr, "really ok!\n" ); + } + } + + flip_bit ( bit ); + } + +#if 0 + assert (nOut == nIn); + for (i = 0; i < nOut; i++) { + if (inbuf[i] != outbuf[i]) { + fprintf ( stderr, "difference at %d !\n", i ); + return 1; + } + } +#endif + + fprintf ( stderr, "all ok\n" ); + return 0; +} diff --git a/Utilities/cmbzip2/words0 b/Utilities/cmbzip2/words0 new file mode 100644 index 000000000..fbf442ad6 --- /dev/null +++ b/Utilities/cmbzip2/words0 @@ -0,0 +1,9 @@ + +If compilation produces errors, or a large number of warnings, +please read README.COMPILATION.PROBLEMS -- you might be able to +adjust the flags in this Makefile to improve matters. + +Also in README.COMPILATION.PROBLEMS are some hints that may help +if your build produces an executable which is unable to correctly +handle so-called 'large files' -- files of size 2GB or more. + diff --git a/Utilities/cmbzip2/words1 b/Utilities/cmbzip2/words1 new file mode 100644 index 000000000..2e83de9f0 --- /dev/null +++ b/Utilities/cmbzip2/words1 @@ -0,0 +1,4 @@ + +Doing 6 tests (3 compress, 3 uncompress) ... +If there's a problem, things might stop at this point. + diff --git a/Utilities/cmbzip2/words2 b/Utilities/cmbzip2/words2 new file mode 100644 index 000000000..caddcf422 --- /dev/null +++ b/Utilities/cmbzip2/words2 @@ -0,0 +1,5 @@ + +Checking test results. If any of the four "cmp"s which follow +report any differences, something is wrong. If you can't easily +figure out what, please let me know (jseward@bzip.org). + diff --git a/Utilities/cmbzip2/words3 b/Utilities/cmbzip2/words3 new file mode 100644 index 000000000..697266990 --- /dev/null +++ b/Utilities/cmbzip2/words3 @@ -0,0 +1,30 @@ + +If you got this far and the 'cmp's didn't complain, it looks +like you're in business. + +To install in /usr/local/bin, /usr/local/lib, /usr/local/man and +/usr/local/include, type + + make install + +To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type + + make install PREFIX=/xxx/yyy + +If you are (justifiably) paranoid and want to see what 'make install' +is going to do, you can first do + + make -n install or + make -n install PREFIX=/xxx/yyy respectively. + +The -n instructs make to show the commands it would execute, but +not actually execute them. + +Instructions for use are in the preformatted manual page, in the file +bzip2.txt. For more detailed documentation, read the full manual. +It is available in Postscript form (manual.ps), PDF form (manual.pdf), +and HTML form (manual.html). + +You can also do "bzip2 --help" to see some helpful information. +"bzip2 -L" displays the software license. + diff --git a/Utilities/cmbzip2/xmlproc.sh b/Utilities/cmbzip2/xmlproc.sh new file mode 100755 index 000000000..53841773d --- /dev/null +++ b/Utilities/cmbzip2/xmlproc.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# see the README file for usage etc. +# +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.5 of 10 December 2007 +# Copyright (C) 1996-2007 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ---------------------------------------------------------------- + + +usage() { + echo ''; + echo 'Usage: xmlproc.sh -[option] '; + echo 'Specify a target from:'; + echo '-v verify xml file conforms to dtd'; + echo '-html output in html format (single file)'; + echo '-ps output in postscript format'; + echo '-pdf output in pdf format'; + exit; +} + +if test $# -ne 2; then + usage +fi +# assign the variable for the output type +action=$1; shift +# assign the output filename +xmlfile=$1; shift +# and check user input it correct +if !(test -f $xmlfile); then + echo "No such file: $xmlfile"; + exit; +fi +# some other stuff we will use +OUT=output +xsl_fo=bz-fo.xsl +xsl_html=bz-html.xsl + +basename=$xmlfile +basename=${basename//'.xml'/''} + +fofile="${basename}.fo" +htmlfile="${basename}.html" +pdffile="${basename}.pdf" +psfile="${basename}.ps" +xmlfmtfile="${basename}.fmt" + +# first process the xmlfile with CDATA tags +./format.pl $xmlfile $xmlfmtfile +# so the shell knows where the catalogs live +export XML_CATALOG_FILES=/etc/xml/catalog + +# post-processing tidy up +cleanup() { + echo "Cleaning up: $@" + while [ $# != 0 ] + do + arg=$1; shift; + echo " deleting $arg"; + rm $arg + done +} + +case $action in + -v) + flags='--noout --xinclude --noblanks --postvalid' + dtd='--dtdvalid http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd' + xmllint $flags $dtd $xmlfmtfile 2> $OUT + egrep 'error' $OUT + rm $OUT + ;; + + -html) + echo "Creating $htmlfile ..." + xsltproc --nonet --xinclude -o $htmlfile $xsl_html $xmlfmtfile + cleanup $xmlfmtfile + ;; + + -pdf) + echo "Creating $pdffile ..." + xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile + pdfxmltex $fofile >$OUT $OUT $OUT $OUT $OUT $OUT $OUT $OUT $OUT + # + # If compiling error occured in zconf.h, You may need patch to zconf.h. + #--- zconf.h.orig 2005-07-21 00:40:26.000000000 + #+++ zconf.h 2009-01-19 11:39:10.093750000 + #@@ -286,7 +286,7 @@ + # + # #if 1 /* HAVE_UNISTD_H -- this line is updated by ./configure */ + # # include /* for off_t */ + #-# include /* for SEEK_* and off_t */ + #+# include /* for SEEK_* and off_t */ + # # ifdef VMS + # # include /* for off_t */ + # # endif +ENDIF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}") + +SET(ADDITIONAL_LIBS "") + +# +# Find ZLIB +# +FIND_PACKAGE(ZLIB) +IF(ZLIB_FOUND) + SET(HAVE_LIBZ 1) + SET(HAVE_ZLIB_H 1) + INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR}) + LIST(APPEND ADDITIONAL_LIBS ${ZLIB_LIBRARIES}) +ENDIF(ZLIB_FOUND) +MARK_AS_ADVANCED(CLEAR ZLIB_INCLUDE_DIR) +MARK_AS_ADVANCED(CLEAR ZLIB_LIBRARY) +# +# Find BZip2 +# +FIND_PACKAGE(BZip2) +IF(BZIP2_FOUND) + SET(HAVE_LIBBZ2 1) + SET(HAVE_BZLIB_H 1) + INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR}) + # if building inside cmake do not add this lib + # as it will not exist at try compile time + IF(NOT BUILD_ARCHIVE_WITHIN_CMAKE) + LIST(APPEND ADDITIONAL_LIBS ${BZIP2_LIBRARIES}) + ENDIF() +ENDIF(BZIP2_FOUND) +MARK_AS_ADVANCED(CLEAR BZIP2_INCLUDE_DIR) +MARK_AS_ADVANCED(CLEAR BZIP2_LIBRARIES) +# +# Find LZMA +# +FIND_PACKAGE(LZMA) +IF(LZMA_FOUND) + SET(HAVE_LIBLZMA 1) + SET(HAVE_LZMA_H 1) + INCLUDE_DIRECTORIES(${LZMA_INCLUDE_DIR}) + LIST(APPEND ADDITIONAL_LIBS ${LZMA_LIBRARIES}) + MARK_AS_ADVANCED(CLEAR LZMA_INCLUDE_DIR) + MARK_AS_ADVANCED(CLEAR LZMA_LIBRARY) +ELSEIF(LZMADEC_FOUND) + SET(HAVE_LIBLZMADEC 1) + SET(HAVE_LZMADEC_H 1) + INCLUDE_DIRECTORIES(${LZMADEC_INCLUDE_DIR}) + LIST(APPEND ADDITIONAL_LIBS ${LZMADEC_LIBRARIES}) + MARK_AS_ADVANCED(CLEAR LZMADEC_INCLUDE_DIR) + MARK_AS_ADVANCED(CLEAR LZMADEC_LIBRARY) +ELSE(LZMA_FOUND) + MARK_AS_ADVANCED(CLEAR LZMA_INCLUDE_DIR) + MARK_AS_ADVANCED(CLEAR LZMA_LIBRARY) +ENDIF(LZMA_FOUND) + +# +# Check headers +# +CHECK_HEADER_STDC() +CHECK_HEADER_DIRENT() + +SET(INCLUDES "") +MACRO (LA_CHECK_INCLUDE_FILE header var) + CHECK_INCLUDE_FILES("${INCLUDES};${header}" ${var}) + IF (${var}) + SET(INCLUDES ${INCLUDES} ${header}) + ENDIF (${var}) +ENDMACRO (LA_CHECK_INCLUDE_FILE) + +# Few headers that must precede other headers +# Must precede sys/extattr.h on FreeBSD +LA_CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H) + +# Alphabetize the rest unless there's a compelling reason +LA_CHECK_INCLUDE_FILE("acl/libacl.h" HAVE_ACL_LIBACL_H) +LA_CHECK_INCLUDE_FILE("attr/xattr.h" HAVE_ATTR_XATTR_H) +LA_CHECK_INCLUDE_FILE("ctype.h" HAVE_CTYPE_H) +LA_CHECK_INCLUDE_FILE("direct.h" HAVE_DIRECT_H) +LA_CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H) +LA_CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H) +LA_CHECK_INCLUDE_FILE("ext2fs/ext2_fs.h" HAVE_EXT2FS_EXT2_FS_H) +LA_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H) +LA_CHECK_INCLUDE_FILE("grp.h" HAVE_GRP_H) +LA_CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H) +LA_CHECK_INCLUDE_FILE("io.h" HAVE_IO_H) +LA_CHECK_INCLUDE_FILE("langinfo.h" HAVE_LANGINFO_H) +LA_CHECK_INCLUDE_FILE("limits.h" HAVE_LIMITS_H) +LA_CHECK_INCLUDE_FILE("linux/fs.h" HAVE_LINUX_FS_H) +LA_CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H) +LA_CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H) +LA_CHECK_INCLUDE_FILE("paths.h" HAVE_PATHS_H) +LA_CHECK_INCLUDE_FILE("poll.h" HAVE_POLL_H) +LA_CHECK_INCLUDE_FILE("process.h" HAVE_PROCESS_H) +LA_CHECK_INCLUDE_FILE("pwd.h" HAVE_PWD_H) +LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H) +LA_CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H) +LA_CHECK_INCLUDE_FILE("stdarg.h" HAVE_STDARG_H) +LA_CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H) +LA_CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H) +LA_CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H) +LA_CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H) +LA_CHECK_INCLUDE_FILE("sys/acl.h" HAVE_SYS_ACL_H) +LA_CHECK_INCLUDE_FILE("sys/extattr.h" HAVE_SYS_EXTATTR_H) +LA_CHECK_INCLUDE_FILE("sys/ioctl.h" HAVE_SYS_IOCTL_H) +LA_CHECK_INCLUDE_FILE("sys/mkdev.h" HAVE_SYS_MKDEV_H) +LA_CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H) +LA_CHECK_INCLUDE_FILE("sys/poll.h" HAVE_SYS_POLL_H) +LA_CHECK_INCLUDE_FILE("sys/select.h" HAVE_SYS_SELECT_H) +LA_CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H) +LA_CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H) +LA_CHECK_INCLUDE_FILE("sys/utime.h" HAVE_SYS_UTIME_H) +LA_CHECK_INCLUDE_FILE("sys/wait.h" HAVE_SYS_WAIT_H) +LA_CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H) +LA_CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H) +LA_CHECK_INCLUDE_FILE("utime.h" HAVE_UTIME_H) +LA_CHECK_INCLUDE_FILE("wchar.h" HAVE_WCHAR_H) +LA_CHECK_INCLUDE_FILE("wctype.h" HAVE_WCTYPE_H) +LA_CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H) + + +# +# Some headers require extra includes when they're available. +# + +# +# Find OpenSSL +# +FIND_PACKAGE(OpenSSL) +IF(OPENSSL_FOUND) + INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR}) + LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES}) +ENDIF(OPENSSL_FOUND) +# +# Check MD5/RMD160/SHA headers +# +LA_CHECK_INCLUDE_FILE("md5.h" HAVE_MD5_H) +LA_CHECK_INCLUDE_FILE("openssl/md5.h" HAVE_OPENSSL_MD5_H) +LA_CHECK_INCLUDE_FILE("openssl/ripemd.h" HAVE_OPENSSL_RIPEMD_H) +LA_CHECK_INCLUDE_FILE("openssl/sha.h" HAVE_OPENSSL_SHA_H) +LA_CHECK_INCLUDE_FILE("ripemd.h" HAVE_RIPEMD_H) +LA_CHECK_INCLUDE_FILE("rmd160.h" HAVE_RMD160_H) +LA_CHECK_INCLUDE_FILE("sha.h" HAVE_SHA_H) +LA_CHECK_INCLUDE_FILE("sha1.h" HAVE_SHA1_H) +LA_CHECK_INCLUDE_FILE("sha2.h" HAVE_SHA2_H) +LA_CHECK_INCLUDE_FILE("sha256.h" HAVE_SHA256_H) + +# +# Find MD5/RMD160/SHA library +# +FIND_LIBRARY(CRYPTO_LIBRARY NAMES crypto) +IF(CRYPTO_LIBRARY) + LIST(APPEND ADDITIONAL_LIBS ${CRYPTO_LIBRARY}) +ELSE(CRYPTO_LIBRARY) + IF(NOT OPENSSL_FOUND) + FIND_LIBRARY(MD_LIBRARY NAMES md) + IF(MD_LIBRARY) + LIST(APPEND ADDITIONAL_LIBS ${MD_LIBRARY}) + ENDIF(MD_LIBRARY) + ENDIF(NOT OPENSSL_FOUND) +ENDIF(CRYPTO_LIBRARY) +# +# Check MD5/RMD160/SHA functions +# +SET(CMAKE_REQUIRED_LIBRARIES ${ADDITIONAL_LIBS}) +CHECK_FUNCTION_EXISTS(MD5_Init HAVE_MD5_Init) +IF(NOT HAVE_MD5_Init) + CHECK_FUNCTION_EXISTS(MD5Init HAVE_MD5Init) + IF(HAVE_MD5Init) + SET(MD5_Init, "MD5Init") + SET(MD5_Update, "MD5Update") + SET(MD5_Final, "MD5Final") + ENDIF(HAVE_MD5Init) +ENDIF(NOT HAVE_MD5_Init) +IF(HAVE_MD5_Init OR HAVE_MD5Init) + SET(HAVE_MD5 1) +ENDIF(HAVE_MD5_Init OR HAVE_MD5Init) +# +CHECK_FUNCTION_EXISTS(RIPEMD160_Init HAVE_RIPEMD160_Init) +IF(NOT HAVE_RIPEMD160_Init) + CHECK_FUNCTION_EXISTS(RMD160Init HAVE_RMD160Init) + IF(HAVE_RMD160Init) + SET(RIPEMD160_Init, "RMD160Init") + SET(RIPEMD160_Update, "RMD160Update") + SET(RIPEMD160_Final, "RMD160Final") + ENDIF(HAVE_RMD160Init) +ENDIF(NOT HAVE_RIPEMD160_Init) +IF(HAVE_RIPEMD160_Init OR HAVE_RMD160Init) + SET(HAVE_RMD160 1) +ENDIF(HAVE_RIPEMD160_Init OR HAVE_RMD160Init) +# +CHECK_FUNCTION_EXISTS(SHA1_Init HAVE_SHA1_Init) +IF(NOT HAVE_SHA1_Init) + CHECK_FUNCTION_EXISTS(SHA1Init HAVE_SHA1Init) + IF(HAVE_SHA1Init) + SET(SHA1_Init, "SHA1Init") + SET(SHA1_Update, "SHA1Update") + SET(SHA1_Final, "SHA1Final") + ENDIF(HAVE_SHA1Init) +ENDIF(NOT HAVE_SHA1_Init) +IF(HAVE_SHA1_Init OR HAVE_SHA1Init) + SET(HAVE_SHA1 1) +ENDIF(HAVE_SHA1_Init OR HAVE_SHA1Init) +# +CHECK_FUNCTION_EXISTS(SHA256_Init HAVE_SHA256) +CHECK_FUNCTION_EXISTS(SHA384_Init HAVE_SHA384) +CHECK_FUNCTION_EXISTS(SHA512_Init HAVE_SHA512) + +# +# Check functions +# +CHECK_SYMBOL_EXISTS(CreateHardLinkA "windows.h" HAVE_CREATEHARDLINKA) +CHECK_SYMBOL_EXISTS(CreateHardLinkW "windows.h" HAVE_CREATEHARDLINKW) +CHECK_FUNCTION_EXISTS_GLIBC(chflags HAVE_CHFLAGS) +CHECK_FUNCTION_EXISTS_GLIBC(chown HAVE_CHOWN) +CHECK_FUNCTION_EXISTS_GLIBC(chroot HAVE_CHROOT) +CHECK_FUNCTION_EXISTS_GLIBC(fchdir HAVE_FCHDIR) +CHECK_FUNCTION_EXISTS_GLIBC(fchflags HAVE_FCHFLAGS) +CHECK_FUNCTION_EXISTS_GLIBC(fchmod HAVE_FCHMOD) +CHECK_FUNCTION_EXISTS_GLIBC(fchown HAVE_FCHOWN) +CHECK_FUNCTION_EXISTS_GLIBC(fcntl HAVE_FCNTL) +CHECK_FUNCTION_EXISTS_GLIBC(fork HAVE_FORK) +CHECK_FUNCTION_EXISTS_GLIBC(fstat HAVE_FSTAT) +CHECK_FUNCTION_EXISTS_GLIBC(ftruncate HAVE_FTRUNCATE) +CHECK_FUNCTION_EXISTS_GLIBC(futimes HAVE_FUTIMES) +CHECK_FUNCTION_EXISTS_GLIBC(geteuid HAVE_GETEUID) +CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID) +CHECK_FUNCTION_EXISTS_GLIBC(lchflags HAVE_LCHFLAGS) +CHECK_FUNCTION_EXISTS_GLIBC(lchmod HAVE_LCHMOD) +CHECK_FUNCTION_EXISTS_GLIBC(lchown HAVE_LCHOWN) +CHECK_FUNCTION_EXISTS_GLIBC(link HAVE_LINK) +CHECK_FUNCTION_EXISTS_GLIBC(lstat HAVE_LSTAT) +CHECK_FUNCTION_EXISTS_GLIBC(lutimes HAVE_LUTIMES) +CHECK_FUNCTION_EXISTS_GLIBC(memmove HAVE_MEMMOVE) +CHECK_FUNCTION_EXISTS_GLIBC(mkdir HAVE_MKDIR) +CHECK_FUNCTION_EXISTS_GLIBC(mkfifo HAVE_MKFIFO) +CHECK_FUNCTION_EXISTS_GLIBC(mknod HAVE_MKNOD) +CHECK_FUNCTION_EXISTS_GLIBC(nl_langinfo HAVE_NL_LANGINFO) +CHECK_FUNCTION_EXISTS_GLIBC(pipe HAVE_PIPE) +CHECK_FUNCTION_EXISTS_GLIBC(poll HAVE_POLL) +CHECK_FUNCTION_EXISTS_GLIBC(readlink HAVE_READLINK) +CHECK_FUNCTION_EXISTS_GLIBC(select HAVE_SELECT) +CHECK_FUNCTION_EXISTS_GLIBC(setenv HAVE_SETENV) +CHECK_FUNCTION_EXISTS_GLIBC(setlocale HAVE_SETLOCALE) +CHECK_FUNCTION_EXISTS_GLIBC(strchr HAVE_STRCHR) +CHECK_FUNCTION_EXISTS_GLIBC(strdup HAVE_STRDUP) +CHECK_FUNCTION_EXISTS_GLIBC(strerror HAVE_STRERROR) +CHECK_FUNCTION_EXISTS_GLIBC(strncpy_s HAVE_STRNCPY_S) +CHECK_FUNCTION_EXISTS_GLIBC(strrchr HAVE_STRRCHR) +CHECK_FUNCTION_EXISTS_GLIBC(symlink HAVE_SYMLINK) +CHECK_FUNCTION_EXISTS_GLIBC(timegm HAVE_TIMEGM) +CHECK_FUNCTION_EXISTS_GLIBC(tzset HAVE_TZSET) +CHECK_FUNCTION_EXISTS_GLIBC(unsetenv HAVE_UNSETENV) +CHECK_FUNCTION_EXISTS_GLIBC(utime HAVE_UTIME) +CHECK_FUNCTION_EXISTS_GLIBC(utimes HAVE_UTIMES) +CHECK_FUNCTION_EXISTS_GLIBC(vfork HAVE_VFORK) +CHECK_FUNCTION_EXISTS_GLIBC(wcrtomb HAVE_WCRTOMB) +CHECK_FUNCTION_EXISTS_GLIBC(wcscpy HAVE_WCSCPY) +CHECK_FUNCTION_EXISTS_GLIBC(wcslen HAVE_WCSLEN) +CHECK_FUNCTION_EXISTS_GLIBC(wctomb HAVE_WCTOMB) +CHECK_SYMBOL_EXISTS(wmemcmp "wchar.h" HAVE_WMEMCMP) +CHECK_SYMBOL_EXISTS(wmemcpy "wchar.h" HAVE_WMEMCPY) + +SET(CMAKE_REQUIRED_LIBRARIES "") +CHECK_SYMBOL_EXISTS(fseeko "stdio.h" HAVE_FSEEKO) +CHECK_SYMBOL_EXISTS(strerror_r "string.h" HAVE_STRERROR_R) +CHECK_SYMBOL_EXISTS(strftime "time.h" HAVE_STRFTIME) +CHECK_SYMBOL_EXISTS(vprintf "stdio.h" HAVE_VPRINTF) + +IF(HAVE_STRERROR_R) + SET(HAVE_DECL_STRERROR_R 1) +ENDIF(HAVE_STRERROR_R) + +# +# Check defines +# +CHECK_SYMBOL_EXISTS(EFTYPE "errno.h" HAVE_EFTYPE) +CHECK_SYMBOL_EXISTS(EILSEQ "errno.h" HAVE_EILSEQ) +CHECK_SYMBOL_EXISTS(D_MD_ORDER "langinfo.h" HAVE_D_MD_ORDER) +CHECK_SYMBOL_EXISTS(optarg "unistd.h" HAVE_DECL_OPTARG) +CHECK_SYMBOL_EXISTS(optind "unistd.h" HAVE_DECL_OPTIND) +IF(HAVE_STDINT_H) + CHECK_SYMBOL_EXISTS(INT64_MAX "stdint.h" HAVE_DECL_INT64_MAX) + CHECK_SYMBOL_EXISTS(INT64_MIN "stdint.h" HAVE_DECL_INT64_MIN) + CHECK_SYMBOL_EXISTS(UINT32_MAX "stdint.h" HAVE_DECL_UINT32_MAX) + CHECK_SYMBOL_EXISTS(UINT64_MAX "stdint.h" HAVE_DECL_UINT64_MAX) + CHECK_SYMBOL_EXISTS(SIZE_MAX "stdint.h" HAVE_DECL_SIZE_MAX) +ELSE(HAVE_STDINT_H) + CHECK_SYMBOL_EXISTS(INT64_MAX "limits.h" HAVE_DECL_INT64_MAX) + CHECK_SYMBOL_EXISTS(INT64_MIN "limits.h" HAVE_DECL_INT64_MIN) + CHECK_SYMBOL_EXISTS(UINT32_MAX "limits.h" HAVE_DECL_UINT32_MAX) + CHECK_SYMBOL_EXISTS(UINT64_MAX "limits.h" HAVE_DECL_UINT64_MAX) + CHECK_SYMBOL_EXISTS(SIZE_MAX "limits.h" HAVE_DECL_SIZE_MAX) +ENDIF(HAVE_STDINT_H) +CHECK_SYMBOL_EXISTS(SSIZE_MAX "limits.h" HAVE_DECL_SSIZE_MAX) + +# +# Check struct members +# +# Check for birthtime in struct stat +CHECK_STRUCT_MEMBER("struct stat" st_birthtime + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIME) + +# Check for high-resolution timestamps in struct stat +CHECK_STRUCT_MEMBER("struct stat" st_birthtimespec.tv_nsec + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC) +CHECK_STRUCT_MEMBER("struct stat" st_mtimespec.tv_nsec + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC) +CHECK_STRUCT_MEMBER("struct stat" st_mtim.tv_nsec + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) +CHECK_STRUCT_MEMBER("struct stat" st_mtime_n + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_N) +CHECK_STRUCT_MEMBER("struct stat" st_umtime + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_UMTIME) +CHECK_STRUCT_MEMBER("struct stat" st_mtime_usec + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_USEC) +# Check for block size support in struct stat +CHECK_STRUCT_MEMBER("struct stat" st_blksize + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BLKSIZE) +# Check for st_flags in struct stat (BSD fflags) +CHECK_STRUCT_MEMBER("struct stat" st_flags + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_FLAGS) +# +# +CHECK_STRUCT_MEMBER("struct tm" tm_sec + "sys/types.h;sys/time.h;time.h" TIME_WITH_SYS_TIME) + +# +# Check for integer types +# +# XXX There must be a way to make this simpler XXXX +# +CHECK_TYPE_SIZE("long long int" LONG_LONG_INT) +CHECK_TYPE_SIZE("unsigned long long" UNSIGNED_LONG_LONG) +CHECK_TYPE_SIZE("unsigned long long int" UNSIGNED_LONG_LONG_INT) + +# +CHECK_TYPE_SIZE(dev_t DEV_T) +IF(NOT HAVE_DEV_T) + IF(MSVC) + SET(dev_t "unsigned int") + ENDIF(MSVC) +ENDIF(NOT HAVE_DEV_T) +# +CHECK_TYPE_SIZE(gid_t GID_T) +IF(NOT HAVE_GID_T) + IF(WIN32) + SET(gid_t "short") + ELSEIF(WIN32) + SET(gid_t "unsigned int") + ENDIF(WIN32) +ENDIF(NOT HAVE_GID_T) +# +CHECK_TYPE_SIZE(id_t ID_T) +IF(NOT HAVE_ID_T) + IF(WIN32) + SET(id_t "short") + ELSEIF(WIN32) + SET(id_t "unsigned int") + ENDIF(WIN32) +ENDIF(NOT HAVE_ID_T) +# +CHECK_TYPE_SIZE(int64_t INT64_T) +IF(NOT HAVE_INT64_T) + IF(MSVC) + SET(int64_t __int64) + ENDIF(MSVC) +ENDIF(NOT HAVE_INT64_T) +# +CHECK_TYPE_SIZE(intmax_t INTMAX_T) +IF(NOT HAVE_INTMAX_T) + IF(MSVC) + SET(intmax_t "long long") + ENDIF(MSVC) +ENDIF(NOT HAVE_INTMAX_T) +# +CHECK_TYPE_SIZE(mode_t MODE_T) +IF(NOT HAVE_MODE_T) + IF(MSVC) + SET(mode_t "unsigned short") + ELSE(MSVC) + SET(mode_t "int") + ENDIF(MSVC) +ENDIF(NOT HAVE_MODE_T) +# +CHECK_TYPE_SIZE(off_t OFF_T) +IF(NOT HAVE_OFF_T) + SET(off_t "long long") +ENDIF(NOT HAVE_OFF_T) +# +CHECK_TYPE_SIZE(size_t SIZE_T) +IF(NOT HAVE_SIZE_T) + SET(size_t "unsigned int") +ENDIF(NOT HAVE_SIZE_T) +# +CHECK_TYPE_SIZE(ssize_t SSIZE_T) +IF(NOT HAVE_SSIZE_T) + IF(MSVC) + IF(CMAKE_CL_64) + SET(ssize_t "__int64") + ELSE(CMAKE_CL_64) + SET(ssize_t "signed long") + ENDIF(CMAKE_CL_64) + ELSE(MSVC) + SET(ssize_t "int") + ENDIF(MSVC) +ENDIF(NOT HAVE_SSIZE_T) +# +CHECK_TYPE_SIZE(uid_t UID_T) +IF(NOT HAVE_UID_T) + IF(WIN32) + SET(uid_t "short") + ELSEIF(WIN32) + SET(uid_t "unsigned int") + ENDIF(WIN32) +ENDIF(NOT HAVE_UID_T) +# +CHECK_TYPE_SIZE(uint16_t UINT16_T) +IF(NOT HAVE_UINT16_T) + IF(MSVC) + SET(uint16_t "unsigned short") + ENDIF(MSVC) +ENDIF(NOT HAVE_UINT16_T) +# +CHECK_TYPE_SIZE(uint32_t UINT32_T) +IF(NOT HAVE_UINT32_T) + IF(MSVC) + SET(uint32_t "unsigned int") + ENDIF(MSVC) +ENDIF(NOT HAVE_UINT32_T) +CHECK_TYPE_SIZE(int32_t INT32_T) +IF(NOT HAVE_INT32_T) + IF(MSVC) + SET(int32_t "int") + ENDIF(MSVC) +ENDIF(NOT HAVE_INT32_T) +# +CHECK_TYPE_SIZE(uint64_t UINT64_T) +IF(NOT HAVE_UINT64_T) + IF(MSVC) + SET(uint64_t "unsigned __int64") + ENDIF(MSVC) +ENDIF(NOT HAVE_UINT64_T) +# +CHECK_TYPE_SIZE(uintmax_t UINTMAX_T) +IF(NOT HAVE_UINTMAX_T) + IF(MSVC) + SET(uintmax_t "unsigned long long") + ENDIF(MSVC) +ENDIF(NOT HAVE_UINTMAX_T) +# +CHECK_TYPE_SIZE(wchar_t SIZEOF_WCHAR_T) +IF(HAVE_SIZEOF_WCHAR_T) + SET(HAVE_WCHAR_T 1) +ENDIF(HAVE_SIZEOF_WCHAR_T) +# +# Check if _FILE_OFFSET_BITS macro needed for large files +# +CHECK_FILE_OFFSET_BITS() + + + +# +# Check for Extended Attribute libraries, headers, and functions +# +IF(ENABLE_XATTR) + LA_CHECK_INCLUDE_FILE(attr/xattr.h HAVE_ATTR_XATTR_H) + LA_CHECK_INCLUDE_FILE(sys/xattr.h HAVE_SYS_XATTR_H) + CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_ATTR_LIB) + IF(HAVE_ATTR_LIB) + SET(CMAKE_REQUIRED_LIBRARIES "attr") + ENDIF(HAVE_ATTR_LIB) + CHECK_FUNCTION_EXISTS_GLIBC(extattr_get_file HAVE_EXTATTR_GET_FILE) + CHECK_FUNCTION_EXISTS_GLIBC(extattr_list_file HAVE_EXTATTR_LIST_FILE) + CHECK_FUNCTION_EXISTS_GLIBC(extattr_set_fd HAVE_EXTATTR_SET_FD) + CHECK_FUNCTION_EXISTS_GLIBC(extattr_set_file HAVE_EXTATTR_SET_FILE) + CHECK_FUNCTION_EXISTS_GLIBC(fsetxattr HAVE_FSETXATTR) + CHECK_FUNCTION_EXISTS_GLIBC(getxattr HAVE_GETXATTR) + CHECK_FUNCTION_EXISTS_GLIBC(lgetxattr HAVE_LGETXATTR) + CHECK_FUNCTION_EXISTS_GLIBC(listxattr HAVE_LISTXATTR) + CHECK_FUNCTION_EXISTS_GLIBC(llistxattr HAVE_LLISTXATTR) + CHECK_FUNCTION_EXISTS_GLIBC(lsetxattr HAVE_LSETXATTR) +ENDIF(ENABLE_XATTR) + +# +# Check for ACL libraries, headers, and functions +# +# The ACL support in libarchive is written against the POSIX1e draft, +# which was never officially approved and varies quite a bit across +# platforms. Worse, some systems have completely non-POSIX acl functions, +# which makes the following checks rather more complex than I would like. +# +IF(ENABLE_ACL) + CHECK_LIBRARY_EXISTS(acl "acl_get_file" "" HAVE_ACL_LIB) + IF(HAVE_ACL_LIB) + SET(CMAKE_REQUIRED_LIBRARIES "acl") + FIND_LIBRARY(ACL_LIBRARY NAMES acl) + LIST(APPEND ADDITIONAL_LIBS ${ACL_LIBRARY}) + ENDIF(HAVE_ACL_LIB) + # + CHECK_FUNCTION_EXISTS_GLIBC(acl_create_entry HAVE_ACL_CREATE_ENTRY) + CHECK_FUNCTION_EXISTS_GLIBC(acl_init HAVE_ACL_INIT) + CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd HAVE_ACL_SET_FD) + CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd_np HAVE_ACL_SET_FD_NP) + CHECK_FUNCTION_EXISTS_GLIBC(acl_set_file HAVE_ACL_SET_FILE) + CHECK_TYPE_EXISTS(acl_permset_t "${INCLUDES}" HAVE_ACL_PERMSET_T) + + # The "acl_get_perm()" function was omitted from the POSIX draft. + # (It's a pretty obvious oversight; otherwise, there's no way to + # test for specific permissions in a permset.) Linux uses the obvious + # name, FreeBSD adds _np to mark it as "non-Posix extension." + # Test for both as a double-check that we really have POSIX-style ACL support. + CHECK_SYMBOL_EXISTS(acl_get_perm "${INCLUDES}" HAVE_ACL_GET_PERM) + CHECK_SYMBOL_EXISTS(acl_get_perm_np "${INCLUDES}" HAVE_ACL_GET_PERM_NP) + CHECK_SYMBOL_EXISTS(acl_get_link "${INCLUDES}" HAVE_ACL_GET_LINK) + CHECK_SYMBOL_EXISTS(acl_get_link_np "${INCLUDES}" HAVE_ACL_GET_LINK_NP) + + # MacOS has an acl.h that isn't POSIX. It can be detected by + # checking for ACL_USER + CHECK_SYMBOL_EXISTS(ACL_USER "${INCLUDES}" HAVE_ACL_USER) +ENDIF(ENABLE_ACL) + +# Check whether printf() supports "%jd" +CHECK_C_SOURCE_RUNS(" + #include + #include + #include + static char buf[100]; + int main() { + sprintf(buf, \"%jd\", (intmax_t)7); + if (strcmp(buf, \"7\")) return 1; + sprintf(buf, \"%ju\", (uintmax_t)7); + return (strcmp(buf, \"7\")); + }" HAVE_PRINTF_JD) + +# Check whether printf() supports "%lld" +CHECK_C_SOURCE_RUNS(" + #include + #include + #include + static char buf[100]; + int main() { + sprintf(buf, \"%lld\", (long long)7); + if (strcmp(buf, \"7\")) return 1; + sprintf(buf, \"%llu\", (long long)7); + return (strcmp(buf, \"7\")); + }" HAVE_PRINTF_LLD) + +# Generate "config.h" from "build/cmake/config.h.in" +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/config.h) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +ADD_DEFINITIONS(-DHAVE_CONFIG_H) + +# +# Register installation of PDF documents. +# +IF(WIN32 AND NOT CYGWIN) + # + # On Windows platform, It's better that we install PDF documents + # on one's computer. + # These PDF documents are available in the release package. + # + IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf) + INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf + DESTINATION share/man + FILES_MATCHING PATTERN "*.pdf" + ) + ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf) +ENDIF(WIN32 AND NOT CYGWIN) +# +# +# +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libarchive) +# +IF(MSVC) + ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) +ENDIF(MSVC) +# Especially for early development, we want to be a little +# aggressive about diagnosing build problems; this can get +# relaxed somewhat in final shipping versions. +IF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$") + ADD_DEFINITIONS(-Wall -Werror) +ENDIF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$") + +IF(ENABLE_TEST) +ADD_CUSTOM_TARGET(run_all_tests) +ENDIF(ENABLE_TEST) + +add_subdirectory(libarchive) +#add_subdirectory(tar) +#add_subdirectory(cpio) diff --git a/Utilities/cmlibarchive/COPYING b/Utilities/cmlibarchive/COPYING new file mode 100644 index 000000000..9dbf49dbf --- /dev/null +++ b/Utilities/cmlibarchive/COPYING @@ -0,0 +1,60 @@ +The libarchive distribution as a whole is Copyright by Tim Kientzle +and is subject to the copyright notice reproduced at the bottom of +this file. + +Each individual file in this distribution should have a clear +copyright/licensing statement at the beginning of the file. If any do +not, please let me know and I will rectify it. The following is +intended to summarize the copyright status of the individual files; +the actual statements in the files are controlling. + +* Except as listed below, all C sources (including .c and .h files) + and documentation files are subject to the copyright notice reproduced + at the bottom of this file. + +* The following source files are also subject in whole or in part to + a 3-clause UC Regents copyright; please read the individual source + files for details: + libarchive/archive_entry.c + libarchive/archive_read_support_compression_compress.c + libarchive/archive_write_set_compression_compress.c + libarchive/mtree.5 + tar/matching.c + +* The following source files are in the public domain: + tar/getdate.c + +* The build files---including Makefiles, configure scripts, + and auxiliary scripts used as part of the compile process---have + widely varying licensing terms. Please check individual files before + distributing them to see if those restrictions apply to you. + +I intend for all new source code to use the license below and hope over +time to replace code with other licenses with new implementations that +do use the license below. The varying licensing of the build scripts +seems to be an unavoidable mess. + + +Copyright (c) 2003-2009 +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. diff --git a/Utilities/cmlibarchive/INSTALL b/Utilities/cmlibarchive/INSTALL new file mode 100644 index 000000000..d91cc0691 --- /dev/null +++ b/Utilities/cmlibarchive/INSTALL @@ -0,0 +1,30 @@ +More complete build documentation is available on the libarchive +Wiki: http://libarchive.googlecode.com/ + +On most Unix-like systems, you should be able to install libarchive, +bsdtar, and bsdcpio using the following common steps: + ./configure + make + make install + +If you need to customize the target directories or otherwise adjust +the build setting, use + ./configure --help +to list the configure options. + +If you are developing libarchive and need to update the +configure script and other build files: + /bin/sh build/autogen.sh + +To create a distribution, please use the 'distcheck' target: + /bin/sh build/autogen.sh && ./configure && make distcheck + +On non-Unix-like systems, use the "cmake" utility (available from +http://cmake.org/) to generate suitable build files for your platform. +Cmake requires the name of the directory containing CmakeLists.txt and +the "generator" to use for your build environment. For example, to +build with Xcode on Mac OS, you can use the following command: + cmake -G "Xcode" ~/libarchive-download-dir/ +The result will be appropriate makefiles, solution files, or project +files that can be used with the corresponding development tool. +See the libarchive Wiki or the cmake site for further documentation. \ No newline at end of file diff --git a/Utilities/cmlibarchive/Makefile.am b/Utilities/cmlibarchive/Makefile.am new file mode 100644 index 000000000..73f992c24 --- /dev/null +++ b/Utilities/cmlibarchive/Makefile.am @@ -0,0 +1,595 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS= foreign subdir-objects +ACLOCAL_AMFLAGS = -I build/autoconf + +# +# What to build and install +# +lib_LTLIBRARIES= libarchive.la +noinst_LTLIBRARIES= libarchive_fe.la +bin_PROGRAMS= $(bsdtar_programs) $(bsdcpio_programs) +man_MANS= $(libarchive_man_MANS) $(bsdtar_man_MANS) $(bsdcpio_man_MANS) +BUILT_SOURCES= libarchive/test/list.h tar/test/list.h cpio/test/list.h + +# +# What to test: We always test libarchive, test bsdtar and bsdcpio only +# if we built them. +# +check_PROGRAMS= libarchive_test $(bsdtar_test_programs) $(bsdcpio_test_programs) +TESTS= libarchive_test $(bsdtar_test_programs) $(bsdcpio_test_programs) +TESTS_ENVIRONMENT= $(libarchive_TESTS_ENVIRONMENT) $(bsdtar_TESTS_ENVIRONMENT) $(bsdcpio_TESTS_ENVIRONMENT) +# Always build and test both bsdtar and bsdcpio as part of 'distcheck' +DISTCHECK_CONFIGURE_FLAGS = --enable-bsdtar --enable-bsdcpio +# Especially for early development, we want to be a little +# aggressive about diagnosing build problems; this can get +# relaxed somewhat in final shipping versions. +AM_CFLAGS=-Wall -Werror +PLATFORMCPPFLAGS = @PLATFORMCPPFLAGS@ +AM_CPPFLAGS=$(PLATFORMCPPFLAGS) + +# +# What to include in the distribution +# +EXTRA_DIST= \ + CMakeLists.txt \ + build/autogen.sh \ + build/release.sh \ + build/cmake \ + build/version \ + build/windows \ + contrib \ + doc \ + examples \ + $(libarchive_EXTRA_DIST) \ + $(libarchive_test_EXTRA_DIST) \ + $(bsdtar_EXTRA_DIST) \ + $(bsdtar_test_EXTRA_DIST) \ + $(bsdcpio_EXTRA_DIST) \ + $(bsdcpio_test_EXTRA_DIST) + +# a) Clean out some unneeded files and directories +# b) Collect all documentation and format it for distribution. +dist-hook: + rm -rf `find $(distdir) -name CVS -type d` + rm -rf `find $(distdir) -name .svn -type d` + rm -f `find $(distdir) -name '*~'` + rm -f `find $(distdir) -name '*.out'` + rm -f `find $(distdir) -name '*.core'` + -rm -f $(distdir)/*/Makefile $(distdir)/*/*/Makefile + cd $(distdir)/doc && /bin/sh update.sh + +# Verify cmake builds as part of the acceptance +distcheck-hook: + mkdir $(distdir)/_build/cmtest + cd $(distdir)/_build/cmtest && cmake ../.. && make && make test + rm -rf $(distdir)/_build/cmtest + +# +# Extra rules for cleanup +# +DISTCLEANFILES= \ + libarchive/test/list.h \ + tar/test/list.h \ + cpio/test/list.h + +distclean-local: + -rm -rf .ref + -rm -rf autom4te.cache/ + -rm -f *~ + -[ -f libarchive/Makefile ] && cd libarchive && make clean + -[ -f libarchive/test/Makefile ] && cd libarchive/test && make clean + -[ -f tar/Makefile ] && cd tar && make clean + -[ -f tar/test/Makefile ] && cd tar/test && make clean + -[ -f cpio/Makefile ] && cd cpio && make clean + -[ -f cpio/test/Makefile ] && cd cpio/test && make clean + +# +# Libarchive headers, source, etc. +# +# + +include_HEADERS= libarchive/archive.h libarchive/archive_entry.h + +libarchive_la_SOURCES= \ + libarchive/archive_check_magic.c \ + libarchive/archive_endian.h \ + libarchive/archive_entry.c \ + libarchive/archive_entry.h \ + libarchive/archive_entry_copy_stat.c \ + libarchive/archive_entry_link_resolver.c \ + libarchive/archive_entry_private.h \ + libarchive/archive_entry_stat.c \ + libarchive/archive_entry_strmode.c \ + libarchive/archive_entry_xattr.c \ + libarchive/archive_hash.h \ + libarchive/archive_platform.h \ + libarchive/archive_private.h \ + libarchive/archive_read.c \ + libarchive/archive_read_data_into_fd.c \ + libarchive/archive_read_disk.c \ + libarchive/archive_read_disk_entry_from_file.c \ + libarchive/archive_read_disk_private.h \ + libarchive/archive_read_disk_set_standard_lookup.c \ + libarchive/archive_read_extract.c \ + libarchive/archive_read_open_fd.c \ + libarchive/archive_read_open_file.c \ + libarchive/archive_read_open_filename.c \ + libarchive/archive_read_open_memory.c \ + libarchive/archive_read_private.h \ + libarchive/archive_read_support_compression_all.c \ + libarchive/archive_read_support_compression_bzip2.c \ + libarchive/archive_read_support_compression_compress.c \ + libarchive/archive_read_support_compression_gzip.c \ + libarchive/archive_read_support_compression_none.c \ + libarchive/archive_read_support_compression_program.c \ + libarchive/archive_read_support_compression_xz.c \ + libarchive/archive_read_support_format_all.c \ + libarchive/archive_read_support_format_ar.c \ + libarchive/archive_read_support_format_cpio.c \ + libarchive/archive_read_support_format_empty.c \ + libarchive/archive_read_support_format_iso9660.c \ + libarchive/archive_read_support_format_mtree.c \ + libarchive/archive_read_support_format_raw.c \ + libarchive/archive_read_support_format_tar.c \ + libarchive/archive_read_support_format_zip.c \ + libarchive/archive_string.c \ + libarchive/archive_string.h \ + libarchive/archive_string_sprintf.c \ + libarchive/archive_util.c \ + libarchive/archive_virtual.c \ + libarchive/archive_write.c \ + libarchive/archive_write_disk.c \ + libarchive/archive_write_disk_private.h \ + libarchive/archive_write_disk_set_standard_lookup.c \ + libarchive/archive_write_open_fd.c \ + libarchive/archive_write_open_file.c \ + libarchive/archive_write_open_filename.c \ + libarchive/archive_write_open_memory.c \ + libarchive/archive_write_private.h \ + libarchive/archive_write_set_compression_bzip2.c \ + libarchive/archive_write_set_compression_compress.c \ + libarchive/archive_write_set_compression_gzip.c \ + libarchive/archive_write_set_compression_none.c \ + libarchive/archive_write_set_compression_program.c \ + libarchive/archive_write_set_compression_xz.c \ + libarchive/archive_write_set_format.c \ + libarchive/archive_write_set_format_ar.c \ + libarchive/archive_write_set_format_by_name.c \ + libarchive/archive_write_set_format_cpio.c \ + libarchive/archive_write_set_format_cpio_newc.c \ + libarchive/archive_write_set_format_mtree.c \ + libarchive/archive_write_set_format_pax.c \ + libarchive/archive_write_set_format_shar.c \ + libarchive/archive_write_set_format_ustar.c \ + libarchive/archive_write_set_format_zip.c \ + libarchive/config_freebsd.h \ + libarchive/config_windows.h \ + libarchive/filter_fork.c \ + libarchive/filter_fork.h + +if INC_WINDOWS_FILES +libarchive_la_SOURCES+= \ + libarchive/archive_entry_copy_bhfi.c \ + libarchive/archive_windows.h \ + libarchive/archive_windows.c \ + libarchive/filter_fork_windows.c +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) + +# Manpages to install +libarchive_man_MANS= \ + libarchive/archive_entry.3 \ + libarchive/archive_read.3 \ + libarchive/archive_read_disk.3 \ + libarchive/archive_util.3 \ + libarchive/archive_write.3 \ + libarchive/archive_write_disk.3 \ + libarchive/cpio.5 \ + libarchive/libarchive.3 \ + libarchive/libarchive_internals.3 \ + libarchive/libarchive-formats.5 \ + libarchive/mtree.5 \ + libarchive/tar.5 + +# Additional libarchive files to include in the distribution +libarchive_EXTRA_DIST= \ + libarchive/test/list.h \ + libarchive/archive_windows.c \ + libarchive/archive_windows.h \ + libarchive/filter_fork_windows.c \ + libarchive/CMakeLists.txt \ + $(libarchive_man_MANS) + +# +# +# libarchive_test program +# +# +libarchive_test_SOURCES= \ + $(libarchive_la_SOURCES) \ + libarchive/test/main.c \ + libarchive/test/read_open_memory.c \ + libarchive/test/test.h \ + libarchive/test/test_acl_basic.c \ + libarchive/test/test_acl_freebsd.c \ + libarchive/test/test_acl_pax.c \ + libarchive/test/test_archive_api_feature.c \ + libarchive/test/test_bad_fd.c \ + libarchive/test/test_compat_bzip2.c \ + libarchive/test/test_compat_gtar.c \ + libarchive/test/test_compat_gzip.c \ + libarchive/test/test_compat_solaris_tar_acl.c \ + libarchive/test/test_compat_tar_hardlink.c \ + libarchive/test/test_compat_xz.c \ + libarchive/test/test_compat_zip.c \ + libarchive/test/test_empty_write.c \ + libarchive/test/test_entry.c \ + libarchive/test/test_extattr_freebsd.c \ + libarchive/test/test_fuzz.c \ + libarchive/test/test_entry_strmode.c \ + libarchive/test/test_link_resolver.c \ + libarchive/test/test_open_fd.c \ + libarchive/test/test_open_file.c \ + libarchive/test/test_open_filename.c \ + libarchive/test/test_pax_filename_encoding.c \ + libarchive/test/test_read_compress_program.c \ + libarchive/test/test_read_data_large.c \ + libarchive/test/test_read_disk.c \ + libarchive/test/test_read_disk_entry_from_file.c \ + libarchive/test/test_read_extract.c \ + libarchive/test/test_read_file_nonexistent.c \ + libarchive/test/test_read_format_ar.c \ + libarchive/test/test_read_format_cpio_bin.c \ + libarchive/test/test_read_format_cpio_bin_Z.c \ + libarchive/test/test_read_format_cpio_bin_be.c \ + libarchive/test/test_read_format_cpio_bin_bz2.c \ + libarchive/test/test_read_format_cpio_bin_gz.c \ + libarchive/test/test_read_format_cpio_bin_xz.c \ + libarchive/test/test_read_format_cpio_odc.c \ + libarchive/test/test_read_format_cpio_svr4_gzip.c \ + libarchive/test/test_read_format_cpio_svr4c_Z.c \ + libarchive/test/test_read_format_empty.c \ + libarchive/test/test_read_format_gtar_gz.c \ + libarchive/test/test_read_format_gtar_lzma.c \ + libarchive/test/test_read_format_gtar_sparse.c \ + libarchive/test/test_read_format_iso_gz.c \ + libarchive/test/test_read_format_isojoliet_bz2.c \ + libarchive/test/test_read_format_isojoliet_long.c \ + libarchive/test/test_read_format_isojoliet_rr.c \ + libarchive/test/test_read_format_isorr_bz2.c \ + libarchive/test/test_read_format_isorr_new_bz2.c \ + libarchive/test/test_read_format_isozisofs_bz2.c \ + libarchive/test/test_read_format_mtree.c \ + libarchive/test/test_read_format_pax_bz2.c \ + libarchive/test/test_read_format_raw.c \ + libarchive/test/test_read_format_tar.c \ + libarchive/test/test_read_format_tar_empty_filename.c \ + libarchive/test/test_read_format_tbz.c \ + libarchive/test/test_read_format_tgz.c \ + libarchive/test/test_read_format_txz.c \ + libarchive/test/test_read_format_tz.c \ + libarchive/test/test_read_format_zip.c \ + libarchive/test/test_read_large.c \ + libarchive/test/test_read_pax_truncated.c \ + libarchive/test/test_read_position.c \ + libarchive/test/test_read_truncated.c \ + libarchive/test/test_tar_filenames.c \ + libarchive/test/test_tar_large.c \ + libarchive/test/test_ustar_filenames.c \ + libarchive/test/test_write_compress.c \ + libarchive/test/test_write_compress_bzip2.c \ + libarchive/test/test_write_compress_gzip.c \ + libarchive/test/test_write_compress_lzma.c \ + libarchive/test/test_write_compress_program.c \ + libarchive/test/test_write_compress_xz.c \ + libarchive/test/test_write_disk.c \ + libarchive/test/test_write_disk_failures.c \ + libarchive/test/test_write_disk_hardlink.c \ + libarchive/test/test_write_disk_perms.c \ + libarchive/test/test_write_disk_secure.c \ + libarchive/test/test_write_disk_sparse.c \ + libarchive/test/test_write_disk_symlink.c \ + libarchive/test/test_write_disk_times.c \ + libarchive/test/test_write_format_ar.c \ + libarchive/test/test_write_format_cpio.c \ + libarchive/test/test_write_format_cpio_empty.c \ + libarchive/test/test_write_format_cpio_odc.c \ + libarchive/test/test_write_format_cpio_newc.c \ + libarchive/test/test_write_format_mtree.c \ + libarchive/test/test_write_format_pax.c \ + libarchive/test/test_write_format_shar_empty.c \ + libarchive/test/test_write_format_tar.c \ + libarchive/test/test_write_format_tar_empty.c \ + libarchive/test/test_write_format_tar_ustar.c \ + libarchive/test/test_write_format_zip.c \ + libarchive/test/test_write_format_zip_empty.c \ + libarchive/test/test_write_format_zip_no_compression.c \ + libarchive/test/test_write_open_memory.c + +libarchive_test_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_builddir)/libarchive/test -DLIBARCHIVE_STATIC $(PLATFORMCPPFLAGS) + +# The "list.h" file just lists all of the tests defined in all of the sources. +# Building it automatically provides a sanity-check on libarchive_test_SOURCES +# above. +libarchive/test/list.h: Makefile + cat $(top_srcdir)/libarchive/test/test_*.c | grep DEFINE_TEST > libarchive/test/list.h + +libarchive_TESTS_ENVIRONMENT= LIBARCHIVE_TEST_FILES=`cd $(top_srcdir);/bin/pwd`/libarchive/test + +libarchive_test_EXTRA_DIST=\ + libarchive/test/test_compat_bzip2_1.tbz.uu \ + libarchive/test/test_compat_bzip2_2.tbz.uu \ + libarchive/test/test_compat_gtar_1.tar.uu \ + libarchive/test/test_compat_gzip_1.tgz.uu \ + libarchive/test/test_compat_gzip_2.tgz.uu \ + libarchive/test/test_compat_solaris_tar_acl.tar.uu \ + libarchive/test/test_compat_tar_hardlink_1.tar.uu \ + libarchive/test/test_compat_xz_1.txz.uu \ + libarchive/test/test_compat_zip_1.zip.uu \ + libarchive/test/test_fuzz_1.iso.uu \ + libarchive/test/test_pax_filename_encoding.tar.uu \ + libarchive/test/test_read_format_cpio_bin_be.cpio.uu \ + libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu \ + libarchive/test/test_read_format_gtar_sparse_1_17.tar.uu \ + libarchive/test/test_read_format_gtar_sparse_1_17_posix00.tar.uu \ + libarchive/test/test_read_format_gtar_sparse_1_17_posix01.tar.uu \ + libarchive/test/test_read_format_gtar_sparse_1_17_posix10.tar.uu \ + libarchive/test/test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu \ + libarchive/test/test_read_format_iso_gz.iso.gz.uu \ + libarchive/test/test_read_format_isojoliet_bz2.iso.bz2.uu \ + libarchive/test/test_read_format_isojoliet_long.iso.bz2.uu \ + libarchive/test/test_read_format_isojoliet_rr.iso.bz2.uu \ + libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu \ + libarchive/test/test_read_format_isorr_new_bz2.iso.bz2.uu \ + libarchive/test/test_read_format_isozisofs_bz2.iso.bz2.uu \ + libarchive/test/test_read_format_raw.data.Z.uu \ + libarchive/test/test_read_format_raw.data.uu \ + libarchive/test/test_read_format_iso_gz.iso.gz.uu \ + libarchive/test/test_read_format_tar_empty_filename.tar.uu \ + libarchive/test/test_read_format_zip.zip.uu \ + libarchive/test/CMakeLists.txt \ + libarchive/test/README + +# +# Common code for libarchive frontends (cpio, tar) +# +libarchive_fe_la_SOURCES= \ + libarchive_fe/err.c \ + libarchive_fe/err.h \ + libarchive_fe/lafe_platform.h \ + libarchive_fe/line_reader.c \ + libarchive_fe/line_reader.h \ + libarchive_fe/matching.c \ + libarchive_fe/matching.h \ + libarchive_fe/pathmatch.c \ + libarchive_fe/pathmatch.h + +# +# +# bsdtar source, docs, etc. +# +# + +bsdtar_SOURCES= \ + tar/bsdtar.c \ + tar/bsdtar.h \ + tar/bsdtar_platform.h \ + tar/cmdline.c \ + tar/getdate.c \ + tar/read.c \ + tar/subst.c \ + tar/tree.c \ + tar/tree.h \ + tar/util.c \ + tar/write.c + +if INC_WINDOWS_FILES +bsdtar_SOURCES+= \ + tar/bsdtar_windows.h \ + tar/bsdtar_windows.c +endif + +bsdtar_DEPENDENCIES= libarchive.la libarchive_fe.la + +if STATIC_BSDTAR +bsdtar_ldstatic= -static +bsdtar_ccstatic= -DLIBARCHIVE_STATIC +else +bsdtar_ldstatic= +bsdtar_ccstatic= +endif + +bsdtar_LDADD= libarchive.la libarchive_fe.la +bsdtar_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdtar_ccstatic) $(PLATFORMCPPFLAGS) +bsdtar_LDFLAGS= $(bsdtar_ldstatic) + +bsdtar_EXTRA_DIST= \ + tar/bsdtar.1 \ + tar/bsdtar_windows.h \ + tar/bsdtar_windows.c \ + tar/CMakeLists.txt \ + tar/config_freebsd.h \ + tar/test/list.h + + +if BUILD_BSDTAR +bsdtar_man_MANS= tar/bsdtar.1 +bsdtar_programs= bsdtar +else +bsdtar_man_MANS= +bsdtar_programs= +endif + +# +# bsdtar_test +# + +bsdtar_test_SOURCES= \ + tar/getdate.c \ + tar/test/main.c \ + tar/test/test.h \ + tar/test/test_0.c \ + tar/test/test_basic.c \ + tar/test/test_copy.c \ + tar/test/test_getdate.c \ + tar/test/test_help.c \ + tar/test/test_option_T_upper.c \ + tar/test/test_option_q.c \ + tar/test/test_option_r.c \ + tar/test/test_option_s.c \ + tar/test/test_patterns.c \ + tar/test/test_stdio.c \ + tar/test/test_strip_components.c \ + tar/test/test_symlink_dir.c \ + tar/test/test_version.c \ + tar/test/test_windows.c + +# For now, bsdtar_test uses Windows shims from tar/bsdtar_windows.* +if INC_WINDOWS_FILES +bsdtar_test_SOURCES+= \ + tar/bsdtar_windows.h \ + tar/bsdtar_windows.c +endif + +bsdtar_test_CPPFLAGS=\ + -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe \ + -I$(top_srcdir)/tar -I$(top_builddir)/tar/test \ + $(PLATFORMCPPFLAGS) + +tar/test/list.h: Makefile + cat $(top_srcdir)/tar/test/test_*.c | grep DEFINE_TEST > tar/test/list.h + +if BUILD_BSDTAR +bsdtar_test_programs= bsdtar_test +bsdtar_TESTS_ENVIRONMENT= BSDTAR=`cd $(top_builddir);/bin/pwd`/bsdtar$(EXEEXT) BSDTAR_TEST_FILES=`cd $(top_srcdir);/bin/pwd`/tar/test +else +bsdtar_test_programs= +bsdtar_TESTS_ENVIRONMENT= +endif + +bsdtar_test_EXTRA_DIST= \ + tar/test/test_patterns_2.tar.uu \ + tar/test/test_patterns_3.tar.uu \ + tar/test/test_patterns_4.tar.uu \ + tar/test/CMakeLists.txt + + +# +# +# bsdcpio source, docs, etc. +# +# + +bsdcpio_SOURCES= \ + cpio/cmdline.c \ + cpio/cpio.c \ + cpio/cpio.h \ + cpio/cpio_platform.h + +if INC_WINDOWS_FILES +bsdcpio_SOURCES+= \ + cpio/cpio_windows.h \ + cpio/cpio_windows.c +endif + +bsdcpio_DEPENDENCIES = libarchive.la libarchive_fe.la + + +if STATIC_BSDCPIO +bsdcpio_ldstatic= -static +bsdcpio_ccstatic= -DLIBARCHIVE_STATIC +else +bsdcpio_ldstatic= +bsdcpio_ccstatic= +endif + +bsdcpio_LDADD= libarchive_fe.la libarchive.la +bsdcpio_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcpio_ccstatic) $(PLATFORMCPPFLAGS) +bsdcpio_LDFLAGS= $(bsdcpio_ldstatic) + +bsdcpio_EXTRA_DIST= \ + cpio/test/list.h \ + cpio/bsdcpio.1 \ + cpio/cpio_windows.h \ + cpio/cpio_windows.c \ + cpio/CMakeLists.txt \ + cpio/config_freebsd.h + + +if BUILD_BSDCPIO +# Manpages to install +bsdcpio_man_MANS= cpio/bsdcpio.1 +bsdcpio_programs= bsdcpio +else +bsdcpio_man_MANS= +bsdcpio_programs= +endif + +# +# bsdcpio_test +# + +bsdcpio_test_SOURCES= \ + cpio/cmdline.c \ + cpio/test/main.c \ + cpio/test/test.h \ + cpio/test/test_0.c \ + cpio/test/test_basic.c \ + cpio/test/test_cmdline.c \ + cpio/test/test_format_newc.c \ + cpio/test/test_gcpio_compat.c \ + cpio/test/test_option_B_upper.c \ + cpio/test/test_option_C_upper.c \ + cpio/test/test_option_J_upper.c \ + cpio/test/test_option_L_upper.c \ + cpio/test/test_option_Z_upper.c \ + cpio/test/test_option_a.c \ + cpio/test/test_option_c.c \ + cpio/test/test_option_d.c \ + cpio/test/test_option_f.c \ + cpio/test/test_option_help.c \ + cpio/test/test_option_l.c \ + cpio/test/test_option_lzma.c \ + cpio/test/test_option_m.c \ + cpio/test/test_option_t.c \ + cpio/test/test_option_u.c \ + cpio/test/test_option_version.c \ + cpio/test/test_option_y.c \ + cpio/test/test_option_z.c \ + cpio/test/test_owner_parse.c \ + cpio/test/test_passthrough_dotdot.c \ + cpio/test/test_passthrough_reverse.c \ + cpio/test/test_pathmatch.c + +bsdcpio_test_CPPFLAGS= \ + -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe \ + -I$(top_srcdir)/cpio -I$(top_builddir)/cpio/test \ + $(PLATFORMCPPFLAGS) +bsdcpio_test_LDADD=libarchive_fe.la + +cpio/test/list.h: Makefile + cat $(top_srcdir)/cpio/test/test_*.c | grep DEFINE_TEST > cpio/test/list.h + +if BUILD_BSDCPIO +bsdcpio_test_programs= bsdcpio_test +bsdcpio_TESTS_ENVIRONMENT= BSDCPIO=`cd $(top_builddir);/bin/pwd`/bsdcpio$(EXEEXT) BSDCPIO_TEST_FILES=`cd $(top_srcdir);/bin/pwd`/cpio/test +else +bsdcpio_test_programs= +bsdcpio_TESTS_ENVIRONMENT= +endif + +bsdcpio_test_EXTRA_DIST= \ + cpio/test/test_gcpio_compat_ref.bin.uu \ + cpio/test/test_gcpio_compat_ref.crc.uu \ + cpio/test/test_gcpio_compat_ref.newc.uu \ + cpio/test/test_gcpio_compat_ref.ustar.uu \ + cpio/test/test_option_f.cpio.uu \ + cpio/test/test_option_m.cpio.uu \ + cpio/test/test_option_t.cpio.uu \ + cpio/test/test_option_t.stdout.uu \ + cpio/test/test_option_tv.stdout.uu \ + cpio/test/CMakeLists.txt diff --git a/Utilities/cmlibarchive/NEWS b/Utilities/cmlibarchive/NEWS new file mode 100644 index 000000000..9c8f46d48 --- /dev/null +++ b/Utilities/cmlibarchive/NEWS @@ -0,0 +1,499 @@ + +Apr 01, 2009: libarchive 2.6.990a released +Apr 01, 2009: Use command-line gunzip, bunzip2, unxz, unlzma for + decompression if the library is built without suitable + libraries. The setup functions return ARCHIVE_WARN + in this case so clients can adapt if necessary. +Apr 01, 2009: Use getpw*_r and getgr*_r functions for thread-safety. +Mar 24, 2009: Add archive_read_next_header2(), which is up to 25% + more efficient for some clients; from Brian Harring. +Mar 22, 2009: PDF versions of manpages are now included in the distribution. +Mar, 2009: Major work to improve Cygwin build by Charles Wilson. +Feb/Mar, 2009: Major work on cmake build support, mostly by Michihiro NAKAJIMA. +Feb/Mar, 2009: Major work on Visual Studio support by Michihiro NAKAJIMA. + All tests now pass. +Feb 25, 2009: Fix Debian Bug #516577 +Feb 21, 2009: Yacc is no longer needed to build; date parser rewritten in C. +Jan/Feb, 2009: Mtree work by Michihiro. +Feb, 2009: Joliet support by Andreas Henriksson. +Jan/Feb, 2009: New options framework by Michihiro. +Feb, 2009: High-res timestamps on Tru64, AIX, and GNU Hurd, by Björn Jacke. +Jan 18, 2009: Extended attributes work on FreeBSD and Linux now with pax format. +Jan 07, 2009: New archive_read_disk_entry_from_file() knows about ACLs, + extended attributes, etc so that bsdtar and bsdcpio don't require + such system-specific knowledge. +Jan 03, 2009: Read filter system extensively refactored. In particular, + read filter pipelines are now built out automatically and individual + filters should be much easier to implement. Documentation on the + Googlecode Wiki explains how to implement new filters. +Dec 28, 2008: Many Windows/Visual Studio fixes from Michihiro NAKAJIMA. + +Dec 28, 2008: Main libarchive development moved from FreeBSD Perforce + server to Google Code. This should make it easier for more + people to participate in libarchive development. + +Dec 28, 2008: libarchive 2.6.0 released +Dec 25, 2008: libarchive 2.5.905a released +Dec 10, 2008: libarchive 2.5.904a released +Dec 04, 2008: libarchive 2.5.903a released +Nov 09, 2008: libarchive 2.5.902a released +Nov 08, 2008: libarchive 2.5.901a released +Nov 08, 2008: Start of pre-release testing for libarchive 2.6 + +Nov 07, 2008: Read filter refactor: The decompression routines just + consume and produce arbitrarily-sized blocks. The reblocking + from read_support_compression_none() has been pulled into the + read core. Also, the decompression bid now makes multiple + passes and stacks read filters. +Oct 21, 2008: bsdcpio: New command-line parser. +Oct 19, 2008: Internal read_ahead change: short reads are now an error +Oct 06, 2008: bsdtar: option parser no longer uses getopt_long(), + gives consistent option parsing on all platforms. +Sep 19, 2008: Jaakko Heinonen: shar utility built on libarchive +Sep 17, 2008: Pedro Giffuni: birthtime support +Sep 17, 2008: Miklos Vajna: lzma reader and test. Note: I still have + some concerns about the auto-detection (LZMA file format + doesn't support auto-detection well), so this is not yet + enabled under archive_read_support_compression_all(). For + now, you must call archive_read_support_compression_lzma() if + you want LZMA read support. +Sep 11, 2008: Ivailo Petrov: Many fixes to Windows build, new solution files +Jul 26, 2008: archive_entry now tracks which values have not been set. + This helps zip extraction (file size is often "unknown") and + time restores (tar usually doesn't know atime). +Jul 26, 2008: Joerg Sonnenberger: Performance improvements to shar writer +Jul 25, 2008: Joerg Sonnenberger: mtree write support + +Jul 02, 2008: libarchive 2.5.5 released + +Jul 02, 2008: libarchive 2.5.5b released +Jul 01, 2008: bsdcpio is being used by enough people, we can call it 1.0.0 now +Jun 20, 2008: bsdcpio: If a -l link fails with EXDEV, copy the file instead +Jun 19, 2008: bsdcpio: additional long options for better GNU cpio compat +Jun 15, 2008: Many small portability and bugfixes since 2.5.4b. + +May 25, 2008: libarchive 2.5.4b released +May 21, 2008: Joerg Sonnenberger: fix bsdtar hardlink handling for newc format + +May 21, 2008: More progress on Windows building. Thanks to "Scott" + for the Windows makefiles, thanks to Kees Zeelenberg for + code contributions. + +May 21, 2008: Fix a number of non-exploitable integer and buffer overflows, + thanks to David Remahl at Apple for pointing these out. + +May 21, 2008: Colin Percival: SIGINFO or SIGUSR1 to bsdtar prints progress info + +May 16, 2008: bsdtar's test harness no longer depends on file ordering. + This was causing spurious test failures on a lot of systems. + Thanks to Bernhard R. Link for the diagnosis. + +May 14, 2008: Joerg Sonnenberger: -s substitution support for bsdtar + +May 13, 2008: Joerg Sonnenberger: Many mtree improvements + +May 11, 2008: Joerg Sonnenberger: fix hardlink extraction when + hardlinks have different permissions from original file + +April 30, 2008: Primary libarchive work has been moved into the FreeBSD + project's Perforce repository: http://perforce.freebsd.org/ + The libarchive project can be browsed at + //depot/user/kientzle/libarchive-portable + Direct link: http://preview.tinyurl.com/46mdgr + +May 04, 2008: libarchive 2.5.3b released + * libarchive: Several fixes to link resolver to address bsdcpio crashes + * bsdcpio: -p hardlink handling fixes + * tar/pax: Ensure ustar dirnames end in '/'; be more careful about + measuring filenames when deciding what pathname fields to use + * libarchive: Mark which entry strings are set; be accurate about + distinguishing empty strings ("") from unset ones (NULL) + * tar: Don't crash reading entries with empty filenames + * libarchive_test, bsdtar_test, bsdcpio_test: Better detaults: + run all tests, delete temp dirs, summarize repeated failures + * -no-undefined to libtool for Cygwin + * libarchive_test: Skip large file tests on systems with 32-bit off_t + * iso9660: Don't bother trying to find the body of an empty file; + this works around strange behavior from some ISO9660 writers + * tar: allow -r -T to be used together + * tar: allow --format with -r or -u + * libarchive: Don't build archive.h + +May 04, 2008: Simplified building: archive.h is no longer constructed + This may require additional #if conditionals on some platforms. + +Mar 30, 2008: libarchive 2.5.1b released + +Mar 15, 2008: libarchive 2.5.0b released +Mar 15, 2008: bsdcpio now seems to correctly write hardlinks into newc, + ustar, and old cpio archives. Just a little more testing before + bsdcpio 1.0 becomes a reality. +Mar 15, 2008: I think the new linkify() interface is finally handling + all known hardlink strategies. +Mar 15, 2008: Mtree read fixes from Joerg Sonnenberger. +Mar 15, 2008: Many new bsdtar and bsdcpio options from Joerg Sonnenberger. +Mar 15, 2008: test harnesses no longer require uudecode; they + now have built-in decoding logic that decodes the reference + files as they are needed. + +Mar 14, 2008: libarchive 2.4.14 released; identical to 2.4.13 except for + a point fix for gname/uname mixup in pax format that was introduced + with the UTF-8 fixes. + +Feb 26, 2008: libarchive 2.4.13 released +Feb 25, 2008: Handle path, linkname, gname, or uname that can't be converted + to/from UTF-8. Implement "hdrcharset" attribute from SUS-2008. +Feb 25, 2008: Fix name clash on NetBSD. +Feb 18, 2008: Fix writing empty 'ar' archives, per Kai Wang +Feb 18, 2008: [bsdtar] Permit appending on block devices. +Feb 09, 2008: New "linkify" resolver to help with newc hardlink writing; + bsdcpio still needs to be converted to use this. +Feb 02, 2008: Windows compatibility fixes from Ivailo Petrov, Kees Zeelenberg +Jan 30, 2008: Ignore hardlink size for non-POSIX tar archives. + +Jan 22, 2008: libarchive 2.4.12 released +Jan 22, 2008: Fix bad padding when writing symlinks to newc cpio archives. +Jan 22, 2008: Verify bsdcpio_test by getting it to work against GNU cpio 2.9. + bsdcpio_test complains about missing options (-y and -z), format + of informational messages (--version, --help), and a minor formatting + issue in odc format output. After this update, bsdcpio_test uncovered + several more cosmetic issues in bsdcpio, all now fixed. +Jan 22, 2008: Experimental support for self-extracting Zip archives. +Jan 22, 2008: Extend hardlink restore strategy to work correctly with + hardlinks extracted from newc cpio files. (Which store the body + only with the last occurrence of a link.) + +Dec 30, 2007: libarchive 2.4.11 released +Dec 30, 2007: Fixed a compile error in bsdcpio on some systems. + +Dec 29, 2007: libarchive 2.4.10 released +Dec 29, 2007: bsdcpio 0.9.0 is ready for wider use. +Dec 29, 2007: Completed initial test harness for bsdcpio. + +Dec 22, 2007: libarchive 2.4.9 released +Dec 22, 2007: Implement the remaining options for bsdcpio: -a, -q, -L, -f, + pattern selection for -i and -it. + +Dec 13, 2007: libarchive 2.4.8 released +Dec 13, 2007: gzip and bzip2 compression now handle zero-byte writes correctly, + Thanks to Damien Golding for bringing this to my attention. + +Dec 12, 2007: libarchive 2.4.7 released + +Dec 10, 2007: libarchive 2.4.6 released +Dec 09, 2007: tar/test/test_copy.c verifies "tar -c | tar -x" copy pipeline +Dec 07, 2007: Fix a couple of minor memory leaks. + +Dec 04, 2007: libarchive 2.4.5 released +Dec 04, 2007: Fix cpio/test/test_write_odc by setting the umask first. + +Dec 03, 2007: libarchive 2.4.4 released +Dec 03, 2007: New configure options --disable-xattr and --disable-acl, + thanks to Samuli Suominen. + +Dec 03, 2007: libarchive 2.4.3 released +Dec 03, 2007: Thanks to Lapo Luchini for sending me a ZIP file that + libarchive couldn't handle. Fixed a bug in handling of + "length at end" flags in ZIP files. +Dec 03, 2007: Fixed bsdcpio -help, bsdtar -help tests. +Dec 02, 2007: First cut at real bsdtar test harness. + +Dec 02, 2007: libarchive 2.4.2 released + +Dec 02, 2007: libarchive 2.4.1 released +Dec 02, 2007: Minor fixes, rough cut of mdoc-to-man conversion for + man pages. + +Oct 30, 2007: libarchive 2.4.0 released +Oct 30, 2007: Minor compile fix thanks to Joerg Schilling. +Oct 30, 2007: Only run the format auction once at the beginning of the + archive. This is simpler and supports better error recovery. +Oct 29, 2007: Test support for very large entries in tar archives: + libarchive_test now exercises entries from 2GB up to 1TB. + +Oct 27, 2007: libarchive 2.3.5 released +Oct 27, 2007: Correct some unnecessary internal data copying in the + "compression none" reader and writer; this reduces user time + by up to 2/3 in some tests. (Thanks to Jan Psota for + publishing his performance test results to GNU tar's bug-tar + mailing list; those results pointed me towards this problem.) +Oct 27, 2007: Fix for skipping archive entries that are exactly + a multiple of 4G on 32-bit platforms. +Oct 25, 2007: Fix for reading very large (>8G) tar archives; this was + broken when I put in support for new GNU tar sparse formats. +Oct 20, 2007: Initial work on new pattern-matching code for cpio; I + hope this eventually replaces the code currently in bsdtar. + +Oct 08, 2007: libarchive 2.3.4 released +Oct 05, 2007: Continuing work on bsdcpio test suite. +Oct 05, 2007: New cpio.5 manpage, updates to "History" of bsdcpio.1 and + bsdtar.1 manpages. +Oct 05, 2007: Fix zip reader to immediately return EOF if you try + to read body of non-regular file. In particular, this fixes + bsdtar extraction of zip archives. + +Sep 30, 2007: libarchive 2.3.3 released +Sep 26, 2007: Rework Makefile.am so that the enable/disable options + actually do the right things. +Sep 26, 2007: cpio-odc and cpio-newc archives no longer write bodies + for non-regular files. +Sep 26, 2007: Test harness for bsdcpio is in place, needs more tests written. + This is much nicer than the ragtag collection of test scripts + that bsdtar has. + +Sep 20, 2007: libarchive 2.3.2 released +Sep 20, 2007: libarchive 2.3.1 broke bsdtar because the archive_write_data() + fix was implemented incorrectly. + +Sep 16, 2007: libarchive 2.3.1 released +Sep 16, 2007: Many fixes to bsdcpio 0.3: handle hardlinks with -p, recognize + block size on writing, fix a couple of segfaults. +Sep 16, 2007: Fixed return value from archive_write_data() when used + with archive_write_disk() to match the documentation and other + instances of this same function. +Sep 15, 2007: Add archive_entry_link_resolver, archive_entry_strmode + +Sep 11, 2007: libarchive 2.2.8 released +Sep 09, 2007: bsdcpio 0.2 supports most (not yet all) of the old POSIX spec. + +Sep 01, 2007: libarchive 2.2.7 released +Aug 31, 2007: Support for reading mtree files, including an mtree.5 manpage + (A little experimental still.) +Aug 18, 2007: Read gtar 1.17 --posix --sparse entries. +Aug 13, 2007: Refined suid/sgid restore handling; it is no longer + an error if suid/sgid bits are dropped when you request + perm restore but don't request owner restore. +Aug 06, 2007: Use --enable-bsdcpio if you want to try bsdcpio + +Aug 05, 2007: libarchive 2.2.6 released +Aug 05, 2007: New configure option --disable-bsdtar, thanks to Joerg + Sonnenberger. +Aug 05, 2007: Several bug fixes from FreeBSD CVS repo. + +Jul 13, 2007: libarchive 2.2.5 released + +Jul 12, 2007: libarchive 2.2.4 released +Jul 12, 2007: Thanks to Colin Percival's help in diagnosing and + fixing several critical security bugs. Details available at + http://security.freebsd.org/advisories/FreeBSD-SA-07:05.libarchive.asc + +May 26, 2007: libarchive 2.2.3 released +May 26, 2007: Fix memory leaks in ZIP reader and shar writer, add some + missing system headers to archive_entry.h, dead code cleanup + from Colin Percival, more tests for gzip/bzip2, fix an + EOF anomaly in bzip2 decompression. + +May 12, 2007: libarchive 2.2.2 released +May 12, 2007: Fix archive_write_disk permission restore by cloning + entry passed into write_header so that permission info is + still available at finish_entry time. (archive_read_extract() + worked okay because it held onto the passed-in entry, but + direct consumers of archive_write_disk would break). This + required fixing archive_entry_clone(), which now works and has + a reasonably complete test case. +May 10, 2007: Skeletal cpio implementation. + +May 06, 2007: libarchive 2.2.1 released +May 06, 2007: Flesh out a lot more of test_entry.c so as to catch + problems such as the device node breakage before releasing . +May 05, 2007: Fix a bad bug introduced in 2.1.9 that broke device + node entries in tar archives. +May 03, 2007: Move 'struct stat' out of archive_entry core as well. + This removes some portability headaches and fixes a bunch + of corner cases that arise when manipulating archives on + dissimilar systems. + +Apr 30, 2007: libarchive 2.1.10 released +Apr 31, 2007: Minor code cleanup. + +Apr 24, 2007: libarchive 2.1.9 released +Apr 24, 2007: Fix some recently-introduced problems with libraries + (Just let automake handle it and it all works much better.) + Finish isolating major()/minor()/makedev() in archive_entry.c. + +Apr 23, 2007: libarchive 2.1.8 released +Apr 23, 2007: Minor fixes found from building on MacOS X + +Apr 22, 2007: libarchive 2.1.7 released +Apr 22, 2007: Eliminated all uses of 'struct stat' from the + format readers/writers. This should improve portability; + 'struct stat' is now only used in archive_entry and in + code that actually touches the disk. + +Apr 17, 2007: libarchive 2.1.6 released + Libarchive now compiles and passes all tests on Interix. + +Apr 16, 2007: libarchive 2.1.5 released + +Apr 15, 2007: libarchive 2.1b2 released +Apr 15, 2007: New libarchive_internals.3 documentation of internal APIs. + Not complete, but should prove helpful. +Apr 15, 2007: Experimental "read_compress_program" and "write_compress_program" + for using libarchive with external compression. Not yet + well tested, and likely has portability issues. Feedback + appreciated. + +Apr 14, 2007: libarchive 2.0.31 released +Apr 14, 2007: More fixes for Interix, more 'ar' work + +Apr 14, 2007: libarchive 2.0.30 released +Apr 13, 2007: libarchive now enforces trailing '/' on dirs + written to tar archives + +Apr 11, 2007: libarchive 2.0.29 released +Apr 11, 2007: Make it easier to statically configure for different platforms. +Apr 11, 2007: Updated config.guess, config.sub, libtool + +Apr 06, 2007: libarchive 2.0.28 released +Apr 06, 2007: 'ar' format read/write support thanks to Kai Wang. + +Apr 01, 2007: libarchive 2.0.27 released +Mar 31, 2007: Several minor fixes from Colin Percival and Joerg Sonnenberger. + +Mar 12, 2007: libarchive 2.0.25 released +Mar 12, 2007: Fix broken --unlink flag. + +Mar 11, 2007: libarchive 2.0.24 released +Mar 10, 2007: Correct an ACL blunder that causes any ACL with an entry + that refers to a non-existent user or group to not be restored correctly. + The fix both makes the parser more tolerant (so that archives created + with the buggy ACLs can be read now) and corrects the ACL formatter. +Mar 10, 2007: More work on test portability to Linux. + +Mar 10, 2007: libarchive 2.0.22 released +Mar 10, 2007: Header cleanups; added linux/fs.h, removed + some unnecessary headers, added #include guards in bsdtar. + If you see any obvious compile failures from this, let me know. +Mar 10, 2007: Work on bsdtar test scripts: not yet robust enough + to enable as part of "make check", but getting better. +Mar 10, 2007: libarchive now returns ARCHIVE_FAILED when + a header write fails in a way that only affects this item. + Less bad than ARCHIVE_FATAL, but worse than ARCHIVE_WARN. + +Mar 07, 2007: libarchive 2.0.21 released +Mar 07, 2007: Add some ACL tests (only for the system-independent + portion of the ACL support for now). +Mar 07, 2007: tar's ability to read ACLs off disk got + turned off for FreeBSD; re-enable it. (ACL restores and + libarchive support for storing/reading ACLs from pax + archives was unaffected.) + +Mar 02, 2007: libarchive 2.0.20 released +Mar 2, 2007: It's not perfect, but it's pretty good. + Libarchive 2.0 is officially out of beta. + +Feb 28, 2007: libarchive 2.0b17 released +Feb 27, 2007: Make the GID restore checks more robust by checking + whether the current user has too few or too many privileges. + +Feb 26, 2007: libarchive 2.0b15 released +Feb 26, 2007: Don't lose symlinks when extracting from ISOs. + Thanks to Diego "Flameeyes" Pettenò for telling me about the + broken testcase on Gentoo that (finally!) led me to the cause + of this long-standing bug. + +Feb 26, 2007: libarchive 2.0b14 released +Feb 26, 2007: Fix a broken test on platforms that lack lchmod(). + +Feb 25, 2007: libarchive 2.0b13 released +Feb 25, 2007: Empty archives were being written as empty files, + without a proper end-of-archive marker. Fixed. + +Feb 23, 2007: libarchive 2.0b12 released +Feb 22, 2007: Basic security checks added: _EXTRACT_SECURE_NODOTDOT + and _EXTRACT_SECURE_SYMLINK. These checks used to be in bsdtar, + but they belong down in libarchive where they can be used by + other tools and where they can be better optimized. + +Feb 11, 2007: libarchive 2.0b11 released +Feb 10, 2007: Fixed a bunch of errors in libarchive's handling + of EXTRACT_PERM and EXTRACT_OWNER, especially relating + to SUID and SGID bits. + +Jan 31, 2007: libarchive 2.0b9 released +Jan 31, 2007: Added read support for "empty" archives as a + distinct archive format. Bsdtar uses this to handle, e.g., + "touch foo.tar; tar -rf foo.tar" + +Jan 22, 2007: libarchive 2.0b6 released +Jan 22, 2007: archive_write_disk API is now in place. It provides + a finer-grained interface than archive_read_extract. In particular, + you can use it to create objects on disk without having an archive + around (just feed it archive_entry objects describing what you + want to create), you can override the uname/gname-to-uid/gid lookups + (minitar uses this to avoid getpwXXX() and getgrXXX() bloat). + +Jan 09, 2007: libarchive 2.0a3 released +Jan 9, 2007: archive_extract is now much better; it handles the + most common cases with a minimal number of system calls. + Some features still need a lot of testing, especially corner + cases involving objects that already exist on disk. I expect + the next round of API overhaul will simplify building test cases. +Jan 9, 2007: a number of fixes thanks to Colin Percival, especially + corrections to the skip() framework and handling of large files. +Jan 9, 2007: Fixes for large ISOs. The code should correctly handle + very large ISOs with entries up to 4G. Thanks to Robert Sciuk + for pointing out these issues. + +Sep 05, 2006: libarchive 1.3.1 released +Sep 5, 2006: Bump version to 1.3 for new I/O wrappers. +Sep 4, 2006: New memory and FILE read/write wrappers. +Sep 4, 2006: libarchive test harness is now minimally functional; + it's located a few minor bugs in error-handling logic + +Aug 17, 2006: libarchive 1.2.54 released +Aug 17, 2006: Outline ABI changes for libarchive 2.0; these + are protected behind #ifdef's until I think I've found everything + that needs to change. +Aug 17, 2006: Fix error-handling in archive_read/write_close() + They weren't returning any errors before. +Aug 17, 2006: Fix recursive-add logic to not trigger if it's not set + Fixes a bug adding files when writing archive to pipe or when + using archive_write_open() directly. +Jul 2006: New "skip" handling improves performance extracting + single files from large uncompressed archives. + +Mar 21, 2006: 1.2.52 released +Mar 21, 2006: Fix -p on platforms that don't have platform-specific + extended attribute code. +Mar 20, 2006: Add NEWS file; fill in some older history from other + files. I'll try to keep this file up-to-date from now on. + +OLDER NEWS SUMMARIES + +Mar 19, 2006: libarchive 1.2.51 released +Mar 18, 2006: Many fixes to extended attribute support, including a redesign + of the storage format to simplify debugging. +Mar 12, 2006: Remove 'tp' support; it was a fun idea, but not worth + spending much time on. +Mar 11, 2006: Incorporated Jaakko Heinonen's still-experimental support + for extended attributes (Currently Linux-only.). +Mar 11, 2006: Reorganized distribution package: There is now one tar.gz + file that builds both libarchive and bsdtar. +Feb 13, 2006: Minor bug fixes: correctly read cpio device entries, write + Pax attribute entry names. +Nov 7, 2005: Experimental 'tp' format support in libarchive. Feedback + appreciated; this is not enabled by archive_read_support_format_all() + yet as I'm not quite content with the format detection heuristics. +Nov 7, 2005: Some more portability improvements thanks to Darin Broady, + minor bugfixes. +Oct 12, 2005: Use GNU libtool to build shared libraries on many systems. +Aug 9, 2005: Correctly detect that MacOS X does not have POSIX ACLs. +Apr 17, 2005: Kees Zeelenberg has ported libarchive and bsdtar to Windows: + http://gnuwin32.sourceforge.net/ +Apr 11, 2005: Extended Zip/Zip64 support thanks to Dan Nelson. -L/-h + fix from Jaakko Heinonen. +Mar 12, 2005: archive_read_extract can now handle very long + pathnames (I've tested with pathnames up to 1MB). +Mar 12, 2005: Marcus Geiger has written an article about libarchive + http://xsnil.antbear.org/2005/02/05/archive-mit-libarchive-verarbeiten/ + including examples of using it from Objective-C. His MoinX + http://moinx.antbear.org/ desktop Wiki uses + libarchive for archiving and restoring Wiki pages. +Jan 22, 2005: Preliminary ZIP extraction support, + new directory-walking code for bsdtar. +Jan 16, 2005: ISO9660 extraction code added; manpage corrections. +May 22, 2004: Many gtar-compatible long options have been added; almost + all FreeBSD ports extract correctly with bsdtar. +May 18, 2004: bsdtar can read Solaris, HP-UX, Unixware, star, gtar, + and pdtar archives. diff --git a/Utilities/cmlibarchive/README b/Utilities/cmlibarchive/README new file mode 100644 index 000000000..cfbb7657e --- /dev/null +++ b/Utilities/cmlibarchive/README @@ -0,0 +1,137 @@ +README for libarchive bundle. + +Questions? Issues? + * http://libarchive.googlecode.com/ is the home for ongoing + libarchive development, including issue tracker, additional + documentation, and links to the libarchive mailing lists. + +This distribution bundle includes the following components: + * libarchive: a library for reading and writing streaming archives + * tar: the 'bsdtar' program is a full-featured 'tar' + replacement built on libarchive + * cpio: the 'bsdcpio' program is a different interface to + essentially the same functionality + * examples: Some small example programs that you may find useful. + * examples/minitar: a compact sample demonstrating use of libarchive. + I use this for testing link pollution; it should produce a very + small executable file on most systems. + * contrib: Various items sent to me by third parties; + please contact the authors with any questions. + +The top-level directory contains the following information files: + * NEWS - highlights of recent changes + * COPYING - what you can do with this + * INSTALL - installation instructions + * README - this file + * configure - configuration script, see INSTALL for details. + * CMakeLists.txt - input for "cmake" build tool, see INSTALL + +The following files in the top-level directory are used by the +'configure' script: + * Makefile.am, aclocal.m4, configure.ac + - used to build this distribution, only needed by maintainers + * Makefile.in, config.h.in + - templates used by configure script + +Guide to Documentation installed by this system: + * bsdtar.1 explains the use of the bsdtar program + * bsdcpio.1 explains the use of the bsdcpio program + * libarchive.3 gives an overview of the library as a whole + * archive_read.3, archive_write.3, archive_write_disk.3, and + archive_read_disk.3 provide detailed calling sequences for the read + and write APIs + * archive_entry.3 details the "struct archive_entry" utility class + * archive_internals.3 provides some insight into libarchive's + internal structure and operation. + * libarchive-formats.5 documents the file formats supported by the library + * cpio.5, mtree.5, and tar.5 provide detailed information about these + popular archive formats, including hard-to-find details about + modern cpio and tar variants. +The manual pages above are provided in the 'doc' directory in +a number of different formats. + +You should also read the copious comments in "archive.h" and the +source code for the sample programs for more details. Please let me +know about any errors or omissions you find. + +Currently, the library automatically detects and reads the following: + * gzip compression + * bzip2 compression + * compress/LZW compression + * lzma and xz compression + * GNU tar format (including GNU long filenames, long link names, and + sparse files) + * Solaris 9 extended tar format (including ACLs) + * Old V7 tar archives + * POSIX ustar + * POSIX pax interchange format + * POSIX octet-oriented cpio + * SVR4 ASCII cpio + * POSIX octet-oriented cpio + * Binary cpio (big-endian or little-endian) + * ISO9660 CD-ROM images (with optional Rockridge or Joliet extensions) + * ZIP archives (with uncompressed or "deflate" compressed entries) + * GNU and BSD 'ar' archives + * 'mtree' format + +The library can write: + * gzip compression + * bzip2 compression + * compress/LZW compression + * lzma and xz compression + * POSIX ustar + * POSIX pax interchange format + * "restricted" pax format, which will create ustar archives except for + entries that require pax extensions (for long filenames, ACLs, etc). + * POSIX octet-oriented cpio + * SVR4 "newc" cpio + * shar archives + * ZIP archives (with uncompressed or "deflate" compressed entries) + * GNU and BSD 'ar' archives + * 'mtree' format + +Notes about the library architecture: + + * This is a heavily stream-oriented system. There is no direct + support for in-place modification or random access. + + * The library is designed to be extended with new compression and + archive formats. The only requirement is that the format be + readable or writable as a stream and that each archive entry be + independent. There are articles on the libarchive Wiki explaining + how to extend libarchive. + + * On read, compression and format are always detected automatically. + + * I've attempted to minimize static link pollution. If you don't + explicitly invoke a particular feature (such as support for a + particular compression or format), it won't get pulled in. + In particular, if you don't explicitly enable a particular + compression or decompression support, you won't need to link + against the corresponding compression or decompression libraries. + This also reduces the size of statically-linked binaries in + environments where that matters. + + * On read, the library accepts whatever blocks you hand it. + Your read callback is free to pass the library a byte at a time + or mmap the entire archive and give it to the library at once. + On write, the library always produces correctly-blocked output. + + * The object-style approach allows you to have multiple archive streams + open at once. bsdtar uses this in its "@archive" extension. + + * The archive itself is read/written using callback functions. + You can read an archive directly from an in-memory buffer or + write it to a socket, if you wish. There are some utility + functions to provide easy-to-use "open file," etc, capabilities. + + * The read/write APIs are designed to allow individual entries + to be read or written to any data source: You can create + a block of data in memory and add it to a tar archive without + first writing a temporary file. You can also read an entry from + an archive and write the data directly to a socket. If you want + to read/write entries to disk, there are convenience functions to + make this especially easy. + + * Note: "pax interchange format" is really an extended tar format, + despite what the name says. diff --git a/Utilities/cmlibarchive/build/autoconf/check_stdcall_func.m4 b/Utilities/cmlibarchive/build/autoconf/check_stdcall_func.m4 new file mode 100644 index 000000000..926b046c5 --- /dev/null +++ b/Utilities/cmlibarchive/build/autoconf/check_stdcall_func.m4 @@ -0,0 +1,51 @@ +# AC_LANG_STDCALL_FUNC_LINK_TRY(FUNCTION, SIGNATURE) +# ------------------------------- +# Produce a source which links correctly iff the FUNCTION exists. +AC_DEFUN([AC_LANG_STDCALL_FUNC_LINK_TRY], +[_AC_LANG_DISPATCH([$0], _AC_LANG, $@)]) + +# AC_CHECK_STDCALL_FUNC(FUNCTION, SIGNATURE, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# ----------------------------------------------------------------- +AC_DEFUN([AC_CHECK_STDCALL_FUNC], +[AS_VAR_PUSHDEF([ac_var], [ac_cv_func_$1])dnl +AC_CACHE_CHECK([for $1], ac_var, +[AC_LINK_IFELSE([AC_LANG_STDCALL_FUNC_LINK_TRY([$1],[$2])], + [AS_VAR_SET(ac_var, yes)], + [AS_VAR_SET(ac_var, no)])]) +AS_IF([test AS_VAR_GET(ac_var) = yes], [$3], [$4])dnl +AS_VAR_POPDEF([ac_var])dnl +])# AC_CHECK_FUNC + +# AC_LANG_STDCALL_FUNC_LINK_TRY(C)(FUNCTION, SIGNATURE) +# ---------------------------------- +# Don't include because on OSF/1 3.0 it includes +# which includes which contains a +# prototype for select. Similarly for bzero. +m4_define([AC_LANG_STDCALL_FUNC_LINK_TRY(C)], +[AC_LANG_PROGRAM( +[/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char __stdcall $1 ( $2 ) below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char __stdcall $1 ( $2 ); +char (*f) ( $2 ); +], +[/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$1) || defined (__stub___$1) +choke me +#else +f = $1; +#endif +])]) + +# AC_LANG_STDCALL_FUNC_LINK_TRY(C++)(FUNCTION) +# ------------------------------------ +m4_copy([AC_LANG_STDCALL_FUNC_LINK_TRY(C)], [AC_LANG_STDCALL_FUNC_LINK_TRY(C++)]) + diff --git a/Utilities/cmlibarchive/build/autoconf/la_uid_t.m4 b/Utilities/cmlibarchive/build/autoconf/la_uid_t.m4 new file mode 100644 index 000000000..107a2fd77 --- /dev/null +++ b/Utilities/cmlibarchive/build/autoconf/la_uid_t.m4 @@ -0,0 +1,20 @@ +# la_TYPE_UID_T +# ------------- +AC_DEFUN([la_TYPE_UID_T], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CACHE_CHECK(for uid_t in sys/types.h, la_cv_type_uid_t, +[AC_EGREP_HEADER(uid_t, sys/types.h, + la_cv_type_uid_t=yes, la_cv_type_uid_t=no)]) +if test $la_cv_type_uid_t = no; then + case $host in + *mingw*) def_uid_t=short ;; + *) def_uid_t=int ;; + esac + AC_DEFINE_UNQUOTED(uid_t, [$def_uid_t], + [Define to match typeof st_uid field of struct stat if doesn't define.]) + AC_DEFINE_UNQUOTED(gid_t, [$def_uid_t], + [Define to match typeof st_gid field of struct stat if doesn't define.]) +fi +]) +AU_ALIAS([AC_TYPE_UID_T], [la_TYPE_UID_T]) + diff --git a/Utilities/cmlibarchive/build/autogen.sh b/Utilities/cmlibarchive/build/autogen.sh new file mode 100755 index 000000000..03cd65737 --- /dev/null +++ b/Utilities/cmlibarchive/build/autogen.sh @@ -0,0 +1,25 @@ +#!/bin/sh + + +# Start from one level above the build directory +if [ -f version ]; then + cd .. +fi + +if [ \! -f build/version ]; then + echo "Can't find source directory" + exit 1 +fi + +set -xe +aclocal -I build/autoconf + +# Note: --automake flag needed only for libtoolize from +# libtool 1.5.x; in libtool 2.2.x it is a synonym for --quiet +case `uname` in +Darwin) glibtoolize --automake -c;; +*) libtoolize --automake -c;; +esac +autoconf +autoheader +automake -a -c diff --git a/Utilities/cmlibarchive/build/cmake/CheckFileOffsetBits.c b/Utilities/cmlibarchive/build/cmake/CheckFileOffsetBits.c new file mode 100644 index 000000000..d948fecf2 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckFileOffsetBits.c @@ -0,0 +1,14 @@ +#include + +#define KB ((off_t)1024) +#define MB ((off_t)1024 * KB) +#define GB ((off_t)1024 * MB) +#define TB ((off_t)1024 * GB) +int t2[(((64 * GB -1) % 671088649) == 268434537) + && (((TB - (64 * GB -1) + 255) % 1792151290) == 305159546)? 1: -1]; + +int main() +{ + ; + return 0; +} diff --git a/Utilities/cmlibarchive/build/cmake/CheckFileOffsetBits.cmake b/Utilities/cmlibarchive/build/cmake/CheckFileOffsetBits.cmake new file mode 100644 index 000000000..5f4e053d0 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckFileOffsetBits.cmake @@ -0,0 +1,43 @@ +# - Check if _FILE_OFFSET_BITS macro needed for large files +# CHECK_FILE_OFFSET_BITS () +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# Copyright (c) 2009, Michihiro NAKAJIMA +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +#INCLUDE(CheckCXXSourceCompiles) + +MACRO (CHECK_FILE_OFFSET_BITS) + + IF(NOT DEFINED _FILE_OFFSET_BITS) + MESSAGE(STATUS "Cheking _FILE_OFFSET_BITS for large files") + TRY_COMPILE(__WITHOUT_FILE_OFFSET_BITS_64 + ${CMAKE_BINARY_DIR} + ${libarchive_SOURCE_DIR}/build/cmake/CheckFileOffsetBits.c + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}) + IF(NOT __WITHOUT_FILE_OFFSET_BITS_64) + TRY_COMPILE(__WITH_FILE_OFFSET_BITS_64 + ${CMAKE_BINARY_DIR} + ${libarchive_SOURCE_DIR}/build/cmake/CheckFileOffsetBits.c + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_FILE_OFFSET_BITS=64) + ENDIF(NOT __WITHOUT_FILE_OFFSET_BITS_64) + + IF(NOT __WITHOUT_FILE_OFFSET_BITS_64 AND __WITH_FILE_OFFSET_BITS_64) + SET(_FILE_OFFSET_BITS 64 CACHE INTERNAL "_FILE_OFFSET_BITS macro needed for large files") + MESSAGE(STATUS "Cheking _FILE_OFFSET_BITS for large files - needed") + ELSE(NOT __WITHOUT_FILE_OFFSET_BITS_64 AND __WITH_FILE_OFFSET_BITS_64) + SET(_FILE_OFFSET_BITS "" CACHE INTERNAL "_FILE_OFFSET_BITS macro needed for large files") + MESSAGE(STATUS "Cheking _FILE_OFFSET_BITS for large files - not needed") + ENDIF(NOT __WITHOUT_FILE_OFFSET_BITS_64 AND __WITH_FILE_OFFSET_BITS_64) + ENDIF(NOT DEFINED _FILE_OFFSET_BITS) + +ENDMACRO (CHECK_FILE_OFFSET_BITS) + diff --git a/Utilities/cmlibarchive/build/cmake/CheckFuncs.cmake b/Utilities/cmlibarchive/build/cmake/CheckFuncs.cmake new file mode 100644 index 000000000..923c693a9 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckFuncs.cmake @@ -0,0 +1,47 @@ +# Check if the system has the specified function; treat glibc "stub" +# functions as nonexistent: +# CHECK_FUNCTION_EXISTS_GLIBC (FUNCTION FUNCVAR) +# +# FUNCTION - the function(s) where the prototype should be declared +# FUNCVAR - variable to define if the function does exist +# +# In particular, this understands the glibc convention of +# defining macros __stub_XXXX or __stub___XXXX if the function +# does appear in the library but is merely a stub that does nothing. +# By detecting this case, we can select alternate behavior on +# platforms that don't support this functionality. +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# Copyright (c) 2009, Michihiro NAKAJIMA +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +INCLUDE(CheckFunctionExists) + +MACRO (CHECK_FUNCTION_EXISTS_GLIBC _FUNC _FUNCVAR) + IF(NOT DEFINED ${_FUNCVAR}) + SET(CHECK_STUB_FUNC_1 "__stub_${_FUNC}") + SET(CHECK_STUB_FUNC_2 "__stub___${_FUNC}") + CONFIGURE_FILE( ${libarchive_SOURCE_DIR}/build/cmake/CheckFuncs_stub.c.in + ${CMAKE_BINARY_DIR}/cmake.tmp/CheckFuncs_stub.c IMMEDIATE) + TRY_COMPILE(__stub + ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}/cmake.tmp/CheckFuncs_stub.c + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + CMAKE_FLAGS + -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_INCLUDE_FILE_FLAGS} + "${CHECK_INCLUDE_FILE_C_INCLUDE_DIRS}") + IF (__stub) + SET("${_FUNCVAR}" "" CACHE INTERNAL "Have function ${_FUNC}") + ELSE (__stub) + CHECK_FUNCTION_EXISTS("${_FUNC}" "${_FUNCVAR}") + ENDIF (__stub) + ENDIF(NOT DEFINED ${_FUNCVAR}) +ENDMACRO (CHECK_FUNCTION_EXISTS_GLIBC) + diff --git a/Utilities/cmlibarchive/build/cmake/CheckFuncs_stub.c.in b/Utilities/cmlibarchive/build/cmake/CheckFuncs_stub.c.in new file mode 100644 index 000000000..50da414b5 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckFuncs_stub.c.in @@ -0,0 +1,16 @@ +#ifdef __STDC__ +#include +#else +#include +#endif + +int +main() +{ +#if defined ${CHECK_STUB_FUNC_1} || defined ${CHECK_STUB_FUNC_2} + return 0; +#else +this system have stub + return 0; +#endif +} diff --git a/Utilities/cmlibarchive/build/cmake/CheckHeaderDirent.cmake b/Utilities/cmlibarchive/build/cmake/CheckHeaderDirent.cmake new file mode 100644 index 000000000..e9a7ea855 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckHeaderDirent.cmake @@ -0,0 +1,32 @@ +# - Check if the system has the specified type +# CHECK_HEADER_DIRENT (HEADER1 HEARDER2 ...) +# +# HEADER - the header(s) where the prototype should be declared +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# Copyright (c) 2009, Michihiro NAKAJIMA +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +INCLUDE(CheckTypeExists) + +MACRO (CHECK_HEADER_DIRENT) + CHECK_TYPE_EXISTS("DIR *" dirent.h HAVE_DIRENT_H) + IF(NOT HAVE_DIRENT_H) + CHECK_TYPE_EXISTS("DIR *" sys/ndir.h HAVE_SYS_NDIR_H) + IF(NOT HAVE_SYS_NDIR_H) + CHECK_TYPE_EXISTS("DIR *" ndir.h HAVE_NDIR_H) + IF(NOT HAVE_NDIR_H) + CHECK_TYPE_EXISTS("DIR *" sys/dir.h HAVE_SYS_DIR_H) + ENDIF(NOT HAVE_NDIR_H) + ENDIF(NOT HAVE_SYS_NDIR_H) + ENDIF(NOT HAVE_DIRENT_H) +ENDMACRO (CHECK_HEADER_DIRENT) + diff --git a/Utilities/cmlibarchive/build/cmake/CheckHeaderSTDC.c b/Utilities/cmlibarchive/build/cmake/CheckHeaderSTDC.c new file mode 100644 index 000000000..cba081041 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckHeaderSTDC.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include + +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) + +int +main() +{ + int i; + + for (i = 0; i < 256; i++) { + if (XOR(islower(i), ISLOWER(i)) || toupper(i) != TOUPPER(i)) + return 2; + } + return 0; +} diff --git a/Utilities/cmlibarchive/build/cmake/CheckHeaderSTDC.cmake b/Utilities/cmlibarchive/build/cmake/CheckHeaderSTDC.cmake new file mode 100644 index 000000000..ca0698e61 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckHeaderSTDC.cmake @@ -0,0 +1,65 @@ +# +# - Check if the system has the ANSI C files +# CHECK_HEADER_STDC +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# Copyright (c) 2009, Michihiro NAKAJIMA +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO (CHECK_HEADER_STDC) + IF(NOT DEFINED STDC_HEADERS) + IF(CMAKE_REQUIRED_INCLUDES) + SET(CHECK_HEADER_STDC_C_INCLUDE_DIRS "-DINCLUDE_DIRECTORIES=${CMAKE_REQUIRED_INCLUDES}") + ELSE(CMAKE_REQUIRED_INCLUDES) + SET(CHECK_HEADER_STDC_C_INCLUDE_DIRS) + ENDIF(CMAKE_REQUIRED_INCLUDES) + SET(MACRO_CHECK_HEADER_STDC_FLAGS ${CMAKE_REQUIRED_FLAGS}) + + MESSAGE(STATUS "Cheking for ANSI C header files") + TRY_RUN(CHECK_HEADER_STDC_result + CHECK_HEADER_STDC_compile_result + ${CMAKE_BINARY_DIR} + ${libarchive_SOURCE_DIR}/build/cmake/CheckHeaderSTDC.c + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + CMAKE_FLAGS + -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_HEADER_STDC_FLAGS} + "${CHECK_HEADER_STDC_C_INCLUDE_DIRS}" + OUTPUT_VARIABLE OUTPUT) + + IF(CHECK_HEADER_STDC_compile_result AND CHECK_HEADER_STDC_result EQUAL 0) + FIND_PATH(CHECK_HEADER_STDC_path "string.h") + IF (CHECK_HEADER_STDC_path) + FILE(STRINGS "${CHECK_HEADER_STDC_path}/string.h" CHECK_HEADER_STDC_result REGEX "[^a-zA-Z_]memchr[^a-zA-Z_]") + IF (CHECK_HEADER_STDC_result) + FILE(STRINGS "${CHECK_HEADER_STDC_path}/stdlib.h" CHECK_HEADER_STDC_result REGEX "[^a-zA-Z_]free[^a-zA-Z_]") + ENDIF (CHECK_HEADER_STDC_result) + ENDIF (CHECK_HEADER_STDC_path) + ENDIF(CHECK_HEADER_STDC_compile_result AND CHECK_HEADER_STDC_result EQUAL 0) + + IF(CHECK_HEADER_STDC_result) + MESSAGE(STATUS "Cheking for ANSI C header files - found") + SET(STDC_HEADERS 1 CACHE INTERNAL "Have ANSI C headers") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the include file ${INCLUDE} " + "exists passed with the following output:\n" + "${OUTPUT}\n\n") + ELSE(CHECK_HEADER_STDC_result) + MESSAGE(STATUS "Cheking for ANSI C header files - not found") + SET(STDC_HEADERS "" CACHE INTERNAL "Have ANSI C headers") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the include file ${INCLUDE} " + "exists failed with the following output:\n" + "${OUTPUT}\n\n") + ENDIF(CHECK_HEADER_STDC_result) + + ENDIF(NOT DEFINED STDC_HEADERS) +ENDMACRO (CHECK_HEADER_STDC) + diff --git a/Utilities/cmlibarchive/build/cmake/CheckStructMember.cmake b/Utilities/cmlibarchive/build/cmake/CheckStructMember.cmake new file mode 100644 index 000000000..05ddb3a11 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckStructMember.cmake @@ -0,0 +1,43 @@ +# - Check if the given struct or class has the specified member variable +# CHECK_STRUCT_MEMBER (STRUCT MEMBER HEADER VARIABLE) +# +# STRUCT - the name of the struct or class you are interested in +# MEMBER - the member which existence you want to check +# HEADER - the header(s) where the prototype should be declared +# VARIABLE - variable to store the result +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories + +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +INCLUDE(CheckCSourceCompiles) + +MACRO (CHECK_STRUCT_MEMBER _STRUCT _MEMBER _HEADER _RESULT) + SET(_INCLUDE_FILES) + FOREACH (it ${_HEADER}) + SET(_INCLUDE_FILES "${_INCLUDE_FILES}#include <${it}>\n") + ENDFOREACH (it) + + SET(_CHECK_STRUCT_MEMBER_SOURCE_CODE " +${_INCLUDE_FILES} +int main() +{ + static ${_STRUCT} tmp; + if (sizeof(tmp.${_MEMBER})) + return 0; + return 0; +} +") + CHECK_C_SOURCE_COMPILES("${_CHECK_STRUCT_MEMBER_SOURCE_CODE}" ${_RESULT}) + +ENDMACRO (CHECK_STRUCT_MEMBER) + diff --git a/Utilities/cmlibarchive/build/cmake/CheckTypeExists.cmake b/Utilities/cmlibarchive/build/cmake/CheckTypeExists.cmake new file mode 100644 index 000000000..b05234fd8 --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/CheckTypeExists.cmake @@ -0,0 +1,42 @@ +# - Check if the system has the specified type +# CHECK_TYPE_EXISTS (TYPE HEADER VARIABLE) +# +# TYPE - the name of the type or struct or class you are interested in +# HEADER - the header(s) where the prototype should be declared +# VARIABLE - variable to store the result +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# Copyright (c) 2009, Michihiro NAKAJIMA +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +INCLUDE(CheckCSourceCompiles) + +MACRO (CHECK_TYPE_EXISTS _TYPE _HEADER _RESULT) + SET(_INCLUDE_FILES) + FOREACH (it ${_HEADER}) + SET(_INCLUDE_FILES "${_INCLUDE_FILES}#include <${it}>\n") + ENDFOREACH (it) + + SET(_CHECK_TYPE_EXISTS_SOURCE_CODE " +${_INCLUDE_FILES} +int main() +{ + static ${_TYPE} tmp; + if (sizeof(tmp)) + return 0; + return 0; +} +") + CHECK_C_SOURCE_COMPILES("${_CHECK_TYPE_EXISTS_SOURCE_CODE}" ${_RESULT}) + +ENDMACRO (CHECK_TYPE_EXISTS) + diff --git a/Utilities/cmlibarchive/build/cmake/FindLZMA.cmake b/Utilities/cmlibarchive/build/cmake/FindLZMA.cmake new file mode 100644 index 000000000..1d065c4ab --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/FindLZMA.cmake @@ -0,0 +1,52 @@ +# - Find lzma and lzmadec +# Find the native LZMA includes and library +# +# LZMA_INCLUDE_DIR - where to find lzma.h, etc. +# LZMA_LIBRARIES - List of libraries when using liblzma. +# LZMA_FOUND - True if liblzma found. +# LZMADEC_INCLUDE_DIR - where to find lzmadec.h, etc. +# LZMADEC_LIBRARIES - List of libraries when using liblzmadec. +# LZMADEC_FOUND - True if liblzmadec found. + +IF (LZMA_INCLUDE_DIR) + # Already in cache, be silent + SET(LZMA_FIND_QUIETLY TRUE) +ENDIF (LZMA_INCLUDE_DIR) + +FIND_PATH(LZMA_INCLUDE_DIR lzma.h) +FIND_LIBRARY(LZMA_LIBRARY NAMES lzma ) + +# handle the QUIETLY and REQUIRED arguments and set LZMA_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZMA DEFAULT_MSG LZMA_LIBRARY LZMA_INCLUDE_DIR) + +IF(LZMA_FOUND) + SET( LZMA_LIBRARIES ${LZMA_LIBRARY} ) +ELSE(LZMA_FOUND) + SET( LZMA_LIBRARIES ) + + IF (LZMADEC_INCLUDE_DIR) + # Already in cache, be silent + SET(LZMADEC_FIND_QUIETLY TRUE) + ENDIF (LZMADEC_INCLUDE_DIR) + + FIND_PATH(LZMADEC_INCLUDE_DIR lzmadec.h) + FIND_LIBRARY(LZMADEC_LIBRARY NAMES lzmadec ) + + # handle the QUIETLY and REQUIRED arguments and set LZMADEC_FOUND to TRUE if + # all listed variables are TRUE + INCLUDE(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZMADEC DEFAULT_MSG LZMADEC_LIBRARY + LZMADEC_INCLUDE_DIR) + + IF(LZMADEC_FOUND) + SET( LZMADEC_LIBRARIES ${LZMADEC_LIBRARY} ) + ELSE(LZMADEC_FOUND) + SET( LZMADEC_LIBRARIES ) + ENDIF(LZMADEC_FOUND) +ENDIF(LZMA_FOUND) + + +MARK_AS_ADVANCED( LZMA_LIBRARY LZMA_INCLUDE_DIR + LZMADEC_LIBRARY LZMADEC_INCLUDE_DIR ) diff --git a/Utilities/cmlibarchive/build/cmake/config.h.in b/Utilities/cmlibarchive/build/cmake/config.h.in new file mode 100644 index 000000000..8bb2d9cde --- /dev/null +++ b/Utilities/cmlibarchive/build/cmake/config.h.in @@ -0,0 +1,700 @@ +/* config.h. Generated from config.h.cmake by cmake configure */ + +/* Version number of bsdcpio */ +#cmakedefine BSDCPIO_VERSION_STRING "${BSDCPIO_VERSION_STRING}" + +/* Version number of bsdtar */ +#cmakedefine BSDTAR_VERSION_STRING "${BSDTAR_VERSION_STRING}" + +/* Define to 1 if you have the `acl_create_entry' function. */ +#cmakedefine HAVE_ACL_CREATE_ENTRY 1 + +/* Define to 1 if you have the `acl_get_link' function. */ +#cmakedefine HAVE_ACL_GET_LINK 1 + +/* Define to 1 if you have the `acl_get_link_np' function. */ +#cmakedefine HAVE_ACL_GET_LINK_NP 1 + +/* Define to 1 if you have the `acl_get_perm' function. */ +#cmakedefine HAVE_ACL_GET_PERM 1 + +/* Define to 1 if you have the `acl_get_perm_np' function. */ +#cmakedefine HAVE_ACL_GET_PERM_NP 1 + +/* Define to 1 if you have the `acl_init' function. */ +#cmakedefine HAVE_ACL_INIT 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ACL_LIBACL_H 1 + +/* Define to 1 if the system has the type `acl_permset_t'. */ +#cmakedefine HAVE_ACL_PERMSET_T 1 + +/* Define to 1 if you have the `acl_set_fd' function. */ +#cmakedefine HAVE_ACL_SET_FD 1 + +/* Define to 1 if you have the `acl_set_fd_np' function. */ +#cmakedefine HAVE_ACL_SET_FD_NP 1 + +/* Define to 1 if you have the `acl_set_file' function. */ +#cmakedefine HAVE_ACL_SET_FILE 1 + +/* True for systems with POSIX ACL support */ +#cmakedefine HAVE_ACL_USER 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ATTR_XATTR_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_BZLIB_H 1 + +/* Define to 1 if you have the `chflags' function. */ +#cmakedefine HAVE_CHFLAGS 1 + +/* Define to 1 if you have the `chown' function. */ +#cmakedefine HAVE_CHOWN 1 + +/* Define to 1 if you have the `chroot' function. */ +#cmakedefine HAVE_CHROOT 1 + +/* Define to 1 if you have the `CreateHardLinkA' function. */ +#cmakedefine HAVE_CREATEHARDLINKA 1 + +/* Define to 1 if you have the `CreateHardLinkW' function. */ +#cmakedefine HAVE_CREATEHARDLINKW 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_CTYPE_H 1 + +/* Define to 1 if you have the declaration of `INT64_MAX', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_INT64_MAX 1 + +/* Define to 1 if you have the declaration of `INT64_MIN', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_INT64_MIN 1 + +/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. + */ +#cmakedefine HAVE_DECL_OPTARG 1 + +/* Define to 1 if you have the declaration of `optind', and to 0 if you don't. + */ +#cmakedefine HAVE_DECL_OPTIND 1 + +/* Define to 1 if you have the declaration of `SIZE_MAX', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_SIZE_MAX 1 + +/* Define to 1 if you have the declaration of `SSIZE_MAX', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_SSIZE_MAX 1 + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_STRERROR_R 1 + +/* Define to 1 if you have the declaration of `UINT32_MAX', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_UINT32_MAX 1 + +/* Define to 1 if you have the declaration of `UINT64_MAX', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_UINT64_MAX 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_DIRECT_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#cmakedefine HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_DLFCN_H 1 + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#cmakedefine HAVE_DOPRNT 1 + +/* Define to 1 if nl_langinfo supports D_MD_ORDER */ +#cmakedefine HAVE_D_MD_ORDER 1 + +/* A possible errno value for invalid file format errors */ +#cmakedefine HAVE_EFTYPE 1 + +/* A possible errno value for invalid file format errors */ +#cmakedefine HAVE_EILSEQ 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_EXT2FS_EXT2_FS_H 1 + +/* Define to 1 if you have the `extattr_get_file' function. */ +#cmakedefine HAVE_EXTATTR_GET_FILE 1 + +/* Define to 1 if you have the `extattr_list_file' function. */ +#cmakedefine HAVE_EXTATTR_LIST_FILE 1 + +/* Define to 1 if you have the `extattr_set_fd' function. */ +#cmakedefine HAVE_EXTATTR_SET_FD 1 + +/* Define to 1 if you have the `extattr_set_file' function. */ +#cmakedefine HAVE_EXTATTR_SET_FILE 1 + +/* Define to 1 if you have the `fchdir' function. */ +#cmakedefine HAVE_FCHDIR 1 + +/* Define to 1 if you have the `fchflags' function. */ +#cmakedefine HAVE_FCHFLAGS 1 + +/* Define to 1 if you have the `fchmod' function. */ +#cmakedefine HAVE_FCHMOD 1 + +/* Define to 1 if you have the `fchown' function. */ +#cmakedefine HAVE_FCHOWN 1 + +/* Define to 1 if you have the `fcntl' function. */ +#cmakedefine HAVE_FCNTL 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `fork' function. */ +#cmakedefine HAVE_FORK 1 + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#cmakedefine HAVE_FSEEKO 1 + +/* Define to 1 if you have the `fsetxattr' function. */ +#cmakedefine HAVE_FSETXATTR 1 + +/* Define to 1 if you have the `fstat' function. */ +#cmakedefine HAVE_FSTAT 1 + +/* Define to 1 if you have the `ftruncate' function. */ +#cmakedefine HAVE_FTRUNCATE 1 + +/* Define to 1 if you have the `futimes' function. */ +#cmakedefine HAVE_FUTIMES 1 + +/* Define to 1 if you have the `geteuid' function. */ +#cmakedefine HAVE_GETEUID 1 + +/* Define to 1 if you have the `getpid' function. */ +#cmakedefine HAVE_GETPID 1 + +/* Define to 1 if you have the `getxattr' function. */ +#cmakedefine HAVE_GETXATTR 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_GRP_H 1 + +/* Define to 1 if the system has the type `intmax_t'. */ +#cmakedefine HAVE_INTMAX_T 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_IO_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LANGINFO_H 1 + +/* Define to 1 if you have the `lchflags' function. */ +#cmakedefine HAVE_LCHFLAGS 1 + +/* Define to 1 if you have the `lchmod' function. */ +#cmakedefine HAVE_LCHMOD 1 + +/* Define to 1 if you have the `lchown' function. */ +#cmakedefine HAVE_LCHOWN 1 + +/* Define to 1 if you have the `lgetxattr' function. */ +#cmakedefine HAVE_LGETXATTR 1 + +/* Define to 1 if you have the `acl' library (-lacl). */ +#cmakedefine HAVE_LIBACL 1 + +/* Define to 1 if you have the `attr' library (-lattr). */ +#cmakedefine HAVE_LIBATTR 1 + +/* Define to 1 if you have the `bz2' library (-lbz2). */ +#cmakedefine HAVE_LIBBZ2 1 + +/* Define to 1 if you have the `lzma' library (-llzma). */ +#cmakedefine HAVE_LIBLZMA 1 + +/* Define to 1 if you have the `lzmadec' library (-llzmadec). */ +#cmakedefine HAVE_LIBLZMADEC 1 + +/* Define to 1 if you have the `z' library (-lz). */ +#cmakedefine HAVE_LIBZ 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LIMITS_H 1 + +/* Define to 1 if you have the link() function. */ +#cmakedefine HAVE_LINK 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_FS_H 1 + +/* Define to 1 if you have the `listxattr' function. */ +#cmakedefine HAVE_LISTXATTR 1 + +/* Define to 1 if you have the `llistxattr' function. */ +#cmakedefine HAVE_LLISTXATTR 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LOCALE_H 1 + +/* Define to 1 if the system has the type `long long int'. */ +#cmakedefine HAVE_LONG_LONG_INT 1 + +/* Define to 1 if you have the `lsetxattr' function. */ +#cmakedefine HAVE_LSETXATTR 1 + +/* Define to 1 if you have the `lstat' function. */ +#cmakedefine HAVE_LSTAT 1 + +/* Define to 1 if `lstat' has the bug that it succeeds when given the + zero-length file name argument. */ +#cmakedefine HAVE_LSTAT_EMPTY_STRING_BUG 1 + +/* Define to 1 if you have the `lutimes' function. */ +#cmakedefine HAVE_LUTIMES 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LZMADEC_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LZMA_H 1 + +/* Define to 1 if you have the `MD5' functions. */ +#cmakedefine HAVE_MD5 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MD5_H 1 + +/* Define to 1 if you have the `memmove' function. */ +#cmakedefine HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkdir' function. */ +#cmakedefine HAVE_MKDIR 1 + +/* Define to 1 if you have the `mkfifo' function. */ +#cmakedefine HAVE_MKFIFO 1 + +/* Define to 1 if you have the `mknod' function. */ +#cmakedefine HAVE_MKNOD 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#cmakedefine HAVE_NDIR_H 1 + +/* Define to 1 if you have the `nl_langinfo' function. */ +#cmakedefine HAVE_NL_LANGINFO 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_OPENSSL_MD5_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_OPENSSL_RIPEMD_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_OPENSSL_SHA_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_PATHS_H 1 + +/* Define to 1 if you have the `pipe' function. */ +#cmakedefine HAVE_PIPE 1 + +/* Define to 1 if you have the `poll' function. */ +#cmakedefine HAVE_POLL 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_POLL_H 1 + +/* Define to 1 if printf() supports "%ju" and "%jd" */ +#cmakedefine HAVE_PRINTF_JD 1 + +/* Define to 1 if printf() supports "%llu" and "%lld" */ +#cmakedefine HAVE_PRINTF_LLD 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_PROCESS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_PWD_H 1 + +/* Define to 1 if you have the `readlink' function. */ +#cmakedefine HAVE_READLINK 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_REGEX_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_RIPEMD_H 1 + +/* Define to 1 if you have the `RIPEMD160' functions. */ +#cmakedefine HAVE_RMD160 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_RMD160_H 1 + +/* Define to 1 if you have the `select' function. */ +#cmakedefine HAVE_SELECT 1 + +/* Define to 1 if you have the `setenv' function. */ +#cmakedefine HAVE_SETENV 1 + +/* Define to 1 if you have the `setlocale' function. */ +#cmakedefine HAVE_SETLOCALE 1 + +/* Define to 1 if you have the `SHA1' functions. */ +#cmakedefine HAVE_SHA1 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SHA1_H 1 + +/* Define to 1 if you have the `SHA256' functions. */ +#cmakedefine HAVE_SHA256 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SHA256_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SHA2_H 1 + +/* Define to 1 if you have the `SHA384' functions. */ +#cmakedefine HAVE_SHA384 1 + +/* Define to 1 if you have the `SHA512' functions. */ +#cmakedefine HAVE_SHA512 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SHA_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SIGNAL_H 1 + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +#cmakedefine HAVE_STAT_EMPTY_STRING_BUG 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strchr' function. */ +#cmakedefine HAVE_STRCHR 1 + +/* Define to 1 if you have the `strdup' function. */ +#cmakedefine HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#cmakedefine HAVE_STRERROR 1 + +/* Define to 1 if you have the `strerror_r' function. */ +#cmakedefine HAVE_STRERROR_R 1 + +/* Define to 1 if you have the `strftime' function. */ +#cmakedefine HAVE_STRFTIME 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRING_H 1 + +/* Define to 1 if you have the `strrchr' function. */ +#cmakedefine HAVE_STRRCHR 1 + +/* Define to 1 if `st_birthtime' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_BIRTHTIME 1 + +/* Define to 1 if `st_birthtimespec.tv_nsec' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1 + +/* Define to 1 if `st_blksize' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_BLKSIZE 1 + +/* Define to 1 if `st_flags' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_FLAGS 1 + +/* Define to 1 if `st_mtimespec.tv_nsec' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1 + +/* Define to 1 if `st_mtime_n' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_MTIME_N 1 + +/* Define to 1 if `st_mtime_usec' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_MTIME_USEC 1 + +/* Define to 1 if `st_mtim.tv_nsec' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1 + +/* Define to 1 if `st_umtime' is member of `struct stat'. */ +#cmakedefine HAVE_STRUCT_STAT_ST_UMTIME 1 + +/* Define to 1 if you have the symlink() function. */ +#cmakedefine HAVE_SYMLINK 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_ACL_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#cmakedefine HAVE_SYS_DIR_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_EXTATTR_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_MKDEV_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#cmakedefine HAVE_SYS_NDIR_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_POLL_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_UTIME_H 1 + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#cmakedefine HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_XATTR_H 1 + +/* Define to 1 if you have the `timegm' function. */ +#cmakedefine HAVE_TIMEGM 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_TIME_H 1 + +/* Define to 1 if you have the `tzset' function. */ +#cmakedefine HAVE_TZSET 1 + +/* Define to 1 if the system has the type `uintmax_t'. */ +#cmakedefine HAVE_UINTMAX_T 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `unsetenv' function. */ +#cmakedefine HAVE_UNSETENV 1 + +/* Define to 1 if the system has the type `unsigned long long'. */ +#cmakedefine HAVE_UNSIGNED_LONG_LONG 1 + +/* Define to 1 if the system has the type `unsigned long long int'. */ +#cmakedefine HAVE_UNSIGNED_LONG_LONG_INT 1 + +/* Define to 1 if you have the `utime' function. */ +#cmakedefine HAVE_UTIME 1 + +/* Define to 1 if you have the `utimes' function. */ +#cmakedefine HAVE_UTIMES 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UTIME_H 1 + +/* Define to 1 if you have the `vfork' function. */ +#cmakedefine HAVE_VFORK 1 + +/* Define to 1 if you have the `vprintf' function. */ +#cmakedefine HAVE_VPRINTF 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_WCHAR_H 1 + +/* Define to 1 if the system has the type `wchar_t'. */ +#cmakedefine HAVE_WCHAR_T 1 + +/* Define to 1 if you have the `wcrtomb' function. */ +#cmakedefine HAVE_WCRTOMB 1 + +/* Define to 1 if you have the `wcscpy' function. */ +#cmakedefine HAVE_WCSCPY 1 + +/* Define to 1 if you have the `wcslen' function. */ +#cmakedefine HAVE_WCSLEN 1 + +/* Define to 1 if you have the `wctomb' function. */ +#cmakedefine HAVE_WCTOMB 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_WCTYPE_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_WINDOWS_H 1 + +/* Define to 1 if you have the `wmemcmp' function. */ +#cmakedefine HAVE_WMEMCMP 1 + +/* Define to 1 if you have the `wmemcpy' function. */ +#cmakedefine HAVE_WMEMCPY 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ZLIB_H 1 + +/* Version number of libarchive as a single integer */ +#cmakedefine LIBARCHIVE_VERSION_NUMBER "${LIBARCHIVE_VERSION_NUMBER}" + +/* Version number of libarchive */ +#cmakedefine LIBARCHIVE_VERSION_STRING "${LIBARCHIVE_VERSION_STRING}" + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#cmakedefine LSTAT_FOLLOWS_SLASHED_SYMLINK 1 + +/* Define to 1 if `major', `minor', and `makedev' are declared in . + */ +#cmakedefine MAJOR_IN_MKDEV 1 + +/* Define to 1 if `major', `minor', and `makedev' are declared in + . */ +#cmakedefine MAJOR_IN_SYSMACROS 1 + +/* Define to the generates final MD5 hash function. */ +#cmakedefine MD5_Final ${MD5_Final} + +/* Define to the initializes MD5 context function. */ +#cmakedefine MD5_Init ${MD5_Init} + +/* Define to the updates MD5 context function. */ +#cmakedefine MD5_Update ${MD5_Update} + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#cmakedefine NO_MINUS_C_MINUS_O 1 + +/* Define to the generates final RIPEMD160 hash function. */ +#cmakedefine RIPEMD160_Final ${RIPEMD160_Final} + +/* Define to the initializes RIPEMD160 context function. */ +#cmakedefine RIPEMD160_Init ${RIPEMD160_Init} + +/* Define to the updates RIPEMD160 context function. */ +#cmakedefine RIPEMD160_Update ${RIPEMD160_Update} + +/* Define to the generates final SHA1 hash function. */ +#cmakedefine SHA1_Final ${SHA1_Final} + +/* Define to the initializes SHA1 context function. */ +#cmakedefine SHA1_Init ${SHA1_Init} + +/* Define to the updates SHA1 context function. */ +#cmakedefine SHA1_Update ${SHA1_Update} + +/* The size of `wchar_t', as computed by sizeof. */ +#cmakedefine SIZEOF_WCHAR_T ${SIZEOF_WCHAR_T} + +/* Define to 1 if you have the ANSI C header files. */ +#cmakedefine STDC_HEADERS 1 + +/* Define to 1 if strerror_r returns char *. */ +#cmakedefine STRERROR_R_CHAR_P 1 + +/* Define to 1 if you can safely include both and . */ +#cmakedefine TIME_WITH_SYS_TIME 1 + +/* Version number of package */ +#cmakedefine VERSION "${VERSION}" + +/* Number of bits in a file offset, on hosts where this is settable. */ +#cmakedefine _FILE_OFFSET_BITS ${_FILE_OFFSET_BITS} + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +#cmakedefine _LARGEFILE_SOURCE 1 + +/* Define for large files, on AIX-style hosts. */ +#cmakedefine _LARGE_FILES ${_LARGE_FILES} + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#cmakedefine _UINT64_T + +/* Define to empty if `const' does not conform to ANSI C. */ +#cmakedefine const ${const} + +/* Define to `int' if doesn't define. */ +#cmakedefine gid_t ${gid_t} + +/* Define to `unsigned long' if does not define. */ +#cmakedefine id_t ${id_t} + +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#cmakedefine int64_t ${int64_t} + +/* Define to the widest signed integer type if and do + not define. */ +#cmakedefine intmax_t ${intmax_t} + +/* Define to `int' if does not define. */ +#cmakedefine mode_t ${mode_t} + +/* Define to `long long' if does not define. */ +#cmakedefine off_t ${off_t} + +/* Define to `unsigned int' if does not define. */ +#cmakedefine size_t ${size_t} + +/* Define to `int' if does not define. */ +#cmakedefine ssize_t ${ssize_t} + +/* Define to `int' if doesn't define. */ +#cmakedefine uid_t ${uid_t} + +/* Define to `unsigned short' if doesn't define. */ +#cmakedefine uint16_t ${uint16_t} + +/* Define to `unsigned int' if doesn't define. */ +#cmakedefine uint32_t ${uint32_t} + +/* Define to `int' if doesn't define. */ +#cmakedefine int32_t ${int32_t} + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#cmakedefine uint64_t ${uint64_t} + +/* Define to the widest unsigned integer type if and + do not define. */ +#cmakedefine uintmax_t ${uintmax_t} + +/* Define to `unsigned int' if does not define. */ +#cmakedefine uintptr_t ${uintptr_t } + diff --git a/Utilities/cmlibarchive/build/release.sh b/Utilities/cmlibarchive/build/release.sh new file mode 100755 index 000000000..c45acf83f --- /dev/null +++ b/Utilities/cmlibarchive/build/release.sh @@ -0,0 +1,63 @@ +#!/bin/sh +v + +PATH=/usr/local/gnu-autotools/bin/:$PATH +export PATH + +# BSD make's "OBJDIR" support freaks out the automake-generated +# Makefile. Effectively disable it. +export MAKEOBJDIRPREFIX=/junk + +# Start from the build directory, where the version file is located +if [ -f build/version ]; then + cd build +fi + +if [ \! -f version ]; then + echo "Can't find version file" + exit 1 +fi + +# Update the build number in the 'version' file. +# Separate number from additional alpha/beta/etc marker +MARKER=`cat version | sed 's/[0-9.]//g'` +# Bump the number +VN=`cat version | sed 's/[^0-9.]//g'` +# Reassemble and write back out +VN=$(($VN + 1)) +rm -f version.old +mv version version.old +chmod +w version.old +echo $VN$MARKER > version +# Build out the string. +VS="$(($VN/1000000)).$(( ($VN/1000)%1000 )).$(( $VN%1000 ))$MARKER" + +cd .. + +# Substitute the integer version into Libarchive's archive.h +perl -p -i -e "s/^(#define\tARCHIVE_VERSION_NUMBER).*/\$1 $VN/" libarchive/archive.h +perl -p -i -e "s/^(#define\tARCHIVE_VERSION_STRING).*/\$1 \"libarchive $VS\"/" libarchive/archive.h +# Substitute the string version into tar and cpio Makefiles +perl -p -i -e "s/^(BSDTAR_VERSION_STRING)=.*/\$1=$VS/" tar/Makefile +perl -p -i -e "s/^(BSDCPIO_VERSION_STRING)=.*/\$1=$VS/" cpio/Makefile +# Substitute versions into configure.ac as well +perl -p -i -e 's/(m4_define\(\[LIBARCHIVE_VERSION_S\]),.*\)/$1,['"$VS"'])/' configure.ac +perl -p -i -e 's/(m4_define\(\[LIBARCHIVE_VERSION_N\]),.*\)/$1,['"$VN"'])/' configure.ac + +# Add a version notice to NEWS +mv NEWS NEWS.bak +chmod +w NEWS.bak +echo > NEWS +echo `date +"%b %d, %Y:"` libarchive $VS released >> NEWS +cat NEWS.bak >> NEWS + +# Clean up first +rm -rf /usr/obj`pwd` +(cd examples/minitar && make cleandir && make clean) +(cd libarchive && make cleandir && make clean) +(cd libarchive/test && make cleandir && make clean && make list.h) +(cd tar && make cleandir && make clean) + +# Build the libarchive distfile +/bin/sh build/autogen.sh +./configure +make distcheck diff --git a/Utilities/cmlibarchive/build/version b/Utilities/cmlibarchive/build/version new file mode 100644 index 000000000..16a4591a2 --- /dev/null +++ b/Utilities/cmlibarchive/build/version @@ -0,0 +1 @@ +2007900a diff --git a/Utilities/cmlibarchive/build/windows/mvcpp.nt b/Utilities/cmlibarchive/build/windows/mvcpp.nt new file mode 100644 index 000000000..228fc5d9b --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/mvcpp.nt @@ -0,0 +1,117 @@ +#/* FILE: mvcpp.nt +# * +# * Copyright (c) 2008 +# * TouchNet Information Systems, Inc. +# * All Rights Reserved +# * +# * This program is an unpublished copyright work of TouchNet Information +# * Systems, Inc. of Lenexa, KS. The program, all information disclosed +# * and the matter shown and described hereon or herewith are confidential +# * and proprietary to TouchNet Information Systems, Inc. +# * +# ****************************************************************************** +# * +# * $LastChangedBy: kientzle $ +# * $Locker: $ +# * $ProjectName: $ +# * $ProjectRevision: $ +# * $LastChangedRevision: 29 $ +# * $LastChangedDate: 2008-05-05 18:10:33 -0400 (Mon, 05 May 2008) $ +# * $State$ +# * $RCSfile$ +# * $Source$ +# * +# * Change Log: +# * $Log: $ +# * +# */ + +.SUFFIXES : .c .cpp .obm + +ZLIB_INCL=\3rdParty\ZLib\Current\Include + +EXTRA_DEFINES=/DLIBARCHIVE_STATIC=1 + +!ifdef DEBUG +DEST_PATH=.\lib\mvcpp\debug +OBJ_DIR=obj\debug +COMPILE_FLAG=/MTd /DDEBUG=1 $(EXTRA_DEFINES) /Zi /Fd$(OBJ_DIR)\libarchive.pdb +!else +DEST_PATH=.\lib\mvcpp +OBJ_DIR=obj +COMPILE_FLAG=/MT $(EXTRA_DEFINES) /Fd$(OBJ_DIR)\libarchive.pdb +!endif + +INCLUDE=.;$(MSDEVDIR)\INCLUDE;$(ZLIB_INCL); +INCLUDE_OPTS= + +NT_CPP=cl +NT_C=cl +NT_LIBRARIAN=lib + +### +NT_C_OPTS=$(COMPILE_FLAG) /GX /Zl /Zp1 /nologo /c /G5 /Oi /Ot /TC /DVC_EXTRANLEAN /DWIN32_LEAN_AND_MEAN $(INCLUDE_OPTS) +NT_CPP_OPTS=$(COMPILE_FLAG) /GX /Zl /Zp1 /nologo /c /G5 /Oi /Ot /TP /DVC_EXTRANLEAN /DWIN32_LEAN_AND_MEAN $(INCLUDE_OPTS) +NT_LIB_OPTS= + +.cpp{$(OBJ_DIR)}.obm: + -md $(OBJ_DIR) > nul 2>nul + $(NT_CPP) $(NT_CPP_OPTS) -Fo$*.obm $< + +.c{$(OBJ_DIR)}.obm: + -md $(OBJ_DIR) > nul 2>nul + $(NT_C) $(NT_C_OPTS) -Fo$*.obm $< + + +OBJS=\ + $(OBJ_DIR)\archive_check_magic.obm $(OBJ_DIR)\archive_entry.obm \ + $(OBJ_DIR)\archive_entry_copy_stat.obm $(OBJ_DIR)\archive_entry_link_resolver.obm \ + $(OBJ_DIR)\archive_entry_stat.obm $(OBJ_DIR)\archive_entry_strmode.obm \ + $(OBJ_DIR)\archive_read.obm $(OBJ_DIR)\archive_read_data_into_fd.obm \ + $(OBJ_DIR)\archive_read_extract.obm $(OBJ_DIR)\archive_read_open_fd.obm \ + $(OBJ_DIR)\archive_read_open_file.obm $(OBJ_DIR)\archive_read_open_filename.obm \ + $(OBJ_DIR)\archive_read_open_memory.obm $(OBJ_DIR)\archive_read_support_compression_all.obm \ + $(OBJ_DIR)\archive_read_support_compression_bzip2.obm \ + $(OBJ_DIR)\archive_read_support_compression_compress.obm \ + $(OBJ_DIR)\archive_read_support_compression_gzip.obm \ + $(OBJ_DIR)\archive_read_support_compression_none.obm \ + $(OBJ_DIR)\archive_read_support_compression_program.obm \ + $(OBJ_DIR)\archive_read_support_format_all.obm \ + $(OBJ_DIR)\archive_read_support_format_ar.obm \ + $(OBJ_DIR)\archive_read_support_format_cpio.obm \ + $(OBJ_DIR)\archive_read_support_format_empty.obm \ + $(OBJ_DIR)\archive_read_support_format_iso9660.obm \ + $(OBJ_DIR)\archive_read_support_format_mtree.obm \ + $(OBJ_DIR)\archive_read_support_format_tar.obm \ + $(OBJ_DIR)\archive_read_support_format_zip.obm \ + $(OBJ_DIR)\archive_string.obm $(OBJ_DIR)\archive_string_sprintf.obm \ + $(OBJ_DIR)\archive_util.obm $(OBJ_DIR)\archive_virtual.obm \ + $(OBJ_DIR)\archive_write.obm $(OBJ_DIR)\archive_write_disk.obm \ + $(OBJ_DIR)\archive_write_disk_set_standard_lookup.obm \ + $(OBJ_DIR)\archive_write_open_fd.obm $(OBJ_DIR)\archive_write_open_file.obm \ + $(OBJ_DIR)\archive_write_open_filename.obm $(OBJ_DIR)\archive_write_open_memory.obm \ + $(OBJ_DIR)\archive_write_set_compression_bzip2.obm $(OBJ_DIR)\archive_write_set_compression_compress.obm \ + $(OBJ_DIR)\archive_write_set_compression_gzip.obm $(OBJ_DIR)\archive_write_set_compression_none.obm \ + $(OBJ_DIR)\archive_write_set_compression_program.obm $(OBJ_DIR)\archive_write_set_format.obm \ + $(OBJ_DIR)\archive_write_set_format_ar.obm $(OBJ_DIR)\archive_write_set_format_by_name.obm \ + $(OBJ_DIR)\archive_write_set_format_cpio.obm $(OBJ_DIR)\archive_write_set_format_cpio_newc.obm \ + $(OBJ_DIR)\archive_write_set_format_pax.obm $(OBJ_DIR)\archive_write_set_format_shar.obm \ + $(OBJ_DIR)\archive_write_set_format_ustar.obm $(OBJ_DIR)\filter_fork.obm \ + $(OBJ_DIR)\libarchive-nonposix.obm + +all: CLEAN $(DEST_PATH)\libarchive.lib + +$(DEST_PATH)\libarchive.lib :: $(OBJS) $(DEST_PATH) + +$(DEST_PATH)\libarchive.lib :: + $(NT_LIBRARIAN) $(NT_LIB_OPTS) /OUT:$(DEST_PATH)\libarchive.lib $(OBJS) + +$(DEST_PATH): + -md $(DEST_PATH) > nul 2>nul + +CLEAN: +!ifdef CLEAN + -del $(OBJ_DIR)\*.pd? > nul 2>nul + -ren $(OBJ_DIR)\*.pdb *.pd1 > nul 2>nul + -ren $(OBJ_DIR)\*.pdb *.pd2 > nul 2>nul +!endif diff --git a/Utilities/cmlibarchive/build/windows/vc71/libarchive.sln b/Utilities/cmlibarchive/build/windows/vc71/libarchive.sln new file mode 100644 index 000000000..962c49727 --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/vc71/libarchive.sln @@ -0,0 +1,23 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libarchive", "libarchive.vcproj", "{0C758FDB-BE1D-47E9-8E18-9168AB34A308}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Debug.ActiveCfg = Debug|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Debug.Build.0 = Debug|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Release.ActiveCfg = Release|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/Utilities/cmlibarchive/build/windows/vc71/libarchive.vcproj b/Utilities/cmlibarchive/build/windows/vc71/libarchive.vcproj new file mode 100644 index 000000000..e09b8962d --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/vc71/libarchive.vcproj @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Utilities/cmlibarchive/build/windows/vc80/libarchive.sln b/Utilities/cmlibarchive/build/windows/vc80/libarchive.sln new file mode 100644 index 000000000..d6ee3c5b2 --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/vc80/libarchive.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libarchive", "libarchive.vcproj", "{0C758FDB-BE1D-47E9-8E18-9168AB34A308}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libarchive_test", "libarchive_test\libarchive_test.vcproj", "{407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Debug|Win32.ActiveCfg = Debug|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Debug|Win32.Build.0 = Debug|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Release|Win32.ActiveCfg = Release|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Release|Win32.Build.0 = Release|Win32 + {407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}.Debug|Win32.ActiveCfg = Debug|Win32 + {407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}.Debug|Win32.Build.0 = Debug|Win32 + {407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}.Release|Win32.ActiveCfg = Release|Win32 + {407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Utilities/cmlibarchive/build/windows/vc80/libarchive.vcproj b/Utilities/cmlibarchive/build/windows/vc80/libarchive.vcproj new file mode 100644 index 000000000..444de6db5 --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/vc80/libarchive.vcproj @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Utilities/cmlibarchive/build/windows/vc80/libarchive_test/libarchive_test.vcproj b/Utilities/cmlibarchive/build/windows/vc80/libarchive_test/libarchive_test.vcproj new file mode 100644 index 000000000..e1058fd1f --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/vc80/libarchive_test/libarchive_test.vcproj @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Utilities/cmlibarchive/build/windows/vc90/libarchive.sln b/Utilities/cmlibarchive/build/windows/vc90/libarchive.sln new file mode 100644 index 000000000..1ddfc9842 --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/vc90/libarchive.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libarchive", "libarchive.vcproj", "{0C758FDB-BE1D-47E9-8E18-9168AB34A308}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libarchive_test", "libarchive_test\libarchive_test.vcproj", "{407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Debug|Win32.ActiveCfg = Debug|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Debug|Win32.Build.0 = Debug|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Release|Win32.ActiveCfg = Release|Win32 + {0C758FDB-BE1D-47E9-8E18-9168AB34A308}.Release|Win32.Build.0 = Release|Win32 + {407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}.Debug|Win32.ActiveCfg = Debug|Win32 + {407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}.Debug|Win32.Build.0 = Debug|Win32 + {407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}.Release|Win32.ActiveCfg = Release|Win32 + {407CA0B9-0CCB-4F02-A20B-CBBAEAAA2E4B}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Utilities/cmlibarchive/build/windows/vc90/libarchive.vcproj b/Utilities/cmlibarchive/build/windows/vc90/libarchive.vcproj new file mode 100644 index 000000000..0946b716a --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/vc90/libarchive.vcproj @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Utilities/cmlibarchive/build/windows/vc90/libarchive_test/libarchive_test.vcproj b/Utilities/cmlibarchive/build/windows/vc90/libarchive_test/libarchive_test.vcproj new file mode 100644 index 000000000..7fc32711c --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/vc90/libarchive_test/libarchive_test.vcproj @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Utilities/cmlibarchive/build/windows/wccpp.nt b/Utilities/cmlibarchive/build/windows/wccpp.nt new file mode 100644 index 000000000..2c6c7301f --- /dev/null +++ b/Utilities/cmlibarchive/build/windows/wccpp.nt @@ -0,0 +1,107 @@ +#/* FILE: wccpp.nt +# * +# * Copyright (c) 2008 +# * TouchNet Information Systems, Inc. +# * All Rights Reserved +# * +# * This program is an unpublished copyright work of TouchNet Information +# * Systems, Inc. of Lenexa, KS. The program, all information disclosed +# * and the matter shown and described hereon or herewith are confidential +# * and proprietary to TouchNet Information Systems, Inc. +# * +# ****************************************************************************** +# * +# * $LastChangedBy: kientzle $ +# * $Locker: $ +# * $ProjectName: $ +# * $ProjectRevision: $ +# * $LastChangedRevision: 29 $ +# * $LastChangedDate: 2008-05-05 18:10:33 -0400 (Mon, 05 May 2008) $ +# * $State$ +# * $RCSfile$ +# * $Source$ +# * +# * Change Log: +# * $Log: $ +# * +# */ + +.EXTENSIONS: +.EXTENSIONS: .obn .cpp .c + +ZLIB_INCL=\3rdParty\ZLib\Current\Include + +!ifdef DEBUG +DEST_PATH=.\lib\wccpp\debug +OBJ_DIR=obj\debug +EXT_COMPILE_FLAG=-d2 -DLIBARCHIVE_STATIC=1 +!else +DEST_PATH=.\lib\wccpp +OBJ_DIR=obj +EXT_COMPILE_FLAG=-DLIBARCHIVE_STATIC=1 +!endif + +# ----- NT compiler options ----------------------------------------------- +NT_CPP=wpp386 +NT_C=wcc386 +NT_LIBRARIAN=wlib + + +### +INCLUDE_OPTS=/I.;$(%watcom)\h;$(%watcom)\h\nt;$(ZLIB_INCL); +NT_CPP_OPTS=-ei -wx -xs -xss -xst -od -of+ -zp1 -5 -bt=nt -bm $(EXT_COMPILE_FLAG) $(INCLUDE_OPTS) -DWIN32_LEAN_AND_MEAN +NT_C_OPTS=-ei -wx -od -of+ -zp1 -5 -bt=nt -bm $(EXT_COMPILE_FLAG) $(INCLUDE_OPTS) -DWIN32_LEAN_AND_MEAN +NT_LIB_OPTS= + +.cpp{$(OBJ_DIR)}.obn: + -md $(OBJ_DIR) > nul 2>nul + $(NT_CPP) $(NT_CPP_OPTS) -zp1 -fo=$*.obn $< + +.c{$(OBJ_DIR)}.obn: + -md $(OBJ_DIR) > nul 2>nul + $(NT_C) $(NT_C_OPTS) -zp1 -fo=$*.obn $< + +OBJS = & + $(OBJ_DIR)\archive_check_magic.obn $(OBJ_DIR)\archive_entry.obn & + $(OBJ_DIR)\archive_entry_copy_stat.obn $(OBJ_DIR)\archive_entry_link_resolver.obn & + $(OBJ_DIR)\archive_entry_stat.obn $(OBJ_DIR)\archive_entry_strmode.obn & + $(OBJ_DIR)\archive_read.obn $(OBJ_DIR)\archive_read_data_into_fd.obn & + $(OBJ_DIR)\archive_read_extract.obn $(OBJ_DIR)\archive_read_open_fd.obn & + $(OBJ_DIR)\archive_read_open_file.obn $(OBJ_DIR)\archive_read_open_filename.obn & + $(OBJ_DIR)\archive_read_open_memory.obn $(OBJ_DIR)\archive_read_support_compression_all.obn & + $(OBJ_DIR)\archive_read_support_compression_bzip2.obn & + $(OBJ_DIR)\archive_read_support_compression_compress.obn & + $(OBJ_DIR)\archive_read_support_compression_gzip.obn & + $(OBJ_DIR)\archive_read_support_compression_none.obn & + $(OBJ_DIR)\archive_read_support_compression_program.obn & + $(OBJ_DIR)\archive_read_support_format_all.obn & + $(OBJ_DIR)\archive_read_support_format_ar.obn & + $(OBJ_DIR)\archive_read_support_format_cpio.obn & + $(OBJ_DIR)\archive_read_support_format_empty.obn & + $(OBJ_DIR)\archive_read_support_format_iso9660.obn & + $(OBJ_DIR)\archive_read_support_format_mtree.obn & + $(OBJ_DIR)\archive_read_support_format_tar.obn & + $(OBJ_DIR)\archive_read_support_format_zip.obn & + $(OBJ_DIR)\archive_string.obn $(OBJ_DIR)\archive_string_sprintf.obn & + $(OBJ_DIR)\archive_util.obn $(OBJ_DIR)\archive_virtual.obn & + $(OBJ_DIR)\archive_write.obn $(OBJ_DIR)\archive_write_disk.obn & + $(OBJ_DIR)\archive_write_disk_set_standard_lookup.obn & + $(OBJ_DIR)\archive_write_open_fd.obn $(OBJ_DIR)\archive_write_open_file.obn & + $(OBJ_DIR)\archive_write_open_filename.obn $(OBJ_DIR)\archive_write_open_memory.obn & + $(OBJ_DIR)\archive_write_set_compression_bzip2.obn $(OBJ_DIR)\archive_write_set_compression_compress.obn & + $(OBJ_DIR)\archive_write_set_compression_gzip.obn $(OBJ_DIR)\archive_write_set_compression_none.obn & + $(OBJ_DIR)\archive_write_set_compression_program.obn $(OBJ_DIR)\archive_write_set_format.obn & + $(OBJ_DIR)\archive_write_set_format_ar.obn $(OBJ_DIR)\archive_write_set_format_by_name.obn & + $(OBJ_DIR)\archive_write_set_format_cpio.obn $(OBJ_DIR)\archive_write_set_format_cpio_newc.obn & + $(OBJ_DIR)\archive_write_set_format_pax.obn $(OBJ_DIR)\archive_write_set_format_shar.obn & + $(OBJ_DIR)\archive_write_set_format_ustar.obn $(OBJ_DIR)\filter_fork.obn & + $(OBJ_DIR)\libarchive-nonposix.obn + +$(DEST_PATH)\LibArchive.lib :: $(OBJS) $(DEST_PATH) + +$(DEST_PATH)\LibArchive.lib :: + -md $(DEST_PATH) > nul 2>nul + $(NT_LIBRARIAN) $@ -+ $(OBJS) + +$(DEST_PATH): + -md $(DEST_PATH) > nul 2>nul diff --git a/Utilities/cmlibarchive/configure.ac b/Utilities/cmlibarchive/configure.ac new file mode 100644 index 000000000..510025b11 --- /dev/null +++ b/Utilities/cmlibarchive/configure.ac @@ -0,0 +1,448 @@ +dnl Process this file with autoconf to produce a configure script. + +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],[2.7.900a]) +m4_define([LIBARCHIVE_VERSION_N],[2007900]) + +dnl bsdtar and bsdcpio versioning tracks libarchive +m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S()) +m4_define([BSDCPIO_VERSION_S],LIBARCHIVE_VERSION_S()) + +# +# Now starts the "real" configure script. +# + +AC_INIT([libarchive],LIBARCHIVE_VERSION_S(),[kientzle@freebsd.org]) +# Make sure the srcdir contains "libarchive" directory +AC_CONFIG_SRCDIR([libarchive]) +# Use auxiliary subscripts from this subdirectory (cleans up root) +AC_CONFIG_AUX_DIR([build/autoconf]) +# M4 scripts +AC_CONFIG_MACRO_DIR([build/autoconf]) +# Must follow AC_CONFIG macros above... +AM_INIT_AUTOMAKE() + +# Libtool versioning uses different conventions on different +# platforms. At least on FreeBSD, libtool uses an overly complex +# convention that attempts to solve problems that most people just +# don't have and which just causes confusion for most end users. +ARCHIVE_MAJOR=$(( LIBARCHIVE_VERSION_N() / 1000000 )) +ARCHIVE_MINOR=$(( (LIBARCHIVE_VERSION_N() / 1000) % 1000 )) +ARCHIVE_REVISION=$(( LIBARCHIVE_VERSION_N() % 1000 )) +ARCHIVE_LIBTOOL_MAJOR=`echo $((${ARCHIVE_MAJOR} + ${ARCHIVE_MINOR}))` +ARCHIVE_LIBTOOL_VERSION=$ARCHIVE_LIBTOOL_MAJOR:$ARCHIVE_REVISION:$ARCHIVE_MINOR + +# Stick the version numbers into config.h +AC_DEFINE([LIBARCHIVE_VERSION_STRING],"LIBARCHIVE_VERSION_S()", + [Version number of libarchive]) +AC_DEFINE_UNQUOTED([LIBARCHIVE_VERSION_NUMBER],"LIBARCHIVE_VERSION_N()", + [Version number of libarchive as a single integer]) +AC_DEFINE([BSDCPIO_VERSION_STRING],"BSDCPIO_VERSION_S()", + [Version number of bsdcpio]) +AC_DEFINE([BSDTAR_VERSION_STRING],"BSDTAR_VERSION_S()", + [Version number of bsdtar]) + +# The shell variables here must be the same as the AC_SUBST() variables +# below, but the shell variable names apparently cannot be the same as +# the m4 macro names above. Why? Ask autoconf. +BSDCPIO_VERSION_STRING=BSDCPIO_VERSION_S() +BSDTAR_VERSION_STRING=BSDTAR_VERSION_S() +LIBARCHIVE_VERSION_STRING=LIBARCHIVE_VERSION_S() +LIBARCHIVE_VERSION_NUMBER=LIBARCHIVE_VERSION_N() + +# Substitute the above version numbers into the various files below. +# Yes, I believe this is the fourth time we define what are essentially +# the same symbols. Why? Ask autoconf. +AC_SUBST(ARCHIVE_LIBTOOL_VERSION) +AC_SUBST(BSDCPIO_VERSION_STRING) +AC_SUBST(BSDTAR_VERSION_STRING) +AC_SUBST(LIBARCHIVE_VERSION_STRING) +AC_SUBST(LIBARCHIVE_VERSION_NUMBER) + +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_FILES([Makefile]) + +# Check for host type +AC_CANONICAL_HOST + +dnl Compilation on mingw and Cygwin needs special Makefile rules +inc_windows_files=no +inc_cygwin_files=no +case "$host_os" in + *mingw* ) inc_windows_files=yes ;; + *cygwin*) inc_cygwin_files=yes ;; +esac +AM_CONDITIONAL([INC_WINDOWS_FILES], [test $inc_windows_files = yes]) +AM_CONDITIONAL([INC_CYGWIN_FILES], [test $inc_cygwin_files = yes]) + +dnl Defines that are required for specific platforms (e.g. -D_POSIX_SOURCE, etc) +PLATFORMCPPFLAGS= +case "$host_os" in + *mingw* ) PLATFORMCPPFLAGS=-D__USE_MINGW_ANSI_STDIO ;; +esac +AC_SUBST(PLATFORMCPPFLAGS) + +# Checks for programs. +AC_PROG_CC +AM_PROG_CC_C_O +AC_LIBTOOL_WIN32_DLL +AC_PROG_LIBTOOL +AC_CHECK_TOOL([STRIP],[strip]) + +# +# Options for building bsdtar. +# +# Default is to build bsdtar, but allow people to override that. +# +AC_ARG_ENABLE([bsdtar], + [AS_HELP_STRING([--enable-bsdtar], [enable build of bsdtar (default)]) + AS_HELP_STRING([--enable-bsdtar=static], [force static build of bsdtar]) + AS_HELP_STRING([--enable-bsdtar=shared], [force dynamic build of bsdtar]) +AS_HELP_STRING([--disable-bsdtar], [disable build of bsdtar])], + [], [enable_bsdtar=yes]) + +case "$enable_bsdtar" in +yes) + if test "$enable_static" = "no"; then + static_bsdtar=no + else + static_bsdtar=yes + fi + build_bsdtar=yes + ;; +dynamic|shared) + if test "$enable_shared" = "no"; then + AC_MSG_FAILURE([Shared linking of bsdtar requires shared libarchive]) + fi + build_bsdtar=yes + static_bsdtar=no + ;; +static) + build_bsdtar=yes + static_bsdtar=yes + ;; +no) + build_bsdtar=no + static_bsdtar=no + ;; +*) + AC_MSG_FAILURE([Unsupported value for --enable-bsdtar]) + ;; +esac + +AM_CONDITIONAL([BUILD_BSDTAR], [ test "$build_bsdtar" = yes ]) +AM_CONDITIONAL([STATIC_BSDTAR], [ test "$static_bsdtar" = yes ]) + +# +# Options for building bsdcpio. +# +# Default is not to build bsdcpio, but that can be overridden. +# +AC_ARG_ENABLE([bsdcpio], + [AS_HELP_STRING([--enable-bsdcpio], [enable build of bsdcpio (default)]) + AS_HELP_STRING([--enable-bsdcpio=static], [static build of bsdcpio]) + AS_HELP_STRING([--enable-bsdcpio=shared], [dynamic build of bsdcpio]) +AS_HELP_STRING([--disable-bsdcpio], [disable build of bsdcpio])], + [], [enable_bsdcpio=yes]) + +case "$enable_bsdcpio" in +yes) + if test "$enable_static" = "no"; then + static_bsdcpio=no + else + static_bsdcpio=yes + fi + build_bsdcpio=yes + ;; +dynamic|shared) + if test "$enabled_shared" = "no"; then + AC_MSG_FAILURE([Shared linking of bsdcpio requires shared libarchive]) + fi + build_bsdcpio=yes + ;; +static) + build_bsdcpio=yes + static_bsdcpio=yes + ;; +no) + build_bsdcpio=no + static_bsdcpio=no + ;; +*) + AC_MSG_FAILURE([Unsupported value for --enable-bsdcpio]) + ;; +esac + +AM_CONDITIONAL([BUILD_BSDCPIO], [ test "$build_bsdcpio" = yes ]) +AM_CONDITIONAL([STATIC_BSDCPIO], [ test "$static_bsdcpio" = yes ]) + +# Set up defines needed before including any headers +case $host in + *mingw* | *cygwin* ) + AC_DEFINE([_WIN32_WINNT], 0x0500, [Define to '0x0500' for Windows 2000 APIs.]) + AC_DEFINE([WINVER], 0x0500, [Define to '0x0500' for Windows 2000 APIs.]) + ;; +esac + +# Checks for header files. +AC_HEADER_STDC +AC_HEADER_DIRENT +AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS([acl/libacl.h attr/xattr.h ctype.h errno.h]) +AC_CHECK_HEADERS([ext2fs/ext2_fs.h fcntl.h grp.h]) +AC_CHECK_HEADERS([inttypes.h io.h langinfo.h limits.h linux/fs.h]) +AC_CHECK_HEADERS([locale.h paths.h poll.h pwd.h regex.h signal.h stdarg.h]) +AC_CHECK_HEADERS([stdint.h stdlib.h string.h]) +AC_CHECK_HEADERS([sys/acl.h sys/extattr.h sys/ioctl.h sys/mkdev.h]) +AC_CHECK_HEADERS([sys/param.h sys/poll.h sys/select.h sys/time.h sys/utime.h]) +AC_CHECK_HEADERS([time.h unistd.h utime.h wchar.h wctype.h windows.h]) + +# Checks for libraries. +AC_ARG_WITH([zlib], + AS_HELP_STRING([--without-zlib], [Don't build support for gzip through zlib])) + +if test "x$with_zlib" != "xno"; then + AC_CHECK_HEADERS([zlib.h]) + AC_CHECK_LIB(z,inflate) +fi + +AC_ARG_WITH([bz2lib], + AS_HELP_STRING([--without-bz2lib], [Don't build support for bzip2 through bz2lib])) + +if test "x$with_bz2lib" != "xno"; then + AC_CHECK_HEADERS([bzlib.h]) + AC_CHECK_LIB(bz2,BZ2_bzDecompressInit) +fi + +AC_ARG_WITH([lzmadec], + AS_HELP_STRING([--without-lzmadec], [Don't build support for lzma through lzmadec])) + +if test "x$with_lzmadec" != "xno"; then + AC_CHECK_HEADERS([lzmadec.h]) + AC_CHECK_LIB(lzmadec,lzmadec_decode) +fi + +AC_ARG_WITH([lzma], + AS_HELP_STRING([--without-lzma], [Don't build support for xz through lzma])) + +if test "x$with_lzma" != "xno"; then + AC_CHECK_HEADERS([lzma.h]) + AC_CHECK_LIB(lzma,lzma_stream_decoder) +fi + +AC_ARG_WITH([openssl], + AS_HELP_STRING([--without-openssl], [Don't build support for mtree hashes through openssl])) + +AC_CHECK_HEADERS([md5.h ripemd.h rmd160.h sha.h sha1.h sha2.h sha256.h]) +# Common names for libc implementation on NetBSD and OpenBSD +AC_CHECK_FUNCS(MD5Init RMD160Init SHA1Init) +# SHA2 on NetBSD and older OpenBSD +AC_CHECK_FUNCS(SHA256_Init SHA384_Init SHA512_Init) +# SHA2 on newer OpenBSD +AC_CHECK_FUNCS(SHA256Init SHA384Init SHA512Init) + +if test "x$with_openssl" != "xno"; then + if test "$ac_cv_func_MD5Init" != "yes"; then + AC_CHECK_HEADERS([openssl/md5.h]) + AC_SEARCH_LIBS([MD5_Init], [crypto]) + fi + if test "$ac_cv_func_RMD160Init" != "yes"; then + AC_CHECK_HEADERS([openssl/ripemd.h]) + AC_SEARCH_LIBS([RIMEMD160_Init], [crypto]) + fi + if test "$ac_cv_func_SHA1Init" != "yes"; then + AC_CHECK_HEADERS([openssl/sha.h]) + AC_SEARCH_LIBS([SHA1_Init], [crypto]) + fi + if test "$ac_cv_func_SHA256Init" != "yes" || + test "$ac_cv_func_SHA384Init" != "yes" || + test "$ac_cv_func_SHA512Init" != "yes"; then + if test "$ac_cv_func_SHA256_Init" != "yes" || + test "$ac_cv_func_SHA384_Init" != "yes" || + test "$ac_cv_func_SHA512_Init" != "yes"; then + AC_CHECK_HEADERS([openssl/sha.h]) + AC_SEARCH_LIBS([SHA256_Init SHA384_Init SHA512_Init], [crypto]) + fi + fi +fi + +# TODO: Give the user the option of using a pre-existing system +# libarchive. This will define HAVE_LIBARCHIVE which will cause +# bsdtar_platform.h to use #include <...> for the libarchive headers. +# Need to include Makefile.am magic to link against system +# -larchive in that case. +#AC_CHECK_LIB(archive,archive_version) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +# AC_TYPE_UID_T defaults to "int", which is incorrect for MinGW +# and MSVC. Use a customized version. +la_TYPE_UID_T +AC_TYPE_MODE_T +# AC_TYPE_OFF_T defaults to "long", which limits us to 4GB files on +# most systems... default to "long long" instead. +AC_CHECK_TYPE(off_t, [long long]) +AC_TYPE_SIZE_T +AC_CHECK_TYPE(id_t, [unsigned long]) +AC_CHECK_TYPE(uintptr_t, [unsigned int]) + +# Check for birthtime in struct stat +AC_CHECK_MEMBERS([struct stat.st_birthtime]) + +# Check for high-resolution timestamps in struct stat +AC_CHECK_MEMBERS([struct stat.st_birthtimespec.tv_nsec]) +AC_CHECK_MEMBERS([struct stat.st_mtimespec.tv_nsec]) +AC_CHECK_MEMBERS([struct stat.st_mtim.tv_nsec]) +AC_CHECK_MEMBERS([struct stat.st_mtime_n]) # AIX +AC_CHECK_MEMBERS([struct stat.st_umtime]) # Tru64 +AC_CHECK_MEMBERS([struct stat.st_mtime_usec]) # Hurd +# Check for block size support in struct stat +AC_CHECK_MEMBERS([struct stat.st_blksize]) +# Check for st_flags in struct stat (BSD fflags) +AC_CHECK_MEMBERS([struct stat.st_flags]) + +# If you have uintmax_t, we assume printf supports %ju +# If you have unsigned long long, we assume printf supports %llu +# TODO: Check for %ju and %llu support directly. +AC_CHECK_TYPES([uintmax_t, unsigned long long]) + +# We need int64_t, uint64_t, intmax_t, and uintmax_t +AC_TYPE_INTMAX_T +AC_TYPE_INT64_T +AC_TYPE_UINTMAX_T +AC_TYPE_UINT64_T + +# TODO: If any of these are missing, define them right here. +AC_CHECK_DECLS([SIZE_MAX, SSIZE_MAX, INT64_MAX, INT64_MIN, UINT64_MAX, UINT32_MAX]) + +AC_CHECK_DECL([EFTYPE], + [AC_DEFINE(HAVE_EFTYPE, 1, [A possible errno value for invalid file format errors])], + [], + [#include ]) +AC_CHECK_DECL([EILSEQ], + [AC_DEFINE(HAVE_EILSEQ, 1, [A possible errno value for invalid file format errors])], + [], + [#include ]) +AC_CHECK_TYPE([wchar_t], + [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_[]wchar_t), 1, [Define to 1 if the system has the type `wchar_t'.])dnl + AC_CHECK_SIZEOF([wchar_t])], + []) + +AC_HEADER_TIME + +# Checks for library functions. +AC_PROG_GCC_TRADITIONAL +AC_HEADER_MAJOR +AC_FUNC_FSEEKO +AC_FUNC_MEMCMP +AC_FUNC_LSTAT +AC_FUNC_STAT +AC_FUNC_STRERROR_R +AC_FUNC_STRFTIME +AC_FUNC_VPRINTF +# check for: +# CreateHardLinkA(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES) +# To avoid necessity for including windows.h or special forward declaration +# workarounds, we use 'void *' for 'struct SECURITY_ATTRIBUTES *' +AC_CHECK_STDCALL_FUNC([CreateHardLinkA],[const char *, const char *, void *]) +AC_CHECK_FUNCS([chflags chown chroot]) +AC_CHECK_FUNCS([fchdir fchflags fchmod fchown fcntl fork]) +AC_CHECK_FUNCS([fstat ftruncate futimes geteuid getpid]) +AC_CHECK_FUNCS([lchflags lchmod lchown link lstat]) +AC_CHECK_FUNCS([lutimes memmove memset mkdir mkfifo mknod]) +AC_CHECK_FUNCS([nl_langinfo pipe poll readlink select setenv setlocale]) +AC_CHECK_FUNCS([strchr strdup strerror strncpy_s strrchr symlink timegm]) +AC_CHECK_FUNCS([tzset unsetenv utime utimes vfork]) +AC_CHECK_FUNCS([wcrtomb wcscpy wcslen wctomb wmemcmp wmemcpy]) +# detects cygwin-1.7, as opposed to older versions +AC_CHECK_FUNCS([cygwin_conv_path]) + +# FreeBSD's nl_langinfo supports an option to specify whether the +# current locale uses month/day or day/month ordering. It makes the +# output a little prettier... +AC_CHECK_DECL([D_MD_ORDER], +[AC_DEFINE(HAVE_D_MD_ORDER, 1, [Define to 1 if nl_langinfo supports D_MD_ORDER])], +[], +[#if HAVE_LANGINFO_H +#include +#endif +]) + +# Check for dirent.d_namlen field explicitly +# (This is a bit more straightforward than, if not quite as portable as, +# the recipe given by the autoconf maintainers.) +AC_CHECK_MEMBER(struct dirent.d_namlen,,, +[#if HAVE_DIRENT_H +#include +#endif +]) + +# Check for Extended Attributes support +AC_ARG_ENABLE([xattr], + AS_HELP_STRING([--disable-xattr], + [Enable Extended Attributes support (default: check)])) + +if test "x$enable_xattr" != "xno"; then + AC_CHECK_HEADERS([attr/xattr.h]) + AC_CHECK_HEADERS([sys/xattr.h]) + AC_CHECK_LIB(attr,setxattr) + AC_CHECK_FUNCS([extattr_get_file extattr_list_file]) + AC_CHECK_FUNCS([extattr_set_fd extattr_set_file]) + AC_CHECK_FUNCS([fsetxattr getxattr]) + AC_CHECK_FUNCS([lgetxattr listxattr llistxattr lsetxattr]) +fi + +# Check for ACL support +# +# The ACL support in libarchive is written against the POSIX1e draft, +# which was never officially approved and varies quite a bit across +# platforms. Worse, some systems have completely non-POSIX acl functions, +# which makes the following checks rather more complex than I would like. +# +AC_ARG_ENABLE([acl], + AS_HELP_STRING([--disable-acl], + [Enable ACL support (default: check)])) + +if test "x$enable_acl" != "xno"; then + AC_CHECK_HEADERS([sys/acl.h]) + AC_CHECK_LIB([acl],[acl_get_file]) + AC_CHECK_FUNCS([acl_create_entry acl_init acl_set_fd acl_set_fd_np acl_set_file]) + + AC_CHECK_TYPES(acl_permset_t,,, + [#if HAVE_SYS_TYPES_H + #include + #endif + #if HAVE_SYS_ACL_H + #include + #endif + ]) + + # The "acl_get_perm()" function was omitted from the POSIX draft. + # (It's a pretty obvious oversight; otherwise, there's no way to + # test for specific permissions in a permset.) Linux uses the obvious + # name, FreeBSD adds _np to mark it as "non-Posix extension." + # Test for both as a double-check that we really have POSIX-style ACL support. + AC_CHECK_FUNCS(acl_get_perm_np acl_get_perm acl_get_link acl_get_link_np,,, + [#if HAVE_SYS_TYPES_H + #include + #endif + #if HAVE_SYS_ACL_H + #include + #endif + ]) + + # MacOS has an acl.h that isn't POSIX. It can be detected by + # checking for ACL_USER + AC_CHECK_DECL([ACL_USER], + [AC_DEFINE(HAVE_ACL_USER, 1, [True for systems with POSIX ACL support])], + [], + [#include ]) +fi + +# Additional requirements +AC_SYS_LARGEFILE + +AC_OUTPUT diff --git a/Utilities/cmlibarchive/contrib/README b/Utilities/cmlibarchive/contrib/README new file mode 100644 index 000000000..2eb0114ff --- /dev/null +++ b/Utilities/cmlibarchive/contrib/README @@ -0,0 +1,32 @@ +Many people have graciously sent me configuration +files and other useful tidbits for use with libarchive. + +I do not support or use any of these; but if you can use them, enjoy! + +====================================================================== + +From: Andre Stechert + +libarchive_autodetect-st_lib_archive.m4 + +M4 macros for use with autoconf to detect whether a suitable +version of libarchive is installed on this system. + + +====================================================================== + +libarchive.spec + +An RPM ".spec" file for building libarchive on most systems. +This apparently was originally developed by a group at pld-linux.org. +Several people have sent me different versions of this file. + +====================================================================== + +From: Robert Meier + +libarchive.1aix53.spec + +As above, for use on AIX5.3. + +====================================================================== diff --git a/Utilities/cmlibarchive/contrib/libarchive.1aix53.spec b/Utilities/cmlibarchive/contrib/libarchive.1aix53.spec new file mode 100644 index 000000000..028c0421b --- /dev/null +++ b/Utilities/cmlibarchive/contrib/libarchive.1aix53.spec @@ -0,0 +1,160 @@ +# $LastChangedRevision: 8 $, $LastChangedDate: 2008-04-30 18:11:33 -0400 (Wed, 30 Apr 2008) $ +Summary: Library to create and read several different archive formats +Summary(pl): Biblioteka do tworzenia i odczytu ró¿nych formatów archiwów +Name: libarchive +Version: 2.0a3 +Release: 1aix53 +License: BSD +Group: Libraries +Source0: http://people.freebsd.org/~kientzle/libarchive/src/%{name}-%{version}.tar.gz +Patch: %{name}-0123457890.patch +URL: http://people.freebsd.org/~kientzle/libarchive/ +Requires: glibc +Requires: zlib +Requires: bzip2 +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: gawk +BuildRequires: zlib-devel +BuildRequires: bzip2 +BuildRoot: %{_tmppath}/%{name}-%{version}-build + +%description +Libarchive is a programming library that can create and read several +different streaming archive formats, including most popular TAR +variants and several CPIO formats. It can also write SHAR archives. + +%description -l pl +Libarchive jest bibliotek± s³u¿ac± to tworzenia i odczytu wielu +ró¿nych strumieniowych formatów archiwów, w³±czaj±c w to popularne +odmiany TAR oraz wiele formatów CPIO. Biblioteka ta potrafi tak¿e +zapisywaæ archiwa SHAR. + +%package devel +Summary: Header files for libarchive library +Summary(pl): Pliki nag³ówkowe biblioteki libarchive +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +Header files for libarchive library. + +%description devel -l pl +Pliki nag³ówkowe biblioteki libarchive. + +%package static +Summary: Static libarchive library +Summary(pl): Statyczna biblioteka libarchive +Group: Development/Libraries +Requires: %{name}-devel = %{version}-%{release} + +%description static +Static libarchive library. + +%description static -l pl +Statyczna biblioteka libarchive. + +%package -n bsdtar +Summary: bsdtar - tar(1) implementation based on libarchive +Summary(pl): bsdtar - implementacja programu tar(1) oparta na libarchive +Group: Applications/Archiving +Requires: %{name} = %{version}-%{release} + +%description -n bsdtar +bsdtar - tar(1) implementation based on libarchive. + +%description -n bsdtar -l pl +bsdtar - implementacja programu tar(1), oparta na libarchive. + +%prep +%setup -q +%patch0 -p1 + +%build +# Specify paths to avoid use of vacpp +# -maix64 - required to use large files with aix-5.3 +# -static - required for interoperability without copying libraries +# -D_BSD - required to include definition of makedev +# -X64 - required to assemble 64-bit COFF files +mkdir -p %{buildroot} +PATH=/opt/freeware/libexec:/opt/freeware/bin:/usr/local/bin:/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:. \ +CPATH=/opt/freeware/include:/usr/local/include \ +LIBPATH=/opt/freeware/lib:/usr/local/lib:/usr/share/lib \ +LD_LIBRARY_PATH=/opt/freeware/lib:/usr/local/lib:/usr/share/lib \ +CFLAGS="$RPM_OPT_FLAGS -maix64 -static -D_BSD" \ +CXXFLAGS="$RPM_OPT_FLAGS -maix64 -static -D_BSD" \ +AR="ar -X64" \ +./configure \ +--prefix=%{_prefix} \ +--libexecdir=%{_libexecdir} \ +--mandir=%{_mandir} \ +--infodir=%{_infodir} \ +--enable-shared=yes \ +--enable-static=yes \ +| tee %{buildroot}/config.log +make | tee %{buildroot}/make.log + +%install +[ "%buildroot" != "/" ] && [ -d %buildroot ] && rm -rf %buildroot; +make DESTDIR=%buildroot install +# original install builds, but does install bsdtar +cp .libs/%{name}.a %{buildroot}%{_libdir} +cp bsdtar %{buildroot}%{_bindir} +cp tar/bsdtar.1 %{buildroot}%{_mandir}/man1 + +%clean +rm -fr %buildroot + +%files +%defattr(644,root,root,755) +%{_libdir}/libarchive.a + +%files devel +%defattr(644,root,root,755) +%{_libdir}/libarchive.la +%{_includedir}/*.h +%doc %{_mandir}/man3/* +%doc %{_mandir}/man5/* + +%files -n bsdtar +%defattr(644,root,root,755) +%attr(755,root,root) %{_bindir}/bsdtar +%doc %{_mandir}/man1/bsdtar.1* + +%define date %(echo `LC_ALL="C" date +"%a %b %d %Y"`) +%changelog +* %{date} PLD Team +All persons listed below can be reached at @pld-linux.org + +$Log: libarchive.spec,v $ +Release 1aix53 2006/12/12 rm1023@dcx.com +- tweak for aix-5.3 +- added libarchive-0123457890.patch for "0123457890" error +- replaced libarchive-1.3.1.tar.gz with libarchive-2.0a3.tar.gz +- removed obsolete -CVE-2006-5680.patch and -man_progname.patch + +Revision 1.6 2006/11/15 10:41:28 qboosh +- BR: acl-devel,attr-devel +- devel deps + +Revision 1.5 2006/11/08 22:22:25 twittner +- up to 1.3.1 +- added BR: e2fsprogs-devel +- added -CVE-2006-5680.patch agains entering in infinite +loop in corrupt archives +- added bsdtar package (bsdtar is included now in libarchive +sources) +- rel. 0.1 for testing + +Revision 1.4 2005/12/15 18:26:36 twittner +- up to 1.2.37 +- removed -shared.patch (no longer needed) + +Revision 1.3 2005/10/05 17:00:12 arekm +- up to 1.02.034 + +Revision 1.2 2005/07/27 20:17:21 qboosh +- typo + +Revision 1.1 2005/07/27 08:36:03 adamg +- new diff --git a/Utilities/cmlibarchive/contrib/libarchive.spec b/Utilities/cmlibarchive/contrib/libarchive.spec new file mode 100644 index 000000000..56545f972 --- /dev/null +++ b/Utilities/cmlibarchive/contrib/libarchive.spec @@ -0,0 +1,147 @@ +# $LastChangedRevision: 8 $, $LastChangedDate: 2008-04-30 18:11:33 -0400 (Wed, 30 Apr 2008) $ +Summary: Library to create and read several different archive formats +Summary(pl): Biblioteka do tworzenia i odczytu ró¿nych formatów archiwów +Name: libarchive +Version: 2.0a3 +Release: 1 +License: BSD +Group: Libraries +Source0: http://people.freebsd.org/~kientzle/libarchive/src/%{name}-%{version}.tar.gz +Patch: %{name}-0123457890.patch +URL: http://people.freebsd.org/~kientzle/libarchive/ +Requires: glibc +Requires: zlib +Requires: bzip2 +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: gawk +BuildRequires: zlib-devel +BuildRequires: bzip2 +BuildRoot: %{_tmppath}/%{name}-%{version}-build + +%description +Libarchive is a programming library that can create and read several +different streaming archive formats, including most popular TAR +variants and several CPIO formats. It can also write SHAR archives. + +%description -l pl +Libarchive jest bibliotek± s³u¿ac± to tworzenia i odczytu wielu +ró¿nych strumieniowych formatów archiwów, w³±czaj±c w to popularne +odmiany TAR oraz wiele formatów CPIO. Biblioteka ta potrafi tak¿e +zapisywaæ archiwa SHAR. + +%package devel +Summary: Header files for libarchive library +Summary(pl): Pliki nag³ówkowe biblioteki libarchive +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +Header files for libarchive library. + +%description devel -l pl +Pliki nag³ówkowe biblioteki libarchive. + +%package static +Summary: Static libarchive library +Summary(pl): Statyczna biblioteka libarchive +Group: Development/Libraries +Requires: %{name}-devel = %{version}-%{release} + +%description static +Static libarchive library. + +%description static -l pl +Statyczna biblioteka libarchive. + +%package -n bsdtar +Summary: bsdtar - tar(1) implementation based on libarchive +Summary(pl): bsdtar - implementacja programu tar(1) oparta na libarchive +Group: Applications/Archiving +Requires: %{name} = %{version}-%{release} + +%description -n bsdtar +bsdtar - tar(1) implementation based on libarchive. + +%description -n bsdtar -l pl +bsdtar - implementacja programu tar(1), oparta na libarchive. + +%prep +%setup -q +%patch0 -p1 + +%build +mkdir -p %{buildroot} +./configure \ +--prefix=%{_prefix} \ +--libexecdir=%{_libexecdir} \ +--mandir=%{_mandir} \ +--infodir=%{_infodir} \ +--enable-shared=yes \ +--enable-static=yes \ +| tee %{buildroot}/config.log +make | tee %{buildroot}/make.log + +%install +[ "%buildroot" != "/" ] && [ -d %buildroot ] && rm -rf %buildroot; +make DESTDIR=%buildroot install +# original install builds, but does install bsdtar +cp .libs/%{name}.a %{buildroot}%{_libdir} +cp bsdtar %{buildroot}%{_bindir} +cp tar/bsdtar.1 %{buildroot}%{_mandir}/man1 + +%clean +rm -fr %buildroot + +%files +%defattr(644,root,root,755) +%{_libdir}/libarchive.a + +%files devel +%defattr(644,root,root,755) +%{_libdir}/libarchive.la +%{_includedir}/*.h +%doc %{_mandir}/man3/* +%doc %{_mandir}/man5/* + +%files -n bsdtar +%defattr(644,root,root,755) +%attr(755,root,root) %{_bindir}/bsdtar +%doc %{_mandir}/man1/bsdtar.1* + +%define date %(echo `LC_ALL="C" date +"%a %b %d %Y"`) +%changelog +* %{date} PLD Team +All persons listed below can be reached at @pld-linux.org + +$Log: libarchive.spec,v $ +Release 1 2006/12/12 rm1023@dcx.com +- added libarchive-0123457890.patch for "0123457890" error +- replaced libarchive-1.3.1.tar.gz with libarchive-2.0a3.tar.gz +- removed obsolete -CVE-2006-5680.patch and -man_progname.patch + +Revision 1.6 2006/11/15 10:41:28 qboosh +- BR: acl-devel,attr-devel +- devel deps + +Revision 1.5 2006/11/08 22:22:25 twittner +- up to 1.3.1 +- added BR: e2fsprogs-devel +- added -CVE-2006-5680.patch agains entering in infinite +loop in corrupt archives +- added bsdtar package (bsdtar is included now in libarchive +sources) +- rel. 0.1 for testing + +Revision 1.4 2005/12/15 18:26:36 twittner +- up to 1.2.37 +- removed -shared.patch (no longer needed) + +Revision 1.3 2005/10/05 17:00:12 arekm +- up to 1.02.034 + +Revision 1.2 2005/07/27 20:17:21 qboosh +- typo + +Revision 1.1 2005/07/27 08:36:03 adamg +- new diff --git a/Utilities/cmlibarchive/contrib/libarchive_autodetect-st_lib_archive.m4 b/Utilities/cmlibarchive/contrib/libarchive_autodetect-st_lib_archive.m4 new file mode 100644 index 000000000..98eb533c3 --- /dev/null +++ b/Utilities/cmlibarchive/contrib/libarchive_autodetect-st_lib_archive.m4 @@ -0,0 +1,154 @@ +dnl +dnl @synopsis ST_LIB_ARCHIVE([ENABLED-DEFAULT]) +dnl +dnl This macro figures out what's necessary to link a program against an +dnl instance of the BSD libarchive package by Tim Kientzle. +dnl +dnl See http://people.freebsd.org/~kientzle/libarchive/ for more info. +dnl +dnl It exports and substitutes the variables LIBARCHIVE_LIBS, LIBARCHIVE_LDFLAGS, +dnl and LIBARCHIVE_CPPFLAGS to appropriate values for the identified instance of +dnl libarchive. The values are AC_SUBST'd, so a user could, for example, simply +dnl include @LIBARCHIVE_CPPFLAGS@ in the definition of AM_CPPFLAGS in a Makefile.am. +dnl +dnl ENABLED-DEFAULT is either "yes" or "no" and determines whether the default value +dnl is --with-libarchive or --without-libarchive. It is not possible to specify a +dnl default directory. More simply, any reasonable choice for a default should just +dnl go into the auto-detect list. +dnl +dnl The macro defines the symbol HAVE_LIBARCHIVE if the library is found. You +dnl should use autoheader to include a definition for this symbol in a config.h +dnl file. Sample usage in a C/C++ source is as follows: +dnl +dnl #ifdef HAVE_LIBARCHIVE +dnl #include +dnl #endif /* HAVE_LIBARCHIVE */ +dnl +dnl @category InstalledPackages +dnl @author Andre Stechert +dnl @version 2006-04-20 +dnl @license GPLWithACException + +AC_DEFUN([ST_LIB_ARCHIVE], +[ +# +# Handle input from the configurer and blend with the requirements from the maintainer. +# We go through the trouble of creating a second set of variables other than the with_foo +# variables in order to be sure that error/corner cases have been cleaned up. +# +# After this statement, three trusted variable are defined. +# +# st_lib_archive_ENABLED will be either "yes" or "no". its value determines whether +# or not we bother with the rest of the checks and whether or not we export a +# bunch of variables. +# +# st_lib_archive_LOCATION will be either "auto" or "defined". if it is "auto", then +# we try a bunch of standard locations. if it is "defined", then we just try the value +# provided in st_lib_archive_DIR. +# +# st_lib_archive_DIR will contain the string provided by the user, provided that it's +# actually a directory. +# +AC_MSG_CHECKING([if libarchive is wanted]) +AC_ARG_WITH([libarchive], + AS_HELP_STRING([--with-libarchive=DIR], [libarchive installation directory]), + [if test "x$with_libarchive" = "xno" ; then + st_lib_archive_ENABLED=no + elif test "x$with_libarchive" = "xyes" ; then + st_lib_archive_ENABLED=yes + st_lib_archive_LOCATION=auto + else + st_lib_archive_ENABLED=yes + st_lib_archive_LOCATION=defined + if test -d "$with_libarchive" ; then + st_lib_archive_DIR="$with_libarchive" + else + AC_MSG_ERROR([$with_libarchive is not a directory]) + fi + fi], + [if test "x$1" = "xno" ; then + st_lib_archive_ENABLED=no + elif test "x$1" = "xyes" ; then + st_lib_archive_ENABLED=yes + else + st_lib_archive_ENABLED=yes + fi]) + +if test "$st_lib_archive_ENABLED" = "yes" ; then + AC_MSG_RESULT([yes]) +# +# After this statement, one trusted variable is defined. +# +# st_lib_archive_LIB will be either "lib" or "lib64", depending on whether the configurer +# specified 32, 64. The default is "lib". +# + AC_MSG_CHECKING([whether to use lib or lib64]) + AC_ARG_WITH([libarchive-bits], + AS_HELP_STRING([--with-libarchive-bits=32/64], [if 64, look in /lib64 on hybrid systems]), + [if test "x$with_libarchive_bits" = "x32" ; then + st_lib_archive_LIB=lib + elif test "x$with_libarchive_bits" = "x64" ; then + st_lib_archive_LIB=lib64 + else + AC_MSG_ERROR([the argument must be either 32 or 64]) + fi], + [st_lib_archive_LIB=lib]) + AC_MSG_RESULT($st_lib_archive_LIB) +# +# Save the environment before verifying libarchive availability +# + st_lib_archive_SAVECPPFLAGS="$CPPFLAGS" + st_lib_archive_SAVELDFLAGS="$LDFLAGS" + AC_LANG_SAVE + AC_LANG_C + + if test "x$st_lib_archive_LOCATION" = "xdefined" ; then + CPPFLAGS="-I$st_lib_archive_DIR/include $st_lib_archive_SAVECPPFLAGS" + LDFLAGS="-L$st_lib_archive_DIR/$st_lib_archive_LIB $st_lib_archive_SAVELDFLAGS" + AC_CHECK_LIB(archive, archive_read_new, [st_lib_archive_found_lib=yes], [st_lib_archive_found_lib=no]) + AC_CHECK_HEADER(archive.h, [st_lib_archive_found_hdr=yes], [st_lib_archive_found_hdr=no]) + if test "x$st_lib_archive_found_lib" = "xyes" && test "x$st_lib_archive_found_hdr" = "xyes"; then + LIBARCHIVE_CPPFLAGS="-I$dir/include" + LIBARCHIVE_LDFLAGS="-L$dir/$st_lib_archive_LIB" + else + AC_MSG_ERROR([could not find libarchive in the requested location]) + fi + else + # + # These are the common install directories for Linux, FreeBSD, Solaris, and Mac. + # + for dir in /usr /usr/local /usr/sfw /opt/csw /opt/local /sw + do + if test -d "$dir" ; then + CPPFLAGS="-I$dir/include $st_lib_archive_SAVECPPFLAGS" + LDFLAGS="-L$dir/$st_lib_archive_LIB $st_lib_archive_SAVELDFLAGS" + AC_CHECK_LIB(archive, archive_read_new, [st_lib_archive_found_lib=yes], [st_lib_archive_found_lib=no]) + AC_CHECK_HEADER(archive.h, [st_lib_archive_found_hdr=yes], [st_lib_archive_found_hdr=no]) + if test "x$st_lib_archive_found_lib" = "xyes" && test "x$st_lib_archive_found_hdr" = "xyes"; then + LIBARCHIVE_CPPFLAGS="-I$dir/include" + LIBARCHIVE_LDFLAGS="-L$dir/$st_lib_archive_LIB" + break + fi + fi + done + fi + + if test "x$st_lib_archive_found_hdr" = "xyes" && test "x$st_lib_archive_found_lib" = "xyes" ; then + LIBARCHIVE_LIBS="-larchive" + AC_DEFINE([HAVE_LIBARCHIVE], [1], [Defined to 1 if libarchive is available for use.]) + AC_SUBST(LIBARCHIVE_LIBS) + AC_SUBST(LIBARCHIVE_CPPFLAGS) + AC_SUBST(LIBARCHIVE_LDFLAGS) + fi + +# +# Restore the environment now that we're done. +# + AC_LANG_RESTORE + CPPFLAGS="$st_lib_archive_SAVECPPFLAGS" + LDFLAGS="$st_lib_archive_SAVELDFLAGS" +else + AC_MSG_RESULT([no]) +fi +AM_CONDITIONAL(LIBARCHIVE, test "x$st_lib_archive_found_lib" = "xyes" && test "x$st_lib_archive_found_hdr" = "xyes") +]) diff --git a/Utilities/cmlibarchive/contrib/psota-benchmark/results.txt b/Utilities/cmlibarchive/contrib/psota-benchmark/results.txt new file mode 100644 index 000000000..8197b28f7 --- /dev/null +++ b/Utilities/cmlibarchive/contrib/psota-benchmark/results.txt @@ -0,0 +1,122 @@ +ODP: [Bug-tar] GNU tar, star and BSD tar speed comparision +new script + +Jan Psota +Thu, 25 Oct 2007 06:51:13 -0700 + +Latest TCP script at the bottom (3180 bytes). +4 tests: 64bit dual core Athlon tmpfs / disk (reiserfs) - 60MB/s, + 32bit Athlon tmpfs / disk (reiserfs) - 55MB/s +Both machines were idle -- used for testing only. +Tarball and extracted files were on different physical devices. +Test data: linux 2.6.22/3 kernel sources for memory operations, +for the other data average file size should bring enough info. + +2 x [...] processor means 1 processor with 2 cores (2 entries in cpuinfo). +Archive format is set to pax (Joerg). +Let's end with it. I only wanted to send You a new version of TCP script :-). + +-- +Jan Psota + +TCP, version 2007-10-25 +Linux 2.6.22-suspend2-r2 / Gentoo Base System release 2.0.0_rc5 +2012MB of memory, 2 x AMD Athlon(tm) 64 X2 Dual Core Processor 4200+ 2211.348 +512 KB 4426.24 bmips +gcc (GCC) 4.2.2 (Gentoo 4.2.2 p1.0) +CFLAGS="-O2 -march=k8 -pipe" + +bsdtar: bsdtar 2.3.4 - libarchive 2.3.4 +gnutar: tar (GNU tar) 1.19 +star: star: star 1.5a85 (x86_64-unknown-linux-gnu) + +best time of 5 repetitions, + src=linux-2.6.23, 291M in 23867 files, avg 13KB/file, + archive=/tmp/tcp.tar, extract to /tmp/tcptmp +program operation real user system %CPU speed +bsdtar create 0.764 0.232 0.532 99.96 370308 KB/s +gnutar create 0.743 0.200 0.512 95.87 380775 KB/s +star create 0.587 0.040 0.820 100.00 441247 KB/s + +bsdtar list 0.164 0.096 0.068 99.84 1579341 KB/s +gnutar list 0.218 0.064 0.152 98.92 1188128 KB/s +star list 0.359 0.044 0.240 79.09 721481 KB/s + +bsdtar extract 0.733 0.200 0.504 96.02 353358 KB/s +gnutar extract 0.625 0.092 0.508 96.02 414419 KB/s +star extract 0.875 0.096 0.980 100.00 296013 KB/s + +bsdtar compare 0.001 0.000 0.000 0.00 259012000 KB/s +gnutar compare 0.719 0.288 0.400 95.66 360239 KB/s +star compare 0.695 0.224 0.636 100.00 372679 KB/s + +[...] +best time of 3 repetitions, + src=/home, 3.2G in 7447 files, avg 554KB/file, + archive=/var/tcp.tar, extract to /mnt/a/tcptmp +program operation real user system %CPU speed +bsdtar create 184.680 0.552 13.365 7.53 17958 KB/s +gnutar create 159.240 0.256 12.417 7.95 20827 KB/s +star create 181.779 0.140 14.789 8.21 18203 KB/s + +bsdtar list 0.053 0.032 0.016 91.41 62435471 KB/s +gnutar list 56.535 0.136 3.764 6.89 58531 KB/s +star list 56.652 0.080 5.236 9.38 58410 KB/s + +bsdtar extract 78.914 0.820 15.149 20.23 41932 KB/s +gnutar extract 78.480 0.196 14.197 18.33 42164 KB/s +star extract 79.439 0.132 12.973 16.49 41655 KB/s + +bsdtar compare 0.001 0.000 0.000 0.00 3309080000 KB/s +gnutar compare 61.771 3.464 8.905 20.02 53570 KB/s +star compare 57.561 1.728 9.897 20.19 57488 KB/s + + +Linux 2.6.22-suspend2-smp / Gentoo Base System release 2.0.0_rc5 +504MB of memory, 1 x AMD Athlon(tm) Processor 1500.033 256 KB 3002.55 bmips +gcc (GCC) 4.2.2 (Gentoo 4.2.2 p1.0) +CFLAGS="-O2 -march=athlon-xp -mfpmath=sse -frename-registers -pipe" + +bsdtar: bsdtar 2.3.4 - libarchive 2.3.4 +gnutar: tar (GNU tar) 1.19 +star: star: star 1.5a85 (i686-pc-linux-gnu) + +best time of 3 repetitions, + src=/usr/src/linux-2.6.22-suspend2/drivers, 119M in 5900 files, + avg 21KB/file, archive=/tmp/tcp.tar, extract to /tmp/tcptmp +program operation real user system %CPU speed +bsdtar create 1.329 0.192 1.132 99.63 89784 KB/s +gnutar create 1.223 0.124 1.092 99.46 97566 KB/s +star create 1.848 0.036 1.708 94.36 61372 KB/s + +bsdtar list 0.167 0.060 0.108 100.00 679137 KB/s +gnutar list 0.161 0.040 0.124 100.00 704447 KB/s +star list 0.859 0.044 0.716 88.51 132032 KB/s + +bsdtar extract 1.186 0.172 1.012 99.87 95629 KB/s +gnutar extract 1.064 0.056 1.004 99.63 106593 KB/s +star extract 1.920 0.088 1.724 94.40 59070 KB/s + +bsdtar compare 0.002 0.000 0.000 0.00 56708000 KB/s +gnutar compare 0.925 0.232 0.692 99.90 122611 KB/s +star compare 1.569 0.376 1.096 93.79 72285 KB/s + +[...] +best time of 3 repetitions, + src=/home/jasiu, 2.1G in 8416 files, avg 277KB/file, + archive=/home/j2/tcp.tar, extract to /mnt/a/tar/tcptmp +program operation real user system %CPU speed +bsdtar create 182.171 1.692 29.130 16.91 11584 KB/s +gnutar create 174.999 0.632 27.450 16.04 12059 KB/s +star create 180.004 0.360 41.795 23.41 11677 KB/s + +bsdtar list 0.214 0.076 0.136 99.04 9822294 KB/s +gnutar list 0.210 0.076 0.136 100.00 10009385 KB/s +star list 43.462 0.148 18.109 42.00 48363 KB/s + +bsdtar extract 94.912 4.476 31.574 37.98 22146 KB/s +gnutar extract 94.657 0.396 29.462 31.54 22206 KB/s +star extract 100.814 0.400 39.906 39.98 20849 KB/s + +bsdtar compare 0.003 0.000 0.004 100.00 700657000 KB/s +gnutar compare 80.174 3.932 20.365 30.30 26217 KB/s +star compare 73.911 8.341 27.670 48.72 28439 KB/s diff --git a/Utilities/cmlibarchive/contrib/psota-benchmark/tcp.sh b/Utilities/cmlibarchive/contrib/psota-benchmark/tcp.sh new file mode 100755 index 000000000..6c0e4b5e9 --- /dev/null +++ b/Utilities/cmlibarchive/contrib/psota-benchmark/tcp.sh @@ -0,0 +1,104 @@ +#!/bin/sh +# tar comparision program +# 2007-10-25 Jan Psota + +n=3 # number of repetitions +TAR=(bsdtar gnutar star) # TApeArchivers to compare +OPT=("" "--seek" "-no-fsync") +pax="--format=pax" # comment out for defaults +OPN=(create list extract compare) # operations +version="2007-10-25" +TIMEFORMAT=$'%R\t%U\t%S\t%P' +LC_ALL=C + +test $# -ge 2 || { + echo -e "usage:\t$0 source_dir where_to_place_archive +[where_to_extract_it] + +TCP, version $version +TCP stands for Tar Comparision Program here. +It currently compares: BSD tar (bsdtar), GNU tar (gnutar) and star in archive +creation, listing, extraction and archive-to-extracted comparision. +Tcp prints out best time of n=$n repetitions. + +Tcp creates temporary archive named tcp.tar with $pax and some native +(--seek/-no-fsync) options and extracts it to [\$3]/tcptmp/. +If unset, third argument defaults to [\$2]. +After normal exit tcp removes tarball and extracted files. +Tcp does not check filesystems destination directories are on for free space, +so make sure there is enough space (a bit more than source_dir uses) for both: +archive and extracted files. +Do not use white space in arguments. + Jan Psota, $version" + exit 0 +} +src=$1 +dst=$2/tcp.tar +dst_path=${3:-$2}/tcptmp +test -e $dst -o -e /tmp/tcp \ + && { echo "$dst or /tmp/tcp exists, exiting"; exit 1; } +mkdir $dst_path || exit 2 + +use_times () +{ + awk -F"\t" -vN=$n -vL="`du -k $dst`" -vOFS="\t" -vORS="" ' + { if (NF==4) { printf "\t%s\t%10.1d KB/s\n", $0, ($1+0>0 ? +(L+0)/($1+0) : 0) } }' \ + /tmp/tcp | sort | head -1 + > /tmp/tcp +} + +test -d $src || { echo "'$src' is not a directory"; exit 3; } + +# system information: type, release, memory, cpu(s), compiler and flags +echo -e "TCP, version $version\n"`uname -sr`" / "`head -1 /etc/*-release` +free -m | awk '/^Mem/ { printf "%dMB of memory, ", $2 }' +test -e /proc/cpuinfo \ + && awk -F: '/name|cache size|MHz|mips/ { if (!a) b=b $2 } + /^$/ { a++ } END { print a" x"b" bmips" }' /proc/cpuinfo +test -e /etc/gentoo-release \ + && gcc --version | head -1 && grep ^CFLAGS /etc/make.conf + +# tar versions +echo +for tar in [EMAIL PROTECTED]; do echo -ne "$tar:\t"; $tar --version | head -1; +done + +echo -e "\nbest time of $n repetitions,\n"\ +" src=$src, "\ +`du -sh $src | awk '{print $1}'`" in "`find $src | wc -l`" files, "\ +"avg "$((`du -sk $src | awk '{print $1}'`/`find $src -type f | wc +-l`))"KB/file,\n"\ +" archive=$dst, extract to $dst_path" + +echo -e "program\toperation\treal\tuser\tsystem\t%CPU\t speed" +> /tmp/tcp +let op_num=0 +for op in "cf $dst $pax -C $src ." "tf $dst" "xf $dst -C $dst_path" \ + "f $dst -C $dst_path --diff"; do + let tar_num=0 + for tar in [EMAIL PROTECTED]; do + echo -en "$tar\t${OPN[op_num]}\t" + for ((i=1; i<=$n; i++)); do + echo $op | grep -q ^cf && rm -f $dst + echo $op | grep -q ^xf && + { chmod -R u+w $dst_path + rm -rf $dst_path; mkdir $dst_path; } + sync + if echo $op | grep -q ^f; then # op == compare + time $tar $op ${OPT[$tar_num]} > /dev/null + else # op in (create | list | extract) + time $tar $op ${OPT[$tar_num]} > /dev/null \ + || break 3 + fi 2>> /tmp/tcp + done + use_times + let tar_num++ + done + let op_num++ + echo +done +rm -rf $dst_path $dst +echo +cat /tmp/tcp +rm -f /tmp/tcp diff --git a/Utilities/cmlibarchive/contrib/shar/Makefile b/Utilities/cmlibarchive/contrib/shar/Makefile new file mode 100644 index 000000000..23c0d3f3e --- /dev/null +++ b/Utilities/cmlibarchive/contrib/shar/Makefile @@ -0,0 +1,14 @@ +# $FreeBSD$ + +PROG= shar +SRCS= shar.c tree.c + +WARNS?= 6 + +DPADD= ${LIBARCHIVE} +LDADD= -larchive + +LINKS= ${BINDIR}/shar +MLINKS= shar.1 + +.include diff --git a/Utilities/cmlibarchive/contrib/shar/shar.1 b/Utilities/cmlibarchive/contrib/shar/shar.1 new file mode 100644 index 000000000..151590dfb --- /dev/null +++ b/Utilities/cmlibarchive/contrib/shar/shar.1 @@ -0,0 +1,128 @@ +.\" Copyright (c) 1990, 1993 +.\" The Regents of the University of California. 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. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. +.\" +.\" @(#)shar.1 8.1 (Berkeley) 6/6/93 +.\" $FreeBSD$ +.\" +.Dd April 17, 2008 +.Dt SHAR 1 +.Os +.Sh NAME +.Nm shar +.Nd create a shell archive of files +.Sh SYNOPSIS +.Nm +.Op Fl br +.Op Fl o Ar archive-file +.Ar +.Sh DESCRIPTION +The +.Nm +command writes a +.Xr sh 1 +shell script which will recreate the file hierarchy specified by the command +line operands. +.Pp +The +.Nm +command is normally used for distributing files by +.Xr ftp 1 +or +.Xr mail 1 . +.Pp +The following options are available: +.Bl -tag -width indent +.It Fl b +Use an alternative binary format. Content of files will be uuencoded. +This option should be used to archive binary files correctly. +In this mode also file permissions will be stored to the archive. +uudecode(1) is needed to extract archives created with this option. +.It Fl o Ar archive-file +Redirect output to +.Ar archive-file . +.It Fl r +If +.Ar file +given on command line is a directory the entire subtree will be archived. +Symbolic links given on command line are followed. Other symbolic links will +be archived as such. +.El +.Sh EXAMPLES +To create a shell archive of the program +.Xr ls 1 +and mail it to Rick: +.Bd -literal -offset indent +cd ls +shar -r . \&| mail -s "ls source" rick +.Ed +.Pp +To recreate the program directory: +.Bd -literal -offset indent +mkdir ls +cd ls +\&... + +\&... +sh archive +.Ed +.Sh SEE ALSO +.Xr compress 1 , +.Xr mail 1 , +.Xr tar 1 , +.Xr uuencode 1 , +.Xr uuencode 5 +.Sh HISTORY +The +.Nm +command appeared in +.Bx 4.4 . +This is a re-implementation based on the libarchive(3) library. +.Sh BUGS +The +.Nm +command makes no provisions for hard links. +.Pp +Files containing magic characters or files without a newline ('\\n') as the +last character are not handled correctly with the default format. Use the -b +option for binary files. +.Pp +It is easy to insert trojan horses into +.Nm +files. +It is strongly recommended that all shell archive files be examined +before running them through +.Xr sh 1 . +Archives produced using this implementation of +.Nm +may be easily examined with the command: +.Bd -literal -offset indent +egrep -v '^[X#]' shar.file +.Ed diff --git a/Utilities/cmlibarchive/contrib/shar/shar.c b/Utilities/cmlibarchive/contrib/shar/shar.c new file mode 100644 index 000000000..91ab2b5f0 --- /dev/null +++ b/Utilities/cmlibarchive/contrib/shar/shar.c @@ -0,0 +1,314 @@ +/*- + * Copyright (c) 2008 Jaakko Heinonen + * 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 +#ifdef __FBSDID +__FBSDID("$FreeBSD$"); +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tree.h" + +/* command line options */ +static int b_opt; /* use alternative shar binary format */ +static int r_opt; /* recurse into subdirectories */ +static char *o_arg; /* output file name */ + +static void +usage(void) +{ + fprintf(stderr, "Usage: shar [-br] [-o filename] file ...\n"); + exit(EX_USAGE); +} + +/* + * Initialize archive structure and create a shar archive. + */ +static struct archive * +shar_create(void) +{ + struct archive *a; + + if ((a = archive_write_new()) == NULL) + errx(EXIT_FAILURE, "%s", archive_error_string(a)); + + if (b_opt) + archive_write_set_format_shar_dump(a); + else + archive_write_set_format_shar(a); + archive_write_set_compression_none(a); + + if (archive_write_open_filename(a, o_arg) != ARCHIVE_OK) + errx(EX_CANTCREAT, "%s", archive_error_string(a)); + + return (a); +} + +/* buffer for file data */ +static char buffer[32768]; + +/* + * Write file data to an archive entry. + */ +static int +shar_write_entry_data(struct archive *a, const int fd) +{ + ssize_t bytes_read, bytes_written; + + assert(a != NULL); + assert(fd >= 0); + + bytes_read = read(fd, buffer, sizeof(buffer)); + while (bytes_read != 0) { + if (bytes_read < 0) { + archive_set_error(a, errno, "Read failed"); + return (ARCHIVE_WARN); + } + bytes_written = archive_write_data(a, buffer, bytes_read); + if (bytes_written < 0) + return (ARCHIVE_WARN); + bytes_read = read(fd, buffer, sizeof(buffer)); + } + + return (ARCHIVE_OK); +} + +/* + * Write a file to the archive. We have special handling for symbolic links. + */ +static int +shar_write_entry(struct archive *a, const char *pathname, const char *accpath, + const struct stat *st) +{ + struct archive_entry *entry; + int fd = -1; + int ret = ARCHIVE_OK; + + assert(a != NULL); + assert(pathname != NULL); + assert(accpath != NULL); + assert(st != NULL); + + entry = archive_entry_new(); + + if (S_ISREG(st->st_mode) && st->st_size > 0) { + /* regular file */ + if ((fd = open(accpath, O_RDONLY)) == -1) { + warn("%s", accpath); + ret = ARCHIVE_WARN; + goto out; + } + } else if (S_ISLNK(st->st_mode)) { + /* symbolic link */ + char lnkbuff[PATH_MAX + 1]; + int lnklen; + if ((lnklen = readlink(accpath, lnkbuff, PATH_MAX)) == -1) { + warn("%s", accpath); + ret = ARCHIVE_WARN; + goto out; + } + lnkbuff[lnklen] = '\0'; + archive_entry_set_symlink(entry, lnkbuff); + } + archive_entry_copy_stat(entry, st); + archive_entry_set_pathname(entry, pathname); + if (!S_ISREG(st->st_mode) || st->st_size == 0) + archive_entry_set_size(entry, 0); + if (archive_write_header(a, entry) != ARCHIVE_OK) { + warnx("%s: %s", pathname, archive_error_string(a)); + ret = ARCHIVE_WARN; + goto out; + } + if (fd >= 0) { + if ((ret = shar_write_entry_data(a, fd)) != ARCHIVE_OK) + warnx("%s: %s", accpath, archive_error_string(a)); + } +out: + archive_entry_free(entry); + if (fd >= 0) + close(fd); + + return (ret); +} + +/* + * Write singe path to the archive. The path can be a regular file, directory + * or device. Symbolic links are followed. + */ +static int +shar_write_path(struct archive *a, const char *pathname) +{ + struct stat st; + + assert(a != NULL); + assert(pathname != NULL); + + if ((stat(pathname, &st)) == -1) { + warn("%s", pathname); + return (ARCHIVE_WARN); + } + + return (shar_write_entry(a, pathname, pathname, &st)); +} + +/* + * Write tree to the archive. If pathname is a symbolic link it will be + * followed. Other symbolic links are stored as such to the archive. + */ +static int +shar_write_tree(struct archive *a, const char *pathname) +{ + struct tree *t; + const struct stat *lst, *st; + int error = 0; + int tree_ret; + int first; + + assert(a != NULL); + assert(pathname != NULL); + + t = tree_open(pathname); + for (first = 1; (tree_ret = tree_next(t)); first = 0) { + if (tree_ret == TREE_ERROR_DIR) { + warnx("%s: %s", tree_current_path(t), + strerror(tree_errno(t))); + error = 1; + continue; + } else if (tree_ret != TREE_REGULAR) + continue; + if ((lst = tree_current_lstat(t)) == NULL) { + warn("%s", tree_current_path(t)); + error = 1; + continue; + } + /* + * If the symlink was given on command line then + * follow it rather than write it as symlink. + */ + if (first && S_ISLNK(lst->st_mode)) { + if ((st = tree_current_stat(t)) == NULL) { + warn("%s", tree_current_path(t)); + error = 1; + continue; + } + } else + st = lst; + + if (shar_write_entry(a, tree_current_path(t), + tree_current_access_path(t), st) != ARCHIVE_OK) + error = 1; + + tree_descend(t); + } + + tree_close(t); + + return ((error != 0) ? ARCHIVE_WARN : ARCHIVE_OK); +} + +/* + * Create a shar archive and write files/trees into it. + */ +static int +shar_write(char **fn, size_t nfn) +{ + struct archive *a; + size_t i; + int error = 0; + + assert(fn != NULL); + assert(nfn > 0); + + a = shar_create(); + + for (i = 0; i < nfn; i++) { + if (r_opt) { + if (shar_write_tree(a, fn[i]) != ARCHIVE_OK) + error = 1; + } else { + if (shar_write_path(a, fn[i]) != ARCHIVE_OK) + error = 1; + } + } + + if (archive_write_finish(a) != ARCHIVE_OK) + errx(EXIT_FAILURE, "%s", archive_error_string(a)); + + if (error != 0) + warnx("Error exit delayed from previous errors."); + + return (error); +} + +int +main(int argc, char **argv) +{ + int opt; + + while ((opt = getopt(argc, argv, "bro:")) != -1) { + switch (opt) { + case 'b': + b_opt = 1; + break; + case 'o': + o_arg = optarg; + break; + case 'r': + r_opt = 1; + break; + default: + usage(); + /* NOTREACHED */ + } + } + argc -= optind; + argv += optind; + + if(argc < 1) + usage(); + + if (shar_write(argv, argc) != 0) + exit(EXIT_FAILURE); + else + exit(EXIT_SUCCESS); + /* NOTREACHED */ +} + diff --git a/Utilities/cmlibarchive/contrib/shar/tree.c b/Utilities/cmlibarchive/contrib/shar/tree.c new file mode 100644 index 000000000..594afd492 --- /dev/null +++ b/Utilities/cmlibarchive/contrib/shar/tree.c @@ -0,0 +1,542 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + */ + +/*- + * This is a new directory-walking system that addresses a number + * of problems I've had with fts(3). In particular, it has no + * pathname-length limits (other than the size of 'int'), handles + * deep logical traversals, uses considerably less memory, and has + * an opaque interface (easier to modify in the future). + * + * Internally, it keeps a single list of "tree_entry" items that + * represent filesystem objects that require further attention. + * Non-directories are not kept in memory: they are pulled from + * readdir(), returned to the client, then freed as soon as possible. + * Any directory entry to be traversed gets pushed onto the stack. + * + * There is surprisingly little information that needs to be kept for + * each item on the stack. Just the name, depth (represented here as the + * string length of the parent directory's pathname), and some markers + * indicating how to get back to the parent (via chdir("..") for a + * regular dir or via fchdir(2) for a symlink). + */ +#include "tree_config.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "tree.h" + +/* + * TODO: + * 1) Loop checking. + * 3) Arbitrary logical traversals by closing/reopening intermediate fds. + */ + +struct tree_entry { + struct tree_entry *next; + struct tree_entry *parent; + char *name; + size_t dirname_length; + dev_t dev; + ino_t ino; + int fd; + int flags; +}; + +/* Definitions for tree_entry.flags bitmap. */ +#define isDir 1 /* This entry is a regular directory. */ +#define isDirLink 2 /* This entry is a symbolic link to a directory. */ +#define needsPreVisit 4 /* This entry needs to be previsited. */ +#define needsPostVisit 8 /* This entry needs to be postvisited. */ + +/* + * Local data for this package. + */ +struct tree { + struct tree_entry *stack; + struct tree_entry *current; + DIR *d; + int initialDirFd; + int flags; + int visit_type; + int tree_errno; /* Error code from last failed operation. */ + + char *buff; + const char *basename; + size_t buff_length; + size_t path_length; + size_t dirname_length; + + int depth; + int openCount; + int maxOpenCount; + + struct stat lst; + struct stat st; +}; + +/* Definitions for tree.flags bitmap. */ +#define needsReturn 8 /* Marks first entry as not having been returned yet. */ +#define hasStat 16 /* The st entry is set. */ +#define hasLstat 32 /* The lst entry is set. */ + + +#ifdef HAVE_DIRENT_D_NAMLEN +/* BSD extension; avoids need for a strlen() call. */ +#define D_NAMELEN(dp) (dp)->d_namlen +#else +#define D_NAMELEN(dp) (strlen((dp)->d_name)) +#endif + +#if 0 +#include +void +tree_dump(struct tree *t, FILE *out) +{ + struct tree_entry *te; + + fprintf(out, "\tdepth: %d\n", t->depth); + fprintf(out, "\tbuff: %s\n", t->buff); + fprintf(out, "\tpwd: "); fflush(stdout); system("pwd"); + fprintf(out, "\taccess: %s\n", t->basename); + fprintf(out, "\tstack:\n"); + for (te = t->stack; te != NULL; te = te->next) { + fprintf(out, "\t\tte->name: %s%s%s\n", te->name, + te->flags & needsPreVisit ? "" : " *", + t->current == te ? " (current)" : ""); + } +} +#endif + +/* + * Add a directory path to the current stack. + */ +static void +tree_push(struct tree *t, const char *path) +{ + struct tree_entry *te; + + te = malloc(sizeof(*te)); + memset(te, 0, sizeof(*te)); + te->next = t->stack; + t->stack = te; + te->fd = -1; + te->name = strdup(path); + te->flags = needsPreVisit | needsPostVisit; + te->dirname_length = t->dirname_length; +} + +/* + * Append a name to the current path. + */ +static void +tree_append(struct tree *t, const char *name, size_t name_length) +{ + char *p; + + if (t->buff != NULL) + t->buff[t->dirname_length] = '\0'; + /* Strip trailing '/' from name, unless entire name is "/". */ + while (name_length > 1 && name[name_length - 1] == '/') + name_length--; + + /* Resize pathname buffer as needed. */ + while (name_length + 1 + t->dirname_length >= t->buff_length) { + t->buff_length *= 2; + if (t->buff_length < 1024) + t->buff_length = 1024; + t->buff = realloc(t->buff, t->buff_length); + } + p = t->buff + t->dirname_length; + t->path_length = t->dirname_length + name_length; + /* Add a separating '/' if it's needed. */ + if (t->dirname_length > 0 && p[-1] != '/') { + *p++ = '/'; + t->path_length ++; + } + strncpy(p, name, name_length); + p[name_length] = '\0'; + t->basename = p; +} + +/* + * Open a directory tree for traversal. + */ +struct tree * +tree_open(const char *path) +{ + struct tree *t; + + t = malloc(sizeof(*t)); + memset(t, 0, sizeof(*t)); + tree_append(t, path, strlen(path)); + t->initialDirFd = open(".", O_RDONLY); + /* + * During most of the traversal, items are set up and then + * returned immediately from tree_next(). That doesn't work + * for the very first entry, so we set a flag for this special + * case. + */ + t->flags = needsReturn; + return (t); +} + +/* + * We've finished a directory; ascend back to the parent. + */ +static void +tree_ascend(struct tree *t) +{ + struct tree_entry *te; + + te = t->stack; + t->depth--; + if (te->flags & isDirLink) { + fchdir(te->fd); + close(te->fd); + t->openCount--; + } else { + chdir(".."); + } +} + +/* + * Pop the working stack. + */ +static void +tree_pop(struct tree *t) +{ + struct tree_entry *te; + + t->buff[t->dirname_length] = '\0'; + if (t->stack == t->current && t->current != NULL) + t->current = t->current->parent; + te = t->stack; + t->stack = te->next; + t->dirname_length = te->dirname_length; + t->basename = t->buff + t->dirname_length; + /* Special case: starting dir doesn't skip leading '/'. */ + if (t->dirname_length > 0) + t->basename++; + free(te->name); + free(te); +} + +/* + * Get the next item in the tree traversal. + */ +int +tree_next(struct tree *t) +{ + struct dirent *de = NULL; + + /* Handle the startup case by returning the initial entry. */ + if (t->flags & needsReturn) { + t->flags &= ~needsReturn; + return (t->visit_type = TREE_REGULAR); + } + + while (t->stack != NULL) { + /* If there's an open dir, get the next entry from there. */ + while (t->d != NULL) { + de = readdir(t->d); + if (de == NULL) { + closedir(t->d); + t->d = NULL; + } else if (de->d_name[0] == '.' + && de->d_name[1] == '\0') { + /* Skip '.' */ + } else if (de->d_name[0] == '.' + && de->d_name[1] == '.' + && de->d_name[2] == '\0') { + /* Skip '..' */ + } else { + /* + * Append the path to the current path + * and return it. + */ + tree_append(t, de->d_name, D_NAMELEN(de)); + t->flags &= ~hasLstat; + t->flags &= ~hasStat; + return (t->visit_type = TREE_REGULAR); + } + } + + /* If the current dir needs to be visited, set it up. */ + if (t->stack->flags & needsPreVisit) { + t->current = t->stack; + tree_append(t, t->stack->name, strlen(t->stack->name)); + t->stack->flags &= ~needsPreVisit; + /* If it is a link, set up fd for the ascent. */ + if (t->stack->flags & isDirLink) { + t->stack->fd = open(".", O_RDONLY); + t->openCount++; + if (t->openCount > t->maxOpenCount) + t->maxOpenCount = t->openCount; + } + t->dirname_length = t->path_length; + if (chdir(t->stack->name) != 0) { + /* chdir() failed; return error */ + tree_pop(t); + t->tree_errno = errno; + return (t->visit_type = TREE_ERROR_DIR); + } + t->depth++; + t->d = opendir("."); + if (t->d == NULL) { + tree_ascend(t); /* Undo "chdir" */ + tree_pop(t); + t->tree_errno = errno; + return (t->visit_type = TREE_ERROR_DIR); + } + t->flags &= ~hasLstat; + t->flags &= ~hasStat; + t->basename = "."; + return (t->visit_type = TREE_POSTDESCENT); + } + + /* We've done everything necessary for the top stack entry. */ + if (t->stack->flags & needsPostVisit) { + tree_ascend(t); + tree_pop(t); + t->flags &= ~hasLstat; + t->flags &= ~hasStat; + return (t->visit_type = TREE_POSTASCENT); + } + } + return (t->visit_type = 0); +} + +/* + * Return error code. + */ +int +tree_errno(struct tree *t) +{ + return (t->tree_errno); +} + +/* + * Called by the client to mark the directory just returned from + * tree_next() as needing to be visited. + */ +void +tree_descend(struct tree *t) +{ + if (t->visit_type != TREE_REGULAR) + return; + + if (tree_current_is_physical_dir(t)) { + tree_push(t, t->basename); + t->stack->flags |= isDir; + } else if (tree_current_is_dir(t)) { + tree_push(t, t->basename); + t->stack->flags |= isDirLink; + } +} + +/* + * Get the stat() data for the entry just returned from tree_next(). + */ +const struct stat * +tree_current_stat(struct tree *t) +{ + if (!(t->flags & hasStat)) { + if (stat(t->basename, &t->st) != 0) + return NULL; + t->flags |= hasStat; + } + return (&t->st); +} + +/* + * Get the lstat() data for the entry just returned from tree_next(). + */ +const struct stat * +tree_current_lstat(struct tree *t) +{ + if (!(t->flags & hasLstat)) { + if (lstat(t->basename, &t->lst) != 0) + return NULL; + t->flags |= hasLstat; + } + return (&t->lst); +} + +/* + * Test whether current entry is a dir or link to a dir. + */ +int +tree_current_is_dir(struct tree *t) +{ + const struct stat *st; + + /* + * If we already have lstat() info, then try some + * cheap tests to determine if this is a dir. + */ + if (t->flags & hasLstat) { + /* If lstat() says it's a dir, it must be a dir. */ + if (S_ISDIR(tree_current_lstat(t)->st_mode)) + return 1; + /* Not a dir; might be a link to a dir. */ + /* If it's not a link, then it's not a link to a dir. */ + if (!S_ISLNK(tree_current_lstat(t)->st_mode)) + return 0; + /* + * It's a link, but we don't know what it's a link to, + * so we'll have to use stat(). + */ + } + + st = tree_current_stat(t); + /* If we can't stat it, it's not a dir. */ + if (st == NULL) + return 0; + /* Use the definitive test. Hopefully this is cached. */ + return (S_ISDIR(st->st_mode)); +} + +/* + * Test whether current entry is a physical directory. Usually, we + * already have at least one of stat() or lstat() in memory, so we + * use tricks to try to avoid an extra trip to the disk. + */ +int +tree_current_is_physical_dir(struct tree *t) +{ + const struct stat *st; + + /* + * If stat() says it isn't a dir, then it's not a dir. + * If stat() data is cached, this check is free, so do it first. + */ + if ((t->flags & hasStat) + && (!S_ISDIR(tree_current_stat(t)->st_mode))) + return 0; + + /* + * Either stat() said it was a dir (in which case, we have + * to determine whether it's really a link to a dir) or + * stat() info wasn't available. So we use lstat(), which + * hopefully is already cached. + */ + + st = tree_current_lstat(t); + /* If we can't stat it, it's not a dir. */ + if (st == NULL) + return 0; + /* Use the definitive test. Hopefully this is cached. */ + return (S_ISDIR(st->st_mode)); +} + +/* + * Test whether current entry is a symbolic link. + */ +int +tree_current_is_physical_link(struct tree *t) +{ + const struct stat *st = tree_current_lstat(t); + if (st == NULL) + return 0; + return (S_ISLNK(st->st_mode)); +} + +/* + * Return the access path for the entry just returned from tree_next(). + */ +const char * +tree_current_access_path(struct tree *t) +{ + return (t->basename); +} + +/* + * Return the full path for the entry just returned from tree_next(). + */ +const char * +tree_current_path(struct tree *t) +{ + return (t->buff); +} + +/* + * Return the length of the path for the entry just returned from tree_next(). + */ +size_t +tree_current_pathlen(struct tree *t) +{ + return (t->path_length); +} + +/* + * Return the nesting depth of the entry just returned from tree_next(). + */ +int +tree_current_depth(struct tree *t) +{ + return (t->depth); +} + +/* + * Terminate the traversal and release any resources. + */ +void +tree_close(struct tree *t) +{ + /* Release anything remaining in the stack. */ + while (t->stack != NULL) + tree_pop(t); + if (t->buff) + free(t->buff); + /* chdir() back to where we started. */ + if (t->initialDirFd >= 0) { + fchdir(t->initialDirFd); + close(t->initialDirFd); + t->initialDirFd = -1; + } + free(t); +} diff --git a/Utilities/cmlibarchive/contrib/shar/tree.h b/Utilities/cmlibarchive/contrib/shar/tree.h new file mode 100644 index 000000000..f99e918cc --- /dev/null +++ b/Utilities/cmlibarchive/contrib/shar/tree.h @@ -0,0 +1,115 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD$ + */ + +/*- + * A set of routines for traversing directory trees. + * Similar in concept to the fts library, but with a few + * important differences: + * * Uses less memory. In particular, fts stores an entire directory + * in memory at a time. This package only keeps enough subdirectory + * information in memory to track the traversal. Information + * about non-directories is discarded as soon as possible. + * * Supports very deep logical traversals. The fts package + * uses "non-chdir" approach for logical traversals. This + * package does use a chdir approach for logical traversals + * and can therefore handle pathnames much longer than + * PATH_MAX. + * * Supports deep physical traversals "out of the box." + * Due to the memory optimizations above, there's no need to + * limit dir names to 32k. + */ + +#include +#include + +struct tree; + +/* Initiate/terminate a tree traversal. */ +struct tree *tree_open(const char * /* pathname */); +void tree_close(struct tree *); + +/* + * tree_next() returns Zero if there is no next entry, non-zero if there is. + * Note that directories are potentially visited three times. The first + * time as "regular" file. If tree_descend() is invoked at that time, + * the directory is added to a work list and will be visited two more + * times: once just after descending into the directory and again + * just after ascending back to the parent. + * + * TREE_ERROR is returned if the descent failed (because the + * directory couldn't be opened, for instance). This is returned + * instead of TREE_PREVISIT/TREE_POSTVISIT. + */ +#define TREE_REGULAR 1 +#define TREE_POSTDESCENT 2 +#define TREE_POSTASCENT 3 +#define TREE_ERROR_DIR -1 +int tree_next(struct tree *); + +int tree_errno(struct tree *); + +/* + * Request that current entry be visited. If you invoke it on every + * directory, you'll get a physical traversal. This is ignored if the + * current entry isn't a directory or a link to a directory. So, if + * you invoke this on every returned path, you'll get a full logical + * traversal. + */ +void tree_descend(struct tree *); + +/* + * Return information about the current entry. + */ + +int tree_current_depth(struct tree *); +/* + * The current full pathname, length of the full pathname, + * and a name that can be used to access the file. + * Because tree does use chdir extensively, the access path is + * almost never the same as the full current path. + */ +const char *tree_current_path(struct tree *); +size_t tree_current_pathlen(struct tree *); +const char *tree_current_access_path(struct tree *); +/* + * Request the lstat() or stat() data for the current path. Since the + * tree package needs to do some of this anyway, and caches the + * results, you should take advantage of it here if you need it rather + * than make a redundant stat() or lstat() call of your own. + */ +const struct stat *tree_current_stat(struct tree *); +const struct stat *tree_current_lstat(struct tree *); +/* The following tests may use mechanisms much faster than stat()/lstat(). */ +/* "is_physical_dir" is equivalent to S_ISDIR(tree_current_lstat()->st_mode) */ +int tree_current_is_physical_dir(struct tree *); +/* "is_physical_link" is equivalent to S_ISLNK(tree_current_lstat()->st_mode) */ +int tree_current_is_physical_link(struct tree *); +/* "is_dir" is equivalent to S_ISDIR(tree_current_stat()->st_mode) */ +int tree_current_is_dir(struct tree *); + +/* For testing/debugging: Dump the internal status to the given filehandle. */ +void tree_dump(struct tree *, FILE *); diff --git a/Utilities/cmlibarchive/contrib/shar/tree_config.h b/Utilities/cmlibarchive/contrib/shar/tree_config.h new file mode 100644 index 000000000..6e2cd7ccd --- /dev/null +++ b/Utilities/cmlibarchive/contrib/shar/tree_config.h @@ -0,0 +1,78 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD$ + */ +#ifndef TREE_CONFIG_H_INCLUDED +#define TREE_CONFIG_H_INCLUDED + +#if defined(PLATFORM_CONFIG_H) +/* + * Use hand-built config.h in environments that need it. + */ +#include PLATFORM_CONFIG_H +#elif defined(HAVE_CONFIG_H) +/* + * Most POSIX platforms use the 'configure' script to build config.h + */ +#include "../config.h" +#elif defined(__FreeBSD__) +/* + * Built-in definitions for FreeBSD. + */ +#define HAVE_DIRENT_D_NAMLEN 1 +#define HAVE_DIRENT_H 1 +#define HAVE_ERRNO_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_LIBARCHIVE 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_UNISTD_H 1 +#else +/* + * Warn if there's no platform configuration. + */ +#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 +#include +#else +/* Otherwise, include user headers. */ +#include "archive.h" +#include "archive_entry.h" +#endif + +#endif /* !TREE_CONFIG_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/contrib/untar.c b/Utilities/cmlibarchive/contrib/untar.c new file mode 100644 index 000000000..0ea645541 --- /dev/null +++ b/Utilities/cmlibarchive/contrib/untar.c @@ -0,0 +1,225 @@ +/* + * "untar" is an extremely simple tar extractor: + * * A single C source file, so it should be easy to compile + * and run on any system with a C compiler. + * * Extremely portable standard C. The only non-ANSI function + * used is mkdir(). + * * Reads basic ustar tar archives. + * * Does not require libarchive or any other special library. + * + * To compile: cc -o untar untar.c + * + * Usage: untar + * + * In particular, this program should be sufficient to extract the + * distribution for libarchive, allowing people to bootstrap + * libarchive on systems that do not already have a tar program. + * + * To unpack libarchive-x.y.z.tar.gz: + * * gunzip libarchive-x.y.z.tar.gz + * * untar libarchive-x.y.z.tar + * + * Written by Tim Kientzle, March 2009. + * + * Released into the public domain. + */ + +/* These are all highly standard and portable headers. */ +#include +#include +#include + +/* This is for mkdir(); this may need to be changed for some platforms. */ +#include /* For mkdir() */ + +/* Parse an octal number, ignoring leading and trailing nonsense. */ +static int +parseoct(const char *p, size_t n) +{ + int i = 0; + + while (*p < '0' || *p > '7') { + ++p; + --n; + } + while (*p >= '0' && *p <= '7' && n > 0) { + i *= 8; + i += *p - '0'; + ++p; + --n; + } + return (i); +} + +/* Returns true if this is 512 zero bytes. */ +static int +is_end_of_archive(const char *p) +{ + int n; + for (n = 511; n >= 0; --n) + if (p[n] != '\0') + return (0); + return (1); +} + +/* Create a directory, including parent directories as necessary. */ +static void +create_dir(char *pathname, int mode) +{ + char *p; + int r; + + /* Strip trailing '/' */ + if (pathname[strlen(pathname) - 1] == '/') + pathname[strlen(pathname) - 1] = '\0'; + + /* Try creating the directory. */ + r = mkdir(pathname, mode); + + if (r != 0) { + /* On failure, try creating parent directory. */ + p = strrchr(pathname, '/'); + if (p != NULL) { + *p = '\0'; + create_dir(pathname, 0755); + *p = '/'; + r = mkdir(pathname, mode); + } + } + if (r != 0) + fprintf(stderr, "Could not create directory %s\n", pathname); +} + +/* Create a file, including parent directory as necessary. */ +static FILE * +create_file(char *pathname, int mode) +{ + FILE *f; + f = fopen(pathname, "w+"); + if (f == NULL) { + /* Try creating parent dir and then creating file. */ + char *p = strrchr(pathname, '/'); + if (p != NULL) { + *p = '\0'; + create_dir(pathname, 0755); + *p = '/'; + f = fopen(pathname, "w+"); + } + } + return (f); +} + +/* Verify the tar checksum. */ +static int +verify_checksum(const char *p) +{ + int n, u = 0; + for (n = 0; n < 512; ++n) { + if (n < 148 || n > 155) + /* Standard tar checksum adds unsigned bytes. */ + u += ((unsigned char *)p)[n]; + else + u += 0x20; + + } + return (u == parseoct(p + 148, 8)); +} + +/* Extract a tar archive. */ +static void +untar(FILE *a, const char *path) +{ + char buff[512]; + FILE *f = NULL; + size_t bytes_read; + int filesize; + + printf("Extracting from %s\n", path); + for (;;) { + bytes_read = fread(buff, 1, 512, a); + if (bytes_read < 512) { + fprintf(stderr, + "Short read on %s: expected 512, got %d\n", + path, bytes_read); + return; + } + if (is_end_of_archive(buff)) { + printf("End of %s\n", path); + return; + } + if (!verify_checksum(buff)) { + fprintf(stderr, "Checksum failure\n"); + return; + } + 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)); + break; + } + while (filesize > 0) { + bytes_read = fread(buff, 1, 512, a); + if (bytes_read < 512) { + fprintf(stderr, + "Short read on %s: Expected 512, got %d\n", + path, bytes_read); + return; + } + if (filesize < 512) + bytes_read = filesize; + if (f != NULL) { + if (fwrite(buff, 1, bytes_read, f) + != bytes_read) + { + fprintf(stderr, "Failed write\n"); + fclose(f); + f = NULL; + } + } + filesize -= bytes_read; + } + if (f != NULL) { + fclose(f); + f = NULL; + } + } +} + +int +main(int argc, char **argv) +{ + FILE *a; + + ++argv; /* Skip program name */ + for ( ;*argv != NULL; ++argv) { + a = fopen(*argv, "r"); + if (a == NULL) + fprintf(stderr, "Unable to open %s\n", *argv); + else { + untar(a, *argv); + fclose(a); + } + } + return (0); +} diff --git a/Utilities/cmlibarchive/cpio/CMakeLists.txt b/Utilities/cmlibarchive/cpio/CMakeLists.txt new file mode 100644 index 000000000..84934ad0c --- /dev/null +++ b/Utilities/cmlibarchive/cpio/CMakeLists.txt @@ -0,0 +1,54 @@ +############################################ +# +# How to build bsdcpio +# +############################################ +IF(ENABLE_CPIO) + + SET(bsdcpio_SOURCES + cmdline.c + cpio.c + cpio.h + cpio_platform.h + ../libarchive_fe/err.c + ../libarchive_fe/err.h + ../libarchive_fe/lafe_platform.h + ../libarchive_fe/line_reader.c + ../libarchive_fe/line_reader.h + ../libarchive_fe/matching.c + ../libarchive_fe/matching.h + ../libarchive_fe/pathmatch.c + ../libarchive_fe/pathmatch.h + ) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../libarchive_fe) + IF(WIN32 AND NOT CYGWIN) + LIST(APPEND bsdcpio_SOURCES cpio_windows.c) + LIST(APPEND bsdcpio_SOURCES cpio_windows.h) + ENDIF(WIN32 AND NOT CYGWIN) + + # bsdcpio documentation + SET(bsdcpio_MANS bsdcpio.1) + + # How to build bsdcpio + ADD_EXECUTABLE(bsdcpio ${bsdcpio_SOURCES}) + IF(ENABLE_CPIO_SHARED) + TARGET_LINK_LIBRARIES(bsdcpio archive ${ADDITIONAL_LIBS}) + ELSE(ENABLE_CPIO_SHARED) + TARGET_LINK_LIBRARIES(bsdcpio archive_static ${ADDITIONAL_LIBS}) + ENDIF(ENABLE_CPIO_SHARED) + # On Windows, DLL must end up in same dir with EXEs + IF(WIN32 AND NOT CYGWIN) + SET_TARGET_PROPERTIES(bsdcpio PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + ENDIF(WIN32 AND NOT CYGWIN) + # Full path to the compiled executable (used by test suite) + GET_TARGET_PROPERTY(BSDCPIO bsdcpio LOCATION) + + # Installation rules + INSTALL(TARGETS bsdcpio RUNTIME DESTINATION bin) + INSTALL_MAN(${bsdcpio_MANS}) + +ENDIF(ENABLE_CPIO) + +# Test suite +add_subdirectory(test) diff --git a/Utilities/cmlibarchive/cpio/Makefile b/Utilities/cmlibarchive/cpio/Makefile new file mode 100644 index 000000000..d57582196 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/Makefile @@ -0,0 +1,26 @@ +# $FreeBSD: src/usr.bin/cpio/Makefile,v 1.6 2008/12/06 07:30:40 kientzle Exp $ + +.include +.PATH: ${.CURDIR}/../libarchive_fe + +PROG= bsdcpio +BSDCPIO_VERSION_STRING=2.7.900a +SRCS= cpio.c cmdline.c err.c line_reader.c matching.c pathmatch.c +WARNS?= 6 +DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2} +CFLAGS+= -DBSDCPIO_VERSION_STRING=\"${BSDCPIO_VERSION_STRING}\" +CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" +CFLAGS+= -I../libarchive_fe -I${.CURDIR} +LDADD+= -larchive -lz -lbz2 -lmd -lcrypto + +.if ${MK_GNU_CPIO} != "yes" +SYMLINKS=bsdcpio ${BINDIR}/cpio +MLINKS= bsdcpio.1 cpio.1 +.endif + +.PHONY: check test + +check test: $(PROG) bsdcpio.1.gz + cd ${.CURDIR}/test && make clean test + +.include diff --git a/Utilities/cmlibarchive/cpio/bsdcpio.1 b/Utilities/cmlibarchive/cpio/bsdcpio.1 new file mode 100644 index 000000000..79b6997ef --- /dev/null +++ b/Utilities/cmlibarchive/cpio/bsdcpio.1 @@ -0,0 +1,405 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD$ +.\" +.Dd December 21, 2007 +.Dt BSDCPIO 1 +.Os +.Sh NAME +.Nm cpio +.Nd copy files to and from archives +.Sh SYNOPSIS +.Nm +.Brq Fl i +.Op Ar options +.Op Ar pattern ... +.Op Ar < archive +.Nm +.Brq Fl o +.Op Ar options +.Ar < name-list +.Op Ar > archive +.Nm +.Brq Fl p +.Op Ar options +.Ar dest-dir +.Ar < name-list +.Sh DESCRIPTION +.Nm +copies files between archives and directories. +This implementation can extract from tar, pax, cpio, zip, jar, ar, +and ISO 9660 cdrom images and can create tar, pax, cpio, ar, +and shar archives. +.Pp +The first option to +.Nm +is a mode indicator from the following list: +.Bl -tag -compact -width indent +.It Fl i +Input. +Read an archive from standard input (unless overriden) and extract the +contents to disk or (if the +.Fl t +option is specified) +list the contents to standard output. +If one or more file patterns are specified, only files matching +one of the patterns will be extracted. +.It Fl o +Output. +Read a list of filenames from standard input and produce a new archive +on standard output (unless overriden) containing the specified items. +.It Fl p +Pass-through. +Read a list of filenames from standard input and copy the files to the +specified directory. +.El +.Pp +.Sh OPTIONS +Unless specifically stated otherwise, options are applicable in +all operating modes. +.Bl -tag -width indent +.It Fl 0 +Read filenames separated by NUL characters instead of newlines. +This is necessary if any of the filenames being read might contain newlines. +.It Fl A +(o mode only) +Append to the specified archive. +(Not yet implemented.) +.It Fl a +(o and p modes) +Reset access times on files after they are read. +.It Fl B +(o mode only) +Block output to records of 5120 bytes. +.It Fl C Ar size +(o mode only) +Block output to records of +.Ar size +bytes. +.It Fl c +(o mode only) +Use the old POSIX portable character format. +Equivalent to +.Fl -format Ar odc . +.It Fl d +(i and p modes) +Create directories as necessary. +.It Fl E Ar file +(i mode only) +Read list of file name patterns from +.Ar file +to list and extract. +.It Fl F Ar file +Read archive from or write archive to +.Ar file . +.It Fl f Ar pattern +(i mode only) +Ignore files that match +.Ar pattern . +.It Fl -format Ar format +(o mode only) +Produce the output archive in the specified format. +Supported formats include: +.Pp +.Bl -tag -width "iso9660" -compact +.It Ar cpio +Synonym for +.Ar odc . +.It Ar newc +The SVR4 portable cpio format. +.It Ar odc +The old POSIX.1 portable octet-oriented cpio format. +.It Ar pax +The POSIX.1 pax format, an extension of the ustar format. +.It Ar ustar +The POSIX.1 tar format. +.El +.Pp +The default format is +.Ar odc . +See +.Xr libarchive_formats 5 +for more complete information about the +formats currently supported by the underlying +.Xr libarchive 3 +library. +.It Fl H Ar format +Synonym for +.Fl -format . +.It Fl h , Fl -help +Print usage information. +.It Fl I Ar file +Read archive from +.Ar file . +.It Fl i +Input mode. +See above for description. +.It Fl -insecure +(i and p mode only) +Disable security checks during extraction or copying. +This allows extraction via symbolic links and path names containing +.Sq .. +in the name. +.It Fl J +(o mode only) +Compress the file with xz-compatible compression before writing it. +In input mode, this option is ignored; xz compression is recognized +automatically on input. +.It Fl j +Synonym for +.Fl y . +.It Fl L +(o and p modes) +All symbolic links will be followed. +Normally, symbolic links are archived and copied as symbolic links. +With this option, the target of the link will be archived or copied instead. +.It Fl l +(p mode only) +Create links from the target directory to the original files, +instead of copying. +.It Fl lzma +(o mode only) +Compress the file with lzma-compatible compression before writing it. +In input mode, this option is ignored; lzma compression is recognized +automatically on input. +.It Fl m +(i and p modes) +Set file modification time on created files to match +those in the source. +.It Fl n +(i mode, only with +.Fl t ) +Display numeric uid and gid. +By default, +.Nm +displays the user and group names when they are provided in the +archive, or looks up the user and group names in the system +password database. +.It Fl no-preserve-owner +(i mode only) +Do not attempt to restore file ownership. +This is the default when run by non-root users. +.It Fl O Ar file +Write archive to +.Ar file . +.It Fl o +Output mode. +See above for description. +.It Fl p +Pass-through mode. +See above for description. +.It Fl preserve-owner +(i mode only) +Restore file ownership. +This is the default when run by the root user. +.It Fl -quiet +Suppress unnecessary messages. +.It Fl R Oo user Oc Ns Oo : Oc Ns Oo group Oc +Set the owner and/or group on files in the output. +If group is specified with no user +(for example, +.Fl R Ar :wheel ) +then the group will be set but not the user. +If the user is specified with a trailing colon and no group +(for example, +.Fl R Ar root: ) +then the group will be set to the user's default group. +If the user is specified with no trailing colon, then +the user will be set but not the group. +In +.Fl i +and +.Fl p +modes, this option can only be used by the super-user. +(For compatibility, a period can be used in place of the colon.) +.It Fl r +(All modes.) +Rename files interactively. +For each file, a prompt is written to +.Pa /dev/tty +containing the name of the file and a line is read from +.Pa /dev/tty . +If the line read is blank, the file is skipped. +If the line contains a single period, the file is processed normally. +Otherwise, the line is taken to be the new name of the file. +.It Fl t +(i mode only) +List the contents of the archive to stdout; +do not restore the contents to disk. +.It Fl u +(i and p modes) +Unconditionally overwrite existing files. +Ordinarily, an older file will not overwrite a newer file on disk. +.It Fl v +Print the name of each file to stderr as it is processed. +With +.Fl t , +provide a detailed listing of each file. +.It Fl -version +Print the program version information and exit. +.It Fl y +(o mode only) +Compress the archive with bzip2-compatible compression before writing it. +In input mode, this option is ignored; +bzip2 compression is recognized automatically on input. +.It Fl Z +(o mode only) +Compress the archive with compress-compatible compression before writing it. +In input mode, this option is ignored; +compression is recognized automatically on input. +.It Fl z +(o mode only) +Compress the archive with gzip-compatible compression before writing it. +In input mode, this option is ignored; +gzip compression is recognized automatically on input. +.El +.Sh ENVIRONMENT +The following environment variables affect the execution of +.Nm : +.Bl -tag -width ".Ev BLOCKSIZE" +.It Ev LANG +The locale to use. +See +.Xr environ 7 +for more information. +.It Ev TZ +The timezone to use when displaying dates. +See +.Xr environ 7 +for more information. +.El +.Sh EXIT STATUS +.Ex -std +.Sh EXAMPLES +The +.Nm +command is traditionally used to copy file heirarchies in conjunction +with the +.Xr find 1 +command. +The first example here simply copies all files from +.Pa src +to +.Pa dest : +.Dl Nm find Pa src | Nm Fl pmud Pa dest +.Pp +By carefully selecting options to the +.Xr find 1 +command and combining it with other standard utilities, +it is possible to exercise very fine control over which files are copied. +This next example copies files from +.Pa src +to +.Pa dest +that are more than 2 days old and whose names match a particular pattern: +.Dl Nm find Pa src Fl mtime Ar +2 | Nm grep foo[bar] | Nm Fl pdmu Pa dest +.Pp +This example copies files from +.Pa src +to +.Pa dest +that are more than 2 days old and which contain the word +.Do foobar Dc : +.Dl Nm find Pa src Fl mtime Ar +2 | Nm xargs Nm grep -l foobar | Nm Fl pdmu Pa dest +.Sh COMPATIBILITY +The mode options i, o, and p and the options +a, B, c, d, f, l, m, r, t, u, and v comply with SUSv2. +.Pp +The old POSIX.1 standard specified that only +.Fl i , +.Fl o , +and +.Fl p +were interpreted as command-line options. +Each took a single argument of a list of modifier +characters. +For example, the standard syntax allows +.Fl imu +but does not support +.Fl miu +or +.Fl i Fl m Fl u , +since +.Ar m +and +.Ar u +are only modifiers to +.Fl i , +they are not command-line options in their own right. +The syntax supported by this implementation is backwards-compatible +with the standard. +For best compatibility, scripts should limit themselves to the +standard syntax. +.Sh SEE ALSO +.Xr bzip2 1 , +.Xr tar 1 , +.Xr gzip 1 , +.Xr mt 1 , +.Xr pax 1 , +.Xr libarchive 3 , +.Xr cpio 5 , +.Xr libarchive-formats 5 , +.Xr tar 5 +.Sh STANDARDS +There is no current POSIX standard for the cpio command; it appeared +in +.St -p1003.1-96 +but was dropped from +.St -p1003.1-2001 . +.Pp +The cpio, ustar, and pax interchange file formats are defined by +.St -p1003.1-2001 +for the pax command. +.Sh HISTORY +The original +.Nm cpio +and +.Nm find +utilities were written by Dick Haight +while working in AT&T's Unix Support Group. +They first appeared in 1977 in PWB/UNIX 1.0, the +.Dq Programmer's Work Bench +system developed for use within AT&T. +They were first released outside of AT&T as part of System III Unix in 1981. +As a result, +.Nm cpio +actually predates +.Nm tar , +even though it was not well-known outside of AT&T until some time later. +.Pp +This is a complete re-implementation based on the +.Xr libarchive 3 +library. +.Sh BUGS +The cpio archive format has several basic limitations: +It does not store user and group names, only numbers. +As a result, it cannot be reliably used to transfer +files between systems with dissimilar user and group numbering. +Older cpio formats limit the user and group numbers to +16 or 18 bits, which is insufficient for modern systems. +The cpio archive formats cannot support files over 4 gigabytes, +except for the +.Dq odc +variant, which can support files up to 8 gigabytes. diff --git a/Utilities/cmlibarchive/cpio/cmdline.c b/Utilities/cmlibarchive/cpio/cmdline.c new file mode 100644 index 000000000..b6ffb2ec5 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/cmdline.c @@ -0,0 +1,369 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "cpio.h" +#include "err.h" + +/* + * Short options for cpio. Please keep this sorted. + */ +static const char *short_options = "0AaBC:cdE:F:f:H:hI:iJjLlmnO:opR:rtuvW:yZz"; + +/* + * Long options for cpio. Please keep this sorted. + */ +static const struct option { + const char *name; + int required; /* 1 if this option requires an argument */ + int equivalent; /* Equivalent short option. */ +} cpio_longopts[] = { + { "create", 0, 'o' }, + { "extract", 0, 'i' }, + { "file", 1, 'F' }, + { "format", 1, 'H' }, + { "help", 0, 'h' }, + { "insecure", 0, OPTION_INSECURE }, + { "link", 0, 'l' }, + { "list", 0, 't' }, + { "lzma", 0, OPTION_LZMA }, + { "make-directories", 0, 'd' }, + { "no-preserve-owner", 0, OPTION_NO_PRESERVE_OWNER }, + { "null", 0, '0' }, + { "numeric-uid-gid", 0, 'n' }, + { "owner", 1, 'R' }, + { "pass-through", 0, 'p' }, + { "preserve-modification-time", 0, 'm' }, + { "preserve-owner", 0, OPTION_PRESERVE_OWNER }, + { "quiet", 0, OPTION_QUIET }, + { "unconditional", 0, 'u' }, + { "verbose", 0, 'v' }, + { "version", 0, OPTION_VERSION }, + { "xz", 0, 'J' }, + { NULL, 0, 0 } +}; + +/* + * I used to try to select platform-provided getopt() or + * getopt_long(), but that caused a lot of headaches. In particular, + * I couldn't consistently use long options in the test harness + * because not all platforms have getopt_long(). That in turn led to + * overuse of the -W hack in the test harness, which made it rough to + * run the test harness against GNU cpio. (I periodically run the + * test harness here against GNU cpio as a sanity-check. Yes, + * I've found a couple of bugs in GNU cpio that way.) + */ +int +cpio_getopt(struct cpio *cpio) +{ + enum { state_start = 0, state_next_word, state_short, state_long }; + static int state = state_start; + static char *opt_word; + + const struct option *popt, *match = NULL, *match2 = NULL; + const char *p, *long_prefix = "--"; + size_t optlength; + int opt = '?'; + int required = 0; + + cpio->optarg = NULL; + + /* First time through, initialize everything. */ + if (state == state_start) { + /* Skip program name. */ + ++cpio->argv; + --cpio->argc; + state = state_next_word; + } + + /* + * We're ready to look at the next word in argv. + */ + if (state == state_next_word) { + /* No more arguments, so no more options. */ + if (cpio->argv[0] == NULL) + return (-1); + /* Doesn't start with '-', so no more options. */ + if (cpio->argv[0][0] != '-') + return (-1); + /* "--" marks end of options; consume it and return. */ + if (strcmp(cpio->argv[0], "--") == 0) { + ++cpio->argv; + --cpio->argc; + return (-1); + } + /* Get next word for parsing. */ + opt_word = *cpio->argv++; + --cpio->argc; + if (opt_word[1] == '-') { + /* Set up long option parser. */ + state = state_long; + opt_word += 2; /* Skip leading '--' */ + } else { + /* Set up short option parser. */ + state = state_short; + ++opt_word; /* Skip leading '-' */ + } + } + + /* + * We're parsing a group of POSIX-style single-character options. + */ + if (state == state_short) { + /* Peel next option off of a group of short options. */ + opt = *opt_word++; + if (opt == '\0') { + /* End of this group; recurse to get next option. */ + state = state_next_word; + return cpio_getopt(cpio); + } + + /* Does this option take an argument? */ + p = strchr(short_options, opt); + if (p == NULL) + return ('?'); + if (p[1] == ':') + required = 1; + + /* If it takes an argument, parse that. */ + if (required) { + /* If arg is run-in, opt_word already points to it. */ + if (opt_word[0] == '\0') { + /* Otherwise, pick up the next word. */ + opt_word = *cpio->argv; + if (opt_word == NULL) { + lafe_warnc(0, + "Option -%c requires an argument", + opt); + return ('?'); + } + ++cpio->argv; + --cpio->argc; + } + if (opt == 'W') { + state = state_long; + long_prefix = "-W "; /* For clearer errors. */ + } else { + state = state_next_word; + cpio->optarg = opt_word; + } + } + } + + /* We're reading a long option, including -W long=arg convention. */ + if (state == state_long) { + /* After this long option, we'll be starting a new word. */ + state = state_next_word; + + /* Option name ends at '=' if there is one. */ + p = strchr(opt_word, '='); + if (p != NULL) { + optlength = (size_t)(p - opt_word); + cpio->optarg = (char *)(uintptr_t)(p + 1); + } else { + optlength = strlen(opt_word); + } + + /* Search the table for an unambiguous match. */ + for (popt = cpio_longopts; popt->name != NULL; popt++) { + /* Short-circuit if first chars don't match. */ + if (popt->name[0] != opt_word[0]) + continue; + /* If option is a prefix of name in table, record it.*/ + if (strncmp(opt_word, popt->name, optlength) == 0) { + match2 = match; /* Record up to two matches. */ + match = popt; + /* If it's an exact match, we're done. */ + if (strlen(popt->name) == optlength) { + match2 = NULL; /* Forget the others. */ + break; + } + } + } + + /* Fail if there wasn't a unique match. */ + if (match == NULL) { + lafe_warnc(0, + "Option %s%s is not supported", + long_prefix, opt_word); + return ('?'); + } + if (match2 != NULL) { + lafe_warnc(0, + "Ambiguous option %s%s (matches --%s and --%s)", + long_prefix, opt_word, match->name, match2->name); + return ('?'); + } + + /* We've found a unique match; does it need an argument? */ + if (match->required) { + /* Argument required: get next word if necessary. */ + if (cpio->optarg == NULL) { + cpio->optarg = *cpio->argv; + if (cpio->optarg == NULL) { + lafe_warnc(0, + "Option %s%s requires an argument", + long_prefix, match->name); + return ('?'); + } + ++cpio->argv; + --cpio->argc; + } + } else { + /* Argument forbidden: fail if there is one. */ + if (cpio->optarg != NULL) { + lafe_warnc(0, + "Option %s%s does not allow an argument", + long_prefix, match->name); + return ('?'); + } + } + return (match->equivalent); + } + + return (opt); +} + + +/* + * Parse the argument to the -R or --owner flag. + * + * The format is one of the following: + * - Override user but not group + * : - Override both, group is user's default group + * : - Override user but not group + * : - Override both + * : - Override group but not user + * + * Where uid/gid are decimal representations and groupname/username + * are names to be looked up in system database. Note that we try + * to look up an argument as a name first, then try numeric parsing. + * + * A period can be used instead of the colon. + * + * Sets uid/gid return as appropriate, -1 indicates uid/gid not specified. + * + * Returns NULL if no error, otherwise returns error string for display. + * + */ +const char * +owner_parse(const char *spec, int *uid, int *gid) +{ + static char errbuff[128]; + const char *u, *ue, *g; + + *uid = -1; + *gid = -1; + + if (spec[0] == '\0') + return ("Invalid empty user/group spec"); + + /* + * Split spec into [user][:.][group] + * u -> first char of username, NULL if no username + * ue -> first char after username (colon, period, or \0) + * g -> first char of group name + */ + if (*spec == ':' || *spec == '.') { + /* If spec starts with ':' or '.', then just group. */ + ue = u = NULL; + g = spec + 1; + } else { + /* Otherwise, [user] or [user][:] or [user][:][group] */ + ue = u = spec; + while (*ue != ':' && *ue != '.' && *ue != '\0') + ++ue; + g = ue; + if (*g != '\0') /* Skip : or . to find first char of group. */ + ++g; + } + + if (u != NULL) { + /* Look up user: ue is first char after end of user. */ + char *user; + struct passwd *pwent; + + user = (char *)malloc(ue - u + 1); + if (user == NULL) + return ("Couldn't allocate memory"); + memcpy(user, u, ue - u); + user[ue - u] = '\0'; + if ((pwent = getpwnam(user)) != NULL) { + *uid = pwent->pw_uid; + if (*ue != '\0') + *gid = pwent->pw_gid; + } else { + char *end; + errno = 0; + *uid = strtoul(user, &end, 10); + if (errno || *end != '\0') { + snprintf(errbuff, sizeof(errbuff), + "Couldn't lookup user ``%s''", user); + errbuff[sizeof(errbuff) - 1] = '\0'; + return (errbuff); + } + } + free(user); + } + + if (*g != '\0') { + struct group *grp; + if ((grp = getgrnam(g)) != NULL) { + *gid = grp->gr_gid; + } else { + char *end; + errno = 0; + *gid = strtoul(g, &end, 10); + if (errno || *end != '\0') { + snprintf(errbuff, sizeof(errbuff), + "Couldn't lookup group ``%s''", g); + errbuff[sizeof(errbuff) - 1] = '\0'; + return (errbuff); + } + } + } + return (NULL); +} diff --git a/Utilities/cmlibarchive/cpio/config_freebsd.h b/Utilities/cmlibarchive/cpio/config_freebsd.h new file mode 100644 index 000000000..b2971afb8 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/config_freebsd.h @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $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. */ + +#include /* __FreeBSD_version */ + +#define HAVE_DIRENT_H 1 +#define HAVE_ERRNO_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_FUTIMES 1 +#define HAVE_GRP_H 1 +#define HAVE_LIBARCHIVE 1 +#define HAVE_LINK 1 +#define HAVE_LSTAT 1 +#define HAVE_LUTIMES 1 +#define HAVE_PWD_H 1 +#define HAVE_READLINK 1 +#define HAVE_STDARG_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_SYMLINK 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_TIME_H 1 +#define HAVE_UINTMAX_T 1 +#define HAVE_UNISTD_H 1 +#define HAVE_UNSIGNED_LONG_LONG 1 +#define HAVE_UTIMES 1 + diff --git a/Utilities/cmlibarchive/cpio/cpio.c b/Utilities/cmlibarchive/cpio/cpio.c new file mode 100644 index 000000000..a12ca80ad --- /dev/null +++ b/Utilities/cmlibarchive/cpio/cpio.c @@ -0,0 +1,1233 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "cpio_platform.h" +__FBSDID("$FreeBSD: src/usr.bin/cpio/cpio.c,v 1.15 2008/12/06 07:30:40 kientzle Exp $"); + +#include +#include +#include + +#ifdef HAVE_SYS_MKDEV_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_STDARG_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif + +#include "cpio.h" +#include "err.h" +#include "line_reader.h" +#include "matching.h" + +/* Fixed size of uname/gname caches. */ +#define name_cache_size 101 + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +struct name_cache { + int probes; + int hits; + size_t size; + struct { + id_t id; + char *name; + } cache[name_cache_size]; +}; + +static int copy_data(struct archive *, struct archive *); +static const char *cpio_rename(const char *name); +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); +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 *); +static void mode_list(struct cpio *); +static void mode_out(struct cpio *); +static void mode_pass(struct cpio *, const char *); +static int restore_time(struct cpio *, struct archive_entry *, + const char *, int fd); +static void usage(void); +static void version(void); + +int +main(int argc, char *argv[]) +{ + static char buff[16384]; + struct cpio _cpio; /* Allocated on stack. */ + struct cpio *cpio; + const char *errmsg; + int uid, gid; + int opt; + + cpio = &_cpio; + memset(cpio, 0, sizeof(*cpio)); + cpio->buff = buff; + cpio->buff_size = sizeof(buff); + + /* Need lafe_progname before calling lafe_warnc. */ + if (*argv == NULL) + lafe_progname = "bsdcpio"; + else { +#if defined(_WIN32) && !defined(__CYGWIN__) + lafe_progname = strrchr(*argv, '\\'); +#else + lafe_progname = strrchr(*argv, '/'); +#endif + if (lafe_progname != NULL) + lafe_progname++; + else + lafe_progname = *argv; + } + + cpio->uid_override = -1; + cpio->gid_override = -1; + cpio->argv = argv; + cpio->argc = argc; + cpio->mode = '\0'; + cpio->verbose = 0; + cpio->compress = '\0'; + cpio->extract_flags = ARCHIVE_EXTRACT_NO_AUTODIR; + cpio->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER; + cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_SYMLINKS; + cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NODOTDOT; + cpio->extract_flags |= ARCHIVE_EXTRACT_PERM; + cpio->extract_flags |= ARCHIVE_EXTRACT_FFLAGS; + cpio->extract_flags |= ARCHIVE_EXTRACT_ACL; +#if !defined(_WIN32) && !defined(__CYGWIN__) + if (geteuid() == 0) + cpio->extract_flags |= ARCHIVE_EXTRACT_OWNER; +#endif + cpio->bytes_per_block = 512; + cpio->filename = NULL; + + while ((opt = cpio_getopt(cpio)) != -1) { + switch (opt) { + case '0': /* GNU convention: --null, -0 */ + cpio->option_null = 1; + break; + case 'A': /* NetBSD/OpenBSD */ + cpio->option_append = 1; + break; + case 'a': /* POSIX 1997 */ + cpio->option_atime_restore = 1; + break; + case 'B': /* POSIX 1997 */ + cpio->bytes_per_block = 5120; + break; + case 'C': /* NetBSD/OpenBSD */ + cpio->bytes_per_block = atoi(cpio->optarg); + if (cpio->bytes_per_block <= 0) + lafe_errc(1, 0, "Invalid blocksize %s", cpio->optarg); + break; + case 'c': /* POSIX 1997 */ + cpio->format = "odc"; + break; + case 'd': /* POSIX 1997 */ + cpio->extract_flags &= ~ARCHIVE_EXTRACT_NO_AUTODIR; + break; + case 'E': /* NetBSD/OpenBSD */ + lafe_include_from_file(&cpio->matching, + cpio->optarg, cpio->option_null); + break; + case 'F': /* NetBSD/OpenBSD/GNU cpio */ + cpio->filename = cpio->optarg; + break; + case 'f': /* POSIX 1997 */ + lafe_exclude(&cpio->matching, cpio->optarg); + break; + case 'H': /* GNU cpio (also --format) */ + cpio->format = cpio->optarg; + break; + case 'h': + long_help(); + break; + case 'I': /* NetBSD/OpenBSD */ + cpio->filename = cpio->optarg; + break; + case 'i': /* POSIX 1997 */ + if (cpio->mode != '\0') + lafe_errc(1, 0, + "Cannot use both -i and -%c", cpio->mode); + cpio->mode = opt; + break; + case 'J': /* GNU tar, others */ + cpio->compress = opt; + break; + case 'j': /* GNU tar, others */ + cpio->compress = opt; + break; + case OPTION_INSECURE: + cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_SYMLINKS; + cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT; + break; + case 'L': /* GNU cpio */ + cpio->option_follow_links = 1; + break; + case 'l': /* POSIX 1997 */ + cpio->option_link = 1; + break; + case OPTION_LZMA: /* GNU tar, others */ + cpio->compress = opt; + break; + case 'm': /* POSIX 1997 */ + cpio->extract_flags |= ARCHIVE_EXTRACT_TIME; + break; + case 'n': /* GNU cpio */ + cpio->option_numeric_uid_gid = 1; + break; + case OPTION_NO_PRESERVE_OWNER: /* GNU cpio */ + cpio->extract_flags &= ~ARCHIVE_EXTRACT_OWNER; + break; + case 'O': /* GNU cpio */ + cpio->filename = cpio->optarg; + break; + case 'o': /* POSIX 1997 */ + if (cpio->mode != '\0') + lafe_errc(1, 0, + "Cannot use both -o and -%c", cpio->mode); + cpio->mode = opt; + break; + case 'p': /* POSIX 1997 */ + if (cpio->mode != '\0') + lafe_errc(1, 0, + "Cannot use both -p and -%c", cpio->mode); + cpio->mode = opt; + cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT; + break; + case OPTION_PRESERVE_OWNER: + cpio->extract_flags |= ARCHIVE_EXTRACT_OWNER; + break; + case OPTION_QUIET: /* GNU cpio */ + cpio->quiet = 1; + break; + case 'R': /* GNU cpio, also --owner */ + errmsg = owner_parse(cpio->optarg, &uid, &gid); + if (errmsg) { + lafe_warnc(-1, "%s", errmsg); + usage(); + } + if (uid != -1) + cpio->uid_override = uid; + if (gid != -1) + cpio->gid_override = gid; + break; + case 'r': /* POSIX 1997 */ + cpio->option_rename = 1; + break; + case 't': /* POSIX 1997 */ + cpio->option_list = 1; + break; + case 'u': /* POSIX 1997 */ + cpio->extract_flags + &= ~ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER; + break; + case 'v': /* POSIX 1997 */ + cpio->verbose++; + break; + case OPTION_VERSION: /* GNU convention */ + version(); + break; +#if 0 + /* + * cpio_getopt() handles -W specially, so it's not + * available here. + */ + case 'W': /* Obscure, but useful GNU convention. */ + break; +#endif + case 'y': /* tar convention */ + cpio->compress = opt; + break; + case 'Z': /* tar convention */ + cpio->compress = opt; + break; + case 'z': /* tar convention */ + cpio->compress = opt; + break; + default: + usage(); + } + } + + /* + * Sanity-check args, error out on nonsensical combinations. + */ + /* -t implies -i if no mode was specified. */ + if (cpio->option_list && cpio->mode == '\0') + cpio->mode = 'i'; + /* -t requires -i */ + if (cpio->option_list && cpio->mode != 'i') + lafe_errc(1, 0, "Option -t requires -i", cpio->mode); + /* -n requires -it */ + if (cpio->option_numeric_uid_gid && !cpio->option_list) + lafe_errc(1, 0, "Option -n requires -it"); + /* Can only specify format when writing */ + if (cpio->format != NULL && cpio->mode != 'o') + lafe_errc(1, 0, "Option --format requires -o"); + /* -l requires -p */ + if (cpio->option_link && cpio->mode != 'p') + lafe_errc(1, 0, "Option -l requires -p"); + /* TODO: Flag other nonsensical combinations. */ + + switch (cpio->mode) { + case 'o': + /* TODO: Implement old binary format in libarchive, + use that here. */ + if (cpio->format == NULL) + cpio->format = "odc"; /* Default format */ + + mode_out(cpio); + break; + case 'i': + while (*cpio->argv != NULL) { + lafe_include(&cpio->matching, *cpio->argv); + --cpio->argc; + ++cpio->argv; + } + if (cpio->option_list) + mode_list(cpio); + else + mode_in(cpio); + break; + case 'p': + if (*cpio->argv == NULL || **cpio->argv == '\0') + lafe_errc(1, 0, + "-p mode requires a target directory"); + mode_pass(cpio, *cpio->argv); + break; + default: + lafe_errc(1, 0, + "Must specify at least one of -i, -o, or -p"); + } + + free_cache(cpio->gname_cache); + free_cache(cpio->uname_cache); + return (0); +} + +void +usage(void) +{ + const char *p; + + p = lafe_progname; + + fprintf(stderr, "Brief Usage:\n"); + fprintf(stderr, " List: %s -it < archive\n", p); + fprintf(stderr, " Extract: %s -i < archive\n", p); + fprintf(stderr, " Create: %s -o < filenames > archive\n", p); + fprintf(stderr, " Help: %s --help\n", p); + exit(1); +} + +static const char *long_help_msg = + "First option must be a mode specifier:\n" + " -i Input -o Output -p Pass\n" + "Common Options:\n" + " -v Verbose\n" + "Create: %p -o [options] < [list of files] > [archive]\n" + " -J,-y,-z,--lzma Compress archive with xz/bzip2/gzip/lzma\n" + " --format {odc|newc|ustar} Select archive format\n" + "List: %p -it < [archive]\n" + "Extract: %p -i [options] < [archive]\n"; + + +/* + * Note that the word 'bsdcpio' will always appear in the first line + * of output. + * + * In particular, /bin/sh scripts that need to test for the presence + * of bsdcpio can use the following template: + * + * if (cpio --help 2>&1 | grep bsdcpio >/dev/null 2>&1 ) then \ + * echo bsdcpio; else echo not bsdcpio; fi + */ +static void +long_help(void) +{ + const char *prog; + const char *p; + + prog = lafe_progname; + + fflush(stderr); + + p = (strcmp(prog,"bsdcpio") != 0) ? "(bsdcpio)" : ""; + printf("%s%s: manipulate archive files\n", prog, p); + + for (p = long_help_msg; *p != '\0'; p++) { + if (*p == '%') { + if (p[1] == 'p') { + fputs(prog, stdout); + p++; + } else + putchar('%'); + } else + putchar(*p); + } + version(); +} + +static void +version(void) +{ + fprintf(stdout,"bsdcpio %s -- %s\n", + BSDCPIO_VERSION_STRING, + archive_version()); + exit(0); +} + +static void +mode_out(struct cpio *cpio) +{ + struct archive_entry *entry, *spare; + struct lafe_line_reader *lr; + const char *p; + int r; + + if (cpio->option_append) + lafe_errc(1, 0, "Append mode not yet supported."); + + cpio->archive_read_disk = archive_read_disk_new(); + if (cpio->archive_read_disk == NULL) + lafe_errc(1, 0, "Failed to allocate archive object"); + if (cpio->option_follow_links) + archive_read_disk_set_symlink_logical(cpio->archive_read_disk); + else + archive_read_disk_set_symlink_physical(cpio->archive_read_disk); + archive_read_disk_set_standard_lookup(cpio->archive_read_disk); + + cpio->archive = archive_write_new(); + if (cpio->archive == NULL) + lafe_errc(1, 0, "Failed to allocate archive object"); + switch (cpio->compress) { + case 'J': + r = archive_write_set_compression_xz(cpio->archive); + break; + case OPTION_LZMA: + r = archive_write_set_compression_lzma(cpio->archive); + break; + case 'j': case 'y': + r = archive_write_set_compression_bzip2(cpio->archive); + break; + case 'z': + r = archive_write_set_compression_gzip(cpio->archive); + break; + case 'Z': + r = archive_write_set_compression_compress(cpio->archive); + break; + default: + r = archive_write_set_compression_none(cpio->archive); + break; + } + if (r < ARCHIVE_WARN) + lafe_errc(1, 0, "Requested compression not available"); + r = archive_write_set_format_by_name(cpio->archive, cpio->format); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(cpio->archive)); + archive_write_set_bytes_per_block(cpio->archive, cpio->bytes_per_block); + cpio->linkresolver = archive_entry_linkresolver_new(); + archive_entry_linkresolver_set_strategy(cpio->linkresolver, + archive_format(cpio->archive)); + + /* + * The main loop: Copy each file into the output archive. + */ + r = archive_write_open_file(cpio->archive, cpio->filename); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(cpio->archive)); + lr = lafe_line_reader("-", cpio->option_null); + while ((p = lafe_line_reader_next(lr)) != NULL) + file_to_archive(cpio, p); + lafe_line_reader_free(lr); + + /* + * The hardlink detection may have queued up a couple of entries + * that can now be flushed. + */ + entry = NULL; + archive_entry_linkify(cpio->linkresolver, &entry, &spare); + while (entry != NULL) { + entry_to_archive(cpio, entry); + archive_entry_free(entry); + entry = NULL; + archive_entry_linkify(cpio->linkresolver, &entry, &spare); + } + + r = archive_write_close(cpio->archive); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(cpio->archive)); + + if (!cpio->quiet) { + int64_t blocks = + (archive_position_uncompressed(cpio->archive) + 511) + / 512; + fprintf(stderr, "%lu %s\n", (unsigned long)blocks, + blocks == 1 ? "block" : "blocks"); + } + archive_write_finish(cpio->archive); +} + +/* + * This is used by both out mode (to copy objects from disk into + * an archive) and pass mode (to copy objects from disk to + * an archive_write_disk "archive"). + */ +static int +file_to_archive(struct cpio *cpio, const char *srcpath) +{ + const char *destpath; + struct archive_entry *entry, *spare; + size_t len; + const char *p; + int r; + + /* + * Create an archive_entry describing the source file. + * + */ + entry = archive_entry_new(); + if (entry == NULL) + lafe_errc(1, 0, "Couldn't allocate entry"); + archive_entry_copy_sourcepath(entry, srcpath); + r = archive_read_disk_entry_from_file(cpio->archive_read_disk, + entry, -1, NULL); + if (r < ARCHIVE_WARN) + lafe_errc(1, 0, archive_error_string(cpio->archive)); + if (r < ARCHIVE_OK) + lafe_warnc(0, archive_error_string(cpio->archive)); + + if (cpio->uid_override >= 0) + archive_entry_set_uid(entry, cpio->uid_override); + if (cpio->gid_override >= 0) + archive_entry_set_gid(entry, cpio->gid_override); + + /* + * Generate a destination path for this entry. + * "destination path" is the name to which it will be copied in + * pass mode or the name that will go into the archive in + * output mode. + */ + destpath = srcpath; + if (cpio->destdir) { + len = strlen(cpio->destdir) + strlen(srcpath) + 8; + if (len >= cpio->pass_destpath_alloc) { + while (len >= cpio->pass_destpath_alloc) { + cpio->pass_destpath_alloc += 512; + cpio->pass_destpath_alloc *= 2; + } + free(cpio->pass_destpath); + cpio->pass_destpath = malloc(cpio->pass_destpath_alloc); + if (cpio->pass_destpath == NULL) + lafe_errc(1, ENOMEM, + "Can't allocate path buffer"); + } + strcpy(cpio->pass_destpath, cpio->destdir); + p = srcpath; + while (p[0] == '/') + ++p; + strcat(cpio->pass_destpath, p); + destpath = cpio->pass_destpath; + } + if (cpio->option_rename) + destpath = cpio_rename(destpath); + if (destpath == NULL) + return (0); + archive_entry_copy_pathname(entry, destpath); + + /* + * If we're trying to preserve hardlinks, match them here. + */ + spare = NULL; + if (cpio->linkresolver != NULL + && archive_entry_filetype(entry) != AE_IFDIR) { + archive_entry_linkify(cpio->linkresolver, &entry, &spare); + } + + if (entry != NULL) { + r = entry_to_archive(cpio, entry); + archive_entry_free(entry); + if (spare != NULL) { + if (r == 0) + r = entry_to_archive(cpio, spare); + archive_entry_free(spare); + } + } + return (r); +} + +static int +entry_to_archive(struct cpio *cpio, struct archive_entry *entry) +{ + const char *destpath = archive_entry_pathname(entry); + const char *srcpath = archive_entry_sourcepath(entry); + int fd = -1; + ssize_t bytes_read; + int r; + + /* Print out the destination name to the user. */ + if (cpio->verbose) + fprintf(stderr,"%s", destpath); + + /* + * Option_link only makes sense in pass mode and for + * regular files. Also note: if a link operation fails + * because of cross-device restrictions, we'll fall back + * to copy mode for that entry. + * + * TODO: Test other cpio implementations to see if they + * hard-link anything other than regular files here. + */ + if (cpio->option_link + && archive_entry_filetype(entry) == AE_IFREG) + { + struct archive_entry *t; + /* Save the original entry in case we need it later. */ + t = archive_entry_clone(entry); + if (t == NULL) + lafe_errc(1, ENOMEM, "Can't create link"); + /* Note: link(2) doesn't create parent directories, + * so we use archive_write_header() instead as a + * convenience. */ + archive_entry_set_hardlink(t, srcpath); + /* This is a straight link that carries no data. */ + archive_entry_set_size(t, 0); + r = archive_write_header(cpio->archive, t); + archive_entry_free(t); + if (r != ARCHIVE_OK) + lafe_warnc(archive_errno(cpio->archive), + archive_error_string(cpio->archive)); + if (r == ARCHIVE_FATAL) + exit(1); +#ifdef EXDEV + if (r != ARCHIVE_OK && archive_errno(cpio->archive) == EXDEV) { + /* Cross-device link: Just fall through and use + * the original entry to copy the file over. */ + lafe_warnc(0, "Copying file instead"); + } else +#endif + return (0); + } + + /* + * Make sure we can open the file (if necessary) before + * trying to write the header. + */ + if (archive_entry_filetype(entry) == AE_IFREG) { + if (archive_entry_size(entry) > 0) { + fd = open(srcpath, O_RDONLY | O_BINARY); + if (fd < 0) { + lafe_warnc(errno, + "%s: could not open file", srcpath); + goto cleanup; + } + } + } else { + archive_entry_set_size(entry, 0); + } + + r = archive_write_header(cpio->archive, entry); + + if (r != ARCHIVE_OK) + lafe_warnc(archive_errno(cpio->archive), + "%s: %s", + srcpath, + archive_error_string(cpio->archive)); + + if (r == ARCHIVE_FATAL) + exit(1); + + if (r >= ARCHIVE_WARN && fd >= 0) { + bytes_read = read(fd, cpio->buff, cpio->buff_size); + while (bytes_read > 0) { + r = archive_write_data(cpio->archive, + cpio->buff, bytes_read); + if (r < 0) + lafe_errc(1, archive_errno(cpio->archive), + archive_error_string(cpio->archive)); + if (r < bytes_read) { + lafe_warnc(0, + "Truncated write; file may have grown while being archived."); + } + bytes_read = read(fd, cpio->buff, cpio->buff_size); + } + } + + fd = restore_time(cpio, entry, srcpath, fd); + +cleanup: + if (cpio->verbose) + fprintf(stderr,"\n"); + if (fd >= 0) + close(fd); + return (0); +} + +static int +restore_time(struct cpio *cpio, struct archive_entry *entry, + const char *name, int fd) +{ +#ifndef HAVE_UTIMES + static int warned = 0; + + (void)cpio; /* UNUSED */ + (void)entry; /* UNUSED */ + (void)name; /* UNUSED */ + + if (!warned) + lafe_warnc(0, "Can't restore access times on this platform"); + warned = 1; + return (fd); +#else +#if defined(_WIN32) && !defined(__CYGWIN__) + struct __timeval times[2]; +#else + struct timeval times[2]; +#endif + + if (!cpio->option_atime_restore) + return (fd); + + times[1].tv_sec = archive_entry_mtime(entry); + times[1].tv_usec = archive_entry_mtime_nsec(entry) / 1000; + + times[0].tv_sec = archive_entry_atime(entry); + times[0].tv_usec = archive_entry_atime_nsec(entry) / 1000; + +#ifdef HAVE_FUTIMES + if (fd >= 0 && futimes(fd, times) == 0) + return (fd); +#endif + /* + * Some platform cannot restore access times if the file descriptor + * is still opened. + */ + if (fd >= 0) { + close(fd); + fd = -1; + } + +#ifdef HAVE_LUTIMES + if (lutimes(name, times) != 0) +#else + if ((AE_IFLNK != archive_entry_filetype(entry)) + && utimes(name, times) != 0) +#endif + lafe_warnc(errno, "Can't update time for %s", name); +#endif + return (fd); +} + + +static void +mode_in(struct cpio *cpio) +{ + struct archive *a; + struct archive_entry *entry; + struct archive *ext; + const char *destpath; + int r; + + ext = archive_write_disk_new(); + if (ext == NULL) + lafe_errc(1, 0, "Couldn't allocate restore object"); + r = archive_write_disk_set_options(ext, cpio->extract_flags); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(ext)); + a = archive_read_new(); + if (a == NULL) + lafe_errc(1, 0, "Couldn't allocate archive object"); + archive_read_support_compression_all(a); + archive_read_support_format_all(a); + + if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block)) + lafe_errc(1, archive_errno(a), + archive_error_string(a)); + for (;;) { + r = archive_read_next_header(a, &entry); + if (r == ARCHIVE_EOF) + break; + if (r != ARCHIVE_OK) { + lafe_errc(1, archive_errno(a), + archive_error_string(a)); + } + if (lafe_excluded(cpio->matching, archive_entry_pathname(entry))) + continue; + if (cpio->option_rename) { + destpath = cpio_rename(archive_entry_pathname(entry)); + archive_entry_set_pathname(entry, destpath); + } else + destpath = archive_entry_pathname(entry); + if (destpath == NULL) + continue; + if (cpio->verbose) + fprintf(stdout, "%s\n", destpath); + if (cpio->uid_override >= 0) + archive_entry_set_uid(entry, cpio->uid_override); + if (cpio->gid_override >= 0) + archive_entry_set_gid(entry, cpio->gid_override); + r = archive_write_header(ext, entry); + if (r != ARCHIVE_OK) { + fprintf(stderr, "%s: %s\n", + archive_entry_pathname(entry), + archive_error_string(ext)); + } else if (archive_entry_size(entry) > 0) { + r = copy_data(a, ext); + } + } + r = archive_read_close(a); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(a)); + r = archive_write_close(ext); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(ext)); + if (!cpio->quiet) { + int64_t blocks = (archive_position_uncompressed(a) + 511) + / 512; + fprintf(stderr, "%lu %s\n", (unsigned long)blocks, + blocks == 1 ? "block" : "blocks"); + } + archive_read_finish(a); + archive_write_finish(ext); + exit(0); +} + +static int +copy_data(struct archive *ar, struct archive *aw) +{ + int r; + size_t size; + const void *block; + off_t offset; + + for (;;) { + r = archive_read_data_block(ar, &block, &size, &offset); + if (r == ARCHIVE_EOF) + return (ARCHIVE_OK); + if (r != ARCHIVE_OK) { + lafe_warnc(archive_errno(ar), + "%s", archive_error_string(ar)); + return (r); + } + r = archive_write_data_block(aw, block, size, offset); + if (r != ARCHIVE_OK) { + lafe_warnc(archive_errno(aw), + archive_error_string(aw)); + return (r); + } + } +} + +static void +mode_list(struct cpio *cpio) +{ + struct archive *a; + struct archive_entry *entry; + int r; + + a = archive_read_new(); + if (a == NULL) + lafe_errc(1, 0, "Couldn't allocate archive object"); + archive_read_support_compression_all(a); + archive_read_support_format_all(a); + + if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block)) + lafe_errc(1, archive_errno(a), + archive_error_string(a)); + for (;;) { + r = archive_read_next_header(a, &entry); + if (r == ARCHIVE_EOF) + break; + if (r != ARCHIVE_OK) { + lafe_errc(1, archive_errno(a), + archive_error_string(a)); + } + if (lafe_excluded(cpio->matching, archive_entry_pathname(entry))) + continue; + if (cpio->verbose) + list_item_verbose(cpio, entry); + else + fprintf(stdout, "%s\n", archive_entry_pathname(entry)); + } + r = archive_read_close(a); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(a)); + if (!cpio->quiet) { + int64_t blocks = (archive_position_uncompressed(a) + 511) + / 512; + fprintf(stderr, "%lu %s\n", (unsigned long)blocks, + blocks == 1 ? "block" : "blocks"); + } + archive_read_finish(a); + exit(0); +} + +/* + * Display information about the current file. + * + * The format here roughly duplicates the output of 'ls -l'. + * This is based on SUSv2, where 'tar tv' is documented as + * listing additional information in an "unspecified format," + * and 'pax -l' is documented as using the same format as 'ls -l'. + */ +static void +list_item_verbose(struct cpio *cpio, struct archive_entry *entry) +{ + char size[32]; + char date[32]; + char uids[16], gids[16]; + const char *uname, *gname; + FILE *out = stdout; + const struct stat *st; + const char *fmt; + time_t tim; + static time_t now; + + st = archive_entry_stat(entry); + + if (!now) + time(&now); + + if (cpio->option_numeric_uid_gid) { + /* Format numeric uid/gid for display. */ + snprintf(uids, sizeof(uids), CPIO_FILESIZE_PRINTF, + (CPIO_FILESIZE_TYPE)archive_entry_uid(entry)); + uname = uids; + snprintf(gids, sizeof(gids), CPIO_FILESIZE_PRINTF, + (CPIO_FILESIZE_TYPE)archive_entry_gid(entry)); + gname = gids; + } else { + /* Use uname if it's present, else lookup name from uid. */ + uname = archive_entry_uname(entry); + if (uname == NULL) + uname = lookup_uname(cpio, archive_entry_uid(entry)); + /* Use gname if it's present, else lookup name from gid. */ + gname = archive_entry_gname(entry); + if (gname == NULL) + gname = lookup_gname(cpio, archive_entry_gid(entry)); + } + + /* Print device number or file size. */ + if (archive_entry_filetype(entry) == AE_IFCHR + || archive_entry_filetype(entry) == AE_IFBLK) { + snprintf(size, sizeof(size), "%lu,%lu", + (unsigned long)archive_entry_rdevmajor(entry), + (unsigned long)archive_entry_rdevminor(entry)); + } else { + snprintf(size, sizeof(size), CPIO_FILESIZE_PRINTF, + (CPIO_FILESIZE_TYPE)st->st_size); + } + + /* Format the time using 'ls -l' conventions. */ + tim = (time_t)st->st_mtime; +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Windows' strftime function does not support %e format. */ + if (tim - now > 365*86400/2 + || tim - now < -365*86400/2) + fmt = cpio->day_first ? "%d %b %Y" : "%b %d %Y"; + else + fmt = cpio->day_first ? "%d %b %H:%M" : "%b %d %H:%M"; +#else + if (abs(tim - now) > (365/2)*86400) + fmt = cpio->day_first ? "%e %b %Y" : "%b %e %Y"; + else + fmt = cpio->day_first ? "%e %b %H:%M" : "%b %e %H:%M"; +#endif + strftime(date, sizeof(date), fmt, localtime(&tim)); + + fprintf(out, "%s%3d %-8s %-8s %8s %12s %s", + archive_entry_strmode(entry), + archive_entry_nlink(entry), + uname, gname, size, date, + archive_entry_pathname(entry)); + + /* Extra information for links. */ + if (archive_entry_hardlink(entry)) /* Hard link */ + fprintf(out, " link to %s", archive_entry_hardlink(entry)); + else if (archive_entry_symlink(entry)) /* Symbolic link */ + fprintf(out, " -> %s", archive_entry_symlink(entry)); + fprintf(out, "\n"); +} + +static void +mode_pass(struct cpio *cpio, const char *destdir) +{ + struct lafe_line_reader *lr; + const char *p; + int r; + + /* Ensure target dir has a trailing '/' to simplify path surgery. */ + cpio->destdir = malloc(strlen(destdir) + 8); + strcpy(cpio->destdir, destdir); + if (destdir[strlen(destdir) - 1] != '/') + strcat(cpio->destdir, "/"); + + cpio->archive = archive_write_disk_new(); + if (cpio->archive == NULL) + lafe_errc(1, 0, "Failed to allocate archive object"); + r = archive_write_disk_set_options(cpio->archive, cpio->extract_flags); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(cpio->archive)); + cpio->linkresolver = archive_entry_linkresolver_new(); + archive_write_disk_set_standard_lookup(cpio->archive); + + cpio->archive_read_disk = archive_read_disk_new(); + if (cpio->archive_read_disk == NULL) + lafe_errc(1, 0, "Failed to allocate archive object"); + if (cpio->option_follow_links) + archive_read_disk_set_symlink_logical(cpio->archive_read_disk); + else + archive_read_disk_set_symlink_physical(cpio->archive_read_disk); + archive_read_disk_set_standard_lookup(cpio->archive_read_disk); + + lr = lafe_line_reader("-", cpio->option_null); + while ((p = lafe_line_reader_next(lr)) != NULL) + file_to_archive(cpio, p); + lafe_line_reader_free(lr); + + archive_entry_linkresolver_free(cpio->linkresolver); + r = archive_write_close(cpio->archive); + if (r != ARCHIVE_OK) + lafe_errc(1, 0, archive_error_string(cpio->archive)); + + if (!cpio->quiet) { + int64_t blocks = + (archive_position_uncompressed(cpio->archive) + 511) + / 512; + fprintf(stderr, "%lu %s\n", (unsigned long)blocks, + blocks == 1 ? "block" : "blocks"); + } + + archive_write_finish(cpio->archive); +} + +/* + * Prompt for a new name for this entry. Returns a pointer to the + * new name or NULL if the entry should not be copied. This + * implements the semantics defined in POSIX.1-1996, which specifies + * that an input of '.' means the name should be unchanged. GNU cpio + * treats '.' as a literal new name. + */ +static const char * +cpio_rename(const char *name) +{ + static char buff[1024]; + FILE *t; + char *p, *ret; + + t = fopen("/dev/tty", "r+"); + if (t == NULL) + return (name); + fprintf(t, "%s (Enter/./(new name))? ", name); + fflush(t); + + p = fgets(buff, sizeof(buff), t); + fclose(t); + if (p == NULL) + /* End-of-file is a blank line. */ + return (NULL); + + while (*p == ' ' || *p == '\t') + ++p; + if (*p == '\n' || *p == '\0') + /* Empty line. */ + return (NULL); + if (*p == '.' && p[1] == '\n') + /* Single period preserves original name. */ + return (name); + ret = p; + /* Trim the final newline. */ + while (*p != '\0' && *p != '\n') + ++p; + /* Overwrite the final \n with a null character. */ + *p = '\0'; + return (ret); +} + +static void +free_cache(struct name_cache *cache) +{ + size_t i; + + if (cache != NULL) { + for (i = 0; i < cache->size; i++) + free(cache->cache[i].name); + free(cache); + } +} + +/* + * Lookup uname/gname from uid/gid, return NULL if no match. + */ +static const char * +lookup_name(struct cpio *cpio, struct name_cache **name_cache_variable, + int (*lookup_fn)(struct cpio *, const char **, id_t), id_t id) +{ + char asnum[16]; + struct name_cache *cache; + const char *name; + int slot; + + + if (*name_cache_variable == NULL) { + *name_cache_variable = malloc(sizeof(struct name_cache)); + if (*name_cache_variable == NULL) + lafe_errc(1, ENOMEM, "No more memory"); + memset(*name_cache_variable, 0, sizeof(struct name_cache)); + (*name_cache_variable)->size = name_cache_size; + } + + cache = *name_cache_variable; + cache->probes++; + + slot = id % cache->size; + if (cache->cache[slot].name != NULL) { + if (cache->cache[slot].id == id) { + cache->hits++; + return (cache->cache[slot].name); + } + free(cache->cache[slot].name); + cache->cache[slot].name = NULL; + } + + if (lookup_fn(cpio, &name, id) == 0) { + if (name == NULL || name[0] == '\0') { + /* If lookup failed, format it as a number. */ + snprintf(asnum, sizeof(asnum), "%u", (unsigned)id); + name = asnum; + } + cache->cache[slot].name = strdup(name); + if (cache->cache[slot].name != NULL) { + cache->cache[slot].id = id; + return (cache->cache[slot].name); + } + /* + * Conveniently, NULL marks an empty slot, so + * if the strdup() fails, we've just failed to + * cache it. No recovery necessary. + */ + } + return (NULL); +} + +static const char * +lookup_uname(struct cpio *cpio, uid_t uid) +{ + return (lookup_name(cpio, &cpio->uname_cache, + &lookup_uname_helper, (id_t)uid)); +} + +static int +lookup_uname_helper(struct cpio *cpio, const char **name, id_t id) +{ + struct passwd *pwent; + + (void)cpio; /* UNUSED */ + + errno = 0; + pwent = getpwuid((uid_t)id); + if (pwent == NULL) { + *name = NULL; + if (errno != 0) + lafe_warnc(errno, "getpwuid(%d) failed", id); + return (errno); + } + + *name = pwent->pw_name; + return (0); +} + +static const char * +lookup_gname(struct cpio *cpio, gid_t gid) +{ + return (lookup_name(cpio, &cpio->gname_cache, + &lookup_gname_helper, (id_t)gid)); +} + +static int +lookup_gname_helper(struct cpio *cpio, const char **name, id_t id) +{ + struct group *grent; + + (void)cpio; /* UNUSED */ + + errno = 0; + grent = getgrgid((gid_t)id); + if (grent == NULL) { + *name = NULL; + if (errno != 0) + lafe_warnc(errno, "getgrgid(%d) failed", id); + return (errno); + } + + *name = grent->gr_name; + return (0); +} diff --git a/Utilities/cmlibarchive/cpio/cpio.h b/Utilities/cmlibarchive/cpio/cpio.h new file mode 100644 index 000000000..511bef6b6 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/cpio.h @@ -0,0 +1,109 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/usr.bin/cpio/cpio.h,v 1.7 2008/12/06 07:30:40 kientzle Exp $ + */ + +#ifndef CPIO_H_INCLUDED +#define CPIO_H_INCLUDED + +#include "cpio_platform.h" +#include + +#include "matching.h" + +/* + * The internal state for the "cpio" program. + * + * Keeping all of the state in a structure like this simplifies memory + * leak testing (at exit, anything left on the heap is suspect). A + * pointer to this structure is passed to most cpio internal + * functions. + */ +struct cpio { + /* Option parsing */ + const char *optarg; + + /* Options */ + const char *filename; + char mode; /* -i -o -p */ + char compress; /* -j, -y, or -z */ + const char *format; /* -H format */ + int bytes_per_block; /* -b block_size */ + int verbose; /* -v */ + int quiet; /* --quiet */ + int extract_flags; /* Flags for extract operation */ + char symlink_mode; /* H or L, per BSD conventions */ + const char *compress_program; + int option_append; /* -A, only relevant for -o */ + int option_atime_restore; /* -a */ + int option_follow_links; /* -L */ + int option_link; /* -l */ + int option_list; /* -t */ + char option_null; /* --null */ + int option_numeric_uid_gid; /* -n */ + int option_rename; /* -r */ + char *destdir; + size_t pass_destpath_alloc; + char *pass_destpath; + int uid_override; + int gid_override; + int day_first; /* true if locale prefers day/mon */ + + /* If >= 0, then close this when done. */ + int fd; + + /* Miscellaneous state information */ + struct archive *archive; + struct archive *archive_read_disk; + int argc; + char **argv; + int return_value; /* Value returned by main() */ + struct archive_entry_linkresolver *linkresolver; + + struct name_cache *uname_cache; + struct name_cache *gname_cache; + + /* Work data. */ + struct lafe_matching *matching; + char *buff; + size_t buff_size; +}; + +const char *owner_parse(const char *, int *, int *); + + +/* Fake short equivalents for long options that otherwise lack them. */ +enum { + OPTION_INSECURE = 1, + OPTION_LZMA, + OPTION_NO_PRESERVE_OWNER, + OPTION_PRESERVE_OWNER, + OPTION_QUIET, + OPTION_VERSION +}; + +int cpio_getopt(struct cpio *cpio); + +#endif diff --git a/Utilities/cmlibarchive/cpio/cpio_platform.h b/Utilities/cmlibarchive/cpio/cpio_platform.h new file mode 100644 index 000000000..253b8a832 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/cpio_platform.h @@ -0,0 +1,95 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/usr.bin/cpio/cpio_platform.h,v 1.2 2008/12/06 07:15:42 kientzle Exp $ + */ + +/* + * This header is the first thing included in any of the cpio + * source files. As far as possible, platform-specific issues should + * be dealt with here and not within individual source files. + */ + +#ifndef CPIO_PLATFORM_H_INCLUDED +#define CPIO_PLATFORM_H_INCLUDED + +#if defined(PLATFORM_CONFIG_H) +/* Use hand-built config.h in environments that need it. */ +#include PLATFORM_CONFIG_H +#else +/* Read config.h or die trying. */ +#include "config.h" +#endif + +/* No non-FreeBSD platform will have __FBSDID, so just define it here. */ +#ifdef __FreeBSD__ +#include /* For __FBSDID */ +#elif !defined(__FBSDID) +/* 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 +#include +#else +/* Otherwise, include user headers. */ +#include "archive.h" +#include "archive_entry.h" +#endif + +/* + * We need to be able to display a filesize using printf(). The type + * and format string here must be compatible with one another and + * large enough for any file. + */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#define CPIO_FILESIZE_TYPE __int64 +#define CPIO_FILESIZE_PRINTF "%I64u" +#elif HAVE_UINTMAX_T +#define CPIO_FILESIZE_TYPE uintmax_t +#define CPIO_FILESIZE_PRINTF "%ju" +#elif HAVE_UNSIGNED_LONG_LONG +#define CPIO_FILESIZE_TYPE unsigned long long +#define CPIO_FILESIZE_PRINTF "%llu" +#else +#define CPIO_FILESIZE_TYPE unsigned long +#define CPIO_FILESIZE_PRINTF "%lu" +#endif + + +/* How to mark functions that don't return. */ +#if defined(__GNUC__) && (__GNUC__ > 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_DEAD __attribute__((__noreturn__)) +#else +#define __LA_DEAD +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include "cpio_windows.h" +#endif + +#endif /* !CPIO_PLATFORM_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/cpio/cpio_windows.c b/Utilities/cmlibarchive/cpio/cpio_windows.c new file mode 100644 index 000000000..37d358fd0 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/cpio_windows.c @@ -0,0 +1,336 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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. + * + * $FreeBSD$ + */ + +#if defined(_WIN32) && !defined(__CYGWIN__) + +#include "cpio_platform.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cpio.h" +#include "err.h" + +#define EPOC_TIME (116444736000000000ULL) + +static void cpio_dosmaperr(unsigned long); + +/* + * Prepend "\\?\" to the path name and convert it to unicode to permit + * an extended-length path for a maximum total path length of 32767 + * characters. + * see also http://msdn.microsoft.com/en-us/library/aa365247.aspx + */ +static wchar_t * +permissive_name(const char *name) +{ + wchar_t *wn, *wnp; + wchar_t *ws, *wsp; + size_t l, len, slen, alloclen; + int unc; + + len = strlen(name); + wn = malloc((len + 1) * sizeof(wchar_t)); + if (wn == NULL) + return (NULL); + l = MultiByteToWideChar(CP_ACP, 0, name, len, wn, len); + if (l == 0) { + free(wn); + return (NULL); + } + wn[l] = L'\0'; + + /* Get a full path names */ + l = GetFullPathNameW(wn, 0, NULL, NULL); + if (l == 0) { + free(wn); + return (NULL); + } + wnp = malloc(l * sizeof(wchar_t)); + if (wnp == NULL) { + free(wn); + return (NULL); + } + len = GetFullPathNameW(wn, l, wnp, NULL); + free(wn); + wn = wnp; + + if (wnp[0] == L'\\' && wnp[1] == L'\\' && + wnp[2] == L'?' && wnp[3] == L'\\') + /* We have already permissive names. */ + return (wn); + + if (wnp[0] == L'\\' && wnp[1] == L'\\' && + wnp[2] == L'.' && wnp[3] == L'\\') { + /* Device names */ + if (((wnp[4] >= L'a' && wnp[4] <= L'z') || + (wnp[4] >= L'A' && wnp[4] <= L'Z')) && + wnp[5] == L':' && wnp[6] == L'\\') + wnp[2] = L'?';/* Not device names. */ + return (wn); + } + + unc = 0; + if (wnp[0] == L'\\' && wnp[1] == L'\\' && wnp[2] != L'\\') { + wchar_t *p = &wnp[2]; + + /* Skip server-name letters. */ + while (*p != L'\\' && *p != L'\0') + ++p; + if (*p == L'\\') { + wchar_t *rp = ++p; + /* Skip share-name letters. */ + while (*p != L'\\' && *p != L'\0') + ++p; + if (*p == L'\\' && p != rp) { + /* Now, match patterns such as + * "\\server-name\share-name\" */ + wnp += 2; + len -= 2; + unc = 1; + } + } + } + + alloclen = slen = 4 + (unc * 4) + len + 1; + ws = wsp = malloc(slen * sizeof(wchar_t)); + if (ws == NULL) { + free(wn); + return (NULL); + } + /* prepend "\\?\" */ + wcsncpy(wsp, L"\\\\?\\", 4); + wsp += 4; + slen -= 4; + if (unc) { + /* append "UNC\" ---> "\\?\UNC\" */ + wcsncpy(wsp, L"UNC\\", 4); + wsp += 4; + slen -= 4; + } + wcsncpy(wsp, wnp, slen); + free(wn); + ws[alloclen - 1] = L'\0'; + return (ws); +} + +static HANDLE +cpio_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) +{ + wchar_t *wpath; + HANDLE handle; + + handle = CreateFileA(path, dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, + hTemplateFile); + if (handle != INVALID_HANDLE_VALUE) + return (handle); + if (GetLastError() != ERROR_PATH_NOT_FOUND) + return (handle); + wpath = permissive_name(path); + if (wpath == NULL) + return (handle); + handle = CreateFileW(wpath, dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, + hTemplateFile); + free(wpath); + return (handle); +} + +#define WINTIME(sec, usec) ((Int32x32To64(sec, 10000000) + EPOC_TIME) + (usec * 10)) +static int +__hutimes(HANDLE handle, const struct __timeval *times) +{ + ULARGE_INTEGER wintm; + FILETIME fatime, fmtime; + + wintm.QuadPart = WINTIME(times[0].tv_sec, times[0].tv_usec); + fatime.dwLowDateTime = wintm.LowPart; + fatime.dwHighDateTime = wintm.HighPart; + wintm.QuadPart = WINTIME(times[1].tv_sec, times[1].tv_usec); + fmtime.dwLowDateTime = wintm.LowPart; + fmtime.dwHighDateTime = wintm.HighPart; + if (SetFileTime(handle, NULL, &fatime, &fmtime) == 0) { + errno = EINVAL; + return (-1); + } + return (0); +} + +int +futimes(int fd, const struct __timeval *times) +{ + + return (__hutimes((HANDLE)_get_osfhandle(fd), times)); +} + +int +utimes(const char *name, const struct __timeval *times) +{ + int ret; + HANDLE handle; + + handle = cpio_CreateFile(name, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL); + if (handle == INVALID_HANDLE_VALUE) { + cpio_dosmaperr(GetLastError()); + return (-1); + } + ret = __hutimes(handle, times); + CloseHandle(handle); + return (ret); +} + +/* + * The following function was modified from PostgreSQL sources and is + * subject to the copyright below. + */ +/*------------------------------------------------------------------------- + * + * win32error.c + * Map win32 error codes to errno values + * + * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + * + * IDENTIFICATION + * $PostgreSQL: pgsql/src/port/win32error.c,v 1.4 2008/01/01 19:46:00 momjian Exp $ + * + *------------------------------------------------------------------------- + */ +/* +PostgreSQL Database Management System +(formerly known as Postgres, then as Postgres95) + +Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +*/ + +static const struct { + DWORD winerr; + int doserr; +} doserrors[] = +{ + { ERROR_INVALID_FUNCTION, EINVAL }, + { ERROR_FILE_NOT_FOUND, ENOENT }, + { ERROR_PATH_NOT_FOUND, ENOENT }, + { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, + { ERROR_ACCESS_DENIED, EACCES }, + { ERROR_INVALID_HANDLE, EBADF }, + { ERROR_ARENA_TRASHED, ENOMEM }, + { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, + { ERROR_INVALID_BLOCK, ENOMEM }, + { ERROR_BAD_ENVIRONMENT, E2BIG }, + { ERROR_BAD_FORMAT, ENOEXEC }, + { ERROR_INVALID_ACCESS, EINVAL }, + { ERROR_INVALID_DATA, EINVAL }, + { ERROR_INVALID_DRIVE, ENOENT }, + { ERROR_CURRENT_DIRECTORY, EACCES }, + { ERROR_NOT_SAME_DEVICE, EXDEV }, + { ERROR_NO_MORE_FILES, ENOENT }, + { ERROR_LOCK_VIOLATION, EACCES }, + { ERROR_SHARING_VIOLATION, EACCES }, + { ERROR_BAD_NETPATH, ENOENT }, + { ERROR_NETWORK_ACCESS_DENIED, EACCES }, + { ERROR_BAD_NET_NAME, ENOENT }, + { ERROR_FILE_EXISTS, EEXIST }, + { ERROR_CANNOT_MAKE, EACCES }, + { ERROR_FAIL_I24, EACCES }, + { ERROR_INVALID_PARAMETER, EINVAL }, + { ERROR_NO_PROC_SLOTS, EAGAIN }, + { ERROR_DRIVE_LOCKED, EACCES }, + { ERROR_BROKEN_PIPE, EPIPE }, + { ERROR_DISK_FULL, ENOSPC }, + { ERROR_INVALID_TARGET_HANDLE, EBADF }, + { ERROR_INVALID_HANDLE, EINVAL }, + { ERROR_WAIT_NO_CHILDREN, ECHILD }, + { ERROR_CHILD_NOT_COMPLETE, ECHILD }, + { ERROR_DIRECT_ACCESS_HANDLE, EBADF }, + { ERROR_NEGATIVE_SEEK, EINVAL }, + { ERROR_SEEK_ON_DEVICE, EACCES }, + { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, + { ERROR_NOT_LOCKED, EACCES }, + { ERROR_BAD_PATHNAME, ENOENT }, + { ERROR_MAX_THRDS_REACHED, EAGAIN }, + { ERROR_LOCK_FAILED, EACCES }, + { ERROR_ALREADY_EXISTS, EEXIST }, + { ERROR_FILENAME_EXCED_RANGE, ENOENT }, + { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, + { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } +}; + +static void +cpio_dosmaperr(unsigned long e) +{ + int i; + + if (e == 0) { + errno = 0; + return; + } + + for (i = 0; i < sizeof(doserrors); i++) { + if (doserrors[i].winerr == e) { + errno = doserrors[i].doserr; + return; + } + } + + /* fprintf(stderr, "unrecognized win32 error code: %lu", e); */ + errno = EINVAL; + return; +} +#endif diff --git a/Utilities/cmlibarchive/cpio/cpio_windows.h b/Utilities/cmlibarchive/cpio/cpio_windows.h new file mode 100644 index 000000000..5c14c8ad8 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/cpio_windows.h @@ -0,0 +1,72 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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. + * + * $FreeBSD$ + */ +#ifndef CPIO_WINDOWS_H +#define CPIO_WINDOWS_H 1 + +#include +#include + +#define getgrgid(id) NULL +#define getgrnam(name) NULL +#define getpwnam(name) NULL +#define getpwuid(id) NULL + +#ifdef _MSC_VER +#define snprintf sprintf_s +#define strdup _strdup +#define open _open +#define read _read +#define close _close +#endif + +struct passwd { + char *pw_name; + uid_t pw_uid; + gid_t pw_gid; +}; + +struct group { + char *gr_name; + gid_t gr_gid; +}; + +struct _timeval64i32 { + time_t tv_sec; + long tv_usec; +}; +#define __timeval _timeval64i32 + +extern int futimes(int fd, const struct __timeval *times); +#ifndef HAVE_FUTIMES +#define HAVE_FUTIMES 1 +#endif +extern int utimes(const char *name, const struct __timeval *times); +#ifndef HAVE_UTIMES +#define HAVE_UTIMES 1 +#endif + +#endif /* CPIO_WINDOWS_H */ diff --git a/Utilities/cmlibarchive/cpio/test/CMakeLists.txt b/Utilities/cmlibarchive/cpio/test/CMakeLists.txt new file mode 100644 index 000000000..4e1c98f53 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/CMakeLists.txt @@ -0,0 +1,75 @@ +############################################ +# +# How to build bsdcpio_test +# +############################################ +IF(ENABLE_CPIO AND ENABLE_TEST) + SET(bsdcpio_test_SOURCES + ../cmdline.c + ../../libarchive_fe/err.c + ../../libarchive_fe/pathmatch.c + main.c + test.h + test_0.c + test_basic.c + test_cmdline.c + test_format_newc.c + test_gcpio_compat.c + test_option_B_upper.c + test_option_C_upper.c + test_option_J_upper.c + test_option_L_upper.c + test_option_Z_upper.c + test_option_a.c + test_option_c.c + test_option_d.c + test_option_f.c + test_option_help.c + test_option_l.c + test_option_lzma.c + test_option_m.c + test_option_t.c + test_option_u.c + test_option_version.c + test_option_y.c + test_option_z.c + test_owner_parse.c + test_passthrough_dotdot.c + test_passthrough_reverse.c + test_pathmatch.c + ) + IF(WIN32 AND NOT CYGWIN) + LIST(APPEND bsdcpio_test_SOURCES ../cpio_windows.h) + ENDIF(WIN32 AND NOT CYGWIN) + + # + # Generate the list.h + # + GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h + ${CMAKE_CURRENT_LIST_FILE} ${bsdcpio_test_SOURCES}) + SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES + ${CMAKE_CURRENT_BINARY_DIR}) + # + # Register target + # + ADD_EXECUTABLE(bsdcpio_test ${bsdcpio_test_SOURCES}) + SET_PROPERTY(TARGET bsdcpio_test PROPERTY COMPILE_DEFINITIONS LIST_H) + + # ADD_TEST() for each separate test + SET(num 0) + FOREACH(test ${bsdcpio_test_SOURCES}) + IF(test MATCHES "^test_[^/]+[.]c$") + STRING(REGEX REPLACE "^(test_[^/]+)[.]c$" "\\1" testname ${test}) + ADD_TEST("bsdcpio_${testname}" bsdcpio_test + -v -p ${BSDCPIO} -r ${CMAKE_CURRENT_SOURCE_DIR} ${num}) + MATH(EXPR num "${num} + 1") + ENDIF(test MATCHES "^test_[^/]+[.]c$") + ENDFOREACH(test) + + # Experimental new test handling + ADD_CUSTOM_TARGET(run_bsdcpio_test + COMMAND bsdcpio_test -p ${BSDCPIO} -r ${CMAKE_CURRENT_SOURCE_DIR}) + ADD_DEPENDENCIES(run_bsdcpio_test bsdcpio) + ADD_DEPENDENCIES(run_all_tests run_bsdcpio_test) +ENDIF(ENABLE_CPIO AND ENABLE_TEST) + diff --git a/Utilities/cmlibarchive/cpio/test/Makefile b/Utilities/cmlibarchive/cpio/test/Makefile new file mode 100644 index 000000000..ab4247c9d --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/Makefile @@ -0,0 +1,75 @@ +# $FreeBSD: src/usr.bin/cpio/test/Makefile,v 1.4 2008/08/24 05:49:36 kientzle Exp $ + +# Where to find the cpio sources (for the internal unit tests) +CPIO_SRCDIR=${.CURDIR}/.. +.PATH: ${CPIO_SRCDIR} ${CPIO_SRCDIR}/../libarchive_fe + +# Some cpio sources are pulled in for white-box tests +CPIO_SRCS= cmdline.c err.c pathmatch.c + +TESTS= \ + test_0.c \ + test_basic.c \ + test_cmdline.c \ + test_format_newc.c \ + test_gcpio_compat.c \ + test_option_B_upper.c \ + test_option_C_upper.c \ + test_option_J_upper.c \ + test_option_L_upper.c \ + test_option_Z_upper.c \ + test_option_a.c \ + test_option_c.c \ + test_option_d.c \ + test_option_f.c \ + test_option_help.c \ + test_option_l.c \ + test_option_lzma.c \ + test_option_m.c \ + test_option_t.c \ + test_option_u.c \ + test_option_version.c \ + test_option_y.c \ + test_option_z.c \ + test_owner_parse.c \ + test_passthrough_dotdot.c \ + test_passthrough_reverse.c \ + test_pathmatch.c + +# Build the test program +SRCS= list.h \ + ${CPIO_SRCS} \ + ${TESTS} \ + main.c + +CLEANFILES+= list.h bsdcpio_test + +NO_MAN=yes + +PROG=bsdcpio_test +DPADD=${LIBARCHIVE} ${LIBBZ2} ${LIBZ} +CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" +CFLAGS+= -I.. -I../../libarchive_fe +LDADD= -larchive -lz -lbz2 +CFLAGS+= -static -g -O2 -Wall +CFLAGS+= -I${.OBJDIR} +CFLAGS+= -I${CPIO_SRCDIR} + +# Uncomment to link against dmalloc +#LDADD+= -L/usr/local/lib -ldmalloc +#CFLAGS+= -I/usr/local/include -DUSE_DMALLOC +WARNS=6 + +check test: bsdcpio_test + ${.OBJDIR}/bsdcpio_test -p ${.OBJDIR}/../bsdcpio -r ${.CURDIR} + +${.OBJDIR}/list.h list.h: ${TESTS} Makefile + (cd ${.CURDIR}; cat ${TESTS}) | grep DEFINE_TEST > list.h + +clean: + rm -f ${CLEANFILES} + rm -f *~ + -chmod -R +w /tmp/bsdcpio_test.* + rm -rf /tmp/bsdcpio_test.* + +.include diff --git a/Utilities/cmlibarchive/cpio/test/main.c b/Utilities/cmlibarchive/cpio/test/main.c new file mode 100644 index 000000000..2740134ce --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/main.c @@ -0,0 +1,2059 @@ +/* + * Copyright (c) 2003-2009 Tim Kientzle + * 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 +#include +#include +#include +#include "test.h" + +/* + * This same file is used pretty much verbatim for all test harnesses. + * + * The next few lines are the only differences. + * TODO: Move this into a separate configuration header, have all test + * suites share one copy of this file. + */ +__FBSDID("$FreeBSD: src/usr.bin/cpio/test/main.c,v 1.3 2008/08/24 04:58:22 kientzle Exp $"); +#define KNOWNREF "test_option_f.cpio.uu" +#define ENVBASE "BSDCPIO" /* Prefix for environment variables. */ +#define PROGRAM "bsdcpio" /* Name of program being tested. */ +#undef LIBRARY /* Not testing a library. */ +#undef EXTRA_DUMP /* How to dump extra data */ +/* How to generate extra version info. */ +#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "") + +/* + * + * Windows support routines + * + * Note: Configuration is a tricky issue. Using HAVE_* feature macros + * in the test harness is dangerous because they cover up + * configuration errors. The classic example of this is omitting a + * configure check. If libarchive and libarchive_test both look for + * the same feature macro, such errors are hard to detect. Platform + * macros (e.g., _WIN32 or __GNUC__) are a little better, but can + * easily lead to very messy code. It's best to limit yourself + * to only the most generic programming techniques in the test harness + * and thus avoid conditionals altogether. Where that's not possible, + * try to minimize conditionals by grouping platform-specific tests in + * one place (e.g., test_acl_freebsd) or by adding new assert() + * functions (e.g., assertMakeHardlink()) to cover up platform + * differences. Platform-specific coding in libarchive_test is often + * a symptom that some capability is missing from libarchive itself. + */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#if !defined(__GNUC__) +#include +#endif +#include +#include +#ifndef F_OK +#define F_OK (0) +#endif +#ifndef S_ISDIR +#define S_ISDIR(m) ((m) & _S_IFDIR) +#endif +#ifndef S_ISREG +#define S_ISREG(m) ((m) & _S_IFREG) +#endif +#define access _access +#define chdir _chdir +#ifndef fileno +#define fileno _fileno +#endif +/*#define fstat _fstat64*/ +#define getcwd _getcwd +#define lstat stat +/*#define lstat _stat64*/ +/*#define stat _stat64*/ +#define rmdir _rmdir +#define strdup _strdup +#define umask _umask +#define int64_t __int64 +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) +void *GetFunctionKernel32(const char *name) +{ + static HINSTANCE lib; + static int set; + if (!set) { + set = 1; + lib = LoadLibrary("kernel32.dll"); + } + if (lib == NULL) { + fprintf(stderr, "Can't load kernel32.dll?!\n"); + exit(1); + } + return (void *)GetProcAddress(lib, name); +} + +static int +my_CreateSymbolicLinkA(const char *linkname, const char *target, int flags) +{ + static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, DWORD); + static int set; + if (!set) { + set = 1; + f = GetFunctionKernel32("CreateSymbolicLinkA"); + } + return f == NULL ? 0 : (*f)(linkname, target, flags); +} + +static int +my_CreateHardLinkA(const char *linkname, const char *target) +{ + static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES); + static int set; + if (!set) { + set = 1; + f = GetFunctionKernel32("CreateHardLinkA"); + } + return f == NULL ? 0 : (*f)(linkname, target, NULL); +} + +int +my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi) +{ + HANDLE h; + int r; + + memset(bhfi, 0, sizeof(*bhfi)); + h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) + return (0); + r = GetFileInformationByHandle(h, bhfi); + CloseHandle(h); + return (r); +} +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__) +static void +invalid_parameter_handler(const wchar_t * expression, + const wchar_t * function, const wchar_t * file, + unsigned int line, uintptr_t pReserved) +{ + /* nop */ +} +#endif + +/* + * + * OPTIONS FLAGS + * + */ + +/* Enable core dump on failure. */ +static int dump_on_failure = 0; +/* Default is to remove temp dirs and log data for successful tests. */ +static int keep_temp_files = 0; +/* Default is to just report pass/fail for each test. */ +static int verbosity = 0; +#define VERBOSITY_SUMMARY_ONLY -1 /* -q */ +#define VERBOSITY_PASSFAIL 0 /* Default */ +#define VERBOSITY_LIGHT_REPORT 1 /* -v */ +#define VERBOSITY_FULL 2 /* -vv */ +/* A few places generate even more output for verbosity > VERBOSITY_FULL, + * mostly for debugging the test harness itself. */ +/* Cumulative count of assertion failures. */ +static int failures = 0; +/* Cumulative count of reported skips. */ +static int skips = 0; +/* Cumulative count of assertions checked. */ +static int assertions = 0; + +/* Directory where uuencoded reference files can be found. */ +static const char *refdir; + +/* + * Report log information selectively to console and/or disk log. + */ +static int log_console = 0; +static FILE *logfile; +static void +vlogprintf(const char *fmt, va_list ap) +{ + if (log_console) + vfprintf(stdout, fmt, ap); + if (logfile != NULL) + vfprintf(logfile, fmt, ap); +} + +static void +logprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vlogprintf(fmt, ap); + va_end(ap); +} + +/* Set up a message to display only if next assertion fails. */ +static char msgbuff[4096]; +static const char *msg, *nextmsg; +void +failure(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vsprintf(msgbuff, fmt, ap); + va_end(ap); + nextmsg = msgbuff; +} + +/* + * Copy arguments into file-local variables. + * This was added to permit vararg assert() functions without needing + * variadic wrapper macros. Turns out that the vararg capability is almost + * never used, so almost all of the vararg assertions can be simplified + * by removing the vararg capability and reworking the wrapper macro to + * pass __FILE__, __LINE__ directly into the function instead of using + * this hook. I suspect this machinery is used so rarely that we + * would be better off just removing it entirely. That would simplify + * the code here noticably. + */ +static const char *test_filename; +static int test_line; +static void *test_extra; +void assertion_setup(const char *filename, int line) +{ + test_filename = filename; + test_line = line; +} + +/* Called at the beginning of each assert() function. */ +static void +assertion_count(const char *file, int line) +{ + (void)file; /* UNUSED */ + (void)line; /* UNUSED */ + ++assertions; + /* Proper handling of "failure()" message. */ + msg = nextmsg; + nextmsg = NULL; + /* Uncomment to print file:line after every assertion. + * Verbose, but occasionally useful in tracking down crashes. */ + /* printf("Checked %s:%d\n", file, line); */ +} + +/* + * For each test source file, we remember how many times each + * assertion was reported. Cleared before each new test, + * used by test_summarize(). + */ +static struct line { + int count; + int skip; +} failed_lines[10000]; + +/* Count this failure, setup up log destination and handle initial report. */ +static void +failure_start(const char *filename, int line, const char *fmt, ...) +{ + va_list ap; + + /* Record another failure for this line. */ + ++failures; + test_filename = filename; + failed_lines[line].count++; + + /* Determine whether to log header to console. */ + switch (verbosity) { + case VERBOSITY_FULL: + log_console = 1; + break; + case VERBOSITY_LIGHT_REPORT: + log_console = (failed_lines[line].count < 2); + break; + default: + log_console = 0; + } + + /* Log file:line header for this failure */ + va_start(ap, fmt); +#if _MSC_VER + logprintf("%s(%d): ", filename, line); +#else + logprintf("%s:%d: ", filename, line); +#endif + vlogprintf(fmt, ap); + va_end(ap); + logprintf("\n"); + + if (msg != NULL && msg[0] != '\0') { + logprintf(" Description: %s\n", msg); + msg = NULL; + } + + /* Determine whether to log details to console. */ + if (verbosity == VERBOSITY_LIGHT_REPORT) + log_console = 0; +} + +/* Complete reporting of failed tests. */ +/* + * The 'extra' hook here is used by libarchive to include libarchive + * error messages with assertion failures. It could also be used + * to add strerror() output, for example. Just define the EXTRA_DUMP() + * macro appropriately. + */ +static void +failure_finish(void *extra) +{ + (void)extra; /* UNUSED (maybe) */ +#ifdef EXTRA_DUMP + if (extra != NULL) + logprintf(" detail: %s\n", EXTRA_DUMP(extra)); +#endif + + if (dump_on_failure) { + fprintf(stderr, + " *** forcing core dump so failure can be debugged ***\n"); + *(char *)(NULL) = 0; + exit(1); + } +} + +/* Inform user that we're skipping some checks. */ +void +test_skipping(const char *fmt, ...) +{ + char buff[1024]; + va_list ap; + + va_start(ap, fmt); + vsprintf(buff, fmt, ap); + va_end(ap); + /* failure_start() isn't quite right, but is awfully convenient. */ + failure_start(test_filename, test_line, "SKIPPING: %s", buff); + --failures; /* Undo failures++ in failure_start() */ + /* Don't failure_finish() here. */ + /* Mark as skip, so doesn't count as failed test. */ + failed_lines[test_line].skip = 1; + ++skips; +} + +/* + * + * ASSERTIONS + * + */ + +/* Generic assert() just displays the failed condition. */ +int +assertion_assert(const char *file, int line, int value, + const char *condition, void *extra) +{ + assertion_count(file, line); + if (!value) { + failure_start(file, line, "Assertion failed: %s", condition); + failure_finish(extra); + } + return (value); +} + +/* chdir() and report any errors */ +int +assertion_chdir(const char *file, int line, const char *pathname) +{ + assertion_count(file, line); + if (chdir(pathname) == 0) + return (1); + failure_start(file, line, "chdir(\"%s\")", pathname); + failure_finish(NULL); + return (0); + +} + +/* Verify two integers are equal. */ +int +assertion_equal_int(const char *file, int line, + long long v1, const char *e1, long long 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=%lld (0x%llx, 0%llo)\n", e1, v1, v1, v1); + logprintf(" %s=%lld (0x%llx, 0%llo)\n", e2, v2, v2, v2); + failure_finish(extra); + return (0); +} + +static void strdump(const char *e, const char *p) +{ + logprintf(" %s = ", e); + if (p == NULL) { + logprintf("(null)"); + return; + } + logprintf("\""); + while (*p != '\0') { + unsigned int c = 0xff & *p++; + switch (c) { + case '\a': printf("\a"); break; + case '\b': printf("\b"); break; + case '\n': printf("\n"); break; + case '\r': printf("\r"); break; + default: + if (c >= 32 && c < 127) + logprintf("%c", c); + else + logprintf("\\x%02X", c); + } + } + logprintf("\""); + logprintf(" (length %d)\n", p == NULL ? 0 : (int)strlen(p)); +} + +/* Verify two strings are equal, dump them if not. */ +int +assertion_equal_string(const char *file, int line, + const char *v1, const char *e1, + const char *v2, const char *e2, + void *extra) +{ + assertion_count(file, line); + if (v1 == v2 || strcmp(v1, v2) == 0) + return (1); + failure_start(file, line, "%s != %s", e1, e2); + strdump(e1, v1); + strdump(e2, v2); + failure_finish(extra); + return (0); +} + +static void +wcsdump(const char *e, const wchar_t *w) +{ + logprintf(" %s = ", e); + if (w == NULL) { + logprintf("(null)"); + return; + } + logprintf("\""); + while (*w != L'\0') { + unsigned int c = *w++; + if (c >= 32 && c < 127) + logprintf("%c", c); + else if (c < 256) + logprintf("\\x%02X", c); + else if (c < 0x10000) + logprintf("\\u%04X", c); + else + logprintf("\\U%08X", c); + } + logprintf("\"\n"); +} + +/* Verify that two wide strings are equal, dump them if not. */ +int +assertion_equal_wstring(const char *file, int line, + const wchar_t *v1, const char *e1, + const wchar_t *v2, const char *e2, + void *extra) +{ + assertion_count(file, line); + if (v1 == v2 || wcscmp(v1, v2) == 0) + return (1); + failure_start(file, line, "%s != %s", e1, e2); + wcsdump(e1, v1); + wcsdump(e2, v2); + failure_finish(extra); + return (0); +} + +/* + * Pretty standard hexdump routine. As a bonus, if ref != NULL, then + * any bytes in p that differ from ref will be highlighted with '_' + * before and after the hex value. + */ +static void +hexdump(const char *p, const char *ref, size_t l, size_t offset) +{ + size_t i, j; + char sep; + + for(i=0; i < l; i+=16) { + logprintf("%04x", (unsigned)(i + offset)); + sep = ' '; + for (j = 0; j < 16 && i + j < l; j++) { + if (ref != NULL && p[i + j] != ref[i + j]) + sep = '_'; + logprintf("%c%02x", sep, 0xff & (int)p[i+j]); + if (ref != NULL && p[i + j] == ref[i + j]) + sep = ' '; + } + for (; j < 16; j++) { + logprintf("%c ", sep); + sep = ' '; + } + logprintf("%c", sep); + for (j=0; j < 16 && i + j < l; j++) { + int c = p[i + j]; + if (c >= ' ' && c <= 126) + logprintf("%c", c); + else + logprintf("."); + } + logprintf("\n"); + } +} + +/* Verify that two blocks of memory are the same, display the first + * block of differences if they're not. */ +int +assertion_equal_mem(const char *file, int line, + const void *_v1, const char *e1, + const void *_v2, const char *e2, + size_t l, const char *ld, void *extra) +{ + const char *v1 = (const char *)_v1; + const char *v2 = (const char *)_v2; + size_t offset; + + assertion_count(file, line); + if (v1 == v2 || memcmp(v1, v2, l) == 0) + return (1); + + failure_start(file, line, "%s != %s", e1, e2); + logprintf(" size %s = %d\n", ld, (int)l); + /* Dump 48 bytes (3 lines) so that the first difference is + * in the second line. */ + offset = 0; + while (l > 64 && memcmp(v1, v2, 32) == 0) { + /* Two lines agree, so step forward one line. */ + v1 += 16; + v2 += 16; + l -= 16; + offset += 16; + } + logprintf(" Dump of %s\n", e1); + hexdump(v1, v2, l < 64 ? l : 64, offset); + logprintf(" Dump of %s\n", e2); + hexdump(v2, v1, l < 64 ? l : 64, offset); + logprintf("\n"); + failure_finish(extra); + return (0); +} + +/* Verify that the named file exists and is empty. */ +int +assertion_empty_file(const char *f1fmt, ...) +{ + char buff[1024]; + char f1[1024]; + struct stat st; + va_list ap; + ssize_t s; + FILE *f; + + assertion_count(test_filename, test_line); + va_start(ap, f1fmt); + vsprintf(f1, f1fmt, ap); + va_end(ap); + + if (stat(f1, &st) != 0) { + failure_start(test_filename, test_line, "Stat failed: %s", f1); + failure_finish(NULL); + return (0); + } + if (st.st_size == 0) + return (1); + + failure_start(test_filename, test_line, "File should be empty: %s", f1); + logprintf(" File size: %d\n", (int)st.st_size); + logprintf(" Contents:\n"); + f = fopen(f1, "rb"); + if (f == NULL) { + logprintf(" Unable to open %s\n", f1); + } else { + s = ((off_t)sizeof(buff) < st.st_size) ? + (ssize_t)sizeof(buff) : (ssize_t)st.st_size; + s = fread(buff, 1, s, f); + hexdump(buff, NULL, s, 0); + fclose(f); + } + failure_finish(NULL); + return (0); +} + +/* Verify that the named file exists and is not empty. */ +int +assertion_non_empty_file(const char *f1fmt, ...) +{ + char f1[1024]; + struct stat st; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, f1fmt); + vsprintf(f1, f1fmt, ap); + va_end(ap); + + if (stat(f1, &st) != 0) { + failure_start(test_filename, test_line, "Stat failed: %s", f1); + failure_finish(NULL); + return (0); + } + if (st.st_size == 0) { + failure_start(test_filename, test_line, "File empty: %s", f1); + failure_finish(NULL); + return (0); + } + return (1); +} + +/* Verify that two files have the same contents. */ +/* TODO: hexdump the first bytes that actually differ. */ +int +assertion_equal_file(const char *fn1, const char *f2pattern, ...) +{ + char fn2[1024]; + va_list ap; + char buff1[1024]; + char buff2[1024]; + FILE *f1, *f2; + int n1, n2; + + assertion_count(test_filename, test_line); + va_start(ap, f2pattern); + vsprintf(fn2, f2pattern, ap); + va_end(ap); + + f1 = fopen(fn1, "rb"); + f2 = fopen(fn2, "rb"); + for (;;) { + n1 = fread(buff1, 1, sizeof(buff1), f1); + n2 = fread(buff2, 1, sizeof(buff2), f2); + if (n1 != n2) + break; + if (n1 == 0 && n2 == 0) { + fclose(f1); + fclose(f2); + return (1); + } + if (memcmp(buff1, buff2, n1) != 0) + break; + } + fclose(f1); + fclose(f2); + failure_start(test_filename, test_line, "Files not identical"); + logprintf(" file1=\"%s\"\n", fn1); + logprintf(" file2=\"%s\"\n", fn2); + failure_finish(test_extra); + return (0); +} + +/* Verify that the named file does exist. */ +int +assertion_file_exists(const char *fpattern, ...) +{ + char f[1024]; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(f, fpattern, ap); + va_end(ap); + +#if defined(_WIN32) && !defined(__CYGWIN__) + if (!_access(f, 0)) + return (1); +#else + if (!access(f, F_OK)) + return (1); +#endif + failure_start(test_filename, test_line, "File should exist: %s", f); + failure_finish(test_extra); + return (0); +} + +/* Verify that the named file doesn't exist. */ +int +assertion_file_not_exists(const char *fpattern, ...) +{ + char f[1024]; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(f, fpattern, ap); + va_end(ap); + +#if defined(_WIN32) && !defined(__CYGWIN__) + if (_access(f, 0)) + return (1); +#else + if (access(f, F_OK)) + return (1); +#endif + failure_start(test_filename, test_line, "File should not exist: %s", f); + failure_finish(test_extra); + return (0); +} + +/* Compare the contents of a file to a block of memory. */ +int +assertion_file_contents(const void *buff, int s, const char *fpattern, ...) +{ + char fn[1024]; + va_list ap; + char *contents; + FILE *f; + int n; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(fn, fpattern, ap); + va_end(ap); + + f = fopen(fn, "rb"); + if (f == NULL) { + failure_start(test_filename, test_line, + "File should exist: %s", fn); + failure_finish(test_extra); + return (0); + } + contents = malloc(s * 2); + n = fread(contents, 1, s * 2, f); + fclose(f); + if (n == s && memcmp(buff, contents, s) == 0) { + free(contents); + return (1); + } + failure_start(test_filename, test_line, "File contents don't match"); + logprintf(" file=\"%s\"\n", fn); + if (n > 0) + hexdump(contents, buff, n > 512 ? 512 : 0, 0); + else { + logprintf(" File empty, contents should be:\n"); + hexdump(buff, NULL, s > 512 ? 512 : 0, 0); + } + failure_finish(test_extra); + free(contents); + return (0); +} + +/* Check the contents of a text file, being tolerant of line endings. */ +int +assertion_text_file_contents(const char *buff, const char *fn) +{ + char *contents; + const char *btxt, *ftxt; + FILE *f; + int n, s; + + assertion_count(test_filename, test_line); + f = fopen(fn, "r"); + s = strlen(buff); + contents = malloc(s * 2 + 128); + n = fread(contents, 1, s * 2 + 128 - 1, f); + if (n >= 0) + contents[n] = '\0'; + fclose(f); + /* Compare texts. */ + btxt = buff; + ftxt = (const char *)contents; + while (*btxt != '\0' && *ftxt != '\0') { + if (*btxt == *ftxt) { + ++btxt; + ++ftxt; + continue; + } + if (btxt[0] == '\n' && ftxt[0] == '\r' && ftxt[1] == '\n') { + /* Pass over different new line characters. */ + ++btxt; + ftxt += 2; + continue; + } + break; + } + if (*btxt == '\0' && *ftxt == '\0') { + free(contents); + return (1); + } + failure_start(test_filename, test_line, "Contents don't match"); + logprintf(" file=\"%s\"\n", fn); + if (n > 0) + hexdump(contents, buff, n, 0); + else { + logprintf(" File empty, contents should be:\n"); + hexdump(buff, NULL, s, 0); + } + failure_finish(test_extra); + free(contents); + return (0); +} + +/* Test that two paths point to the same file. */ +/* As a side-effect, asserts that both files exist. */ +static int +is_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2; + int r; + + assertion_count(file, line); + r = my_GetFileInformationByName(path1, &bhfi1); + if (r == 0) { + failure_start(file, line, "File %s can't be inspected?", path1); + failure_finish(NULL); + return (0); + } + r = my_GetFileInformationByName(path2, &bhfi2); + if (r == 0) { + failure_start(file, line, "File %s can't be inspected?", path2); + failure_finish(NULL); + return (0); + } + return (bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber + && bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh + && bhfi1.nFileIndexLow == bhfi2.nFileIndexLow); +#else + struct stat st1, st2; + int r; + + assertion_count(file, line); + r = lstat(path1, &st1); + if (r != 0) { + failure_start(file, line, "File should exist: %s", path1); + failure_finish(NULL); + return (0); + } + r = lstat(path2, &st2); + if (r != 0) { + failure_start(file, line, "File should exist: %s", path2); + failure_finish(NULL); + return (0); + } + return (st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev); +#endif +} + +int +assertion_is_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ + if (is_hardlink(file, line, path1, path2)) + return (1); + failure_start(file, line, + "Files %s and %s are not hardlinked", path1, path2); + failure_finish(NULL); + return (0); +} + +int +assertion_is_not_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ + if (!is_hardlink(file, line, path1, path2)) + return (1); + failure_start(file, line, + "Files %s and %s should not be hardlinked", path1, path2); + failure_finish(NULL); + return (0); +} + +/* Verify a/b/mtime of 'pathname'. */ +/* If 'recent', verify that it's within last 10 seconds. */ +static int +assertion_file_time(const char *file, int line, + const char *pathname, long t, long nsec, char type, int recent) +{ + long long filet, filet_nsec; + int r; + +#if defined(_WIN32) && !defined(__CYGWIN__) +#define EPOC_TIME (116444736000000000ULL) + FILETIME ftime, fbirthtime, fatime, fmtime; + ULARGE_INTEGER wintm; + HANDLE h; + ftime.dwLowDateTime = 0; + ftime.dwHighDateTime = 0; + + assertion_count(file, line); + h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) { + failure_start(file, line, "Can't access %s\n", pathname); + failure_finish(NULL); + return (0); + } + r = GetFileTime(h, &fbirthtime, &fatime, &fmtime); + switch (type) { + case 'a': ftime = fatime; break; + case 'b': ftime = fbirthtime; break; + case 'm': ftime = fmtime; break; + } + CloseHandle(h); + if (r == 0) { + failure_start(file, line, "Can't GetFileTime %s\n", pathname); + failure_finish(NULL); + return (0); + } + wintm.LowPart = ftime.dwLowDateTime; + wintm.HighPart = ftime.dwHighDateTime; + filet = (wintm.QuadPart - EPOC_TIME) / 10000000; + filet_nsec = ((wintm.QuadPart - EPOC_TIME) % 10000000) * 100; + nsec = (nsec / 100) * 100; /* Round the request */ +#else + struct stat st; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, "Can't stat %s\n", pathname); + failure_finish(NULL); + return (0); + } + switch (type) { + case 'a': filet = st.st_atime; break; + case 'm': filet = st.st_mtime; break; + case 'b': filet = 0; break; + default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type); + exit(1); + } +#if defined(__FreeBSD__) + switch (type) { + case 'a': filet_nsec = st.st_atimespec.tv_nsec; break; + case 'b': filet = st.st_birthtime; + filet_nsec = st.st_birthtimespec.tv_nsec; break; + case 'm': filet_nsec = st.st_mtimespec.tv_nsec; break; + default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type); + exit(1); + } + /* FreeBSD generally only stores to microsecond res, so round. */ + filet_nsec = (filet_nsec / 1000) * 1000; + nsec = (nsec / 1000) * 1000; +#else + filet_nsec = nsec = 0; /* Generic POSIX only has whole seconds. */ + if (type == 'b') return (1); /* Generic POSIX doesn't have birthtime */ +#endif +#endif + if (recent) { + /* Check that requested time is up-to-date. */ + time_t now = time(NULL); + if (filet < now - 10 || filet > now + 1) { + failure_start(file, line, + "File %s has %ctime %ld, %ld seconds ago\n", + pathname, type, filet, now - filet); + failure_finish(NULL); + return (0); + } + } else if (filet != t || filet_nsec != nsec) { + failure_start(file, line, + "File %s has %ctime %ld.%09ld, expected %ld.%09ld", + pathname, type, filet, filet_nsec, t, nsec); + failure_finish(NULL); + return (0); + } + return (1); +} + +/* Verify atime of 'pathname'. */ +int +assertion_file_atime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'a', 0); +} + +/* Verify atime of 'pathname' is up-to-date. */ +int +assertion_file_atime_recent(const char *file, int line, const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'a', 1); +} + +/* Verify birthtime of 'pathname'. */ +int +assertion_file_birthtime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'b', 0); +} + +/* Verify birthtime of 'pathname' is up-to-date. */ +int +assertion_file_birthtime_recent(const char *file, int line, + const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'b', 1); +} + +/* Verify mtime of 'pathname'. */ +int +assertion_file_mtime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'm', 0); +} + +/* Verify mtime of 'pathname' is up-to-date. */ +int +assertion_file_mtime_recent(const char *file, int line, const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'm', 1); +} + +/* Verify number of links to 'pathname'. */ +int +assertion_file_nlinks(const char *file, int line, + const char *pathname, int nlinks) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + BY_HANDLE_FILE_INFORMATION bhfi; + int r; + + assertion_count(file, line); + r = my_GetFileInformationByName(pathname, &bhfi); + if (r != 0 && bhfi.nNumberOfLinks == nlinks) + return (1); + failure_start(file, line, "File %s has %d links, expected %d", + pathname, bhfi.nNumberOfLinks, nlinks); + failure_finish(NULL); + return (0); +#else + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r == 0 && st.st_nlink == nlinks) + return (1); + failure_start(file, line, "File %s has %d links, expected %d", + pathname, st.st_nlink, nlinks); + failure_finish(NULL); + return (0); +#endif +} + +/* Verify size of 'pathname'. */ +int +assertion_file_size(const char *file, int line, const char *pathname, long size) +{ + int64_t filesize; + int r; + + assertion_count(file, line); +#if defined(_WIN32) && !defined(__CYGWIN__) + { + BY_HANDLE_FILE_INFORMATION bhfi; + r = !my_GetFileInformationByName(pathname, &bhfi); + filesize = ((int64_t)bhfi.nFileSizeHigh << 32) + bhfi.nFileSizeLow; + } +#else + { + struct stat st; + r = lstat(pathname, &st); + filesize = st.st_size; + } +#endif + if (r == 0 && filesize == size) + return (1); + failure_start(file, line, "File %s has size %ld, expected %ld", + pathname, (long)filesize, (long)size); + failure_finish(NULL); + return (0); +} + +/* Assert that 'pathname' is a dir. If mode >= 0, verify that too. */ +int +assertion_is_dir(const char *file, int line, const char *pathname, int mode) +{ + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, "Dir should exist: %s", pathname); + failure_finish(NULL); + return (0); + } + if (!S_ISDIR(st.st_mode)) { + failure_start(file, line, "%s is not a dir", pathname); + failure_finish(NULL); + return (0); + } +#if !defined(_WIN32) || defined(__CYGWIN__) + /* Windows doesn't handle permissions the same way as POSIX, + * so just ignore the mode tests. */ + /* TODO: Can we do better here? */ + if (mode >= 0 && mode != (st.st_mode & 07777)) { + failure_start(file, line, "Dir %s has wrong mode", pathname); + logprintf(" Expected: 0%3o\n", mode); + logprintf(" Found: 0%3o\n", st.st_mode & 07777); + failure_finish(NULL); + return (0); + } +#endif + return (1); +} + +/* Verify that 'pathname' is a regular file. If 'mode' is >= 0, + * verify that too. */ +int +assertion_is_reg(const char *file, int line, const char *pathname, int mode) +{ + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0 || !S_ISREG(st.st_mode)) { + failure_start(file, line, "File should exist: %s", pathname); + failure_finish(NULL); + return (0); + } +#if !defined(_WIN32) || defined(__CYGWIN__) + /* Windows doesn't handle permissions the same way as POSIX, + * so just ignore the mode tests. */ + /* TODO: Can we do better here? */ + if (mode >= 0 && mode != (st.st_mode & 07777)) { + failure_start(file, line, "File %s has wrong mode", pathname); + logprintf(" Expected: 0%3o\n", mode); + logprintf(" Found: 0%3o\n", st.st_mode & 07777); + failure_finish(NULL); + return (0); + } +#endif + return (1); +} + +/* Check whether 'pathname' is a symbolic link. If 'contents' is + * non-NULL, verify that the symlink has those contents. */ +static int +is_symlink(const char *file, int line, + const char *pathname, const char *contents) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + assertion_count(file, line); + return (0); +#else + char buff[300]; + struct stat st; + ssize_t linklen; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, + "Symlink should exist: %s", pathname); + failure_finish(NULL); + return (0); + } + if (!S_ISLNK(st.st_mode)) + return (0); + if (contents == NULL) + return (1); + linklen = readlink(pathname, buff, sizeof(buff)); + if (linklen < 0) { + failure_start(file, line, "Can't read symlink %s", pathname); + failure_finish(NULL); + return (0); + } + buff[linklen] = '\0'; + if (strcmp(buff, contents) != 0) + return (0); + return (1); +#endif +} + +/* Assert that path is a symlink that (optionally) contains contents. */ +int +assertion_is_symlink(const char *file, int line, + const char *path, const char *contents) +{ + if (is_symlink(file, line, path, contents)) + return (1); + if (contents) + failure_start(file, line, "File %s is not a symlink to %s", + path, contents); + else + failure_start(file, line, "File %s is not a symlink", path); + failure_finish(NULL); + return (0); +} + + +/* Create a directory and report any errors. */ +int +assertion_make_dir(const char *file, int line, const char *dirname, int mode) +{ + assertion_count(file, line); +#if defined(_WIN32) && !defined(__CYGWIN__) + if (0 == _mkdir(dirname)) + return (1); +#else + if (0 == mkdir(dirname, mode)) + return (1); +#endif + failure_start(file, line, "Could not create directory %s", dirname); + failure_finish(NULL); + return(0); +} + +/* Create a file with the specified contents and report any failures. */ +int +assertion_make_file(const char *file, int line, + const char *path, int mode, const char *contents) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* TODO: Rework this to set file mode as well. */ + FILE *f; + assertion_count(file, line); + f = fopen(path, "wb"); + if (f == NULL) { + failure_start(file, line, "Could not create file %s", path); + failure_finish(NULL); + return (0); + } + if (contents != NULL) { + if (strlen(contents) + != fwrite(contents, 1, strlen(contents), f)) { + fclose(f); + failure_start(file, line, + "Could not write file %s", path); + failure_finish(NULL); + return (0); + } + } + fclose(f); + return (1); +#else + int fd; + assertion_count(file, line); + fd = open(path, O_CREAT | O_WRONLY, mode >= 0 ? mode : 0644); + if (fd < 0) { + failure_start(file, line, "Could not create %s", path); + failure_finish(NULL); + return (0); + } + if (contents != NULL) { + if ((ssize_t)strlen(contents) + != write(fd, contents, strlen(contents))) { + close(fd); + failure_start(file, line, "Could not write to %s", path); + failure_finish(NULL); + return (0); + } + } + close(fd); + return (1); +#endif +} + +/* Create a hardlink and report any failures. */ +int +assertion_make_hardlink(const char *file, int line, + const char *newpath, const char *linkto) +{ + int succeeded; + + assertion_count(file, line); +#if defined(_WIN32) && !defined(__CYGWIN__) + succeeded = my_CreateHardLinkA(newpath, linkto); +#elif HAVE_LINK + succeeded = !link(linkto, newpath); +#else + succeeded = 0; +#endif + if (succeeded) + return (1); + failure_start(file, line, "Could not create hardlink"); + logprintf(" New link: %s\n", newpath); + logprintf(" Old name: %s\n", linkto); + failure_finish(NULL); + return(0); +} + +/* Create a symlink and report any failures. */ +int +assertion_make_symlink(const char *file, int line, + const char *newpath, const char *linkto) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + int targetIsDir = 0; /* TODO: Fix this */ + assertion_count(file, line); + if (my_CreateSymbolicLinkA(newpath, linkto, targetIsDir)) + return (1); +#elif HAVE_SYMLINK + assertion_count(file, line); + if (0 == symlink(linkto, newpath)) + return (1); +#endif + failure_start(file, line, "Could not create symlink"); + logprintf(" New link: %s\n", newpath); + logprintf(" Old name: %s\n", linkto); + failure_finish(NULL); + return(0); +} + +/* Set umask, report failures. */ +int +assertion_umask(const char *file, int line, int mask) +{ + assertion_count(file, line); + (void)file; /* UNUSED */ + (void)line; /* UNUSED */ + umask(mask); + return (1); +} + +/* + * + * UTILITIES for use by tests. + * + */ + +/* + * Check whether platform supports symlinks. This is intended + * for tests to use in deciding whether to bother testing symlink + * support; if the platform doesn't support symlinks, there's no point + * in checking whether the program being tested can create them. + */ +int +canSymlink(void) +{ + /* Remember the test result */ + static int value = 0, tested = 0; + if (tested) + return (value); + + ++tested; + assertion_make_file(__FILE__, __LINE__, "canSymlink.0", 0644, "a"); +#if defined(_WIN32) && !defined(__CYGWIN__) + value = my_CreateSymbolicLinkA("canSymlink.1", "canSymlink.0", 0) + && is_symlink(__FILE__, __LINE__, "canSymlink.1", "canSymlink.0"); +#elif HAVE_SYMLINK + value = (0 == symlink("canSymlink.0", "canSymlink.1")) + && is_symlink(__FILE__, __LINE__, "canSymlink.1","canSymlink.0"); +#endif + return (value); +} + +/* + * Can this platform run the gzip program? + */ +/* Platform-dependent options for hiding the output of a subcommand. */ +#if defined(_WIN32) && !defined(__CYGWIN__) +static const char *redirectArgs = ">NUL 2>NUL"; /* Win32 cmd.exe */ +#else +static const char *redirectArgs = ">/dev/null 2>/dev/null"; /* POSIX 'sh' */ +#endif +int +canGzip(void) +{ + static int tested = 0, value = 0; + if (!tested) { + tested = 1; + if (systemf("gzip -V %s", redirectArgs) == 0) + value = 1; + } + return (value); +} + +/* + * Can this platform run the gunzip program? + */ +int +canGunzip(void) +{ + static int tested = 0, value = 0; + if (!tested) { + tested = 1; + if (systemf("gunzip -V %s", redirectArgs) == 0) + value = 1; + } + return (value); +} + +/* + * Sleep as needed; useful for verifying disk timestamp changes by + * ensuring that the wall-clock time has actually changed before we + * go back to re-read something from disk. + */ +void +sleepUntilAfter(time_t t) +{ + while (t >= time(NULL)) +#if defined(_WIN32) && !defined(__CYGWIN__) + Sleep(500); +#else + sleep(1); +#endif +} + +/* + * Call standard system() call, but build up the command line using + * sprintf() conventions. + */ +int +systemf(const char *fmt, ...) +{ + char buff[8192]; + va_list ap; + int r; + + va_start(ap, fmt); + vsprintf(buff, fmt, ap); + if (verbosity > VERBOSITY_FULL) + logprintf("Cmd: %s\n", buff); + r = system(buff); + va_end(ap); + return (r); +} + +/* + * Slurp a file into memory for ease of comparison and testing. + * Returns size of file in 'sizep' if non-NULL, null-terminates + * data in memory for ease of use. + */ +char * +slurpfile(size_t * sizep, const char *fmt, ...) +{ + char filename[8192]; + struct stat st; + va_list ap; + char *p; + ssize_t bytes_read; + FILE *f; + int r; + + va_start(ap, fmt); + vsprintf(filename, fmt, ap); + va_end(ap); + + f = fopen(filename, "rb"); + if (f == NULL) { + /* Note: No error; non-existent file is okay here. */ + return (NULL); + } + r = fstat(fileno(f), &st); + if (r != 0) { + logprintf("Can't stat file %s\n", filename); + fclose(f); + return (NULL); + } + p = malloc((size_t)st.st_size + 1); + if (p == NULL) { + logprintf("Can't allocate %ld bytes of memory to read file %s\n", + (long int)st.st_size, filename); + fclose(f); + return (NULL); + } + bytes_read = fread(p, 1, (size_t)st.st_size, f); + if (bytes_read < st.st_size) { + logprintf("Can't read file %s\n", filename); + fclose(f); + free(p); + return (NULL); + } + p[st.st_size] = '\0'; + if (sizep != NULL) + *sizep = (size_t)st.st_size; + fclose(f); + return (p); +} + +/* Read a uuencoded file from the reference directory, decode, and + * write the result into the current directory. */ +#define UUDECODE(c) (((c) - 0x20) & 0x3f) +void +extract_reference_file(const char *name) +{ + char buff[1024]; + FILE *in, *out; + + sprintf(buff, "%s/%s.uu", refdir, name); + in = fopen(buff, "r"); + failure("Couldn't open reference file %s", buff); + assert(in != NULL); + if (in == NULL) + return; + /* Read up to and including the 'begin' line. */ + for (;;) { + if (fgets(buff, sizeof(buff), in) == NULL) { + /* TODO: This is a failure. */ + return; + } + if (memcmp(buff, "begin ", 6) == 0) + break; + } + /* Now, decode the rest and write it. */ + /* Not a lot of error checking here; the input better be right. */ + out = fopen(name, "wb"); + while (fgets(buff, sizeof(buff), in) != NULL) { + char *p = buff; + int bytes; + + if (memcmp(buff, "end", 3) == 0) + break; + + bytes = UUDECODE(*p++); + while (bytes > 0) { + int n = 0; + /* Write out 1-3 bytes from that. */ + if (bytes > 0) { + n = UUDECODE(*p++) << 18; + n |= UUDECODE(*p++) << 12; + fputc(n >> 16, out); + --bytes; + } + if (bytes > 0) { + n |= UUDECODE(*p++) << 6; + fputc((n >> 8) & 0xFF, out); + --bytes; + } + if (bytes > 0) { + n |= UUDECODE(*p++); + fputc(n & 0xFF, out); + --bytes; + } + } + } + fclose(out); + fclose(in); +} + +/* + * + * TEST management + * + */ + +/* + * "list.h" is simply created by "grep DEFINE_TEST test_*.c"; it has + * a line like + * DEFINE_TEST(test_function) + * for each test. + */ + +/* Use "list.h" to declare all of the test functions. */ +#undef DEFINE_TEST +#define DEFINE_TEST(name) void name(void); +#include "list.h" + +/* Use "list.h" to create a list of all tests (functions and names). */ +#undef DEFINE_TEST +#define DEFINE_TEST(n) { n, #n, 0 }, +struct { void (*func)(void); const char *name; int failures; } tests[] = { + #include "list.h" +}; + +/* + * Summarize repeated failures in the just-completed test. + */ +static void +test_summarize(const char *filename, int failed) +{ + unsigned int i; + + switch (verbosity) { + case VERBOSITY_SUMMARY_ONLY: + printf(failed ? "E" : "."); + fflush(stdout); + break; + case VERBOSITY_PASSFAIL: + printf(failed ? "FAIL\n" : "ok\n"); + break; + } + + log_console = (verbosity == VERBOSITY_LIGHT_REPORT); + + for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) { + if (failed_lines[i].count > 1 && !failed_lines[i].skip) + logprintf("%s:%d: Summary: Failed %d times\n", + filename, i, failed_lines[i].count); + } + /* Clear the failure history for the next file. */ + memset(failed_lines, 0, sizeof(failed_lines)); +} + +/* + * Actually run a single test, with appropriate setup and cleanup. + */ +static int +test_run(int i, const char *tmpdir) +{ + char logfilename[64]; + int failures_before = failures; + int oldumask; + + switch (verbosity) { + case VERBOSITY_SUMMARY_ONLY: /* No per-test reports at all */ + break; + case VERBOSITY_PASSFAIL: /* rest of line will include ok/FAIL marker */ + printf("%3d: %-50s", i, tests[i].name); + fflush(stdout); + break; + default: /* Title of test, details will follow */ + printf("%3d: %s\n", i, tests[i].name); + } + + /* Chdir to the top-level work directory. */ + if (!assertChdir(tmpdir)) { + fprintf(stderr, + "ERROR: Can't chdir to top work dir %s\n", tmpdir); + exit(1); + } + /* Create a log file for this test. */ + sprintf(logfilename, "%s.log", tests[i].name); + logfile = fopen(logfilename, "w"); + fprintf(logfile, "%s\n\n", tests[i].name); + /* Chdir() to a work dir for this specific test. */ + if (!assertMakeDir(tests[i].name, 0755) + || !assertChdir(tests[i].name)) { + fprintf(stderr, + "ERROR: Can't chdir to work dir %s/%s\n", + tmpdir, tests[i].name); + exit(1); + } + /* Explicitly reset the locale before each test. */ + setlocale(LC_ALL, "C"); + /* Record the umask before we run the test. */ + umask(oldumask = umask(0)); + /* + * Run the actual test. + */ + (*tests[i].func)(); + /* + * Clean up and report afterwards. + */ + /* Restore umask */ + umask(oldumask); + /* Reset locale. */ + setlocale(LC_ALL, "C"); + /* Reset directory. */ + if (!assertChdir(tmpdir)) { + fprintf(stderr, "ERROR: Couldn't chdir to temp dir %s\n", + tmpdir); + exit(1); + } + /* Report per-test summaries. */ + tests[i].failures = failures - failures_before; + test_summarize(test_filename, tests[i].failures); + /* Close the per-test log file. */ + fclose(logfile); + logfile = NULL; + /* If there were no failures, we can remove the work dir and logfile. */ + if (tests[i].failures == 0) { + if (!keep_temp_files && assertChdir(tmpdir)) { +#if defined(_WIN32) && !defined(__CYGWIN__) + systemf("rmdir /S /Q %s", tests[i].name); + systemf("del %s", logfilename); +#else + systemf("rm -rf %s", tests[i].name); + systemf("rm %s", logfilename); +#endif + } + } + /* Return appropriate status. */ + return (tests[i].failures); +} + +/* + * + * + * MAIN and support routines. + * + * + */ + +static void +usage(const char *program) +{ + static const int limit = sizeof(tests) / sizeof(tests[0]); + int i; + + printf("Usage: %s [options] ...\n", program); + printf("Default is to run all tests.\n"); + printf("Otherwise, specify the numbers of the tests you wish to run.\n"); + printf("Options:\n"); + printf(" -d Dump core after any failure, for debugging.\n"); + printf(" -k Keep all temp files.\n"); + printf(" Default: temp files for successful tests deleted.\n"); +#ifdef PROGRAM + printf(" -p Path to executable to be tested.\n"); + printf(" Default: path taken from " ENVBASE " environment variable.\n"); +#endif + printf(" -q Quiet.\n"); + printf(" -r

Path to dir containing reference files.\n"); + printf(" Default: Current directory.\n"); + printf(" -v Verbose.\n"); + printf("Available tests:\n"); + for (i = 0; i < limit; i++) + printf(" %d: %s\n", i, tests[i].name); + exit(1); +} + +static char * +get_refdir(const char *d) +{ + char tried[512] = { '\0' }; + char buff[128]; + char *pwd, *p; + + /* If a dir was specified, try that */ + if (d != NULL) { + pwd = NULL; + snprintf(buff, sizeof(buff), "%s", d); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + goto failure; + } + + /* Get the current dir. */ + pwd = getcwd(NULL, 0); + while (pwd[strlen(pwd) - 1] == '\n') + pwd[strlen(pwd) - 1] = '\0'; + + /* Look for a known file. */ + snprintf(buff, sizeof(buff), "%s", pwd); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + snprintf(buff, sizeof(buff), "%s/test", pwd); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + +#if defined(LIBRARY) + snprintf(buff, sizeof(buff), "%s/%s/test", pwd, LIBRARY); +#else + snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM); +#endif + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + if (memcmp(pwd, "/usr/obj", 8) == 0) { + snprintf(buff, sizeof(buff), "%s", pwd + 8); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + snprintf(buff, sizeof(buff), "%s/test", pwd + 8); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + } + +failure: + printf("Unable to locate known reference file %s\n", KNOWNREF); + printf(" Checked following directories:\n%s\n", tried); +#if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG) + DebugBreak(); +#endif + exit(1); + +success: + free(p); + free(pwd); + return strdup(buff); +} + +int +main(int argc, char **argv) +{ + static const int limit = sizeof(tests) / sizeof(tests[0]); + int i, tests_run = 0, tests_failed = 0, option; + time_t now; + char *refdir_alloc = NULL; + const char *progname; + const char *tmp, *option_arg, *p; + char tmpdir[256]; + char tmpdir_timestamp[256]; + + (void)argc; /* UNUSED */ + +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__) + /* To stop to run the default invalid parameter handler. */ + _set_invalid_parameter_handler(invalid_parameter_handler); + /* Disable annoying assertion message box. */ + _CrtSetReportMode(_CRT_ASSERT, 0); +#endif + + /* + * Name of this program, used to build root of our temp directory + * tree. + */ + progname = p = argv[0]; + while (*p != '\0') { + /* Support \ or / dir separators for Windows compat. */ + if (*p == '/' || *p == '\\') + progname = p + 1; + ++p; + } + +#ifdef PROGRAM + /* Get the target program from environment, if available. */ + testprogfile = getenv(ENVBASE); +#endif + + if (getenv("TMPDIR") != NULL) + tmp = getenv("TMPDIR"); + else if (getenv("TMP") != NULL) + tmp = getenv("TMP"); + else if (getenv("TEMP") != NULL) + tmp = getenv("TEMP"); + else if (getenv("TEMPDIR") != NULL) + tmp = getenv("TEMPDIR"); + else + tmp = "/tmp"; + + /* Allow -d to be controlled through the environment. */ + if (getenv(ENVBASE "_DEBUG") != NULL) + dump_on_failure = 1; + + /* Get the directory holding test files from environment. */ + refdir = getenv(ENVBASE "_TEST_FILES"); + + /* + * Parse options, without using getopt(), which isn't available + * on all platforms. + */ + ++argv; /* Skip program name */ + while (*argv != NULL) { + if (**argv != '-') + break; + p = *argv++; + ++p; /* Skip '-' */ + while (*p != '\0') { + option = *p++; + option_arg = NULL; + /* If 'opt' takes an argument, parse that. */ + if (option == 'p' || option == 'r') { + if (*p != '\0') + option_arg = p; + else if (*argv == NULL) { + fprintf(stderr, + "Option -%c requires argument.\n", + option); + usage(progname); + } else + option_arg = *argv++; + p = ""; /* End of this option word. */ + } + + /* Now, handle the option. */ + switch (option) { + case 'd': + dump_on_failure = 1; + break; + case 'k': + keep_temp_files = 1; + break; + case 'p': +#ifdef PROGRAM + testprogfile = option_arg; +#else + usage(progname); +#endif + break; + case 'q': + verbosity--; + break; + case 'r': + refdir = option_arg; + break; + case 'v': + verbosity++; + break; + default: + usage(progname); + } + } + } + + /* + * Sanity-check that our options make sense. + */ +#ifdef PROGRAM + if (testprogfile == NULL) + usage(progname); + { + char *testprg; +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Command.com sometimes rejects '/' separators. */ + testprg = strdup(testprogfile); + for (i = 0; testprg[i] != '\0'; i++) { + if (testprg[i] == '/') + testprg[i] = '\\'; + } + testprogfile = testprg; +#endif + /* Quote the name that gets put into shell command lines. */ + testprg = malloc(strlen(testprogfile) + 3); + strcpy(testprg, "\""); + strcat(testprg, testprogfile); + strcat(testprg, "\""); + testprog = testprg; + } +#endif + + /* + * Create a temp directory for the following tests. + * Include the time the tests started as part of the name, + * to make it easier to track the results of multiple tests. + */ + now = time(NULL); + for (i = 0; ; i++) { + strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp), + "%Y-%m-%dT%H.%M.%S", + localtime(&now)); + sprintf(tmpdir, "%s/%s.%s-%03d", tmp, progname, + tmpdir_timestamp, i); + if (assertMakeDir(tmpdir,0755)) + break; + if (i >= 999) { + fprintf(stderr, + "ERROR: Unable to create temp directory %s\n", + tmpdir); + exit(1); + } + } + + /* + * If the user didn't specify a directory for locating + * reference files, try to find the reference files in + * the "usual places." + */ + refdir = refdir_alloc = get_refdir(refdir); + + /* + * Banner with basic information. + */ + printf("\n"); + printf("If tests fail or crash, details will be in:\n"); + printf(" %s\n", tmpdir); + printf("\n"); + if (verbosity > VERBOSITY_SUMMARY_ONLY) { + printf("Reference files will be read from: %s\n", refdir); +#ifdef PROGRAM + printf("Running tests on: %s\n", testprog); +#endif + printf("Exercising: "); + fflush(stdout); + printf("%s\n", EXTRA_VERSION); + } else { + printf("Running "); + fflush(stdout); + } + + /* + * Run some or all of the individual tests. + */ + if (*argv == NULL) { + /* Default: Run all tests. */ + for (i = 0; i < limit; i++) { + if (test_run(i, tmpdir)) + tests_failed++; + tests_run++; + } + } else { + while (*(argv) != NULL) { + if (**argv >= '0' && **argv <= '9') { + i = atoi(*argv); + if (i < 0 || i >= limit) { + printf("*** INVALID Test %s\n", *argv); + free(refdir_alloc); + usage(progname); + /* usage() never returns */ + } + } else { + for (i = 0; i < limit; ++i) { + if (strcmp(*argv, tests[i].name) == 0) + break; + } + if (i >= limit) { + printf("*** INVALID Test ``%s''\n", + *argv); + free(refdir_alloc); + usage(progname); + /* usage() never returns */ + } + } + if (test_run(i, tmpdir)) + tests_failed++; + tests_run++; + argv++; + } + } + + /* + * Report summary statistics. + */ + if (verbosity > VERBOSITY_SUMMARY_ONLY) { + printf("\n"); + printf("Totals:\n"); + printf(" Tests run: %8d\n", tests_run); + printf(" Tests failed: %8d\n", tests_failed); + printf(" Assertions checked:%8d\n", assertions); + printf(" Assertions failed: %8d\n", failures); + printf(" Skips reported: %8d\n", skips); + } + if (failures) { + printf("\n"); + printf("Failing tests:\n"); + for (i = 0; i < limit; ++i) { + if (tests[i].failures) + printf(" %d: %s (%d failures)\n", i, + tests[i].name, tests[i].failures); + } + printf("\n"); + printf("Details for failing tests: %s\n", tmpdir); + printf("\n"); + } else { + if (verbosity == VERBOSITY_SUMMARY_ONLY) + printf("\n"); + printf("%d tests passed, no failures\n", tests_run); + } + + free(refdir_alloc); + + /* If the final tmpdir is empty, we can remove it. */ + /* This should be the usual case when all tests succeed. */ + assertChdir(".."); + rmdir(tmpdir); + + return (tests_failed ? 1 : 0); +} diff --git a/Utilities/cmlibarchive/cpio/test/test.h b/Utilities/cmlibarchive/cpio/test/test.h new file mode 100644 index 000000000..99010c89f --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test.h @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2003-2006 Tim Kientzle + * 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. + * + * $FreeBSD: src/usr.bin/cpio/test/test.h,v 1.2 2008/06/21 02:17:18 kientzle Exp $ + */ + +/* Every test program should #include "test.h" as the first thing. */ + +/* + * The goal of this file (and the matching test.c) is to + * simplify the very repetitive test-*.c test programs. + */ +#if defined(HAVE_CONFIG_H) +/* Most POSIX platforms use the 'configure' script to build config.h */ +#include "config.h" +#elif defined(__FreeBSD__) +/* Building as part of FreeBSD system requires a pre-built config.h. */ +#include "config_freebsd.h" +#elif defined(_WIN32) && !defined(__CYGWIN__) +/* Win32 can't run the 'configure' script. */ +#include "config_windows.h" +#else +/* Warn if the library hasn't been (automatically or manually) configured. */ +#error Oops: No config.h and no pre-built configuration in test.h. +#endif + +#include /* Windows requires this before sys/stat.h */ +#include + +#ifdef USE_DMALLOC +#include +#endif +#if HAVE_DIRENT_H +#include +#else +#include +#define dirent direct +#endif +#include +#include +#ifdef HAVE_IO_H +#include +#endif +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#ifdef HAVE_WINDOWS_H +#include +#endif + +/* + * System-specific tweaks. We really want to minimize these + * as much as possible, since they make it harder to understand + * the mainline code. + */ + +/* Windows (including Visual Studio and MinGW but not Cygwin) */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#include "../cpio_windows.h" +#define strdup _strdup +#define LOCALE_DE "deu" +#else +#define LOCALE_DE "de_DE.UTF-8" +#endif + +/* Visual Studio */ +#ifdef _MSC_VER +#define snprintf sprintf_s +#endif + +/* Cygwin */ +#if defined(__CYGWIN__) +/* Cygwin-1.7.x is lazy about populating nlinks, so don't + * expect it to be accurate. */ +# define NLINKS_INACCURATE_FOR_DIRS +#endif + +/* FreeBSD */ +#ifdef __FreeBSD__ +#include /* For __FBSDID */ +#else +/* Surprisingly, some non-FreeBSD platforms define __FBSDID. */ +#ifndef __FBSDID +#define __FBSDID(a) struct _undefined_hack +#endif +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +/* + * Redefine DEFINE_TEST for use in defining the test functions. + */ +#undef DEFINE_TEST +#define DEFINE_TEST(name) void name(void); void name(void) + +/* An implementation of the standard assert() macro */ +#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL) +/* chdir() and error if it fails */ +#define assertChdir(path) \ + assertion_chdir(__FILE__, __LINE__, path) +/* 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) +/* 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) +/* As above, but v1 and v2 are wchar_t * */ +#define assertEqualWString(v1,v2) \ + assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) +/* As above, but raw blocks of bytes. */ +#define assertEqualMem(v1, v2, l) \ + assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL) +/* Assert two files are the same; allow printf-style expansion of second name. + * See below for comments about variable arguments here... + */ +#define assertEqualFile \ + assertion_setup(__FILE__, __LINE__);assertion_equal_file +/* Assert that a file is empty; supports printf-style arguments. */ +#define assertEmptyFile \ + assertion_setup(__FILE__, __LINE__);assertion_empty_file +/* Assert that a file is not empty; supports printf-style arguments. */ +#define assertNonEmptyFile \ + assertion_setup(__FILE__, __LINE__);assertion_non_empty_file +#define assertFileAtime(pathname, sec, nsec) \ + assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileAtimeRecent(pathname) \ + assertion_file_atime_recent(__FILE__, __LINE__, pathname) +#define assertFileBirthtime(pathname, sec, nsec) \ + assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileBirthtimeRecent(pathname) \ + assertion_file_birthtime_recent(__FILE__, __LINE__, pathname) +/* Assert that a file exists; supports printf-style arguments. */ +#define assertFileExists \ + assertion_setup(__FILE__, __LINE__);assertion_file_exists +/* Assert that a file exists; supports printf-style arguments. */ +#define assertFileNotExists \ + assertion_setup(__FILE__, __LINE__);assertion_file_not_exists +/* Assert that file contents match a string; supports printf-style arguments. */ +#define assertFileContents \ + assertion_setup(__FILE__, __LINE__);assertion_file_contents +#define assertFileMtime(pathname, sec, nsec) \ + assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileMtimeRecent(pathname) \ + assertion_file_mtime_recent(__FILE__, __LINE__, pathname) +#define assertFileNLinks(pathname, nlinks) \ + assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks) +#define assertFileSize(pathname, size) \ + assertion_file_size(__FILE__, __LINE__, pathname, size) +#define assertTextFileContents \ + assertion_setup(__FILE__, __LINE__);assertion_text_file_contents +#define assertIsDir(pathname, mode) \ + assertion_is_dir(__FILE__, __LINE__, pathname, mode) +#define assertIsHardlink(path1, path2) \ + assertion_is_hardlink(__FILE__, __LINE__, path1, path2) +#define assertIsNotHardlink(path1, path2) \ + assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2) +#define assertIsReg(pathname, mode) \ + assertion_is_reg(__FILE__, __LINE__, pathname, mode) +#define assertIsSymlink(pathname, contents) \ + assertion_is_symlink(__FILE__, __LINE__, pathname, contents) +/* Create a directory, report error if it fails. */ +#define assertMakeDir(dirname, mode) \ + assertion_make_dir(__FILE__, __LINE__, dirname, mode) +#define assertMakeFile(path, mode, contents) \ + assertion_make_file(__FILE__, __LINE__, path, mode, contents) +#define assertMakeHardlink(newfile, oldfile) \ + assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile) +#define assertMakeSymlink(newfile, linkto) \ + assertion_make_symlink(__FILE__, __LINE__, newfile, linkto) +#define assertUmask(mask) \ + assertion_umask(__FILE__, __LINE__, mask) + +/* + * This would be simple with C99 variadic macros, but I don't want to + * require that. Instead, I insert a function call before each + * skipping() call to pass the file and line information down. Crude, + * but effective. + */ +#define skipping \ + assertion_setup(__FILE__, __LINE__);test_skipping + +/* Function declarations. These are defined in test_utility.c. */ +void failure(const char *fmt, ...); +int assertion_assert(const char *, int, int, const char *, void *); +int assertion_chdir(const char *, int, const char *); +int assertion_empty_file(const char *, ...); +int assertion_equal_file(const char *, const char *, ...); +int assertion_equal_int(const char *, int, long long, const char *, long long, 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_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *); +int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *); +int assertion_file_atime(const char *, int, const char *, long, long); +int assertion_file_atime_recent(const char *, int, const char *); +int assertion_file_birthtime(const char *, int, const char *, long, long); +int assertion_file_birthtime_recent(const char *, int, const char *); +int assertion_file_contents(const void *, int, const char *, ...); +int assertion_file_exists(const char *, ...); +int assertion_file_mtime(const char *, int, const char *, long, long); +int assertion_file_mtime_recent(const char *, int, const char *); +int assertion_file_nlinks(const char *, int, const char *, int); +int assertion_file_not_exists(const char *, ...); +int assertion_file_size(const char *, int, const char *, long); +int assertion_is_dir(const char *, int, const char *, int); +int assertion_is_hardlink(const char *, int, const char *, const char *); +int assertion_is_not_hardlink(const char *, int, const char *, const char *); +int assertion_is_reg(const char *, int, const char *, int); +int assertion_is_symlink(const char *, int, const char *, const char *); +int assertion_make_dir(const char *, int, const char *, int); +int assertion_make_file(const char *, int, const char *, int, const char *); +int assertion_make_hardlink(const char *, int, const char *newpath, const char *); +int assertion_make_symlink(const char *, int, const char *newpath, const char *); +int assertion_non_empty_file(const char *, ...); +int assertion_text_file_contents(const char *buff, const char *f); +int assertion_umask(const char *, int, int); +void assertion_setup(const char *, int); + +void test_skipping(const char *fmt, ...); + +/* Like sprintf, then system() */ +int systemf(const char * fmt, ...); + +/* Delay until time() returns a value after this. */ +void sleepUntilAfter(time_t); + +/* Return true if this platform can create symlinks. */ +int canSymlink(void); + +/* Return true if this platform can run the "gzip" program. */ +int canGzip(void); + +/* Return true if this platform can run the "gunzip" program. */ +int canGunzip(void); + +/* Suck file into string allocated via malloc(). Call free() when done. */ +/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */ +char *slurpfile(size_t *, const char *fmt, ...); + +/* Extracts named reference file to the current directory. */ +void extract_reference_file(const char *); + +/* + * Special interfaces for program test harness. + */ + +/* Pathname of exe to be tested. */ +const char *testprogfile; +/* Name of exe to use in printf-formatted command strings. */ +/* On Windows, this includes leading/trailing quotes. */ +const char *testprog; diff --git a/Utilities/cmlibarchive/cpio/test/test_0.c b/Utilities/cmlibarchive/cpio/test/test_0.c new file mode 100644 index 000000000..e5d3bd23f --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_0.c @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * This first test does basic sanity checks on the environment. For + * most of these, we just exit on failure. + */ +#if !defined(_WIN32) || defined(__CYGWIN__) +#define DEV_NULL "/dev/null" +#else +#define DEV_NULL "NUL" +#endif + +DEFINE_TEST(test_0) +{ + struct stat st; + + failure("File %s does not exist?!", testprogfile); + if (!assertEqualInt(0, stat(testprogfile, &st))) + exit(1); + + failure("%s is not executable?!", testprogfile); + if (!assert((st.st_mode & 0111) != 0)) + exit(1); + + /* + * Try to succesfully run the program; this requires that + * we know some option that will succeed. + */ + if (0 == systemf("%s --version >" DEV_NULL, testprog)) { + /* This worked. */ + } else if (0 == systemf("%s -W version >" DEV_NULL, testprog)) { + /* This worked. */ + } else { + failure("Unable to successfully run any of the following:\n" + " * %s --version\n" + " * %s -W version\n", + testprog, testprog); + assert(0); + } + + /* TODO: Ensure that our reference files are available. */ +} diff --git a/Utilities/cmlibarchive/cpio/test/test_basic.c b/Utilities/cmlibarchive/cpio/test/test_basic.c new file mode 100644 index 000000000..a2c0b70fa --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_basic.c @@ -0,0 +1,173 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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) +{ + /* + * Verify unpacked files. + */ + + /* Regular file with 2 links. */ + assertIsReg("file", 0644); + failure(msg); + assertFileSize("file", 10); + assertFileNLinks("file", 2); + + /* Another name for the same file. */ + assertIsHardlink("linkfile", "file"); + + /* Symlink */ + if (canSymlink()) + assertIsSymlink("symlink", "file"); + + /* Another file with 1 link and different permissions. */ + assertIsReg("file2", 0777); + assertFileSize("file2", 10); + assertFileNLinks("file2", 1); + + /* dir */ + assertIsDir("dir", 0775); +} + +static void +basic_cpio(const char *target, + const char *pack_options, + const char *unpack_options, + const char *se) +{ + int r; + + if (!assertMakeDir(target, 0775)) + return; + + /* Use the cpio program to create an archive. */ + r = systemf("%s -o %s < filelist >%s/archive 2>%s/pack.err", + testprog, pack_options, target, target); + failure("Error invoking %s -o %s", testprog, pack_options); + assertEqualInt(r, 0); + + assertChdir(target); + + /* Verify stderr. */ + failure("Expected: %s, options=%s", se, pack_options); + assertTextFileContents(se, "pack.err"); + + /* + * Use cpio to unpack the archive into another directory. + */ + r = systemf("%s -i %s< archive >unpack.out 2>unpack.err", + testprog, unpack_options); + failure("Error invoking %s -i %s", testprog, unpack_options); + assertEqualInt(r, 0); + + /* Verify stderr. */ + failure("Error invoking %s -i %s in dir %s", testprog, unpack_options, target); + assertTextFileContents(se, "unpack.err"); + + verify_files(pack_options); + + assertChdir(".."); +} + +static void +passthrough(const char *target) +{ + int r; + + if (!assertMakeDir(target, 0775)) + return; + + /* + * Use cpio passthrough mode to copy files to another directory. + */ + r = systemf("%s -p %s %s/stdout 2>%s/stderr", + testprog, target, target, target); + failure("Error invoking %s -p", testprog); + assertEqualInt(r, 0); + + assertChdir(target); + + /* Verify stderr. */ + failure("Error invoking %s -p in dir %s", + testprog, target); + assertTextFileContents("1 block\n", "stderr"); + + verify_files("passthrough"); + assertChdir(".."); +} + +DEFINE_TEST(test_basic) +{ + FILE *filelist; + const char *msg; + + assertUmask(0); + + /* + * Create an assortment of files on disk. + */ + filelist = fopen("filelist", "w"); + + /* File with 10 bytes content. */ + assertMakeFile("file", 0644, "1234567890"); + fprintf(filelist, "file\n"); + + /* hardlink to above file. */ + assertMakeHardlink("linkfile", "file"); + fprintf(filelist, "linkfile\n"); + + /* Symlink to above file. */ + if (canSymlink()) { + assertMakeSymlink("symlink", "file"); + fprintf(filelist, "symlink\n"); + } + + /* Another file with different permissions. */ + assertMakeFile("file2", 0777, "1234567890"); + fprintf(filelist, "file2\n"); + + /* Directory. */ + assertMakeDir("dir", 0775); + fprintf(filelist, "dir\n"); + /* All done. */ + fclose(filelist); + + assertUmask(022); + + /* Archive/dearchive with a variety of options. */ + msg = canSymlink() ? "2 blocks\n" : "1 block\n"; + basic_cpio("copy", "", "", msg); + basic_cpio("copy_odc", "--format=odc", "", msg); + basic_cpio("copy_newc", "-H newc", "", "2 blocks\n"); + basic_cpio("copy_cpio", "-H odc", "", msg); + msg = canSymlink() ? "9 blocks\n" : "8 blocks\n"; + basic_cpio("copy_ustar", "-H ustar", "", msg); + + /* Copy in one step using -p */ + passthrough("passthrough"); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_cmdline.c b/Utilities/cmlibarchive/cpio/test/test_cmdline.c new file mode 100644 index 000000000..c8cd84e1e --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_cmdline.c @@ -0,0 +1,107 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Test the command-line parsing. + */ + +DEFINE_TEST(test_cmdline) +{ + FILE *f; + + /* Create an empty file. */ + f = fopen("empty", "wb"); + assert(f != NULL); + fclose(f); + + failure("-Q is an invalid option on every cpio program I know of"); + assert(0 != systemf("%s -i -Q 1.out 2>1.err", testprog)); + assertEmptyFile("1.out"); + + failure("-f requires an argument"); + assert(0 != systemf("%s -if 2.out 2>2.err", testprog)); + assertEmptyFile("2.out"); + + failure("-f requires an argument"); + assert(0 != systemf("%s -i -f 3.out 2>3.err", testprog)); + assertEmptyFile("3.out"); + + failure("--format requires an argument"); + assert(0 != systemf("%s -i --format 4.out 2>4.err", testprog)); + assertEmptyFile("4.out"); + + failure("--badopt is an invalid option"); + assert(0 != systemf("%s -i --badop 5.out 2>5.err", testprog)); + assertEmptyFile("5.out"); + + failure("--badopt is an invalid option"); + assert(0 != systemf("%s -i --badopt 6.out 2>6.err", testprog)); + assertEmptyFile("6.out"); + + failure("--n is ambiguous"); + assert(0 != systemf("%s -i --n 7.out 2>7.err", testprog)); + assertEmptyFile("7.out"); + + failure("--create forbids an argument"); + assert(0 != systemf("%s --create=arg 8.out 2>8.err", testprog)); + assertEmptyFile("8.out"); + + failure("-i with empty input should succeed"); + assert(0 == systemf("%s -i 9.out 2>9.err", testprog)); + assertEmptyFile("9.out"); + + failure("-o with empty input should succeed"); + assert(0 == systemf("%s -o 10.out 2>10.err", testprog)); + + failure("-i -p is nonsense"); + assert(0 != systemf("%s -i -p 11.out 2>11.err", testprog)); + assertEmptyFile("11.out"); + + failure("-p -i is nonsense"); + assert(0 != systemf("%s -p -i 12.out 2>12.err", testprog)); + assertEmptyFile("12.out"); + + failure("-i -o is nonsense"); + assert(0 != systemf("%s -i -o 13.out 2>13.err", testprog)); + assertEmptyFile("13.out"); + + failure("-o -i is nonsense"); + assert(0 != systemf("%s -o -i 14.out 2>14.err", testprog)); + assertEmptyFile("14.out"); + + failure("-o -p is nonsense"); + assert(0 != systemf("%s -o -p 15.out 2>15.err", testprog)); + assertEmptyFile("15.out"); + + failure("-p -o is nonsense"); + assert(0 != systemf("%s -p -o 16.out 2>16.err", testprog)); + assertEmptyFile("16.out"); + + failure("-p with empty input should fail"); + assert(0 != systemf("%s -p 17.out 2>17.err", testprog)); + assertEmptyFile("17.out"); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_format_newc.c b/Utilities/cmlibarchive/cpio/test/test_format_newc.c new file mode 100644 index 000000000..133f753b8 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_format_newc.c @@ -0,0 +1,294 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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 + * remembered as -n & (block - 1), but many compilers quite reasonably + * warn about "-n" when n is an unsigned value. (~(n) + 1) is the + * same thing, but written in a way that won't offend anyone. */ +#define PAD(n, block) ((~(n) + 1) & ((block) - 1)) + +static int +is_hex(const char *p, size_t l) +{ + while (l > 0) { + if ((*p >= '0' && *p <= '9') + || (*p >= 'a' && *p <= 'f') + || (*p >= 'A' && *p <= 'F')) + { + --l; + ++p; + } else + return (0); + + } + return (1); +} + +static int +from_hex(const char *p, size_t l) +{ + int r = 0; + + while (l > 0) { + r *= 16; + if (*p >= 'a' && *p <= 'f') + r += *p + 10 - 'a'; + else if (*p >= 'A' && *p <= 'F') + r += *p + 10 - 'A'; + else + r += *p - '0'; + --l; + ++p; + } + return (r); +} + +DEFINE_TEST(test_format_newc) +{ + FILE *list; + int r; + int devmajor, devminor, ino, gid; + int uid = -1; + time_t t, t2, now; + char *p, *e; + size_t s, fs, ns; + + assertUmask(0); + +#if !defined(_WIN32) + uid = getuid(); +#endif + + /* + * Create an assortment of files. + * TODO: Extend this to cover more filetypes. + */ + list = fopen("list", "w"); + + /* "file1" */ + assertMakeFile("file1", 0644, "1234567890"); + fprintf(list, "file1\n"); + + /* "hardlink" */ + assertMakeHardlink("hardlink", "file1"); + fprintf(list, "hardlink\n"); + + /* Another hardlink, but this one won't be archived. */ + assertMakeHardlink("hardlink2", "file1"); + + /* "symlink" */ + if (canSymlink()) { + assertMakeSymlink("symlink", "file1"); + fprintf(list, "symlink\n"); + } + + /* "dir" */ + assertMakeDir("dir", 0775); + fprintf(list, "dir\n"); + + /* Record some facts about what we just created: */ + now = time(NULL); /* They were all created w/in last two seconds. */ + + /* Use the cpio program to create an archive. */ + fclose(list); + r = systemf("%s -o --format=newc newc.out 2>newc.err", + testprog); + if (!assertEqualInt(r, 0)) + return; + + /* Verify that nothing went to stderr. */ + if (canSymlink()) { + assertTextFileContents("2 blocks\n", "newc.err"); + } else { + assertTextFileContents("1 block\n", "newc.err"); + } + + /* Verify that stdout is a well-formed cpio file in "newc" format. */ + p = slurpfile(&s, "newc.out"); + assertEqualInt(s, canSymlink() ? 1024 : 512); + e = p; + + /* + * Some of these assertions could be stronger, but it's + * a little tricky because they depend on the local environment. + */ + + /* First entry is "file1" */ + assert(is_hex(e, 110)); /* Entire header is octal digits. */ + assertEqualMem(e + 0, "070701", 6); /* Magic */ + ino = from_hex(e + 6, 8); /* ino */ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Group members bits and others bits do not work. */ + assertEqualInt(0x8180, from_hex(e + 14, 8) & 0xffc0); /* Mode */ +#else + assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */ +#endif + if (uid < 0) + uid = from_hex(e + 22, 8); + assertEqualInt(from_hex(e + 22, 8), uid); /* uid */ + gid = from_hex(e + 30, 8); /* gid */ + assertEqualMem(e + 38, "00000003", 8); /* nlink */ + t = from_hex(e + 46, 8); /* mtime */ + failure("t=0x%08x now=0x%08x=%d", t, now, now); + assert(t <= now); /* File wasn't created in future. */ + failure("t=0x%08x now - 2=0x%08x = %d", t, now - 2, now - 2); + assert(t >= now - 2); /* File was created w/in last 2 secs. */ + failure("newc format stores body only with last appearance of a link\n" + " first appearance should be empty, so this file size\n" + " field should be zero"); + assertEqualInt(0, from_hex(e + 54, 8)); /* File size */ + fs = from_hex(e + 54, 8); + fs += PAD(fs, 4); + devmajor = from_hex(e + 62, 8); /* devmajor */ + devminor = from_hex(e + 70, 8); /* devminor */ + assert(is_hex(e + 78, 8)); /* rdevmajor */ + assert(is_hex(e + 86, 8)); /* rdevminor */ + assertEqualMem(e + 94, "00000006", 8); /* Name size */ + ns = from_hex(e + 94, 8); + ns += PAD(ns + 2, 4); + assertEqualInt(0, from_hex(e + 102, 8)); /* check field */ + assertEqualMem(e + 110, "file1\0", 6); /* Name contents */ + /* Since there's another link, no file contents here. */ + /* But add in file size so that an error here doesn't cascade. */ + e += 110 + fs + ns; + + if (canSymlink()) { + /* "symlink" pointing to "file1" */ + assert(is_hex(e, 110)); + assertEqualMem(e + 0, "070701", 6); /* Magic */ + assert(is_hex(e + 6, 8)); /* ino */ + assertEqualInt(0xa1ff, from_hex(e + 14, 8)); /* Mode */ + assertEqualInt(from_hex(e + 22, 8), uid); /* uid */ + assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */ + assertEqualMem(e + 38, "00000001", 8); /* nlink */ + t2 = from_hex(e + 46, 8); /* mtime */ + failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2); + assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ + assertEqualMem(e + 54, "00000005", 8); /* File size */ + fs = from_hex(e + 54, 8); + fs += PAD(fs, 4); + assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */ + assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */ + assert(is_hex(e + 78, 8)); /* rdevmajor */ + assert(is_hex(e + 86, 8)); /* rdevminor */ + assertEqualMem(e + 94, "00000008", 8); /* Name size */ + ns = from_hex(e + 94, 8); + ns += PAD(ns + 2, 4); + assertEqualInt(0, from_hex(e + 102, 8)); /* check field */ + assertEqualMem(e + 110, "symlink\0\0\0", 10); /* Name contents */ + assertEqualMem(e + 110 + ns, "file1\0\0\0", 8); /* symlink target */ + e += 110 + fs + ns; + } + + /* "dir" */ + assert(is_hex(e, 110)); + assertEqualMem(e + 0, "070701", 6); /* Magic */ + assert(is_hex(e + 6, 8)); /* ino */ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Group members bits and others bits do not work. */ + assertEqualInt(0x41c0, from_hex(e + 14, 8) & 0xffc0); /* Mode */ +#else + /* Mode: sgid bit sometimes propagates from parent dirs, ignore it. */ + assertEqualInt(040775, from_hex(e + 14, 8) & ~02000); +#endif + assertEqualInt(from_hex(e + 22, 8), uid); /* uid */ + assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */ +#ifndef NLINKS_INACCURATE_FOR_DIRS + assertEqualMem(e + 38, "00000002", 8); /* nlink */ +#endif + t2 = from_hex(e + 46, 8); /* mtime */ + failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2); + assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ + assertEqualMem(e + 54, "00000000", 8); /* File size */ + fs = from_hex(e + 54, 8); + fs += PAD(fs, 4); + assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */ + assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */ + assert(is_hex(e + 78, 8)); /* rdevmajor */ + assert(is_hex(e + 86, 8)); /* rdevminor */ + assertEqualMem(e + 94, "00000004", 8); /* Name size */ + ns = from_hex(e + 94, 8); + ns += PAD(ns + 2, 4); + assertEqualInt(0, from_hex(e + 102, 8)); /* check field */ + assertEqualMem(e + 110, "dir\0\0\0", 6); /* Name contents */ + e += 110 + fs + ns; + + /* Hardlink identical to "file1" */ + /* Since we only wrote two of the three links to this + * file, this link should get deferred by the hardlink logic. */ + assert(is_hex(e, 110)); + assertEqualMem(e + 0, "070701", 6); /* Magic */ + failure("If these aren't the same, then the hardlink detection failed to match them."); + assertEqualInt(ino, from_hex(e + 6, 8)); /* ino */ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Group members bits and others bits do not work. */ + assertEqualInt(0x8180, from_hex(e + 14, 8) & 0xffc0); /* Mode */ +#else + assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */ +#endif + assertEqualInt(from_hex(e + 22, 8), uid); /* uid */ + assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */ + assertEqualMem(e + 38, "00000003", 8); /* nlink */ + t2 = from_hex(e + 46, 8); /* mtime */ + failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2); + assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ + assertEqualInt(10, from_hex(e + 54, 8)); /* File size */ + fs = from_hex(e + 54, 8); + fs += PAD(fs, 4); + assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */ + assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */ + assert(is_hex(e + 78, 8)); /* rdevmajor */ + assert(is_hex(e + 86, 8)); /* rdevminor */ + assertEqualMem(e + 94, "00000009", 8); /* Name size */ + ns = from_hex(e + 94, 8); + ns += PAD(ns + 2, 4); + assertEqualInt(0, from_hex(e + 102, 8)); /* check field */ + assertEqualMem(e + 110, "hardlink\0\0", 10); /* Name contents */ + assertEqualMem(e + 110 + ns, "1234567890\0\0", 12); /* File contents */ + e += 110 + ns + fs; + + /* Last entry is end-of-archive marker. */ + assert(is_hex(e, 110)); + assertEqualMem(e + 0, "070701", 6); /* Magic */ + assertEqualMem(e + 8, "00000000", 8); /* ino */ + assertEqualMem(e + 14, "00000000", 8); /* mode */ + assertEqualMem(e + 22, "00000000", 8); /* uid */ + assertEqualMem(e + 30, "00000000", 8); /* gid */ + assertEqualMem(e + 38, "00000001", 8); /* nlink */ + assertEqualMem(e + 46, "00000000", 8); /* mtime */ + assertEqualMem(e + 54, "00000000", 8); /* size */ + assertEqualMem(e + 62, "00000000", 8); /* devmajor */ + assertEqualMem(e + 70, "00000000", 8); /* devminor */ + assertEqualMem(e + 78, "00000000", 8); /* rdevmajor */ + assertEqualMem(e + 86, "00000000", 8); /* rdevminor */ + assertEqualInt(11, from_hex(e + 94, 8)); /* name size */ + assertEqualMem(e + 102, "00000000", 8); /* check field */ + assertEqualMem(e + 110, "TRAILER!!!\0\0", 12); /* Name */ + + free(p); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_gcpio_compat.c b/Utilities/cmlibarchive/cpio/test/test_gcpio_compat.c new file mode 100644 index 000000000..2d49523f9 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_gcpio_compat.c @@ -0,0 +1,108 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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) +{ + int r; + + /* Create a work dir named after the file we're unpacking. */ + assertMakeDir(from, 0775); + assertChdir(from); + + /* + * Use cpio to unpack the sample archive + */ + extract_reference_file(from); + r = systemf("%s -i %s < %s >unpack.out 2>unpack.err", + testprog, options, from); + failure("Error invoking %s -i %s < %s", + testprog, options, from); + assertEqualInt(r, 0); + + /* Verify that nothing went to stderr. */ + if (canSymlink()) { + failure("Error invoking %s -i %s < %s", + testprog, options, from); + assertTextFileContents(se, "unpack.err"); + } + + /* + * Verify unpacked files. + */ + + /* Regular file with 2 links. */ + assertIsReg("file", 0644); + failure("%s", from); + assertFileSize("file", 10); + assertFileSize("linkfile", 10); + failure("%s", from); + assertFileNLinks("file", 2); + + /* Another name for the same file. */ + failure("%s", from); + assertIsHardlink("linkfile", "file"); + assertFileSize("file", 10); + assertFileSize("linkfile", 10); + + /* Symlink */ + if (canSymlink()) + assertIsSymlink("symlink", "file"); + + /* dir */ + assertIsDir("dir", 0775); + + assertChdir(".."); +} + +DEFINE_TEST(test_gcpio_compat) +{ + assertUmask(0); + + /* Dearchive sample files with a variety of options. */ + if (canSymlink()) { + unpack_test("test_gcpio_compat_ref.bin", + "--no-preserve-owner", "1 block\n"); + unpack_test("test_gcpio_compat_ref.crc", + "--no-preserve-owner", "2 blocks\n"); + unpack_test("test_gcpio_compat_ref.newc", + "--no-preserve-owner", "2 blocks\n"); + /* gcpio-2.9 only reads 6 blocks here */ + unpack_test("test_gcpio_compat_ref.ustar", + "--no-preserve-owner", "7 blocks\n"); + } else { + unpack_test("test_gcpio_compat_ref_nosym.bin", + "--no-preserve-owner", "1 block\n"); + unpack_test("test_gcpio_compat_ref_nosym.crc", + "--no-preserve-owner", "2 blocks\n"); + unpack_test("test_gcpio_compat_ref_nosym.newc", + "--no-preserve-owner", "2 blocks\n"); + /* gcpio-2.9 only reads 6 blocks here */ + unpack_test("test_gcpio_compat_ref_nosym.ustar", + "--no-preserve-owner", "7 blocks\n"); + } +} diff --git a/Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref.bin.uu b/Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref.bin.uu new file mode 100644 index 000000000..745d8ab78 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_gcpio_compat_ref.bin.uu @@ -0,0 +1,16 @@ +$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 +M60"K=^VAZ`/H`P$````-1X29"`````0` small.cpio 2>small.err", testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "small.err"); + assertEqualInt(0, stat("small.cpio", &st)); + assertEqualInt(512, st.st_size); + + /* Create an archive with -B; this should be 5120 bytes. */ + r = systemf("echo file | %s -oB > large.cpio 2>large.err", testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "large.err"); + assertEqualInt(0, stat("large.cpio", &st)); + assertEqualInt(5120, st.st_size); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_C_upper.c b/Utilities/cmlibarchive/cpio/test/test_option_C_upper.c new file mode 100644 index 000000000..afc319f4f --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_C_upper.c @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + + +DEFINE_TEST(test_option_C_upper) +{ + int r; + + /* + * Create a file on disk. + */ + assertMakeFile("file", 0644, NULL); + + /* Create an archive without -C; this should be 512 bytes. */ + r = systemf("echo file | %s -o > small.cpio 2>small.err", testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "small.err"); + assertFileSize("small.cpio", 512); + + /* Create an archive with -C 513; this should be 513 bytes. */ + r = systemf("echo file | %s -o -C 513 > 513.cpio 2>513.err", + testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "513.err"); + assertFileSize("513.cpio", 513); + + /* Create an archive with -C 12345; this should be 12345 bytes. */ + r = systemf("echo file | %s -o -C12345 > 12345.cpio 2>12345.err", + testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "12345.err"); + assertFileSize("12345.cpio", 12345); + + /* Create an archive with invalid -C request */ + assert(0 != systemf("echo file | %s -o -C > bad.cpio 2>bad.err", + testprog)); + assertEmptyFile("bad.cpio"); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_J_upper.c b/Utilities/cmlibarchive/cpio/test/test_option_J_upper.c new file mode 100644 index 000000000..554f64a8c --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_J_upper.c @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_option_J_upper) +{ + char *p; + int r; + size_t s; + + /* Create a file. */ + assertMakeFile("f", 0644, "a"); + + /* Archive it with xz compression. */ + r = systemf("echo f | %s -o -J >archive.out 2>archive.err", + testprog); + p = slurpfile(&s, "archive.err"); + p[s] = '\0'; + if (r != 0) { + if (strstr(p, "compression not available") != NULL) { + skipping("This version of bsdcpio was compiled " + "without xz support"); + return; + } + failure("-J option is broken"); + assertEqualInt(r, 0); + return; + } + /* Check that the archive file has an xz signature. */ + p = slurpfile(&s, "archive.out"); + assert(s > 2); + assertEqualMem(p, "\3757zXZ", 5); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_L_upper.c b/Utilities/cmlibarchive/cpio/test/test_option_L_upper.c new file mode 100644 index 000000000..396752f79 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_L_upper.c @@ -0,0 +1,96 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_option_L.c,v 1.2 2008/08/24 06:21:00 kientzle Exp $"); + +/* This is a little pointless, as Windows doesn't support symlinks + * (except for the seriously crippled CreateSymbolicLink API) so these + * tests won't run on Windows. */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#define CAT "type" +#else +#define CAT "cat" +#endif + +DEFINE_TEST(test_option_L_upper) +{ + FILE *filelist; + int r; + + if (!canSymlink()) { + skipping("Symlink tests"); + return; + } + + filelist = fopen("filelist", "w"); + + /* Create a file and a symlink to the file. */ + assertMakeFile("file", 0644, "1234567890"); + fprintf(filelist, "file\n"); + + /* Symlink to above file. */ + assertMakeSymlink("symlink", "file"); + fprintf(filelist, "symlink\n"); + + fclose(filelist); + + r = systemf(CAT " filelist | %s -pd copy >copy.out 2>copy.err", testprog); + assertEqualInt(r, 0); + + failure("Regular -p without -L should preserve symlinks."); + assertIsSymlink("copy/symlink", NULL); + + r = systemf(CAT " filelist | %s -pd -L copy-L >copy-L.out 2>copy-L.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("copy-L.out"); + assertTextFileContents("1 block\n", "copy-L.err"); + failure("-pdL should dereference symlinks and turn them into files."); + assertIsReg("copy-L/symlink", -1); + + r = systemf(CAT " filelist | %s -o >archive.out 2>archive.err", testprog); + failure("Error invoking %s -o ", testprog); + assertEqualInt(r, 0); + + assertMakeDir("unpack", 0755); + assertChdir("unpack"); + r = systemf(CAT " ../archive.out | %s -i >unpack.out 2>unpack.err", testprog); + assertChdir(".."); + failure("Error invoking %s -i", testprog); + assertEqualInt(r, 0); + + assertIsSymlink("unpack/symlink", NULL); + + r = systemf(CAT " filelist | %s -oL >archive-L.out 2>archive-L.err", testprog); + failure("Error invoking %s -oL", testprog); + assertEqualInt(r, 0); + + assertMakeDir("unpack-L", 0755); + assertChdir("unpack-L"); + r = systemf(CAT " ../archive-L.out | %s -i >unpack-L.out 2>unpack-L.err", testprog); + assertChdir(".."); + failure("Error invoking %s -i < archive-L.out", testprog); + assertEqualInt(r, 0); + assertIsReg("unpack-L/symlink", -1); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_Z_upper.c b/Utilities/cmlibarchive/cpio/test/test_option_Z_upper.c new file mode 100644 index 000000000..6810ec631 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_Z_upper.c @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_option_Z_upper) +{ + char *p; + int r; + size_t s; + + /* Create a file. */ + assertMakeFile("f", 0644, "a"); + + /* Archive it with compress compression. */ + r = systemf("echo f | %s -oZ >archive.out 2>archive.err", + testprog); + p = slurpfile(&s, "archive.err"); + p[s] = '\0'; + if (r != 0) { + if (strstr(p, "compression not available") != NULL) { + skipping("This version of bsdcpio was compiled " + "without compress support"); + return; + } + failure("-Z option is broken"); + assertEqualInt(r, 0); + return; + } + /* Check that the archive file has a compress signature. */ + p = slurpfile(&s, "archive.out"); + assert(s > 2); + assertEqualMem(p, "\x1f\x9d", 2); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_a.c b/Utilities/cmlibarchive/cpio/test/test_option_a.c new file mode 100644 index 000000000..c39e553c2 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_a.c @@ -0,0 +1,154 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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" +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#else +#include +#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; + time_t atime_sec; +} files[] = { + { "f0", 0 }, + { "f1", 0 }, + { "f2", 0 }, + { "f3", 0 }, + { "f4", 0 }, + { "f5", 0 } +}; + +/* + * Create a bunch of test files and record their atimes. + * For the atime preserve/change tests, the files must have + * atimes in the past. We can accomplish this by explicitly invoking + * utime() on platforms that support it or by simply sleeping + * for a second after creating the files. (Creating all of the files + * at once means we only need to sleep once.) + */ +static void +test_create(void) +{ + struct stat st; + struct utimbuf times; + static const int numfiles = sizeof(files) / sizeof(files[0]); + int i; + + for (i = 0; i < numfiles; ++i) { + /* + * Note: Have to write at least one byte to the file. + * cpio doesn't bother reading the file if it's zero length, + * so the atime never gets changed in that case, which + * makes the tests below rather pointless. + */ + assertMakeFile(files[i].name, 0644, "a"); + + /* If utime() isn't supported on your platform, just + * #ifdef this section out. Most of the test below is + * still valid. */ + memset(×, 0, sizeof(times)); + times.actime = 1; + times.modtime = 3; + assertEqualInt(0, utime(files[i].name, ×)); + + /* Record whatever atime the file ended up with. */ + /* If utime() is available, this should be 1, but there's + * no harm in being careful. */ + assertEqualInt(0, stat(files[i].name, &st)); + files[i].atime_sec = st.st_atime; + } + + /* Wait until the atime on the last file is actually in the past. */ + sleepUntilAfter(files[numfiles - 1].atime_sec); +} + +DEFINE_TEST(test_option_a) +{ + struct stat st; + int r; + char *p; + + /* Create all of the test files. */ + test_create(); + + /* Sanity check; verify that atimes really do get modified. */ + assert((p = slurpfile(NULL, "f0")) != NULL); + free(p); + assertEqualInt(0, stat("f0", &st)); + if (st.st_atime == files[0].atime_sec) { + skipping("Cannot verify -a option\n" + " Your system appears to not support atime."); + } + else + { + /* + * If this disk is mounted noatime, then we can't + * verify correct operation without -a. + */ + + /* Copy the file without -a; should change the atime. */ + r = systemf("echo %s | %s -pd copy-no-a > copy-no-a.out 2>copy-no-a.err", files[1].name, testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "copy-no-a.err"); + assertEmptyFile("copy-no-a.out"); + assertEqualInt(0, stat(files[1].name, &st)); + failure("Copying file without -a should have changed atime."); + assert(st.st_atime != files[1].atime_sec); + + /* Archive the file without -a; should change the atime. */ + r = systemf("echo %s | %s -o > archive-no-a.out 2>archive-no-a.err", files[2].name, testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "copy-no-a.err"); + assertEqualInt(0, stat(files[2].name, &st)); + failure("Archiving file without -a should have changed atime."); + assert(st.st_atime != files[2].atime_sec); + } + + /* + * We can, of course, still verify that the atime is unchanged + * when using the -a option. + */ + + /* Copy the file with -a; should not change the atime. */ + r = systemf("echo %s | %s -pad copy-a > copy-a.out 2>copy-a.err", + files[3].name, testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "copy-a.err"); + assertEmptyFile("copy-a.out"); + assertEqualInt(0, stat(files[3].name, &st)); + failure("Copying file with -a should not have changed atime."); + assertEqualInt(st.st_atime, files[3].atime_sec); + + /* Archive the file with -a; should not change the atime. */ + r = systemf("echo %s | %s -oa > archive-a.out 2>archive-a.err", + files[4].name, testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "copy-a.err"); + assertEqualInt(0, stat(files[4].name, &st)); + failure("Archiving file with -a should not have changed atime."); + assertEqualInt(st.st_atime, files[4].atime_sec); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_c.c b/Utilities/cmlibarchive/cpio/test/test_option_c.c new file mode 100644 index 000000000..a28a2ff83 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_c.c @@ -0,0 +1,221 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +static int +is_octal(const char *p, size_t l) +{ + while (l > 0) { + if (*p < '0' || *p > '7') + return (0); + --l; + ++p; + } + return (1); +} + +static int +from_octal(const char *p, size_t l) +{ + int r = 0; + + while (l > 0) { + r *= 8; + r += *p - '0'; + --l; + ++p; + } + return (r); +} + +DEFINE_TEST(test_option_c) +{ + FILE *filelist; + int r; + int uid = -1; + int dev, ino, gid; + time_t t, now; + char *p, *e; + size_t s; + + assertUmask(0); + +#if !defined(_WIN32) + uid = getuid(); +#endif + + /* + * Create an assortment of files. + * TODO: Extend this to cover more filetypes. + */ + filelist = fopen("filelist", "w"); + + /* "file" */ + assertMakeFile("file", 0644, "1234567890"); + fprintf(filelist, "file\n"); + + /* "symlink" */ + if (canSymlink()) { + assertMakeSymlink("symlink", "file"); + fprintf(filelist, "symlink\n"); + } + + /* "dir" */ + assertMakeDir("dir", 0775); + /* Record some facts about what we just created: */ + now = time(NULL); /* They were all created w/in last two seconds. */ + fprintf(filelist, "dir\n"); + + /* Use the cpio program to create an archive. */ + fclose(filelist); + r = systemf("%s -oc basic.out 2>basic.err", testprog); + /* Verify that nothing went to stderr. */ + assertTextFileContents("1 block\n", "basic.err"); + + /* Assert that the program finished. */ + failure("%s -oc crashed", testprog); + if (!assertEqualInt(r, 0)) + return; + + /* Verify that stdout is a well-formed cpio file in "odc" format. */ + p = slurpfile(&s, "basic.out"); + assertEqualInt(s, 512); + e = p; + + /* + * Some of these assertions could be stronger, but it's + * a little tricky because they depend on the local environment. + */ + + /* First entry is "file" */ + assert(is_octal(e, 76)); /* Entire header is octal digits. */ + assertEqualMem(e + 0, "070707", 6); /* Magic */ + assert(is_octal(e + 6, 6)); /* dev */ + dev = from_octal(e + 6, 6); + assert(is_octal(e + 12, 6)); /* ino */ + ino = from_octal(e + 12, 6); +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Group members bits and others bits do not work. */ + assertEqualMem(e + 18, "100666", 6); /* Mode */ +#else + assertEqualMem(e + 18, "100644", 6); /* Mode */ +#endif + if (uid < 0) + uid = from_octal(e + 24, 6); + assertEqualInt(from_octal(e + 24, 6), uid); /* uid */ + assert(is_octal(e + 30, 6)); /* gid */ + gid = from_octal(e + 30, 6); + assertEqualMem(e + 36, "000001", 6); /* nlink */ + failure("file entries should not have rdev set (dev field was 0%o)", + dev); + assertEqualMem(e + 42, "000000", 6); /* rdev */ + t = from_octal(e + 48, 11); /* mtime */ + assert(t <= now); /* File wasn't created in future. */ + assert(t >= now - 2); /* File was created w/in last 2 secs. */ + assertEqualMem(e + 59, "000005", 6); /* Name size */ + assertEqualMem(e + 65, "00000000012", 11); /* File size */ + assertEqualMem(e + 76, "file\0", 5); /* Name contents */ + assertEqualMem(e + 81, "1234567890", 10); /* File contents */ + e += 91; + + /* "symlink" pointing to "file" */ + if (canSymlink()) { + assert(is_octal(e, 76)); /* Entire header is octal digits. */ + assertEqualMem(e + 0, "070707", 6); /* Magic */ + assertEqualInt(dev, from_octal(e + 6, 6)); /* dev */ + assert(dev != from_octal(e + 12, 6)); /* ino */ +#if !defined(_WIN32) || defined(__CYGWIN__) + /* On Windows, symbolic link and group members bits and + * others bits do not work. */ + assertEqualMem(e + 18, "120777", 6); /* Mode */ +#endif + assertEqualInt(from_octal(e + 24, 6), uid); /* uid */ + assertEqualInt(gid, from_octal(e + 30, 6)); /* gid */ + assertEqualMem(e + 36, "000001", 6); /* nlink */ + failure("file entries should have rdev == 0 (dev was 0%o)", + from_octal(e + 6, 6)); + assertEqualMem(e + 42, "000000", 6); /* rdev */ + t = from_octal(e + 48, 11); /* mtime */ + assert(t <= now); /* File wasn't created in future. */ + assert(t >= now - 2); /* File was created w/in last 2 secs. */ + assertEqualMem(e + 59, "000010", 6); /* Name size */ + assertEqualMem(e + 65, "00000000004", 11); /* File size */ + assertEqualMem(e + 76, "symlink\0", 8); /* Name contents */ + assertEqualMem(e + 84, "file", 4); /* Symlink target. */ + e += 88; + } + + /* "dir" */ + assert(is_octal(e, 76)); + assertEqualMem(e + 0, "070707", 6); /* Magic */ + /* Dev should be same as first entry. */ + assert(is_octal(e + 6, 6)); /* dev */ + assertEqualInt(dev, from_octal(e + 6, 6)); + /* Ino must be different from first entry. */ + assert(is_octal(e + 12, 6)); /* ino */ + assert(dev != from_octal(e + 12, 6)); +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Group members bits and others bits do not work. */ + assertEqualMem(e + 18, "040777", 6); /* Mode */ +#else + /* Accept 042775 to accomodate systems where sgid bit propagates. */ + if (memcmp(e + 18, "042775", 6) != 0) + assertEqualMem(e + 18, "040775", 6); /* Mode */ +#endif + assertEqualInt(from_octal(e + 24, 6), uid); /* uid */ + /* Gid should be same as first entry. */ + assert(is_octal(e + 30, 6)); /* gid */ + assertEqualInt(gid, from_octal(e + 30, 6)); +#ifndef NLINKS_INACCURATE_FOR_DIRS + assertEqualMem(e + 36, "000002", 6); /* Nlink */ +#endif + t = from_octal(e + 48, 11); /* mtime */ + assert(t <= now); /* File wasn't created in future. */ + assert(t >= now - 2); /* File was created w/in last 2 secs. */ + assertEqualMem(e + 59, "000004", 6); /* Name size */ + assertEqualMem(e + 65, "00000000000", 11); /* File size */ + assertEqualMem(e + 76, "dir\0", 4); /* name */ + e += 80; + + /* TODO: Verify other types of entries. */ + + /* Last entry is end-of-archive marker. */ + assert(is_octal(e, 76)); + assertEqualMem(e + 0, "070707", 6); /* Magic */ + assertEqualMem(e + 6, "000000", 6); /* dev */ + assertEqualMem(e + 12, "000000", 6); /* ino */ + assertEqualMem(e + 18, "000000", 6); /* Mode */ + assertEqualMem(e + 24, "000000", 6); /* uid */ + assertEqualMem(e + 30, "000000", 6); /* gid */ + assertEqualMem(e + 36, "000001", 6); /* Nlink */ + assertEqualMem(e + 42, "000000", 6); /* rdev */ + assertEqualMem(e + 48, "00000000000", 11); /* mtime */ + assertEqualMem(e + 59, "000013", 6); /* Name size */ + assertEqualMem(e + 65, "00000000000", 11); /* File size */ + assertEqualMem(e + 76, "TRAILER!!!\0", 11); /* Name */ + + free(p); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_d.c b/Utilities/cmlibarchive/cpio/test/test_option_d.c new file mode 100644 index 000000000..48e708596 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_d.c @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + + +DEFINE_TEST(test_option_d) +{ + int r; + + /* + * Create a file in a directory. + */ + assertMakeDir("dir", 0755); + assertMakeFile("dir/file", 0644, NULL); + + /* Create an archive. */ + r = systemf("echo dir/file | %s -o > archive.cpio 2>archive.err", testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "archive.err"); + assertFileSize("archive.cpio", 512); + + /* Dearchive without -d, this should fail. */ + assertMakeDir("without-d", 0755); + assertChdir("without-d"); + r = systemf("%s -i < ../archive.cpio >out 2>err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("out"); + /* And the file should not be restored. */ + assertFileNotExists("dir/file"); + + /* Dearchive with -d, this should succeed. */ + assertChdir(".."); + assertMakeDir("with-d", 0755); + assertChdir("with-d"); + r = systemf("%s -id < ../archive.cpio >out 2>err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("out"); + assertTextFileContents("1 block\n", "err"); + /* And the file should be restored. */ + assertFileExists("dir/file"); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_f.c b/Utilities/cmlibarchive/cpio/test/test_option_f.c new file mode 100644 index 000000000..fa09e8523 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_f.c @@ -0,0 +1,76 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Unpack the archive in a new dir. + */ +static void +unpack(const char *dirname, const char *option) +{ + int r; + + assertMakeDir(dirname, 0755); + assertChdir(dirname); + extract_reference_file("test_option_f.cpio"); + r = systemf("%s -i %s < test_option_f.cpio > copy-no-a.out 2>copy-no-a.err", testprog, option); + assertEqualInt(0, r); + assertChdir(".."); +} + +DEFINE_TEST(test_option_f) +{ + /* Calibrate: No -f option, so everything should be extracted. */ + unpack("t0", "--no-preserve-owner"); + assertFileExists("t0/a123"); + assertFileExists("t0/a234"); + assertFileExists("t0/b123"); + assertFileExists("t0/b234"); + + /* Don't extract 'a*' files. */ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Single quotes isn't used by command.exe. */ + unpack("t1", "--no-preserve-owner -f a*"); +#else + unpack("t1", "--no-preserve-owner -f 'a*'"); +#endif + assertFileNotExists("t1/a123"); + assertFileNotExists("t1/a234"); + assertFileExists("t1/b123"); + assertFileExists("t1/b234"); + + /* Don't extract 'b*' files. */ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Single quotes isn't used by command.exe. */ + unpack("t2", "--no-preserve-owner -f b*"); +#else + unpack("t2", "--no-preserve-owner -f 'b*'"); +#endif + assertFileExists("t2/a123"); + assertFileExists("t2/a234"); + assertFileNotExists("t2/b123"); + assertFileNotExists("t2/b234"); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_f.cpio.uu b/Utilities/cmlibarchive/cpio/test/test_option_f.cpio.uu new file mode 100644 index 000000000..42c63c396 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_f.cpio.uu @@ -0,0 +1,16 @@ +$FreeBSD$ +begin 644 test_option_f.cpio +M,#help.stdout 2>help.stderr", testprog); + failure("--help should generate nothing to stderr."); + assertEmptyFile("help.stderr"); + /* Help message should start with name of program. */ + p = slurpfile(&plen, "help.stdout"); + failure("Help output should be long enough."); + assert(plen >= 7); + failure("First line of help output should contain string 'bsdcpio'"); + assert(in_first_line(p, "bsdcpio")); + /* + * TODO: Extend this check to further verify that --help output + * looks approximately right. + */ + free(p); + + /* -h option should generate the same output. */ + r = systemf("%s -h >h.stdout 2>h.stderr", testprog); + failure("-h should generate nothing to stderr."); + assertEmptyFile("h.stderr"); + failure("stdout should be same for -h and --help"); + assertEqualFile("h.stdout", "help.stdout"); + + /* -W help should be another synonym. */ + r = systemf("%s -W help >Whelp.stdout 2>Whelp.stderr", testprog); + failure("-W help should generate nothing to stderr."); + assertEmptyFile("Whelp.stderr"); + failure("stdout should be same for -W help and --help"); + assertEqualFile("Whelp.stdout", "help.stdout"); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_l.c b/Utilities/cmlibarchive/cpio/test/test_option_l.c new file mode 100644 index 000000000..899478cad --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_l.c @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_option_l) +{ + int r; + + /* Create a file. */ + assertMakeFile("f", 0644, "a"); + + /* Copy the file to the "copy" dir. */ + r = systemf("echo f | %s -pd copy >copy.out 2>copy.err", + testprog); + assertEqualInt(r, 0); + + /* Check that the copy is a true copy and not a link. */ + assertIsNotHardlink("f", "copy/f"); + + /* Copy the file to the "link" dir with the -l option. */ + r = systemf("echo f | %s -pld link >link.out 2>link.err", + testprog); + assertEqualInt(r, 0); + + /* Check that this is a link and not a copy. */ + assertIsHardlink("f", "link/f"); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_lzma.c b/Utilities/cmlibarchive/cpio/test/test_option_lzma.c new file mode 100644 index 000000000..dc780f10f --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_lzma.c @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_option_lzma) +{ + char *p; + int r; + size_t s; + + /* Create a file. */ + assertMakeFile("f", 0644, "a"); + + /* Archive it with lzma compression. */ + r = systemf("echo f | %s -o --lzma >archive.out 2>archive.err", + testprog); + p = slurpfile(&s, "archive.err"); + p[s] = '\0'; + if (r != 0) { + if (strstr(p, "compression not available") != NULL) { + skipping("This version of bsdcpio was compiled " + "without lzma support"); + return; + } + failure("--lzma option is broken"); + assertEqualInt(r, 0); + return; + } + /* Check that the archive file has an lzma signature. */ + p = slurpfile(&s, "archive.out"); + assert(s > 2); + assertEqualMem(p, "\x5d\00\00", 3); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_m.c b/Utilities/cmlibarchive/cpio/test/test_option_m.c new file mode 100644 index 000000000..870a89483 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_m.c @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + + +DEFINE_TEST(test_option_m) +{ + int r; + + /* + * The reference archive has one file with an mtime in 1970, 1 + * second after the start of the epoch. + */ + + /* Restored without -m, the result should have a current mtime. */ + assertMakeDir("without-m", 0755); + assertChdir("without-m"); + extract_reference_file("test_option_m.cpio"); + r = systemf("%s --no-preserve-owner -i < test_option_m.cpio >out 2>err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("out"); + assertTextFileContents("1 block\n", "err"); + /* Should have been created within the last few seconds. */ + assertFileMtimeRecent("file"); + + /* With -m, it should have an mtime in 1970. */ + assertChdir(".."); + assertMakeDir("with-m", 0755); + assertChdir("with-m"); + extract_reference_file("test_option_m.cpio"); + r = systemf("%s --no-preserve-owner -im < test_option_m.cpio >out 2>err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("out"); + assertTextFileContents("1 block\n", "err"); + /* + * mtime in reference archive is '1' == 1 second after + * midnight Jan 1, 1970 UTC. + */ + assertFileMtime("file", 1, 0); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_m.cpio.uu b/Utilities/cmlibarchive/cpio/test/test_option_m.cpio.uu new file mode 100644 index 000000000..3d2002355 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_m.cpio.uu @@ -0,0 +1,16 @@ +$FreeBSD$ +begin 644 test_option_m.cpio +M,#it.out 2>it.err", testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "it.err"); + extract_reference_file("test_option_t.stdout"); + p = slurpfile(NULL, "test_option_t.stdout"); + assertTextFileContents(p, "it.out"); + free(p); + + /* We accept plain "-t" as a synonym for "-it" */ + r = systemf("%s -t < test_option_t.cpio >t.out 2>t.err", testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "t.err"); + extract_reference_file("test_option_t.stdout"); + p = slurpfile(NULL, "test_option_t.stdout"); + assertTextFileContents(p, "t.out"); + free(p); + + /* But "-ot" is an error. */ + assert(0 != systemf("%s -ot < test_option_t.cpio >ot.out 2>ot.err", + testprog)); + assertEmptyFile("ot.out"); + + /* List reference archive verbosely, make sure the TOC is correct. */ + r = systemf("%s -itv < test_option_t.cpio >tv.out 2>tv.err", testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "tv.err"); + extract_reference_file("test_option_tv.stdout"); + + /* This doesn't work because the usernames on different systems + * are different and cpio now looks up numeric UIDs on + * the local system. */ + /* assertEqualFile("tv.out", "test_option_tv.stdout"); */ + + /* List reference archive with numeric IDs, verify TOC is correct. */ + r = systemf("%s -itnv < test_option_t.cpio >itnv.out 2>itnv.err", + testprog); + assertEqualInt(r, 0); + assertTextFileContents("1 block\n", "itnv.err"); + p = slurpfile(NULL, "itnv.out"); + /* Since -n uses numeric UID/GID, this part should be the + * same on every system. */ + assertEqualMem(p, "-rw-r--r-- 1 1000 1000 0 ",42); + /* Date varies depending on local timezone. */ + if (memcmp(p + 42, "Dec 31 1969", 12) == 0) { + /* East of Greenwich we get Dec 31, 1969. */ + } else { + /* West of Greenwich get Jan 1, 1970 */ + assertEqualMem(p + 42, "Jan ", 4); + /* Some systems format "Jan 01", some "Jan 1" */ + assert(p[46] == ' ' || p[46] == '0'); + assertEqualMem(p + 47, "1 1970 ", 8); + } + assertEqualMem(p + 54, " file", 5); + free(p); + + /* But "-n" without "-t" is an error. */ + assert(0 != systemf("%s -in < test_option_t.cpio >in.out 2>in.err", + testprog)); + assertEmptyFile("in.out"); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_t.cpio.uu b/Utilities/cmlibarchive/cpio/test/test_option_t.cpio.uu new file mode 100644 index 000000000..055fe747d --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_t.cpio.uu @@ -0,0 +1,16 @@ +$FreeBSD$ +begin 644 test_option_t.cpio +M,# +#else +#include +#endif +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_option_u) +{ + struct utimbuf times; + char *p; + size_t s; + int r; + + /* Create a file. */ + assertMakeFile("f", 0644, "a"); + + /* Copy the file to the "copy" dir. */ + r = systemf("echo f | %s -pd copy >copy.out 2>copy.err", + testprog); + assertEqualInt(r, 0); + + /* Check that the file contains only a single "a" */ + p = slurpfile(&s, "copy/f"); + assertEqualInt(s, 1); + assertEqualMem(p, "a", 1); + + /* Recreate the file with a single "b" */ + assertMakeFile("f", 0644, "b"); + + /* Set the mtime to the distant past. */ + memset(×, 0, sizeof(times)); + times.actime = 1; + times.modtime = 3; + assertEqualInt(0, utime("f", ×)); + + /* Copy the file to the "copy" dir. */ + r = systemf("echo f | %s -pd copy >copy.out 2>copy.err", + testprog); + assertEqualInt(r, 0); + + /* Verify that the file hasn't changed (it wasn't overwritten) */ + p = slurpfile(&s, "copy/f"); + assertEqualInt(s, 1); + assertEqualMem(p, "a", 1); + + /* Copy the file to the "copy" dir with -u (force) */ + r = systemf("echo f | %s -pud copy >copy.out 2>copy.err", + testprog); + assertEqualInt(r, 0); + + /* Verify that the file has changed (it was overwritten) */ + p = slurpfile(&s, "copy/f"); + assertEqualInt(s, 1); + assertEqualMem(p, "b", 1); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_version.c b/Utilities/cmlibarchive/cpio/test/test_option_version.c new file mode 100644 index 000000000..f0dc88a88 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_version.c @@ -0,0 +1,109 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Test that --version option works and generates reasonable output. + */ + +static void +verify(const char *p, size_t s) +{ + const char *q = p; + + /* Version message should start with name of program, then space. */ + failure("version message too short:", p); + if (!assert(s > 6)) + return; + failure("Version message should begin with 'bsdcpio': %s", p); + if (!assertEqualMem(q, "bsdcpio ", 8)) + /* If we're not testing bsdcpio, don't keep going. */ + return; + q += 8; s -= 8; + /* Version number is a series of digits and periods. */ + while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) { + ++q; + --s; + } + /* Version number terminated by space. */ + failure("Version: %s", p); + assert(s > 1); + /* Skip a single trailing a,b,c, or d. */ + if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd') + ++q; + failure("Version: %s", p); + assert(*q == ' '); + ++q; --s; + /* Separator. */ + failure("Version: %s", p); + assertEqualMem(q, "-- ", 3); + q += 3; s -= 3; + /* libarchive name and version number */ + assert(s > 11); + failure("Version: %s", p); + assertEqualMem(q, "libarchive ", 11); + q += 11; s -= 11; + /* Version number is a series of digits and periods. */ + while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) { + ++q; + --s; + } + /* Skip a single trailing a,b,c, or d. */ + if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd') + ++q; + /* All terminated by a newline. */ + assert(s >= 1); + failure("Version: %s", p); +#if defined(_WIN32) && !defined(__CYGWIN__) + assertEqualMem(q, "\r\n", 2); +#else + assertEqualMem(q, "\n", 1); +#endif +} + + +DEFINE_TEST(test_option_version) +{ + int r; + char *p; + size_t s; + + r = systemf("%s --version >version.stdout 2>version.stderr", testprog); + if (r != 0) + r = systemf("%s -W version >version.stdout 2>version.stderr", + testprog); + failure("Unable to run either %s --version or %s -W version", + testprog, testprog); + if (!assert(r == 0)) + return; + + /* --version should generate nothing to stderr. */ + assertEmptyFile("version.stderr"); + /* Verify format of version message. */ + p = slurpfile(&s, "version.stdout"); + verify(p, s); + free(p); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_y.c b/Utilities/cmlibarchive/cpio/test/test_option_y.c new file mode 100644 index 000000000..934cd9025 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_y.c @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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) +{ + char *p; + int r; + size_t s; + + /* Create a file. */ + assertMakeFile("f", 0644, "a"); + + /* Archive it with bzip2 compression. */ + r = systemf("echo f | %s -oy >archive.out 2>archive.err", + testprog); + p = slurpfile(&s, "archive.err"); + p[s] = '\0'; + if (r != 0) { + if (strstr(p, "compression not available") != NULL) { + skipping("This version of bsdcpio was compiled " + "without bzip2 support"); + return; + } + failure("-y option is broken"); + assertEqualInt(r, 0); + return; + } + assertTextFileContents("1 block\n", "archive.err"); + /* Check that the archive file has a bzip2 signature. */ + p = slurpfile(&s, "archive.out"); + assert(s > 2); + assertEqualMem(p, "BZh9", 4); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_option_z.c b/Utilities/cmlibarchive/cpio/test/test_option_z.c new file mode 100644 index 000000000..0d7c148f7 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_option_z.c @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_option_z) +{ + char *p; + int r; + size_t s; + + /* Create a file. */ + assertMakeFile("f", 0644, "a"); + + /* Archive it with gzip compression. */ + r = systemf("echo f | %s -oz >archive.out 2>archive.err", + testprog); + p = slurpfile(&s, "archive.err"); + p[s] = '\0'; + if (r != 0) { + if (strstr(p, "compression not available") != NULL) { + skipping("This version of bsdcpio was compiled " + "without gzip support"); + return; + } + failure("-z option is broken"); + assertEqualInt(r, 0); + return; + } + /* Check that the archive file has a gzip signature. */ + p = slurpfile(&s, "archive.out"); + assert(s > 4); + assertEqualMem(p, "\x1f\x8b\x08\x00", 4); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_owner_parse.c b/Utilities/cmlibarchive/cpio/test/test_owner_parse.c new file mode 100644 index 000000000..9bdb4d901 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_owner_parse.c @@ -0,0 +1,121 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +#include "../cpio.h" +#include "err.h" + +#if !defined(_WIN32) +#define ROOT "root" +static int root_uids[] = { 0 }; +static int root_gids[] = { 0 }; +#elif defined(__CYGWIN__) +/* On cygwin, the Administrator user most likely exists (unless + * it has been renamed or is in a non-English localization), but + * its primary group membership depends on how the user set up + * their /etc/passwd. Likely values are 513 (None), 545 (Users), + * or 544 (Administrators). Just check for one of those... + * TODO: Handle non-English localizations...e.g. French 'Administrateur' + * Use CreateWellKnownSID() and LookupAccountName()? + */ +#define ROOT "Administrator" +static int root_uids[] = { 500 }; +static int root_gids[] = { 513, 545, 544 }; +#endif + +#if defined(ROOT) +static int +int_in_list(int i, int *l, size_t n) +{ + while (n-- > 0) + if (*l++ == i) + return (1); + failure("%d", i); + return (0); +} +#endif + +DEFINE_TEST(test_owner_parse) +{ +#if !defined(ROOT) + skipping("No uid/gid configuration for this OS"); +#else + int uid, gid; + + assert(NULL == owner_parse(ROOT, &uid, &gid)); + assert(int_in_list(uid, root_uids, + sizeof(root_uids)/sizeof(root_uids[0]))); + assertEqualInt(-1, gid); + + + assert(NULL == owner_parse(ROOT ":", &uid, &gid)); + assert(int_in_list(uid, root_uids, + sizeof(root_uids)/sizeof(root_uids[0]))); + assert(int_in_list(gid, root_gids, + sizeof(root_gids)/sizeof(root_gids[0]))); + + assert(NULL == owner_parse(ROOT ".", &uid, &gid)); + assert(int_in_list(uid, root_uids, + sizeof(root_uids)/sizeof(root_uids[0]))); + assert(int_in_list(gid, root_gids, + sizeof(root_gids)/sizeof(root_gids[0]))); + + assert(NULL == owner_parse("111", &uid, &gid)); + assertEqualInt(111, uid); + assertEqualInt(-1, gid); + + assert(NULL == owner_parse("112:", &uid, &gid)); + assertEqualInt(112, uid); + /* Can't assert gid, since we don't know gid for user #112. */ + + assert(NULL == owner_parse("113.", &uid, &gid)); + assertEqualInt(113, uid); + /* Can't assert gid, since we don't know gid for user #113. */ + + assert(NULL == owner_parse(":114", &uid, &gid)); + assertEqualInt(-1, uid); + assertEqualInt(114, gid); + + assert(NULL == owner_parse(".115", &uid, &gid)); + assertEqualInt(-1, uid); + assertEqualInt(115, gid); + + assert(NULL == owner_parse("116:117", &uid, &gid)); + assertEqualInt(116, uid); + assertEqualInt(117, gid); + + /* + * TODO: Lookup current user/group name, build strings and + * use those to verify username/groupname lookups for ordinary + * users. + */ + + assert(NULL != owner_parse(":nonexistentgroup", &uid, &gid)); + assert(NULL != owner_parse(ROOT ":nonexistentgroup", &uid, &gid)); + assert(NULL != + owner_parse("nonexistentuser:nonexistentgroup", &uid, &gid)); +#endif +} diff --git a/Utilities/cmlibarchive/cpio/test/test_passthrough_dotdot.c b/Utilities/cmlibarchive/cpio/test/test_passthrough_dotdot.c new file mode 100644 index 000000000..a81e1482d --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_passthrough_dotdot.c @@ -0,0 +1,76 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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. + */ + +DEFINE_TEST(test_passthrough_dotdot) +{ + int r; + FILE *filelist; + + assertUmask(0); + + /* + * Create an assortment of files on disk. + */ + filelist = fopen("filelist", "w"); + + /* Directory. */ + assertMakeDir("dir", 0755); + assertChdir("dir"); + + fprintf(filelist, ".\n"); + + /* File with 10 bytes content. */ + assertMakeFile("file", 0642, "1234567890"); + fprintf(filelist, "file\n"); + + /* All done. */ + fclose(filelist); + + + /* + * Use cpio passthrough mode to copy files to another directory. + */ + r = systemf("%s -pdvm .. <../filelist >../stdout 2>../stderr", + testprog); + failure("Error invoking %s -pd ..", testprog); + assertEqualInt(r, 0); + + assertChdir(".."); + + /* Verify stderr and stdout. */ + assertTextFileContents("../.\n../file\n1 block\n", "stderr"); + assertEmptyFile("stdout"); + + /* Regular file. */ + assertIsReg("file", 0642); + assertFileSize("file", 10); + assertFileNLinks("file", 1); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_passthrough_reverse.c b/Utilities/cmlibarchive/cpio/test/test_passthrough_reverse.c new file mode 100644 index 000000000..86d70a6a2 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_passthrough_reverse.c @@ -0,0 +1,85 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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 + * using "find -d" to generate a list for cpio -p because that + * copies the top-level dir last, which preserves owner and mode + * information. That's not necessary for bsdcpio (libarchive defers + * restoring directory information), but bsdcpio should still generate + * the correct results with this usage. + */ + +DEFINE_TEST(test_passthrough_reverse) +{ + int r; + FILE *filelist; + + assertUmask(0); + + /* + * Create an assortment of files on disk. + */ + filelist = fopen("filelist", "w"); + + /* Directory. */ + assertMakeDir("dir", 0743); + + /* File with 10 bytes content. */ + assertMakeFile("dir/file", 0644, "1234567890"); + fprintf(filelist, "dir/file\n"); + + /* Write dir last. */ + fprintf(filelist, "dir\n"); + + /* All done. */ + fclose(filelist); + + + /* + * Use cpio passthrough mode to copy files to another directory. + */ + r = systemf("%s -pdvm out stdout 2>stderr", testprog); + failure("Error invoking %s -pd out", testprog); + assertEqualInt(r, 0); + + assertChdir("out"); + + /* Verify stderr and stdout. */ + assertTextFileContents("out/dir/file\nout/dir\n1 block\n", + "../stderr"); + assertEmptyFile("../stdout"); + + /* dir */ + assertIsDir("dir", 0743); + + + /* Regular file. */ + assertIsReg("dir/file", 0644); + assertFileSize("dir/file", 10); + assertFileNLinks("dir/file", 1); +} diff --git a/Utilities/cmlibarchive/cpio/test/test_pathmatch.c b/Utilities/cmlibarchive/cpio/test/test_pathmatch.c new file mode 100644 index 000000000..12b888670 --- /dev/null +++ b/Utilities/cmlibarchive/cpio/test/test_pathmatch.c @@ -0,0 +1,243 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +#include "pathmatch.h" + +/* + * Verify that the pattern matcher implements the wildcard logic specified + * in SUSv2 for the cpio command. This is essentially the + * shell glob syntax: + * * - matches any sequence of chars, including '/' + * ? - matches any single char, including '/' + * [...] - matches any of a set of chars, '-' specifies a range, + * initial '!' is undefined + * + * The specification in SUSv2 is a bit incomplete, I assume the following: + * Trailing '-' in [...] is not special. + * + * TODO: Figure out if there's a good way to extend this to handle + * Windows paths that use '\' as a path separator. + */ + +DEFINE_TEST(test_pathmatch) +{ + assertEqualInt(1, lafe_pathmatch("a/b/c", "a/b/c", 0)); + assertEqualInt(0, lafe_pathmatch("a/b/", "a/b/c", 0)); + assertEqualInt(0, lafe_pathmatch("a/b", "a/b/c", 0)); + assertEqualInt(0, lafe_pathmatch("a/b/c", "a/b/", 0)); + assertEqualInt(0, lafe_pathmatch("a/b/c", "a/b", 0)); + + /* Empty pattern only matches empty string. */ + assertEqualInt(1, lafe_pathmatch("","", 0)); + assertEqualInt(0, lafe_pathmatch("","a", 0)); + assertEqualInt(1, lafe_pathmatch("*","", 0)); + assertEqualInt(1, lafe_pathmatch("*","a", 0)); + assertEqualInt(1, lafe_pathmatch("*","abcd", 0)); + /* SUSv2: * matches / */ + assertEqualInt(1, lafe_pathmatch("*","abcd/efgh/ijkl", 0)); + assertEqualInt(1, lafe_pathmatch("abcd*efgh/ijkl","abcd/efgh/ijkl", 0)); + assertEqualInt(1, lafe_pathmatch("abcd***efgh/ijkl","abcd/efgh/ijkl", 0)); + assertEqualInt(1, lafe_pathmatch("abcd***/efgh/ijkl","abcd/efgh/ijkl", 0)); + assertEqualInt(0, lafe_pathmatch("?", "", 0)); + assertEqualInt(0, lafe_pathmatch("?", "\0", 0)); + assertEqualInt(1, lafe_pathmatch("?", "a", 0)); + assertEqualInt(0, lafe_pathmatch("?", "ab", 0)); + assertEqualInt(1, lafe_pathmatch("?", ".", 0)); + assertEqualInt(1, lafe_pathmatch("?", "?", 0)); + assertEqualInt(1, lafe_pathmatch("a", "a", 0)); + assertEqualInt(0, lafe_pathmatch("a", "ab", 0)); + assertEqualInt(0, lafe_pathmatch("a", "ab", 0)); + assertEqualInt(1, lafe_pathmatch("a?c", "abc", 0)); + /* SUSv2: ? matches / */ + assertEqualInt(1, lafe_pathmatch("a?c", "a/c", 0)); + assertEqualInt(1, lafe_pathmatch("a?*c*", "a/c", 0)); + assertEqualInt(1, lafe_pathmatch("*a*", "a/c", 0)); + assertEqualInt(1, lafe_pathmatch("*a*", "/a/c", 0)); + assertEqualInt(1, lafe_pathmatch("*a*", "defaaaaaaa", 0)); + assertEqualInt(0, lafe_pathmatch("a*", "defghi", 0)); + assertEqualInt(0, lafe_pathmatch("*a*", "defghi", 0)); + + /* Character classes */ + assertEqualInt(1, lafe_pathmatch("abc[def", "abc[def", 0)); + assertEqualInt(0, lafe_pathmatch("abc[def]", "abc[def", 0)); + assertEqualInt(0, lafe_pathmatch("abc[def", "abcd", 0)); + assertEqualInt(1, lafe_pathmatch("abc[def]", "abcd", 0)); + assertEqualInt(1, lafe_pathmatch("abc[def]", "abce", 0)); + assertEqualInt(1, lafe_pathmatch("abc[def]", "abcf", 0)); + assertEqualInt(0, lafe_pathmatch("abc[def]", "abcg", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d*f]", "abcd", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d*f]", "abc*", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d*f]", "abcdefghi", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d*", "abcdefghi", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d*", "abc[defghi", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abcd", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abce", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abcf", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d-f]", "abcg", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abca", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcd", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abce", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcf", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abcg", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abch", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abci", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcj", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abck", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abcl", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abc-", 0)); + + /* [] matches nothing, [!] is the same as ? */ + assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcdefg", 0)); + assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcqefg", 0)); + assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcefg", 0)); + assertEqualInt(1, lafe_pathmatch("abc[!]efg", "abcdefg", 0)); + assertEqualInt(1, lafe_pathmatch("abc[!]efg", "abcqefg", 0)); + assertEqualInt(0, lafe_pathmatch("abc[!]efg", "abcefg", 0)); + + /* I assume: Trailing '-' is non-special. */ + assertEqualInt(0, lafe_pathmatch("abc[d-fh-]", "abcl", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abch", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abc-", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abc-", 0)); + + /* ']' can be backslash-quoted within a character class. */ + assertEqualInt(1, lafe_pathmatch("abc[\\]]", "abc]", 0)); + assertEqualInt(1, lafe_pathmatch("abc[\\]d]", "abc]", 0)); + assertEqualInt(1, lafe_pathmatch("abc[\\]d]", "abcd", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d\\]]", "abc]", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d\\]]", "abcd", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d]e]", "abcde]", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d\\]e]", "abc]", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d\\]e]", "abcd]e", 0)); + assertEqualInt(0, lafe_pathmatch("abc[d]e]", "abc]", 0)); + + /* backslash-quoted chars can appear as either end of a range. */ + assertEqualInt(1, lafe_pathmatch("abc[\\d-f]gh", "abcegh", 0)); + assertEqualInt(0, lafe_pathmatch("abc[\\d-f]gh", "abcggh", 0)); + assertEqualInt(0, lafe_pathmatch("abc[\\d-f]gh", "abc\\gh", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d-\\f]gh", "abcegh", 0)); + assertEqualInt(1, lafe_pathmatch("abc[\\d-\\f]gh", "abcegh", 0)); + assertEqualInt(1, lafe_pathmatch("abc[\\d-\\f]gh", "abcegh", 0)); + /* backslash-quoted '-' isn't special. */ + assertEqualInt(0, lafe_pathmatch("abc[d\\-f]gh", "abcegh", 0)); + assertEqualInt(1, lafe_pathmatch("abc[d\\-f]gh", "abc-gh", 0)); + + /* Leading '!' negates a character class. */ + assertEqualInt(0, lafe_pathmatch("abc[!d]", "abcd", 0)); + assertEqualInt(1, lafe_pathmatch("abc[!d]", "abce", 0)); + assertEqualInt(1, lafe_pathmatch("abc[!d]", "abcc", 0)); + assertEqualInt(0, lafe_pathmatch("abc[!d-z]", "abcq", 0)); + assertEqualInt(1, lafe_pathmatch("abc[!d-gi-z]", "abch", 0)); + assertEqualInt(1, lafe_pathmatch("abc[!fgijkl]", "abch", 0)); + assertEqualInt(0, lafe_pathmatch("abc[!fghijkl]", "abch", 0)); + + /* Backslash quotes next character. */ + assertEqualInt(0, lafe_pathmatch("abc\\[def]", "abc\\d", 0)); + assertEqualInt(1, lafe_pathmatch("abc\\[def]", "abc[def]", 0)); + assertEqualInt(0, lafe_pathmatch("abc\\\\[def]", "abc[def]", 0)); + assertEqualInt(0, lafe_pathmatch("abc\\\\[def]", "abc\\[def]", 0)); + assertEqualInt(1, lafe_pathmatch("abc\\\\[def]", "abc\\d", 0)); + assertEqualInt(1, lafe_pathmatch("abcd\\", "abcd\\", 0)); + assertEqualInt(0, lafe_pathmatch("abcd\\", "abcd\\[", 0)); + assertEqualInt(0, lafe_pathmatch("abcd\\", "abcde", 0)); + assertEqualInt(0, lafe_pathmatch("abcd\\[", "abcd\\", 0)); + + /* + * Because '.' and '/' have special meanings, we can + * identify many equivalent paths even if they're expressed + * differently. (But quoting a character with '\\' suppresses + * special meanings!) + */ + assertEqualInt(0, lafe_pathmatch("a/b/", "a/bc", 0)); + assertEqualInt(1, lafe_pathmatch("a/./b", "a/b", 0)); + assertEqualInt(0, lafe_pathmatch("a\\/./b", "a/b", 0)); + assertEqualInt(0, lafe_pathmatch("a/\\./b", "a/b", 0)); + assertEqualInt(0, lafe_pathmatch("a/.\\/b", "a/b", 0)); + assertEqualInt(0, lafe_pathmatch("a\\/\\.\\/b", "a/b", 0)); + assertEqualInt(1, lafe_pathmatch("./abc/./def/", "abc/def/", 0)); + assertEqualInt(1, lafe_pathmatch("abc/def", "./././abc/./def", 0)); + assertEqualInt(1, lafe_pathmatch("abc/def/././//", "./././abc/./def/", 0)); + assertEqualInt(1, lafe_pathmatch(".////abc/.//def", "./././abc/./def", 0)); + assertEqualInt(1, lafe_pathmatch("./abc?def/", "abc/def/", 0)); + failure("\"?./\" is not the same as \"/./\""); + assertEqualInt(0, lafe_pathmatch("./abc?./def/", "abc/def/", 0)); + failure("Trailing '/' should match no trailing '/'"); + assertEqualInt(1, lafe_pathmatch("./abc/./def/", "abc/def", 0)); + failure("Trailing '/./' is still the same directory."); + assertEqualInt(1, lafe_pathmatch("./abc/./def/./", "abc/def", 0)); + failure("Trailing '/.' is still the same directory."); + assertEqualInt(1, lafe_pathmatch("./abc/./def/.", "abc/def", 0)); + assertEqualInt(1, lafe_pathmatch("./abc/./def", "abc/def/", 0)); + failure("Trailing '/./' is still the same directory."); + assertEqualInt(1, lafe_pathmatch("./abc/./def", "abc/def/./", 0)); + failure("Trailing '/.' is still the same directory."); + assertEqualInt(1, lafe_pathmatch("./abc*/./def", "abc/def/.", 0)); + + /* Matches not anchored at beginning. */ + assertEqualInt(0, + lafe_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_START)); + assertEqualInt(1, + lafe_pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_START)); + assertEqualInt(0, + lafe_pathmatch("^bcd", "abcd", PATHMATCH_NO_ANCHOR_START)); + assertEqualInt(1, + lafe_pathmatch("b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START)); + assertEqualInt(0, + lafe_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START)); + assertEqualInt(0, + lafe_pathmatch("^b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START)); + + /* Matches not anchored at end. */ + assertEqualInt(0, + lafe_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("abcd", "abcd/", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("abcd", "abcd/.", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(0, + lafe_pathmatch("abc", "abcd", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("a/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(0, + lafe_pathmatch("a/b/c$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("a/b/c$", "a/b/c", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("a/b/c$", "a/b/c/", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("a/b/c/", "a/b/c/d", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(0, + lafe_pathmatch("a/b/c/$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("a/b/c/$", "a/b/c/", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(1, + lafe_pathmatch("a/b/c/$", "a/b/c", PATHMATCH_NO_ANCHOR_END)); + assertEqualInt(0, + lafe_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END)); +} diff --git a/Utilities/cmlibarchive/doc/mdoc2man.awk b/Utilities/cmlibarchive/doc/mdoc2man.awk new file mode 100755 index 000000000..2d67c35d7 --- /dev/null +++ b/Utilities/cmlibarchive/doc/mdoc2man.awk @@ -0,0 +1,391 @@ +#!/usr/bin/awk +# +# Copyright (c) 2003 Peter Stuge +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# Dramatically overhauled by Tim Kientzle. This version almost +# handles library-style pages with Fn, Ft, etc commands. Still +# a lot of problems... + +BEGIN { + displaylines = 0 + trailer = "" + out = "" + sep = "" + nextsep = " " +} + +# Add a word with appropriate preceding whitespace +# Maintain a short queue of the expected upcoming word separators. +function add(str) { + out=out sep str + sep = nextsep + nextsep = " " +} + +# Add a word with no following whitespace +# Use for opening punctuation such as '(' +function addopen(str) { + add(str) + sep = "" +} + +# Add a word with no preceding whitespace +# Use for closing punctuation such as ')' or '.' +function addclose(str) { + sep = "" + add(str) +} + +# Add a word with no space before or after +# Use for separating punctuation such as '=' +function addpunct(str) { + sep = "" + add(str) + sep = "" +} + +# Emit the current line so far +function endline() { + addclose(trailer) + trailer = "" + if(length(out) > 0) { + print out + out="" + } + if(displaylines > 0) { + displaylines = displaylines - 1 + if (displaylines == 0) + dispend() + } + # First word on next line has no preceding whitespace + sep = "" +} + +function linecmd(cmd) { + endline() + add(cmd) + endline() +} + +function breakline() { + linecmd(".br") +} + +# Start an indented display +function dispstart() { + linecmd(".RS 4") +} + +# End an indented display +function dispend() { + linecmd(".RE") +} + +# Collect rest of input line +function wtail() { + retval="" + while(w 0) { + sub("^[ \t]*", "", l) + if (match(l, "^\"")) { + l = substr(l, 2) + o = index(l, "\"") + if (o > 0) { + w = substr(l, 1, o-1) + l = substr(l, o+1) + dest[n++] = w + } else { + dest[n++] = l + l = "" + } + } else { + o = match(l, "[ \t]") + if (o > 0) { + w = substr(l, 1, o-1) + l = substr(l, o+1) + dest[n++] = w + } else { + dest[n++] = l + l = "" + } + } + } + return n-1 +} + +! /^\./ { + out = $0 + endline() + next +} + +/^\.\\"/ { next } + +{ + sub("^\\.","") + nwords=splitwords($0, words) + # TODO: Instead of iterating 'w' over the array, have a separate + # function that returns 'next word' and use that. This will allow + # proper handling of double-quoted arguments as well. + for(w=1;w<=nwords;w++) { + if(match(words[w],"^Li$")) { # Literal; rest of line is unformatted + dispstart() + displaylines = 1 + } else if(match(words[w],"^Dl$")) { # Display literal + dispstart() + displaylines = 1 + } else if(match(words[w],"^Bd$")) { # Begin display + if(match(words[w+1],"-literal")) { + dispstart() + linecmd(".nf") + displaylines=10000 + w=nwords + } + } else if(match(words[w],"^Ed$")) { # End display + displaylines = 0 + dispend() + } else if(match(words[w],"^Ns$")) { # Suppress space after next word + nextsep = "" + } else if(match(words[w],"^No$")) { # Normal text + add(words[++w]) + } else if(match(words[w],"^Dq$")) { # Quote + addopen("``") + add(words[++w]) + while(w") + } else if(match(words[w],"^Dd$")) { + date=wtail() + next + } else if(match(words[w],"^Dt$")) { + id=wtail() + next + } else if(match(words[w],"^Ox$")) { + add("OpenBSD") + } else if(match(words[w],"^Fx$")) { + add("FreeBSD") + } else if(match(words[w],"^Nx$")) { + add("NetBSD") + } else if(match(words[w],"^St$")) { + if (match(words[w+1], "^-p1003.1$")) { + w++ + add("IEEE Std 1003.1 (``POSIX.1'')") + } else if(match(words[w+1], "^-p1003.1-96$")) { + w++ + add("ISO/IEC 9945-1:1996 (``POSIX.1'')") + } else if(match(words[w+1], "^-p1003.1-88$")) { + w++ + add("IEEE Std 1003.1-1988 (``POSIX.1'')") + } else if(match(words[w+1], "^-p1003.1-2001$")) { + w++ + add("IEEE Std 1003.1-2001 (``POSIX.1'')") + } else if(match(words[w+1], "^-susv2$")) { + w++ + add("Version 2 of the Single UNIX Specification (``SUSv2'')") + } + } else if(match(words[w],"^Ex$")) { + if (match(words[w+1], "^-std$")) { + w++ + add("The \\fB" name "\\fP utility exits 0 on success, and >0 if an error occurs.") + } + } else if(match(words[w],"^Os$")) { + add(".TH " id " \"" date "\" \"" wtail() "\"") + } else if(match(words[w],"^Sh$")) { + section=wtail() + add(".SH " section) + linecmd(".ad l") + } else if(match(words[w],"^Xr$")) { + add("\\fB" words[++w] "\\fP(" words[++w] ")" words[++w]) + } else if(match(words[w],"^Nm$")) { + if(match(section,"SYNOPSIS")) + breakline() + if(w >= nwords) + n=name + else if (match(words[w+1], "^[A-Z][a-z]$")) + n=name + else if (match(words[w+1], "^[.,;:]$")) + n=name + else { + n=words[++w] + if(!length(name)) + name=n + } + if(!length(n)) + n=name + add("\\fB\\%" n "\\fP") + } else if(match(words[w],"^Nd$")) { + add("\\- " wtail()) + } else if(match(words[w],"^Fl$")) { + add("\\fB\\-" words[++w] "\\fP") + } else if(match(words[w],"^Ar$")) { + addopen("\\fI") + if(w==nwords) + add("file ...\\fP") + else + add(words[++w] "\\fP") + } else if(match(words[w],"^Cm$")) { + add("\\fB" words[++w] "\\fP") + } else if(match(words[w],"^Op$")) { + addopen("[") + option=1 + trailer="]" trailer + } else if(match(words[w],"^Pp$")) { + linecmd(".PP") + } else if(match(words[w],"^An$")) { + endline() + } else if(match(words[w],"^Ss$")) { + add(".SS") + } else if(match(words[w],"^Ft$")) { + if (match(section, "SYNOPSIS")) { + breakline() + } + add("\\fI" wtail() "\\fP") + if (match(section, "SYNOPSIS")) { + breakline() + } + } else if(match(words[w],"^Fn$")) { + ++w + F = "\\fB\\%" words[w] "\\fP(" + Fsep = "" + while(w\\fP") + } else if(match(words[w],"^Pa$")) { + addopen("\\fI") + w++ + if(match(words[w],"^\\.")) + add("\\&") + add(words[w] "\\fP") + } else if(match(words[w],"^Dv$")) { + add(".BR") + } else if(match(words[w],"^Em|Ev$")) { + add(".IR") + } else if(match(words[w],"^Pq$")) { + addopen("(") + trailer=")" trailer + } else if(match(words[w],"^Aq$")) { + addopen("\\%<") + trailer=">" trailer + } else if(match(words[w],"^Brq$")) { + addopen("{") + trailer="}" trailer + } else if(match(words[w],"^S[xy]$")) { + add(".B " wtail()) + } else if(match(words[w],"^Ic$")) { + add("\\fB") + trailer="\\fP" trailer + } else if(match(words[w],"^Bl$")) { + oldoptlist=optlist + linecmd(".RS 5") + if(match(words[w+1],"-bullet")) + optlist=1 + else if(match(words[w+1],"-enum")) { + optlist=2 + enum=0 + } else if(match(words[w+1],"-tag")) + optlist=3 + else if(match(words[w+1],"-item")) + optlist=4 + else if(match(words[w+1],"-bullet")) + optlist=1 + w=nwords + } else if(match(words[w],"^El$")) { + linecmd(".RE") + optlist=oldoptlist + } else if(match(words[w],"^It$")&&optlist) { + if(optlist==1) + add(".IP \\(bu") + else if(optlist==2) + add(".IP " ++enum ".") + else if(optlist==3) { + add(".TP") + endline() + if(match(words[w+1],"^Pa$|^Ev$")) { + add(".B") + w++ + } + } else if(optlist==4) + add(".IP") + } else if(match(words[w],"^Xo$")) { + # TODO: Figure out how to handle this + } else if(match(words[w],"^Xc$")) { + # TODO: Figure out how to handle this + } else if(match(words[w],"^[=]$")) { + addpunct(words[w]) + } else if(match(words[w],"^[\[{(]$")) { + addopen(words[w]) + } else if(match(words[w],"^[\\\])}.,;:]$")) { + addclose(words[w]) + } else { + add(words[w]) + } + } + if(match(out,"^\\.[^a-zA-Z]")) + sub("^\\.","",out) + endline() +} diff --git a/Utilities/cmlibarchive/doc/mdoc2wiki.awk b/Utilities/cmlibarchive/doc/mdoc2wiki.awk new file mode 100755 index 000000000..5d063be3e --- /dev/null +++ b/Utilities/cmlibarchive/doc/mdoc2wiki.awk @@ -0,0 +1,448 @@ +#!/usr/bin/awk +# +# Copyright (c) 2003 Peter Stuge +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# Dramatically overhauled by Tim Kientzle. This version almost +# handles library-style pages with Fn, Ft, etc commands. Still +# a lot of problems... + +BEGIN { + displaylines = 0 + listdepth = 0 + trailer = "" + out = "" + sep = "" + nextsep = " " + spaces = " " +} + +# Add a word with appropriate preceding whitespace +# Maintain a short queue of the expected upcoming word separators. +function add(str) { + out=out sep str + sep = nextsep + nextsep = " " +} + +# Add a word with no following whitespace +# Use for opening punctuation such as '(' +function addopen(str) { + add(str) + sep = "" +} + +# Add a word with no preceding whitespace +# Use for closing punctuation such as ')' or '.' +function addclose(str) { + sep = "" + add(str) +} + +# Add a word with no space before or after +# Use for separating punctuation such as '=' +function addpunct(str) { + sep = "" + add(str) + sep = "" +} + +# Emit the current line so far +function endline() { + addclose(trailer) + trailer = "" + if(length(out) > 0) { + print out + out="" + } + if(displaylines > 0) { + displaylines = displaylines - 1 + if (displaylines == 0) + dispend() + } + # First word on next line has no preceding whitespace + sep = "" +} + +function linecmd(cmd) { + endline() + add(cmd) + endline() +} + +function breakline() { + linecmd("
") +} + +# Start an indented display +function dispstart() { + linecmd("{{{") +} + +# End an indented display +function dispend() { + linecmd("}}}") +} + +# Collect rest of input line +function wtail() { + retval="" + while(w 0) { + sub("^[ \t]*", "", l) + if (match(l, "^\"")) { + l = substr(l, 2) + o = index(l, "\"") + if (o > 0) { + w = substr(l, 1, o-1) + l = substr(l, o+1) + dest[n++] = w + } else { + dest[n++] = l + l = "" + } + } else { + o = match(l, "[ \t]") + if (o > 0) { + w = substr(l, 1, o-1) + l = substr(l, o+1) + dest[n++] = w + } else { + dest[n++] = l + l = "" + } + } + } + return n-1 +} + +! /^\./ { + out = $0 + endline() + next +} + +/^\.\\"/ { next } + +{ + sub("^\\.","") + nwords=splitwords($0, words) + # TODO: Instead of iterating 'w' over the array, have a separate + # function that returns 'next word' and use that. This will allow + # proper handling of double-quoted arguments as well. + for(w=1;w<=nwords;w++) { + if(match(words[w],"^Li$")) { # Literal; rest of line is unformatted + dispstart() + displaylines = 1 + } else if(match(words[w],"^Dl$")) { # Display literal + dispstart() + displaylines = 1 + } else if(match(words[w],"^Bd$")) { # Begin display + if(match(words[w+1],"-literal")) { + dispstart() + displaylines=10000 + w=nwords + } + } else if(match(words[w],"^Ed$")) { # End display + displaylines = 0 + dispend() + } else if(match(words[w],"^Ns$")) { # Suppress space before next word + sep="" + } else if(match(words[w],"^No$")) { # Normal text + add(words[++w]) + } else if(match(words[w],"^Dq$")) { # Quote + addopen("\"") + add(words[++w]) + while(w`") + } else if(match(words[w],"^Dd$")) { + date=wtail() + next + } else if(match(words[w],"^Dt$")) { + id=wtail() + next + } else if(match(words[w],"^Ox$")) { + add("OpenBSD") + } else if(match(words[w],"^Fx$")) { + add("FreeBSD") + } else if(match(words[w],"^Bx$")) { + add("BSD") + } else if(match(words[w],"^Nx$")) { + add("NetBSD") + } else if(match(words[w],"^St$")) { + if (match(words[w+1], "^-p1003.1$")) { + w++ + add("IEEE Std 1003.1 (``POSIX.1'')") + } else if(match(words[w+1], "^-p1003.1-96$")) { + w++ + add("ISO/IEC 9945-1:1996 (``POSIX.1'')") + } else if(match(words[w+1], "^-p1003.1-88$")) { + w++ + add("IEEE Std 1003.1-1988 (``POSIX.1'')") + } else if(match(words[w+1], "^-p1003.1-2001$")) { + w++ + add("IEEE Std 1003.1-2001 (``POSIX.1'')") + } else if(match(words[w+1], "^-susv2$")) { + w++ + add("Version 2 of the Single UNIX Specification (``SUSv2'')") + } + } else if(match(words[w],"^Ex$")) { + if (match(words[w+1], "^-std$")) { + w++ + add("The *" name "* utility exits 0 on success, and >0 if an error occurs.") + } + } else if(match(words[w],"^Os$")) { + add("#summary " id " manual page") + } else if(match(words[w],"^Sh$")) { + section=wtail() + linecmd("== " section " ==") + } else if(match(words[w],"^Xr$")) { + add("*" words[++w] "*(" words[++w] ")" words[++w]) + } else if(match(words[w],"^Nm$")) { + if(match(section,"SYNOPSIS")) + breakline() + if(w >= nwords) + n=name + else if (match(words[w+1], "^[A-Z][a-z]$")) + n=name + else if (match(words[w+1], "^[.,;:]$")) + n=name + else { + n=words[++w] + if(!length(name)) + name=n + } + if(!length(n)) + n=name + if (displaylines == 0) + add("*" n "*") + else + add(n) + } else if(match(words[w],"^Nd$")) { + add("- " wtail()) + } else if(match(words[w],"^Fl$")) { + if (displaylines == 0) + add("*-" words[++w] "*") + else + add("-" words[++w]) + } else if(match(words[w],"^Ar$")) { + if(w==nwords) + add("_file ..._") + else { + ++w + gsub("<", "`<`", words[w]) + add("_" words[w] "_") + } + } else if(match(words[w],"^Cm$")) { + ++w + if (displaylines == 0) { + gsub("^_", "`_`", words[w]) + gsub("\\*$", "`*`", words[w]) + add("*" words[w] "*") + } else + add(words[w]) + } else if(match(words[w],"^Op$")) { + addopen("`[`") + option=1 + trailer="`]`" trailer + } else if(match(words[w],"^Pp$")) { + ++w + endline() + print "" + } else if(match(words[w],"^An$")) { + if (match(words[w+1],"-nosplit")) + ++w + endline() + } else if(match(words[w],"^Ss$")) { + add("===") + trailer="===" + } else if(match(words[w],"^Ft$")) { + if (match(section, "SYNOPSIS")) { + breakline() + } + l = wtail() + gsub("\\*", "`*`", l) + + add("*" l "*") + if (match(section, "SYNOPSIS")) { + breakline() + } + } else if(match(words[w],"^Fn$")) { + ++w + F = "*" words[w] "*(" + Fsep = "" + while(w*") + } else if(match(words[w],"^Pa$")) { + w++ +# if(match(words[w],"^\\.")) +# add("\\&") + if (displaylines == 0) + add("_" words[w] "_") + else + add(words[w]) + } else if(match(words[w],"^Dv$")) { + linecmd() + } else if(match(words[w],"^Em|Ev$")) { + add(".IR") + } else if(match(words[w],"^Pq$")) { + addopen("(") + trailer=")" trailer + } else if(match(words[w],"^Aq$")) { + addopen(" <") + trailer=">" trailer + } else if(match(words[w],"^Brq$")) { + addopen("{") + trailer="}" trailer + } else if(match(words[w],"^S[xy]$")) { + add(".B " wtail()) + } else if(match(words[w],"^Tn$")) { + n=wtail() + gsub("\\*$", "`*`", n) + add("*" n "*") + } else if(match(words[w],"^Ic$")) { + add("\\fB") + trailer="\\fP" trailer + } else if(match(words[w],"^Bl$")) { + ++listdepth + listnext[listdepth]="" + if(match(words[w+1],"-bullet")) { + optlist[listdepth]=1 + addopen("
    ") + listclose[listdepth]="
" + } else if(match(words[w+1],"-enum")) { + optlist[listdepth]=2 + enum=0 + addopen("
    ") + listclose[listdepth]="
" + } else if(match(words[w+1],"-tag")) { + optlist[listdepth]=3 + addopen("
") + listclose[listdepth]="
" + } else if(match(words[w+1],"-item")) { + optlist[listdepth]=4 + addopen("
    ") + listclose[listdepth]="
" + } + w=nwords + } else if(match(words[w],"^El$")) { + addclose(listnext[listdepth]) + addclose(listclose[listdepth]) + listclose[listdepth]="" + listdepth-- + } else if(match(words[w],"^It$")) { + addclose(listnext[listdepth]) + if(optlist[listdepth]==1) { + addpunct("
  • ") + listnext[listdepth] = "
  • " + } else if(optlist[listdepth]==2) { + addpunct("
  • ") + listnext[listdepth] = "
  • " + } else if(optlist[listdepth]==3) { + addpunct("
    ") + listnext[listdepth] = "
    " + if(match(words[w+1],"^Xo$")) { + # Suppress trailer + w++ + } else if(match(words[w+1],"^Pa$|^Ev$")) { + addopen("*") + w++ + add(words[++w] "*") + } else { + trailer = listnext[listdepth] "
    " trailer + listnext[listdepth] = "
    " + } + } else if(optlist[listdepth]==4) { + addpunct("
  • ") + listnext[listdepth] = "
  • " + } + } else if(match(words[w],"^Xo$")) { + # TODO: Figure out how to handle this + } else if(match(words[w],"^Xc$")) { + # TODO: Figure out how to handle this + if (optlist[listdepth] == 3) { + addclose(listnext[listdepth]) + addopen("
    ") + listnext[listdepth] = "
    " + } + } else if(match(words[w],"^[=]$")) { + addpunct(words[w]) + } else if(match(words[w],"^[\[{(]$")) { + addopen(words[w]) + } else if(match(words[w],"^[\\\])}.,;:]$")) { + addclose(words[w]) + } else { + sub("\\\\&", "", words[w]) + add(words[w]) + } + } + if(match(out,"^\\.[^a-zA-Z]")) + sub("^\\.","",out) + endline() +} diff --git a/Utilities/cmlibarchive/doc/update.sh b/Utilities/cmlibarchive/doc/update.sh new file mode 100755 index 000000000..87c8453d0 --- /dev/null +++ b/Utilities/cmlibarchive/doc/update.sh @@ -0,0 +1,112 @@ +#!/bin/sh + +# +# Simple script to repopulate the 'doc' tree from +# the mdoc man pages stored in each project. +# + +# Build Makefile in 'man' directory +cd man +rm -f *.[135] +echo > Makefile +echo "default: all" >>Makefile +echo >>Makefile +all="all:" +for d in libarchive tar cpio; do + for f in ../../$d/*.[135]; do + outname="`basename $f`" + echo >> Makefile + echo $outname: ../mdoc2man.awk $f >> Makefile + echo " awk -f ../mdoc2man.awk < $f > $outname" >> Makefile + all="$all $outname" + done +done +echo $all >>Makefile +cd .. + +# Rebuild Makefile in 'text' directory +cd text +rm -f *.txt +echo > Makefile +echo "default: all" >>Makefile +echo >>Makefile +all="all:" +for d in libarchive tar cpio; do + for f in ../../$d/*.[135]; do + outname="`basename $f`.txt" + echo >> Makefile + echo $outname: $f >> Makefile + echo " nroff -mdoc $f | col -b > $outname" >> Makefile + all="$all $outname" + done +done +echo $all >>Makefile +cd .. + +# Rebuild Makefile in 'pdf' directory +cd pdf +rm -f *.pdf +echo > Makefile +echo "default: all" >>Makefile +echo >>Makefile +all="all:" +for d in libarchive tar cpio; do + for f in ../../$d/*.[135]; do + outname="`basename $f`.pdf" + echo >> Makefile + echo $outname: $f >> Makefile + echo " groff -mdoc -T ps $f | ps2pdf - - > $outname" >> Makefile + all="$all $outname" + done +done +echo $all >>Makefile +cd .. + +# Build Makefile in 'html' directory +cd html +rm -f *.html +echo > Makefile +echo "default: all" >>Makefile +echo >>Makefile +all="all:" +for d in libarchive tar cpio; do + for f in ../../$d/*.[135]; do + outname="`basename $f`.html" + echo >> Makefile + echo $outname: ../mdoc2man.awk $f >> Makefile + echo " groff -mdoc -T html $f > $outname" >> Makefile + all="$all $outname" + done +done +echo $all >>Makefile +cd .. + +# Build Makefile in 'wiki' directory +cd wiki +rm -f *.wiki +echo > Makefile +echo "default: all" >>Makefile +echo >>Makefile +all="all:" +for d in libarchive tar cpio; do + for f in ../../$d/*.[135]; do + outname="`basename $f | awk '{ac=split($0,a,"[_.-]");o="ManPage";for(w=0;w<=ac;++w){o=o toupper(substr(a[w],1,1)) substr(a[w],2)};print o}'`.wiki" + echo >> Makefile + echo $outname: ../mdoc2wiki.awk $f >> Makefile + echo " awk -f ../mdoc2wiki.awk < $f > $outname" >> Makefile + all="$all $outname" + done +done +echo $all >>Makefile +cd .. + +# Convert all of the manpages to -man format +(cd man && make) +# Format all of the manpages to text +(cd text && make) +# Format all of the manpages to PDF +(cd pdf && make) +# Format all of the manpages to HTML +(cd html && make) +# Format all of the manpages to Google Wiki syntax +(cd wiki && make) diff --git a/Utilities/cmlibarchive/examples/minitar/Makefile b/Utilities/cmlibarchive/examples/minitar/Makefile new file mode 100644 index 000000000..4f8e70815 --- /dev/null +++ b/Utilities/cmlibarchive/examples/minitar/Makefile @@ -0,0 +1,34 @@ + +# +# Adjust the following to control which options minitar gets +# built with. See comments in minitar.c for details. +# +CFLAGS= \ + -DNO_BZIP2_CREATE \ + -DNO_BZIP2_EXTRACT \ + -DNO_COMPRESS_EXTRACT \ + -DNO_CPIO_EXTRACT \ + -DNO_CREATE \ + -DNO_GZIP_CREATE \ + -DNO_GZIP_EXTRACT \ + -DNO_LOOKUP + +# Omit 'tree.o' if you're not including create support +#OBJS= minitar.o tree.o +OBJS= minitar.o + +all: minitar + +minitar: $(OBJS) + cc -o minitar -static $(OBJS) -larchive -lz -lbz2 + strip minitar + ls -l minitar + +minitar.o: minitar.c + +tree.o: tree.c + +clean:: + rm -f *.o + rm -f minitar + rm -f *~ diff --git a/Utilities/cmlibarchive/examples/minitar/README b/Utilities/cmlibarchive/examples/minitar/README new file mode 100644 index 000000000..83f646cdb --- /dev/null +++ b/Utilities/cmlibarchive/examples/minitar/README @@ -0,0 +1,12 @@ +"minitar" is a minimal example of a program that uses libarchive to +read/write various archive formats. It's a more ambitious version of +'untar.c' that includes compile-time options to enable/disable various +features, including non-tar formats, archive creation, and automatic +decompression support. + +I use this as a test bed to check for "link pollution," ensuring that +a program using libarchive does not pull in unnecessary code. + +The "minitar" program is also a good starting point for anyone who +wants to use libarchive for their own purposes, as it demonstrates +basic usage of the library. diff --git a/Utilities/cmlibarchive/examples/minitar/minitar.c b/Utilities/cmlibarchive/examples/minitar/minitar.c new file mode 100644 index 000000000..73b4baf44 --- /dev/null +++ b/Utilities/cmlibarchive/examples/minitar/minitar.c @@ -0,0 +1,421 @@ +/*- + * This file is in the public domain. + * Do with it as you will. + */ + +/*- + * This is a compact "tar" program whose primary goal is small size. + * Statically linked, it can be very small indeed. This serves a number + * of goals: + * o a testbed for libarchive (to check for link pollution), + * o a useful tool for space-constrained systems (boot floppies, etc), + * o a place to experiment with new implementation ideas for bsdtar, + * o a small program to demonstrate libarchive usage. + * + * Use the following macros to suppress features: + * NO_BZIP2 - Implies NO_BZIP2_CREATE and NO_BZIP2_EXTRACT + * NO_BZIP2_CREATE - Suppress bzip2 compression support. + * NO_BZIP2_EXTRACT - Suppress bzip2 auto-detection and decompression. + * NO_COMPRESS - Implies NO_COMPRESS_CREATE and NO_COMPRESS_EXTRACT + * NO_COMPRESS_CREATE - Suppress compress(1) compression support + * NO_COMPRESS_EXTRACT - Suppress compress(1) auto-detect and decompression. + * NO_CREATE - Suppress all archive creation support. + * NO_CPIO_EXTRACT - Suppress auto-detect and dearchiving of cpio archives. + * NO_GZIP - Implies NO_GZIP_CREATE and NO_GZIP_EXTRACT + * NO_GZIP_CREATE - Suppress gzip compression support. + * NO_GZIP_EXTRACT - Suppress gzip auto-detection and decompression. + * NO_LOOKUP - Try to avoid getpw/getgr routines, which can be very large + * NO_TAR_EXTRACT - Suppress tar extraction + * + * With all of the above macros defined (except NO_TAR_EXTRACT), you + * get a very small program that can recognize and extract essentially + * any uncompressed tar archive. On FreeBSD 5.1, this minimal program + * is under 64k, statically linked, which compares rather favorably to + * main(){printf("hello, world");} + * which is over 60k statically linked on the same operating system. + * Without any of the above macros, you get a static executable of + * about 180k with a lot of very sophisticated modern features. + * Obviously, it's trivial to add support for ISO, Zip, mtree, + * lzma/xz, etc. Just fill in the appropriate setup calls. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef NO_CREATE +#include "tree.h" +#endif + +/* + * NO_CREATE implies NO_BZIP2_CREATE and NO_GZIP_CREATE and NO_COMPRESS_CREATE. + */ +#ifdef NO_CREATE +#undef NO_BZIP2_CREATE +#define NO_BZIP2_CREATE +#undef NO_COMPRESS_CREATE +#define NO_COMPRESS_CREATE +#undef NO_GZIP_CREATE +#define NO_GZIP_CREATE +#endif + +/* + * The combination of NO_BZIP2_CREATE and NO_BZIP2_EXTRACT is + * equivalent to NO_BZIP2. + */ +#ifdef NO_BZIP2_CREATE +#ifdef NO_BZIP2_EXTRACT +#undef NO_BZIP2 +#define NO_BZIP2 +#endif +#endif + +#ifdef NO_BZIP2 +#undef NO_BZIP2_EXTRACT +#define NO_BZIP2_EXTRACT +#undef NO_BZIP2_CREATE +#define NO_BZIP2_CREATE +#endif + +/* + * The combination of NO_COMPRESS_CREATE and NO_COMPRESS_EXTRACT is + * equivalent to NO_COMPRESS. + */ +#ifdef NO_COMPRESS_CREATE +#ifdef NO_COMPRESS_EXTRACT +#undef NO_COMPRESS +#define NO_COMPRESS +#endif +#endif + +#ifdef NO_COMPRESS +#undef NO_COMPRESS_EXTRACT +#define NO_COMPRESS_EXTRACT +#undef NO_COMPRESS_CREATE +#define NO_COMPRESS_CREATE +#endif + +/* + * The combination of NO_GZIP_CREATE and NO_GZIP_EXTRACT is + * equivalent to NO_GZIP. + */ +#ifdef NO_GZIP_CREATE +#ifdef NO_GZIP_EXTRACT +#undef NO_GZIP +#define NO_GZIP +#endif +#endif + +#ifdef NO_GZIP +#undef NO_GZIP_EXTRACT +#define NO_GZIP_EXTRACT +#undef NO_GZIP_CREATE +#define NO_GZIP_CREATE +#endif + +#ifndef NO_CREATE +static void create(const char *filename, int compress, const char **argv); +#endif +static void errmsg(const char *); +static void extract(const char *filename, int do_extract, int flags); +static int copy_data(struct archive *, struct archive *); +static void msg(const char *); +static void usage(void); + +static int verbose = 0; + +int +main(int argc, const char **argv) +{ + const char *filename = NULL; + int compress, flags, mode, opt; + + (void)argc; + mode = 'x'; + verbose = 0; + compress = '\0'; + flags = ARCHIVE_EXTRACT_TIME; + + /* Among other sins, getopt(3) pulls in printf(3). */ + while (*++argv != NULL && **argv == '-') { + const char *p = *argv + 1; + + while ((opt = *p++) != '\0') { + switch (opt) { +#ifndef NO_CREATE + case 'c': + mode = opt; + break; +#endif + case 'f': + if (*p != '\0') + filename = p; + else + filename = *++argv; + p += strlen(p); + break; +#ifndef NO_BZIP2_CREATE + case 'j': + compress = opt; + break; +#endif + case 'p': + flags |= ARCHIVE_EXTRACT_PERM; + flags |= ARCHIVE_EXTRACT_ACL; + flags |= ARCHIVE_EXTRACT_FFLAGS; + break; + case 't': + mode = opt; + break; + case 'v': + verbose++; + break; + case 'x': + mode = opt; + break; +#ifndef NO_BZIP2_CREATE + case 'y': + compress = opt; + break; +#endif +#ifndef NO_COMPRESS_CREATE + case 'Z': + compress = opt; + break; +#endif +#ifndef NO_GZIP_CREATE + case 'z': + compress = opt; + break; +#endif + default: + usage(); + } + } + } + + switch (mode) { +#ifndef NO_CREATE + case 'c': + create(filename, compress, argv); + break; +#endif + case 't': + extract(filename, 0, flags); + break; + case 'x': + extract(filename, 1, flags); + break; + } + + return (0); +} + + +#ifndef NO_CREATE +static char buff[16384]; + +static void +create(const char *filename, int compress, const char **argv) +{ + struct archive *a; + struct archive *disk; + struct archive_entry *entry; + ssize_t len; + int fd; + + a = archive_write_new(); + switch (compress) { +#ifndef NO_BZIP2_CREATE + case 'j': case 'y': + archive_write_set_compression_bzip2(a); + break; +#endif +#ifndef NO_COMPRESS_CREATE + case 'Z': + archive_write_set_compression_compress(a); + break; +#endif +#ifndef NO_GZIP_CREATE + case 'z': + archive_write_set_compression_gzip(a); + break; +#endif + default: + archive_write_set_compression_none(a); + break; + } + archive_write_set_format_ustar(a); + if (strcmp(filename, "-") == 0) + filename = NULL; + archive_write_open_file(a, filename); + + disk = archive_read_disk_new(); +#ifndef NO_LOOKUP + archive_read_disk_set_standard_lookup(disk); +#endif + while (*argv != NULL) { + struct tree *t = tree_open(*argv); + while (tree_next(t)) { + entry = archive_entry_new(); + archive_entry_set_pathname(entry, tree_current_path(t)); + archive_read_disk_entry_from_file(disk, entry, -1, + tree_current_stat(t)); + if (verbose) { + msg("a "); + msg(tree_current_path(t)); + } + archive_write_header(a, entry); + fd = open(tree_current_access_path(t), O_RDONLY); + len = read(fd, buff, sizeof(buff)); + while (len > 0) { + archive_write_data(a, buff, len); + len = read(fd, buff, sizeof(buff)); + } + close(fd); + archive_entry_free(entry); + if (verbose) + msg("\n"); + } + argv++; + } + archive_write_close(a); + archive_write_finish(a); +} +#endif + +static void +extract(const char *filename, int do_extract, int flags) +{ + struct archive *a; + struct archive *ext; + struct archive_entry *entry; + int r; + + a = archive_read_new(); + ext = archive_write_disk_new(); + archive_write_disk_set_options(ext, flags); +#ifndef NO_BZIP2_EXTRACT + archive_read_support_compression_bzip2(a); +#endif +#ifndef NO_GZIP_EXTRACT + archive_read_support_compression_gzip(a); +#endif +#ifndef NO_COMPRESS_EXTRACT + archive_read_support_compression_compress(a); +#endif +#ifndef NO_TAR_EXTRACT + archive_read_support_format_tar(a); +#endif +#ifndef NO_CPIO_EXTRACT + archive_read_support_format_cpio(a); +#endif +#ifndef NO_LOOKUP + archive_write_disk_set_standard_lookup(ext); +#endif + if (filename != NULL && strcmp(filename, "-") == 0) + filename = NULL; + if ((r = archive_read_open_file(a, filename, 10240))) { + errmsg(archive_error_string(a)); + errmsg("\n"); + exit(r); + } + for (;;) { + r = archive_read_next_header(a, &entry); + if (r == ARCHIVE_EOF) + break; + if (r != ARCHIVE_OK) { + errmsg(archive_error_string(a)); + errmsg("\n"); + exit(1); + } + if (verbose && do_extract) + msg("x "); + if (verbose || !do_extract) + msg(archive_entry_pathname(entry)); + if (do_extract) { + r = archive_write_header(ext, entry); + if (r != ARCHIVE_OK) + errmsg(archive_error_string(a)); + else + copy_data(a, ext); + } + if (verbose || !do_extract) + msg("\n"); + } + archive_read_close(a); + archive_read_finish(a); + exit(0); +} + +static int +copy_data(struct archive *ar, struct archive *aw) +{ + int r; + const void *buff; + size_t size; + off_t offset; + + for (;;) { + r = archive_read_data_block(ar, &buff, &size, &offset); + if (r == ARCHIVE_EOF) { + errmsg(archive_error_string(ar)); + return (ARCHIVE_OK); + } + if (r != ARCHIVE_OK) + return (r); + r = archive_write_data_block(aw, buff, size, offset); + if (r != ARCHIVE_OK) { + errmsg(archive_error_string(ar)); + return (r); + } + } +} + +static void +msg(const char *m) +{ + write(1, m, strlen(m)); +} + +static void +errmsg(const char *m) +{ + write(2, m, strlen(m)); +} + +static void +usage(void) +{ +/* Many program options depend on compile options. */ + const char *m = "Usage: minitar [-" +#ifndef NO_CREATE + "c" +#endif +#ifndef NO_BZIP2 + "j" +#endif + "tvx" +#ifndef NO_BZIP2 + "y" +#endif +#ifndef NO_COMPRESS + "Z" +#endif +#ifndef NO_GZIP + "z" +#endif + "] [-f file] [file]\n"; + + errmsg(m); + exit(1); +} diff --git a/Utilities/cmlibarchive/examples/minitar/notes b/Utilities/cmlibarchive/examples/minitar/notes new file mode 100644 index 000000000..79728d4e5 --- /dev/null +++ b/Utilities/cmlibarchive/examples/minitar/notes @@ -0,0 +1,50 @@ +create(const char* filename) +{ + struct archive *a; + a = archive_write_new(); +// pick a compression type + archive_write_set_compression_bzip2(a); + archive_write_set_compression_compress(a); + archive_write_set_compression_gzip(a); + archive_write_set_compression_none(a); + +// what does this do??? + archive_write_set_format_ustar(a); // is this what we want? +// maybe this: + archive_write_set_format_pax(a); + + archive_write_open_file(a, filename); + + struct archive* disk = archive_read_disk_new(); + archive_read_disk_set_standard_lookup(disk); + while (*argv != NULL) + { + struct tree *t = tree_open(*argv); + while (tree_next(t)) + { + entry = archive_entry_new(); + archive_entry_set_pathname(entry, tree_current_path(t)); + archive_read_disk_entry_from_file(disk, entry, -1, + tree_current_stat(t)); + if (verbose) + { + msg("a "); + msg(tree_current_path(t)); + } + archive_write_header(a, entry); + int fd = open(tree_current_access_path(t), O_RDONLY); + char buff[16384]; + len = read(fd, buff, sizeof(buff)); + while (len > 0) + { + archive_write_data(a, buff, len); + len = read(fd, buff, sizeof(buff)); + } + close(fd); + archive_entry_free(entry); + if (verbose) + msg("\n"); + } + } + +} diff --git a/Utilities/cmlibarchive/examples/minitar/tree.c b/Utilities/cmlibarchive/examples/minitar/tree.c new file mode 100644 index 000000000..ae92635f6 --- /dev/null +++ b/Utilities/cmlibarchive/examples/minitar/tree.c @@ -0,0 +1,423 @@ +/*- + * Copyright (c) 2003-2004 Tim Kientzle + * 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. + */ + +/*- + * There is a single list of "tree_entry" items that represent + * filesystem objects that require further attention. Non-directories + * are not kept in memory: they are pulled from readdir(), returned to + * the client, then freed as soon as possible. Any directory entry to + * be traversed gets pushed onto the stack. + * + * There is surprisingly little information that needs to be kept for + * each item on the stack. Just the name, depth (represented here as the + * string length of the parent directory's pathname), and some markers + * indicating how to get back to the parent (via chdir("..") for a + * regular dir or via fchdir(2) for a symlink). + */ + +#include +#include +#include +#include +#include +#include + +#include "tree.h" + +/* + * TODO: + * 1) Loop checking. + * 3) Arbitrary logical traversals by closing/reopening intermediate fds. + */ + +struct tree_entry { + struct tree_entry *next; + char *name; + size_t dirname_length; + int fd; + int flags; +}; + +/* Definitions for tree_entry.flags bitmap. */ +#define isDir 1 /* This entry is a regular directory. */ +#define isDirLink 2 /* This entry is a symbolic link to a directory. */ +#define needsTraversal 4 /* This entry hasn't yet been traversed. */ + +/* + * Local data for this package. + */ +struct tree { + struct tree_entry *stack; + DIR *d; + int initialDirFd; + int flags; + + char *buff; + char *basename; + size_t buff_length; + size_t path_length; + size_t dirname_length; + + int depth; + int openCount; + int maxOpenCount; + + struct stat lst; + struct stat st; +}; + +/* Definitions for tree.flags bitmap. */ +#define needsReturn 8 /* Marks first entry as not having been returned yet. */ +#define hasStat 16 /* The st entry is set. */ +#define hasLstat 32 /* The lst entry is set. */ + + +#define HAVE_DIRENT_D_NAMLEN 1 +#ifdef HAVE_DIRENT_D_NAMLEN +/* BSD extension; avoids need for a strlen() call. */ +#define D_NAMELEN(dp) (dp)->d_namlen +#else +#define D_NAMELEN(dp) (strlen((dp)->d_name)) +#endif + +#if 0 +static void +dumpStack(struct tree *t) +{ + struct tree_entry *te; + + printf("\tbuff: %s\n", t->buff); + printf("\tpwd: "); fflush(stdout); system("pwd"); + printf("\tstack:\n"); + for (te = t->stack; te != NULL; te = te->next) { + printf("\t\tte->name: %s %s\n", te->name, te->flags & needsTraversal ? "" : "*"); + } +} +#endif + +/* + * Add a directory path to the current stack. + */ +static void +tree_add(struct tree *t, const char *path) +{ + struct tree_entry *te; + + te = malloc(sizeof(*te)); + memset(te, 0, sizeof(*te)); + te->next = t->stack; + t->stack = te; + te->fd = -1; + te->name = strdup(path); + te->flags = needsTraversal; + te->dirname_length = t->dirname_length; +} + +/* + * Append a name to the current path. + */ +static void +tree_append(struct tree *t, const char *name, size_t name_length) +{ + if (t->buff != NULL) + t->buff[t->dirname_length] = '\0'; + + /* Resize pathname buffer as needed. */ + while (name_length + 1 + t->dirname_length >= t->buff_length) { + t->buff_length *= 2; + if (t->buff_length < 1024) + t->buff_length = 1024; + t->buff = realloc(t->buff, t->buff_length); + } + t->basename = t->buff + t->dirname_length; + t->path_length = t->dirname_length + name_length; + if (t->dirname_length > 0) { + *t->basename++ = '/'; + t->path_length ++; + } + strcpy(t->basename, name); +} + +/* + * Open a directory tree for traversal. + */ +struct tree * +tree_open(const char *path) +{ + struct tree *t; + + t = malloc(sizeof(*t)); + memset(t, 0, sizeof(*t)); + tree_append(t, path, strlen(path)); + t->initialDirFd = open(".", O_RDONLY); + /* + * During most of the traversal, items are set up and then + * returned immediately from tree_next(). That doesn't work + * for the very first entry, so we set a flag for this special + * case. + */ + t->flags = needsReturn; + return (t); +} + +/* + * We've finished a directory; ascend back to the parent. + */ +static void +tree_ascend(struct tree *t) +{ + struct tree_entry *te; + + te = t->stack; + t->depth--; + if (te->flags & isDirLink) { + fchdir(te->fd); + close(te->fd); + t->openCount--; + } else { + chdir(".."); + } +} + +/* + * Pop the working stack. + */ +static void +tree_pop(struct tree *t) +{ + struct tree_entry *te; + + te = t->stack; + t->stack = te->next; + t->dirname_length = te->dirname_length; + free(te->name); + free(te); +} + +/* + * Get the next item in the tree traversal. + */ +int +tree_next(struct tree *t) +{ + struct dirent *de = NULL; + + /* Handle the startup case by returning the initial entry. */ + if (t->flags & needsReturn) { + t->flags &= ~needsReturn; + return (1); + } + + while (t->stack != NULL) { + /* If there's an open dir, get the next entry from there. */ + while (t->d != NULL) { + de = readdir(t->d); + if (de == NULL) { + closedir(t->d); + t->d = NULL; + } else if (de->d_name[0] == '.' + && de->d_name[1] == '\0') { + /* Skip '.' */ + } else if (de->d_name[0] == '.' + && de->d_name[1] == '.' + && de->d_name[2] == '\0') { + /* Skip '..' */ + } else { + /* + * Append the path to the current path + * and return it. + */ + tree_append(t, de->d_name, D_NAMELEN(de)); + t->flags &= ~hasLstat; + t->flags &= ~hasStat; + return (1); + } + } + + /* If the current dir needs to be traversed, set it up. */ + if (t->stack->flags & needsTraversal) { + tree_append(t, t->stack->name, strlen(t->stack->name)); + t->stack->flags &= ~needsTraversal; + /* If it is a link, set up fd for the ascent. */ + if (t->stack->flags & isDirLink) { + t->stack->fd = open(".", O_RDONLY); + t->openCount++; + if (t->openCount > t->maxOpenCount) + t->maxOpenCount = t->openCount; + } + if (chdir(t->stack->name) == 0) { + t->depth++; + t->dirname_length = t->path_length; + t->d = opendir("."); + } else + tree_pop(t); + continue; + } + + /* We've done everything necessary for the top stack entry. */ + tree_ascend(t); + tree_pop(t); + } + return (0); +} + +/* + * Called by the client to mark the directory just returned from + * tree_next() as needing to be visited. + */ +void +tree_descend(struct tree *t) +{ + const struct stat *s = tree_current_lstat(t); + + if (S_ISDIR(s->st_mode)) { + tree_add(t, t->basename); + t->stack->flags |= isDir; + } + + if (S_ISLNK(s->st_mode) && S_ISDIR(tree_current_stat(t)->st_mode)) { + tree_add(t, t->basename); + t->stack->flags |= isDirLink; + } +} + +/* + * Get the stat() data for the entry just returned from tree_next(). + */ +const struct stat * +tree_current_stat(struct tree *t) +{ + if (!(t->flags & hasStat)) { + stat(t->basename, &t->st); + t->flags |= hasStat; + } + return (&t->st); +} + +/* + * Get the lstat() data for the entry just returned from tree_next(). + */ +const struct stat * +tree_current_lstat(struct tree *t) +{ + if (!(t->flags & hasLstat)) { + lstat(t->basename, &t->lst); + t->flags |= hasLstat; + } + return (&t->lst); +} + +/* + * Return the access path for the entry just returned from tree_next(). + */ +const char * +tree_current_access_path(struct tree *t) +{ + return (t->basename); +} + +/* + * Return the full path for the entry just returned from tree_next(). + */ +const char * +tree_current_path(struct tree *t) +{ + return (t->buff); +} + +/* + * Return the length of the path for the entry just returned from tree_next(). + */ +size_t +tree_current_pathlen(struct tree *t) +{ + return (t->path_length); +} + +/* + * Return the nesting depth of the entry just returned from tree_next(). + */ +int +tree_current_depth(struct tree *t) +{ + return (t->depth); +} + +/* + * Terminate the traversal and release any resources. + */ +void +tree_close(struct tree *t) +{ + /* Release anything remaining in the stack. */ + while (t->stack != NULL) + tree_pop(t); + if (t->buff) + free(t->buff); + /* chdir() back to where we started. */ + if (t->initialDirFd >= 0) { + fchdir(t->initialDirFd); + close(t->initialDirFd); + t->initialDirFd = -1; + } + free(t); +} + + +#if 0 +/* Main function for testing. */ +#include + +int main(int argc, char **argv) +{ + size_t max_path_len = 0; + int max_depth = 0; + + system("pwd"); + while (*++argv) { + struct tree *t = tree_open(*argv); + while (tree_next(t)) { + size_t path_len = tree_current_pathlen(t); + int depth = tree_current_depth(t); + if (path_len > max_path_len) + max_path_len = path_len; + if (depth > max_depth) + max_depth = depth; + printf("%s\n", tree_current_path(t)); + if (S_ISDIR(tree_current_lstat(t)->st_mode)) + tree_descend(t); /* Descend into every dir. */ + } + tree_close(t); + printf("Max path length: %d\n", max_path_len); + printf("Max depth: %d\n", max_depth); + printf("Final open count: %d\n", t->openCount); + printf("Max open count: %d\n", t->maxOpenCount); + fflush(stdout); + system("pwd"); + } + return (0); +} +#endif diff --git a/Utilities/cmlibarchive/examples/minitar/tree.h b/Utilities/cmlibarchive/examples/minitar/tree.h new file mode 100644 index 000000000..554e6c2da --- /dev/null +++ b/Utilities/cmlibarchive/examples/minitar/tree.h @@ -0,0 +1,78 @@ +/*- + * Copyright (c) 2003-2004 Tim Kientzle + * 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. + */ + +/*- + * A set of routines for traversing directory trees. + * Similar in concept to the fts library, but with a few + * important differences: + * * Uses less memory. In particular, fts stores an entire directory + * in memory at a time. This package only keeps enough subdirectory + * information in memory to track the traversal. Information + * about non-directories is discarded as soon as possible. + * * Supports very deep logical traversals. The fts package + * uses "non-chdir" approach for logical traversals. This + * package does use a chdir approach for logical traversals + * and can therefore handle pathnames much longer than + * PATH_MAX. + * * Supports deep physical traversals "out of the box." + * Due to the memory optimizations above, there's no need to + * limit dir names to 32k. + */ + +#include + +struct tree; + +struct tree *tree_open(const char *); +/* Returns TRUE if there is a next entry. Zero if there is no next entry. */ +int tree_next(struct tree *); +/* Return information about the current entry. */ +int tree_current_depth(struct tree *); +/* + * The current full pathname, length of the full pathname, + * and a name that can be used to access the file. + * Because tree does use chdir extensively, the access path is + * almost never the same as the full current path. + */ +const char *tree_current_path(struct tree *); +size_t tree_current_pathlen(struct tree *); +const char *tree_current_access_path(struct tree *); +/* + * Request the lstat() or stat() data for the current path. + * Since the tree package needs to do some of this anyway, + * you should take advantage of it here if you need it. + */ +const struct stat *tree_current_stat(struct tree *); +const struct stat *tree_current_lstat(struct tree *); +/* + * Request that current entry be visited. If you invoke it on every + * directory, you'll get a physical traversal. This is ignored if the + * current entry isn't a directory or a link to a directory. So, if + * you invoke this on every returned path, you'll get a full logical + * traversal. + */ +void tree_descend(struct tree *); +void tree_close(struct tree *); diff --git a/Utilities/cmlibarchive/examples/tarfilter.c b/Utilities/cmlibarchive/examples/tarfilter.c new file mode 100644 index 000000000..9097d1259 --- /dev/null +++ b/Utilities/cmlibarchive/examples/tarfilter.c @@ -0,0 +1,113 @@ +/* + * This file is in the public domain. + * + * Feel free to use it as you wish. + */ + +/* + * This example program reads an archive from stdin (which can be in + * any format recognized by libarchive) and writes certain entries to + * an uncompressed ustar archive on stdout. This is a template for + * many kinds of archive manipulation: converting formats, resetting + * ownership, inserting entries, removing entries, etc. + * + * To compile: + * gcc -Wall -o tarfilter tarfilter.c -larchive -lz -lbz2 + */ + +#include +#include +#include +#include +#include +#include + +static void +die(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, "\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + char buff[8192]; + ssize_t len; + int r; + mode_t m; + struct archive *ina; + struct archive *outa; + struct archive_entry *entry; + + /* Read an archive from stdin, with automatic format detection. */ + ina = archive_read_new(); + if (ina == NULL) + die("Couldn't create archive reader."); + if (archive_read_support_compression_all(ina) != ARCHIVE_OK) + die("Couldn't enable decompression"); + if (archive_read_support_format_all(ina) != ARCHIVE_OK) + die("Couldn't enable read formats"); + if (archive_read_open_fd(ina, 0, 10240) != ARCHIVE_OK) + die("Couldn't open input archive"); + + /* Write an uncompressed ustar archive to stdout. */ + outa = archive_write_new(); + if (outa == NULL) + die("Couldn't create archive writer."); + if (archive_write_set_compression_none(outa) != ARCHIVE_OK) + die("Couldn't enable compression"); + if (archive_write_set_format_ustar(outa) != ARCHIVE_OK) + die("Couldn't set output format"); + if (archive_write_open_fd(outa, 1) != ARCHIVE_OK) + die("Couldn't open output archive"); + + /* Examine each entry in the input archive. */ + while ((r = archive_read_next_header(ina, &entry)) == ARCHIVE_OK) { + fprintf(stderr, "%s: ", archive_entry_pathname(entry)); + + /* Skip anything that isn't a regular file. */ + if (!S_ISREG(archive_entry_mode(entry))) { + fprintf(stderr, "skipped\n"); + continue; + } + + /* Make everything owned by root/wheel. */ + archive_entry_set_uid(entry, 0); + archive_entry_set_uname(entry, "root"); + archive_entry_set_gid(entry, 0); + archive_entry_set_gname(entry, "wheel"); + + /* Make everything permission 0744, strip SUID, etc. */ + m = archive_entry_mode(entry); + archive_entry_set_mode(entry, (m & ~07777) | 0744); + + /* Copy input entries to output archive. */ + if (archive_write_header(outa, entry) != ARCHIVE_OK) + die("Error writing output archive"); + if (archive_entry_size(entry) > 0) { + len = archive_read_data(ina, buff, sizeof(buff)); + while (len > 0) { + if (archive_write_data(outa, buff, len) != len) + die("Error writing output archive"); + len = archive_read_data(ina, buff, sizeof(buff)); + } + if (len < 0) + die("Error reading input archive"); + } + fprintf(stderr, "copied\n"); + } + if (r != ARCHIVE_EOF) + die("Error reading archive"); + /* Close the archives. */ + if (archive_read_finish(ina) != ARCHIVE_OK) + die("Error closing input archive"); + if (archive_write_finish(outa) != ARCHIVE_OK) + die("Error closing output archive"); + return (0); +} diff --git a/Utilities/cmlibarchive/examples/untar.c b/Utilities/cmlibarchive/examples/untar.c new file mode 100644 index 000000000..f0d54c216 --- /dev/null +++ b/Utilities/cmlibarchive/examples/untar.c @@ -0,0 +1,262 @@ +/* + * This file is in the public domain. + * Use it as you wish. + */ + +/* + * This is a compact tar extraction program using libarchive whose + * primary goal is small executable size. Statically linked, it can + * be very small, depending in large part on how cleanly factored your + * system libraries are. Note that this uses the standard libarchive, + * without any special recompilation. The only functional concession + * is that this program uses the uid/gid from the archive instead of + * doing uname/gname lookups. (Add a call to + * archive_write_disk_set_standard_lookup() to enable uname/gname + * lookups, but be aware that this can add 500k or more to a static + * executable, depending on the system libraries, since user/group + * lookups frequently pull in password, YP/LDAP, networking, and DNS + * resolver libraries.) + * + * To build: + * $ gcc -static -Wall -o untar untar.c -larchive + * $ strip untar + * + * NOTE: On some systems, you may need to add additional flags + * to ensure that untar.c is compiled the same way as libarchive + * was compiled. In particular, Linux users will probably + * have to add -D_FILE_OFFSET_BITS=64 to the command line above. + * + * For fun, statically compile the following simple hello.c program + * using the same flags as for untar and compare the size: + * + * #include + * int main(int argc, char **argv) { + * printf("hello, world\n"); + * return(0); + * } + * + * You may be even more surprised by the compiled size of true.c listed here: + * + * int main(int argc, char **argv) { + * return (0); + * } + * + * On a slightly customized FreeBSD 5 system that I used around + * 2005, hello above compiled to 89k compared to untar of 69k. So at + * that time, libarchive's tar reader and extract-to-disk routines + * compiled to less code than printf(). + * + * On my FreeBSD development system today (August, 2009): + * hello: 195024 bytes + * true: 194912 bytes + * untar: 259924 bytes + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include +#include + +static void errmsg(const char *); +static void extract(const char *filename, int do_extract, int flags); +static void fail(const char *, const char *, int); +static int copy_data(struct archive *, struct archive *); +static void msg(const char *); +static void usage(void); +static void warn(const char *, const char *); + +static int verbose = 0; + +int +main(int argc, const char **argv) +{ + const char *filename = NULL; + int compress, flags, mode, opt; + + (void)argc; + mode = 'x'; + verbose = 0; + compress = '\0'; + flags = ARCHIVE_EXTRACT_TIME; + + /* Among other sins, getopt(3) pulls in printf(3). */ + while (*++argv != NULL && **argv == '-') { + const char *p = *argv + 1; + + while ((opt = *p++) != '\0') { + switch (opt) { + case 'f': + if (*p != '\0') + filename = p; + else + filename = *++argv; + p += strlen(p); + break; + case 'p': + flags |= ARCHIVE_EXTRACT_PERM; + flags |= ARCHIVE_EXTRACT_ACL; + flags |= ARCHIVE_EXTRACT_FFLAGS; + break; + case 't': + mode = opt; + break; + case 'v': + verbose++; + break; + case 'x': + mode = opt; + break; + default: + usage(); + } + } + } + + switch (mode) { + case 't': + extract(filename, 0, flags); + break; + case 'x': + extract(filename, 1, flags); + break; + } + + return (0); +} + + +static void +extract(const char *filename, int do_extract, int flags) +{ + struct archive *a; + struct archive *ext; + struct archive_entry *entry; + int r; + + a = archive_read_new(); + ext = archive_write_disk_new(); + archive_write_disk_set_options(ext, flags); + /* + * Note: archive_write_disk_set_standard_lookup() is useful + * here, but it requires library routines that can add 500k or + * more to a static executable. + */ + archive_read_support_format_tar(a); + /* + * On my system, enabling other archive formats adds 20k-30k + * each. Enabling gzip decompression adds about 20k. + * Enabling bzip2 is more expensive because the libbz2 library + * isn't very well factored. + */ + if (filename != NULL && strcmp(filename, "-") == 0) + filename = NULL; + if ((r = archive_read_open_file(a, filename, 10240))) + fail("archive_read_open_file()", + archive_error_string(a), r); + for (;;) { + r = archive_read_next_header(a, &entry); + if (r == ARCHIVE_EOF) + break; + if (r != ARCHIVE_OK) + fail("archive_read_next_header()", + archive_error_string(a), 1); + if (verbose && do_extract) + msg("x "); + if (verbose || !do_extract) + msg(archive_entry_pathname(entry)); + if (do_extract) { + r = archive_write_header(ext, entry); + if (r != ARCHIVE_OK) + warn("archive_write_header()", + archive_error_string(ext)); + else { + copy_data(a, ext); + r = archive_write_finish_entry(ext); + if (r != ARCHIVE_OK) + fail("archive_write_finish_entry()", + archive_error_string(ext), 1); + } + + } + if (verbose || !do_extract) + msg("\n"); + } + archive_read_close(a); + archive_read_finish(a); + exit(0); +} + +static int +copy_data(struct archive *ar, struct archive *aw) +{ + int r; + const void *buff; + size_t size; + off_t offset; + + for (;;) { + r = archive_read_data_block(ar, &buff, &size, &offset); + if (r == ARCHIVE_EOF) + return (ARCHIVE_OK); + if (r != ARCHIVE_OK) + return (r); + r = archive_write_data_block(aw, buff, size, offset); + if (r != ARCHIVE_OK) { + warn("archive_write_data_block()", + archive_error_string(aw)); + return (r); + } + } +} + +/* + * These reporting functions use low-level I/O; on some systems, this + * is a significant code reduction. Of course, on many server and + * desktop operating systems, malloc() and even crt rely on printf(), + * which in turn pulls in most of the rest of stdio, so this is not an + * optimization at all there. (If you're going to pay 100k or more + * for printf() anyway, you may as well use it!) + */ +static void +msg(const char *m) +{ + write(1, m, strlen(m)); +} + +static void +errmsg(const char *m) +{ + write(2, m, strlen(m)); +} + +static void +warn(const char *f, const char *m) +{ + errmsg(f); + errmsg(" failed: "); + errmsg(m); + errmsg("\n"); +} + +static void +fail(const char *f, const char *m, int r) +{ + warn(f, m); + exit(r); +} + +static void +usage(void) +{ + const char *m = "Usage: untar [-tvx] [-f file] [file]\n"; + errmsg(m); + exit(1); +} diff --git a/Utilities/cmlibarchive/libarchive/CMakeLists.txt b/Utilities/cmlibarchive/libarchive/CMakeLists.txt new file mode 100644 index 000000000..f50c4638f --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/CMakeLists.txt @@ -0,0 +1,145 @@ + +############################################ +# +# How to build libarchive +# +############################################ + +# Public headers +SET(include_HEADERS + archive.h + archive_entry.h +) + +# Sources and private headers +SET(libarchive_SOURCES + archive_check_magic.c + archive_endian.h + archive_entry.c + archive_entry.h + archive_entry_copy_stat.c + archive_entry_copy_bhfi.c + archive_entry_link_resolver.c + archive_entry_private.h + archive_entry_stat.c + archive_entry_strmode.c + archive_entry_xattr.c + archive_platform.h + archive_private.h + archive_read.c + archive_read_data_into_fd.c + archive_read_disk.c + archive_read_disk_entry_from_file.c + archive_read_disk_private.h + archive_read_disk_set_standard_lookup.c + archive_read_extract.c + archive_read_open_fd.c + archive_read_open_file.c + archive_read_open_filename.c + archive_read_open_memory.c + archive_read_private.h + archive_read_support_compression_all.c + archive_read_support_compression_bzip2.c + archive_read_support_compression_compress.c + archive_read_support_compression_gzip.c + archive_read_support_compression_none.c + archive_read_support_compression_program.c + archive_read_support_compression_xz.c + archive_read_support_format_all.c + archive_read_support_format_ar.c + archive_read_support_format_cpio.c + archive_read_support_format_empty.c + archive_read_support_format_iso9660.c + archive_read_support_format_mtree.c + archive_read_support_format_raw.c + archive_read_support_format_tar.c + archive_read_support_format_zip.c + archive_string.c + archive_string.h + archive_string_sprintf.c + archive_util.c + archive_virtual.c + archive_write.c + archive_write_disk.c + archive_write_disk_private.h + archive_write_disk_set_standard_lookup.c + archive_write_private.h + archive_write_open_fd.c + archive_write_open_file.c + archive_write_open_filename.c + archive_write_open_memory.c + archive_write_set_compression_bzip2.c + archive_write_set_compression_compress.c + archive_write_set_compression_gzip.c + archive_write_set_compression_none.c + archive_write_set_compression_program.c + archive_write_set_compression_xz.c + archive_write_set_format.c + archive_write_set_format_ar.c + archive_write_set_format_by_name.c + archive_write_set_format_cpio.c + archive_write_set_format_cpio_newc.c + archive_write_set_format_mtree.c + archive_write_set_format_pax.c + archive_write_set_format_shar.c + archive_write_set_format_ustar.c + archive_write_set_format_zip.c + filter_fork.c + filter_fork.h +) + +# Man pages +SET(libarchive_MANS + archive_entry.3 + archive_read.3 + archive_read_disk.3 + archive_util.3 + archive_write.3 + archive_write_disk.3 + cpio.5 + libarchive.3 + libarchive_internals.3 + libarchive-formats.5 + mtree.5 + tar.5 +) + +IF(WIN32 AND NOT CYGWIN) +# LIST(APPEND libarchive_SOURCES archive_entry_copy_bhfi.c) + LIST(APPEND libarchive_SOURCES archive_windows.c) + LIST(APPEND libarchive_SOURCES archive_windows.h) + LIST(APPEND libarchive_SOURCES filter_fork_windows.c) +ENDIF(WIN32 AND NOT CYGWIN) + +IF(BUILD_ARCHIVE_WITHIN_CMAKE) + # when building inside the CMake tree only use static + # and call the library cmlibarchive + ADD_LIBRARY(cmlibarchive STATIC ${libarchive_SOURCES} ${include_HEADERS}) +ELSE() + # Libarchive is a shared library + ADD_LIBRARY(archive SHARED ${libarchive_SOURCES} ${include_HEADERS}) + TARGET_LINK_LIBRARIES(archive ${ADDITIONAL_LIBS}) + SET_TARGET_PROPERTIES(archive PROPERTIES SOVERSION ${SOVERSION}) + SET_TARGET_PROPERTIES(archive PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + + # archive_static is a static library + ADD_LIBRARY(archive_static STATIC ${libarchive_SOURCES} ${include_HEADERS}) + SET_TARGET_PROPERTIES(archive_static PROPERTIES COMPILE_DEFINITIONS + LIBARCHIVE_STATIC) + SET_TARGET_PROPERTIES(archive_static PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + # On Posix systems, libarchive.so and libarchive.a can co-exist. + IF(NOT WIN32 OR CYGWIN) + SET_TARGET_PROPERTIES(archive_static PROPERTIES OUTPUT_NAME archive) + ENDIF(NOT WIN32 OR CYGWIN) + + # How to install the libraries + INSTALL(TARGETS archive archive_static + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) + INSTALL_MAN(${libarchive_MANS}) + INSTALL(FILES ${include_HEADERS} DESTINATION include) + ADD_SUBDIRECTORY(test) +ENDIF() diff --git a/Utilities/cmlibarchive/libarchive/Makefile b/Utilities/cmlibarchive/libarchive/Makefile new file mode 100644 index 000000000..a94f64ea6 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/Makefile @@ -0,0 +1,267 @@ +# $FreeBSD: src/lib/libarchive/Makefile,v 1.88 2008/08/31 07:21:46 kientzle Exp $ +.include + +LIB= archive +DPADD= ${LIBBZ2} ${LIBZ} +LDADD= -lbz2 -lz + +# FreeBSD SHLIB_MAJOR value is managed as part of the FreeBSD system. +# It has no real relation to the libarchive version number. +SHLIB_MAJOR= 5 + +CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" +CFLAGS+= -I${.OBJDIR} +#Uncomment to build with full lzma/xz support via liblzma +#CFLAGS+= -I/usr/local/include -DHAVE_LIBLZMA=1 -DHAVE_LZMA_H=1 +#LDADD+= -L/usr/local/lib -llzma + +.if ${MK_OPENSSL} != "no" +CFLAGS+= -DWITH_OPENSSL +.endif + + +WARNS?= 6 + +# Headers to be installed in /usr/include +INCS= archive.h archive_entry.h + +# Sources to be compiled. +SRCS= archive_check_magic.c \ + archive_entry.c \ + archive_entry_copy_stat.c \ + archive_entry_stat.c \ + archive_entry_strmode.c \ + archive_entry_link_resolver.c \ + archive_entry_xattr.c \ + archive_read.c \ + archive_read_data_into_fd.c \ + archive_read_disk.c \ + archive_read_disk_entry_from_file.c \ + archive_read_disk_set_standard_lookup.c \ + archive_read_extract.c \ + archive_read_open_fd.c \ + archive_read_open_file.c \ + archive_read_open_filename.c \ + archive_read_open_memory.c \ + archive_read_support_compression_all.c \ + archive_read_support_compression_bzip2.c \ + archive_read_support_compression_compress.c \ + archive_read_support_compression_gzip.c \ + archive_read_support_compression_none.c \ + archive_read_support_compression_program.c \ + archive_read_support_compression_xz.c \ + archive_read_support_format_all.c \ + archive_read_support_format_ar.c \ + archive_read_support_format_cpio.c \ + archive_read_support_format_empty.c \ + archive_read_support_format_iso9660.c \ + archive_read_support_format_mtree.c \ + archive_read_support_format_raw.c \ + archive_read_support_format_tar.c \ + archive_read_support_format_zip.c \ + archive_string.c \ + archive_string_sprintf.c \ + archive_util.c \ + archive_virtual.c \ + archive_write.c \ + archive_write_disk.c \ + archive_write_disk_set_standard_lookup.c \ + archive_write_open_fd.c \ + archive_write_open_file.c \ + archive_write_open_filename.c \ + archive_write_open_memory.c \ + archive_write_set_compression_bzip2.c \ + archive_write_set_compression_compress.c \ + archive_write_set_compression_gzip.c \ + archive_write_set_compression_none.c \ + archive_write_set_compression_program.c \ + archive_write_set_compression_xz.c \ + archive_write_set_format.c \ + archive_write_set_format_ar.c \ + archive_write_set_format_by_name.c \ + archive_write_set_format_cpio.c \ + archive_write_set_format_cpio_newc.c \ + archive_write_set_format_mtree.c \ + archive_write_set_format_pax.c \ + archive_write_set_format_shar.c \ + archive_write_set_format_ustar.c \ + archive_write_set_format_zip.c \ + filter_fork.c + +# Man pages to be installed. +MAN= archive_entry.3 \ + archive_read.3 \ + archive_read_disk.3 \ + archive_util.3 \ + archive_write.3 \ + archive_write_disk.3 \ + cpio.5 \ + libarchive.3 \ + libarchive-formats.5 \ + tar.5 + +# Symlink the man pages under each function name. +MLINKS+= archive_entry.3 archive_entry_acl_add_entry.3 +MLINKS+= archive_entry.3 archive_entry_acl_add_entry_w.3 +MLINKS+= archive_entry.3 archive_entry_acl_clear.3 +MLINKS+= archive_entry.3 archive_entry_acl_count.3 +MLINKS+= archive_entry.3 archive_entry_acl_next.3 +MLINKS+= archive_entry.3 archive_entry_acl_next_w.3 +MLINKS+= archive_entry.3 archive_entry_acl_reset.3 +MLINKS+= archive_entry.3 archive_entry_acl_text_w.3 +MLINKS+= archive_entry.3 archive_entry_clear.3 +MLINKS+= archive_entry.3 archive_entry_clone.3 +MLINKS+= archive_entry.3 archive_entry_copy_fflags_text.3 +MLINKS+= archive_entry.3 archive_entry_copy_fflags_text_w.3 +MLINKS+= archive_entry.3 archive_entry_copy_gname.3 +MLINKS+= archive_entry.3 archive_entry_copy_gname_w.3 +MLINKS+= archive_entry.3 archive_entry_copy_hardlink_w.3 +MLINKS+= archive_entry.3 archive_entry_copy_link.3 +MLINKS+= archive_entry.3 archive_entry_copy_link_w.3 +MLINKS+= archive_entry.3 archive_entry_copy_pathname_w.3 +MLINKS+= archive_entry.3 archive_entry_copy_stat.3 +MLINKS+= archive_entry.3 archive_entry_copy_symlink_w.3 +MLINKS+= archive_entry.3 archive_entry_copy_uname.3 +MLINKS+= archive_entry.3 archive_entry_copy_uname_w.3 +MLINKS+= archive_entry.3 archive_entry_dev.3 +MLINKS+= archive_entry.3 archive_entry_devmajor.3 +MLINKS+= archive_entry.3 archive_entry_devminor.3 +MLINKS+= archive_entry.3 archive_entry_filetype.3 +MLINKS+= archive_entry.3 archive_entry_fflags.3 +MLINKS+= archive_entry.3 archive_entry_fflags_text.3 +MLINKS+= archive_entry.3 archive_entry_free.3 +MLINKS+= archive_entry.3 archive_entry_gid.3 +MLINKS+= archive_entry.3 archive_entry_gname.3 +MLINKS+= archive_entry.3 archive_entry_gname_w.3 +MLINKS+= archive_entry.3 archive_entry_hardlink.3 +MLINKS+= archive_entry.3 archive_entry_ino.3 +MLINKS+= archive_entry.3 archive_entry_mode.3 +MLINKS+= archive_entry.3 archive_entry_mtime.3 +MLINKS+= archive_entry.3 archive_entry_mtime_nsec.3 +MLINKS+= archive_entry.3 archive_entry_nlink.3 +MLINKS+= archive_entry.3 archive_entry_new.3 +MLINKS+= archive_entry.3 archive_entry_pathname.3 +MLINKS+= archive_entry.3 archive_entry_pathname_w.3 +MLINKS+= archive_entry.3 archive_entry_rdev.3 +MLINKS+= archive_entry.3 archive_entry_rdevmajor.3 +MLINKS+= archive_entry.3 archive_entry_rdevminor.3 +MLINKS+= archive_entry.3 archive_entry_set_atime.3 +MLINKS+= archive_entry.3 archive_entry_set_ctime.3 +MLINKS+= archive_entry.3 archive_entry_set_dev.3 +MLINKS+= archive_entry.3 archive_entry_set_devmajor.3 +MLINKS+= archive_entry.3 archive_entry_set_devminor.3 +MLINKS+= archive_entry.3 archive_entry_set_fflags.3 +MLINKS+= archive_entry.3 archive_entry_set_gid.3 +MLINKS+= archive_entry.3 archive_entry_set_gname.3 +MLINKS+= archive_entry.3 archive_entry_set_hardlink.3 +MLINKS+= archive_entry.3 archive_entry_set_link.3 +MLINKS+= archive_entry.3 archive_entry_set_mode.3 +MLINKS+= archive_entry.3 archive_entry_set_mtime.3 +MLINKS+= archive_entry.3 archive_entry_set_nlink.3 +MLINKS+= archive_entry.3 archive_entry_set_pathname.3 +MLINKS+= archive_entry.3 archive_entry_set_rdev.3 +MLINKS+= archive_entry.3 archive_entry_set_rdevmajor.3 +MLINKS+= archive_entry.3 archive_entry_set_rdevminor.3 +MLINKS+= archive_entry.3 archive_entry_set_size.3 +MLINKS+= archive_entry.3 archive_entry_set_symlink.3 +MLINKS+= archive_entry.3 archive_entry_set_uid.3 +MLINKS+= archive_entry.3 archive_entry_set_uname.3 +MLINKS+= archive_entry.3 archive_entry_size.3 +MLINKS+= archive_entry.3 archive_entry_stat.3 +MLINKS+= archive_entry.3 archive_entry_symlink.3 +MLINKS+= archive_entry.3 archive_entry_uid.3 +MLINKS+= archive_entry.3 archive_entry_uname.3 +MLINKS+= archive_entry.3 archive_entry_uname_w.3 +MLINKS+= archive_read.3 archive_read_data.3 +MLINKS+= archive_read.3 archive_read_data_block.3 +MLINKS+= archive_read.3 archive_read_data_into_buffer.3 +MLINKS+= archive_read.3 archive_read_data_into_fd.3 +MLINKS+= archive_read.3 archive_read_data_skip.3 +MLINKS+= archive_read.3 archive_read_extract.3 +MLINKS+= archive_read.3 archive_read_extract_set_progress_callback.3 +MLINKS+= archive_read.3 archive_read_extract_set_skip_file.3 +MLINKS+= archive_read.3 archive_read_finish.3 +MLINKS+= archive_read.3 archive_read_new.3 +MLINKS+= archive_read.3 archive_read_next_header.3 +MLINKS+= archive_read.3 archive_read_next_header2.3 +MLINKS+= archive_read.3 archive_read_open.3 +MLINKS+= archive_read.3 archive_read_open2.3 +MLINKS+= archive_read.3 archive_read_open_FILE.3 +MLINKS+= archive_read.3 archive_read_open_fd.3 +MLINKS+= archive_read.3 archive_read_open_file.3 +MLINKS+= archive_read.3 archive_read_open_filename.3 +MLINKS+= archive_read.3 archive_read_open_memory.3 +MLINKS+= archive_read.3 archive_read_support_compression_all.3 +MLINKS+= archive_read.3 archive_read_support_compression_bzip2.3 +MLINKS+= archive_read.3 archive_read_support_compression_compress.3 +MLINKS+= archive_read.3 archive_read_support_compression_gzip.3 +MLINKS+= archive_read.3 archive_read_support_compression_lzma.3 +MLINKS+= archive_read.3 archive_read_support_compression_none.3 +MLINKS+= archive_read.3 archive_read_support_compression_program.3 +MLINKS+= archive_read.3 archive_read_support_compression_program_signature.3 +MLINKS+= archive_read.3 archive_read_support_compression_xz.3 +MLINKS+= archive_read.3 archive_read_support_format_all.3 +MLINKS+= archive_read.3 archive_read_support_format_ar.3 +MLINKS+= archive_read.3 archive_read_support_format_cpio.3 +MLINKS+= archive_read.3 archive_read_support_format_empty.3 +MLINKS+= archive_read.3 archive_read_support_format_iso9660.3 +MLINKS+= archive_read.3 archive_read_support_format_raw.3 +MLINKS+= archive_read.3 archive_read_support_format_tar.3 +MLINKS+= archive_read.3 archive_read_support_format_zip.3 +MLINKS+= archive_read_disk.3 archive_read_disk_entry_from_file.3 +MLINKS+= archive_read_disk.3 archive_read_disk_gname.3 +MLINKS+= archive_read_disk.3 archive_read_disk_new.3 +MLINKS+= archive_read_disk.3 archive_read_disk_set_gname_lookup.3 +MLINKS+= archive_read_disk.3 archive_read_disk_set_standard_lookup.3 +MLINKS+= archive_read_disk.3 archive_read_disk_set_symlink_hybrid.3 +MLINKS+= archive_read_disk.3 archive_read_disk_set_symlink_logical.3 +MLINKS+= archive_read_disk.3 archive_read_disk_set_symlink_physical.3 +MLINKS+= archive_read_disk.3 archive_read_disk_set_uname_lookup.3 +MLINKS+= archive_read_disk.3 archive_read_disk_uname.3 +MLINKS+= archive_util.3 archive_clear_error.3 +MLINKS+= archive_util.3 archive_compression.3 +MLINKS+= archive_util.3 archive_compression_name.3 +MLINKS+= archive_util.3 archive_errno.3 +MLINKS+= archive_util.3 archive_error_string.3 +MLINKS+= archive_util.3 archive_file_count.3 +MLINKS+= archive_util.3 archive_format.3 +MLINKS+= archive_util.3 archive_format_name.3 +MLINKS+= archive_util.3 archive_set_error.3 +MLINKS+= archive_write.3 archive_write_close.3 +MLINKS+= archive_write.3 archive_write_data.3 +MLINKS+= archive_write.3 archive_write_finish.3 +MLINKS+= archive_write.3 archive_write_finish_entry.3 +MLINKS+= archive_write.3 archive_write_get_bytes_in_last_block.3 +MLINKS+= archive_write.3 archive_write_get_bytes_per_block.3 +MLINKS+= archive_write.3 archive_write_header.3 +MLINKS+= archive_write.3 archive_write_new.3 +MLINKS+= archive_write.3 archive_write_open.3 +MLINKS+= archive_write.3 archive_write_open_FILE.3 +MLINKS+= archive_write.3 archive_write_open_fd.3 +MLINKS+= archive_write.3 archive_write_open_file.3 +MLINKS+= archive_write.3 archive_write_open_filename.3 +MLINKS+= archive_write.3 archive_write_open_memory.3 +MLINKS+= archive_write.3 archive_write_set_bytes_in_last_block.3 +MLINKS+= archive_write.3 archive_write_set_bytes_per_block.3 +MLINKS+= archive_write.3 archive_write_set_callbacks.3 +MLINKS+= archive_write.3 archive_write_set_compression_bzip2.3 +MLINKS+= archive_write.3 archive_write_set_compression_compress.3 +MLINKS+= archive_write.3 archive_write_set_compression_gzip.3 +MLINKS+= archive_write.3 archive_write_set_compression_none.3 +MLINKS+= archive_write.3 archive_write_set_compression_program.3 +MLINKS+= archive_write.3 archive_write_set_format_pax.3 +MLINKS+= archive_write.3 archive_write_set_format_shar.3 +MLINKS+= archive_write.3 archive_write_set_format_ustar.3 +MLINKS+= archive_write_disk.3 archive_write_disk_new.3 +MLINKS+= archive_write_disk.3 archive_write_disk_set_group_lookup.3 +MLINKS+= archive_write_disk.3 archive_write_disk_set_options.3 +MLINKS+= archive_write_disk.3 archive_write_disk_set_skip_file.3 +MLINKS+= archive_write_disk.3 archive_write_disk_set_standard_lookup.3 +MLINKS+= archive_write_disk.3 archive_write_disk_set_user_lookup.3 +MLINKS+= libarchive.3 archive.3 + +.PHONY: check test +check test: + cd ${.CURDIR}/test && make test + +.include diff --git a/Utilities/cmlibarchive/libarchive/archive.h b/Utilities/cmlibarchive/libarchive/archive.h new file mode 100644 index 000000000..f880b300d --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive.h @@ -0,0 +1,724 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive.h.in,v 1.50 2008/05/26 17:00:22 kientzle Exp $ + */ + +#ifndef ARCHIVE_H_INCLUDED +#define ARCHIVE_H_INCLUDED + +/* + * Note: archive.h is for use outside of libarchive; the configuration + * headers (config.h, archive_platform.h, etc.) are purely internal. + * Do NOT use HAVE_XXX configuration macros to control the behavior of + * this header! If you must conditionalize, use predefined compiler and/or + * platform macros. + */ + +#include +#include /* Linux requires this for off_t */ +#if !defined(__WATCOMC__) && !defined(_MSC_VER) && !defined(__INTERIX) +/* Header unavailable on Watcom C or MS Visual C++ or SFU. */ +#include /* int64_t, etc. */ +#endif +#include /* For FILE * */ + +/* Get appropriate definitions of standard POSIX-style types. */ +/* These should match the types used in 'struct stat' */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#define __LA_INT64_T __int64 +# if defined(_WIN64) +# define __LA_SSIZE_T __int64 +# else +# define __LA_SSIZE_T long +# endif +#define __LA_UID_T short +#define __LA_GID_T short +#else +#include /* ssize_t, uid_t, and gid_t */ +#define __LA_INT64_T int64_t +#define __LA_SSIZE_T ssize_t +#define __LA_UID_T uid_t +#define __LA_GID_T gid_t +#endif + +/* + * On Windows, define LIBARCHIVE_STATIC if you're building or using a + * .lib. The default here assumes you're building a DLL. Only + * libarchive source should ever define __LIBARCHIVE_BUILD. + */ +#if ((defined __WIN32__) || (defined _WIN32) || defined(__CYGWIN__)) && (!defined LIBARCHIVE_STATIC) +# ifdef __LIBARCHIVE_BUILD +# ifdef __GNUC__ +# define __LA_DECL __attribute__((dllexport)) extern +# else +# define __LA_DECL __declspec(dllexport) +# endif +# else +# ifdef __GNUC__ +# define __LA_DECL __attribute__((dllimport)) extern +# else +# define __LA_DECL __declspec(dllimport) +# endif +# endif +#else +/* Static libraries or non-Windows needs no special declaration. */ +# define __LA_DECL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The version number is provided as both a macro and a function. + * The macro identifies the installed header; the function identifies + * the library version (which may not be the same if you're using a + * dynamically-linked version of the library). Of course, if the + * header and library are very different, you should expect some + * strangeness. Don't do that. + */ + +/* + * The version number is expressed as a single integer that makes it + * easy to compare versions at build time: for version a.b.c, the + * version number is printf("%d%03d%03d",a,b,c). For example, if you + * know your application requires version 2.12.108 or later, you can + * assert that ARCHIVE_VERSION >= 2012108. + * + * This single-number format was introduced with libarchive 1.9.0 in + * the libarchive 1.x family and libarchive 2.2.4 in the libarchive + * 2.x family. The following may be useful if you really want to do + * feature detection for earlier libarchive versions (which defined + * ARCHIVE_API_VERSION and ARCHIVE_API_FEATURE instead): + * + * #ifndef ARCHIVE_VERSION_NUMBER + * #define ARCHIVE_VERSION_NUMBER \ + * (ARCHIVE_API_VERSION * 1000000 + ARCHIVE_API_FEATURE * 1000) + * #endif + */ +#define ARCHIVE_VERSION_NUMBER 2007900 +__LA_DECL int archive_version_number(void); + +/* + * Textual name/version of the library, useful for version displays. + */ +#define ARCHIVE_VERSION_STRING "libarchive 2.7.900a" +__LA_DECL const char * archive_version_string(void); + +#if ARCHIVE_VERSION_NUMBER < 3000000 +/* + * Deprecated; these are older names that will be removed in favor of + * the simpler definitions above. + */ +#define ARCHIVE_VERSION_STAMP ARCHIVE_VERSION_NUMBER +__LA_DECL int archive_version_stamp(void); +#define ARCHIVE_LIBRARY_VERSION ARCHIVE_VERSION_STRING +__LA_DECL const char * archive_version(void); +#define ARCHIVE_API_VERSION (ARCHIVE_VERSION_NUMBER / 1000000) +__LA_DECL int archive_api_version(void); +#define ARCHIVE_API_FEATURE ((ARCHIVE_VERSION_NUMBER / 1000) % 1000) +__LA_DECL int archive_api_feature(void); +#endif + +#if ARCHIVE_VERSION_NUMBER < 3000000 +/* This should never have been here in the first place. */ +/* Legacy of old tar assumptions, will be removed in libarchive 3.0. */ +#define ARCHIVE_BYTES_PER_RECORD 512 +#define ARCHIVE_DEFAULT_BYTES_PER_BLOCK 10240 +#endif + +/* Declare our basic types. */ +struct archive; +struct archive_entry; + +/* + * Error codes: Use archive_errno() and archive_error_string() + * to retrieve details. Unless specified otherwise, all functions + * that return 'int' use these codes. + */ +#define ARCHIVE_EOF 1 /* Found end of archive. */ +#define ARCHIVE_OK 0 /* Operation was successful. */ +#define ARCHIVE_RETRY (-10) /* Retry might succeed. */ +#define ARCHIVE_WARN (-20) /* Partial success. */ +/* For example, if write_header "fails", then you can't push data. */ +#define ARCHIVE_FAILED (-25) /* Current operation cannot complete. */ +/* But if write_header is "fatal," then this archive is dead and useless. */ +#define ARCHIVE_FATAL (-30) /* No more operations are possible. */ + +/* + * As far as possible, archive_errno returns standard platform errno codes. + * Of course, the details vary by platform, so the actual definitions + * here are stored in "archive_platform.h". The symbols are listed here + * for reference; as a rule, clients should not need to know the exact + * platform-dependent error code. + */ +/* Unrecognized or invalid file format. */ +/* #define ARCHIVE_ERRNO_FILE_FORMAT */ +/* Illegal usage of the library. */ +/* #define ARCHIVE_ERRNO_PROGRAMMER_ERROR */ +/* Unknown or unclassified error. */ +/* #define ARCHIVE_ERRNO_MISC */ + +/* + * Callbacks are invoked to automatically read/skip/write/open/close the + * archive. You can provide your own for complex tasks (like breaking + * archives across multiple tapes) or use standard ones built into the + * library. + */ + +/* Returns pointer and size of next block of data from archive. */ +typedef __LA_SSIZE_T archive_read_callback(struct archive *, + void *_client_data, const void **_buffer); + +/* Skips at most request bytes from archive and returns the skipped amount */ +#if ARCHIVE_VERSION_NUMBER < 2000000 +/* Libarchive 1.0 used ssize_t for the return, which is only 32 bits + * on most 32-bit platforms; not large enough. */ +typedef __LA_SSIZE_T archive_skip_callback(struct archive *, + void *_client_data, size_t request); +#elif ARCHIVE_VERSION_NUMBER < 3000000 +/* Libarchive 2.0 used off_t here, but that is a bad idea on Linux and a + * few other platforms where off_t varies with build settings. */ +typedef off_t archive_skip_callback(struct archive *, + void *_client_data, off_t request); +#else +/* Libarchive 3.0 uses int64_t here, which is actually guaranteed to be + * 64 bits on every platform. */ +typedef __LA_INT64_T archive_skip_callback(struct archive *, + void *_client_data, __LA_INT64_T request); +#endif + +/* Returns size actually written, zero on EOF, -1 on error. */ +typedef __LA_SSIZE_T archive_write_callback(struct archive *, + void *_client_data, + const void *_buffer, size_t _length); + +#if ARCHIVE_VERSION_NUMBER < 3000000 +/* Open callback is actually never needed; remove it in libarchive 3.0. */ +typedef int archive_open_callback(struct archive *, void *_client_data); +#endif + +typedef int archive_close_callback(struct archive *, void *_client_data); + +/* + * Codes for archive_compression. + */ +#define ARCHIVE_COMPRESSION_NONE 0 +#define ARCHIVE_COMPRESSION_GZIP 1 +#define ARCHIVE_COMPRESSION_BZIP2 2 +#define ARCHIVE_COMPRESSION_COMPRESS 3 +#define ARCHIVE_COMPRESSION_PROGRAM 4 +#define ARCHIVE_COMPRESSION_LZMA 5 +#define ARCHIVE_COMPRESSION_XZ 6 + +/* + * Codes returned by archive_format. + * + * Top 16 bits identifies the format family (e.g., "tar"); lower + * 16 bits indicate the variant. This is updated by read_next_header. + * Note that the lower 16 bits will often vary from entry to entry. + * In some cases, this variation occurs as libarchive learns more about + * the archive (for example, later entries might utilize extensions that + * weren't necessary earlier in the archive; in this case, libarchive + * will change the format code to indicate the extended format that + * was used). In other cases, it's because different tools have + * modified the archive and so different parts of the archive + * actually have slightly different formts. (Both tar and cpio store + * format codes in each entry, so it is quite possible for each + * entry to be in a different format.) + */ +#define ARCHIVE_FORMAT_BASE_MASK 0xff0000 +#define ARCHIVE_FORMAT_CPIO 0x10000 +#define ARCHIVE_FORMAT_CPIO_POSIX (ARCHIVE_FORMAT_CPIO | 1) +#define ARCHIVE_FORMAT_CPIO_BIN_LE (ARCHIVE_FORMAT_CPIO | 2) +#define ARCHIVE_FORMAT_CPIO_BIN_BE (ARCHIVE_FORMAT_CPIO | 3) +#define ARCHIVE_FORMAT_CPIO_SVR4_NOCRC (ARCHIVE_FORMAT_CPIO | 4) +#define ARCHIVE_FORMAT_CPIO_SVR4_CRC (ARCHIVE_FORMAT_CPIO | 5) +#define ARCHIVE_FORMAT_SHAR 0x20000 +#define ARCHIVE_FORMAT_SHAR_BASE (ARCHIVE_FORMAT_SHAR | 1) +#define ARCHIVE_FORMAT_SHAR_DUMP (ARCHIVE_FORMAT_SHAR | 2) +#define ARCHIVE_FORMAT_TAR 0x30000 +#define ARCHIVE_FORMAT_TAR_USTAR (ARCHIVE_FORMAT_TAR | 1) +#define ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE (ARCHIVE_FORMAT_TAR | 2) +#define ARCHIVE_FORMAT_TAR_PAX_RESTRICTED (ARCHIVE_FORMAT_TAR | 3) +#define ARCHIVE_FORMAT_TAR_GNUTAR (ARCHIVE_FORMAT_TAR | 4) +#define ARCHIVE_FORMAT_ISO9660 0x40000 +#define ARCHIVE_FORMAT_ISO9660_ROCKRIDGE (ARCHIVE_FORMAT_ISO9660 | 1) +#define ARCHIVE_FORMAT_ZIP 0x50000 +#define ARCHIVE_FORMAT_EMPTY 0x60000 +#define ARCHIVE_FORMAT_AR 0x70000 +#define ARCHIVE_FORMAT_AR_GNU (ARCHIVE_FORMAT_AR | 1) +#define ARCHIVE_FORMAT_AR_BSD (ARCHIVE_FORMAT_AR | 2) +#define ARCHIVE_FORMAT_MTREE 0x80000 +#define ARCHIVE_FORMAT_RAW 0x90000 + +/*- + * Basic outline for reading an archive: + * 1) Ask archive_read_new for an archive reader object. + * 2) Update any global properties as appropriate. + * In particular, you'll certainly want to call appropriate + * archive_read_support_XXX functions. + * 3) Call archive_read_open_XXX to open the archive + * 4) Repeatedly call archive_read_next_header to get information about + * successive archive entries. Call archive_read_data to extract + * data for entries of interest. + * 5) Call archive_read_finish to end processing. + */ +__LA_DECL struct archive *archive_read_new(void); + +/* + * The archive_read_support_XXX calls enable auto-detect for this + * archive handle. They also link in the necessary support code. + * For example, if you don't want bzlib linked in, don't invoke + * support_compression_bzip2(). The "all" functions provide the + * obvious shorthand. + */ +__LA_DECL int archive_read_support_compression_all(struct archive *); +__LA_DECL int archive_read_support_compression_bzip2(struct archive *); +__LA_DECL int archive_read_support_compression_compress(struct archive *); +__LA_DECL int archive_read_support_compression_gzip(struct archive *); +__LA_DECL int archive_read_support_compression_lzma(struct archive *); +__LA_DECL int archive_read_support_compression_none(struct archive *); +__LA_DECL int archive_read_support_compression_program(struct archive *, + const char *command); +__LA_DECL int archive_read_support_compression_program_signature + (struct archive *, const char *, + const void * /* match */, size_t); + +__LA_DECL int archive_read_support_compression_xz(struct archive *); + +__LA_DECL int archive_read_support_format_all(struct archive *); +__LA_DECL int archive_read_support_format_ar(struct archive *); +__LA_DECL int archive_read_support_format_cpio(struct archive *); +__LA_DECL int archive_read_support_format_empty(struct archive *); +__LA_DECL int archive_read_support_format_gnutar(struct archive *); +__LA_DECL int archive_read_support_format_iso9660(struct archive *); +__LA_DECL int archive_read_support_format_mtree(struct archive *); +__LA_DECL int archive_read_support_format_raw(struct archive *); +__LA_DECL int archive_read_support_format_tar(struct archive *); +__LA_DECL int archive_read_support_format_zip(struct archive *); + + +/* Open the archive using callbacks for archive I/O. */ +__LA_DECL int archive_read_open(struct archive *, void *_client_data, + archive_open_callback *, archive_read_callback *, + archive_close_callback *); +__LA_DECL int archive_read_open2(struct archive *, void *_client_data, + archive_open_callback *, archive_read_callback *, + archive_skip_callback *, archive_close_callback *); + +/* + * A variety of shortcuts that invoke archive_read_open() with + * canned callbacks suitable for common situations. The ones that + * accept a block size handle tape blocking correctly. + */ +/* Use this if you know the filename. Note: NULL indicates stdin. */ +__LA_DECL int archive_read_open_filename(struct archive *, + const char *_filename, size_t _block_size); +/* 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); +/* Read an archive that's stored in memory. */ +__LA_DECL int archive_read_open_memory(struct archive *, + void * buff, size_t size); +/* A more involved version that is only used for internal testing. */ +__LA_DECL int archive_read_open_memory2(struct archive *a, void *buff, + size_t size, size_t read_size); +/* Read an archive that's already open, using the file descriptor. */ +__LA_DECL int archive_read_open_fd(struct archive *, int _fd, + size_t _block_size); +/* Read an archive that's already open, using a FILE *. */ +/* Note: DO NOT use this with tape drives. */ +__LA_DECL int archive_read_open_FILE(struct archive *, FILE *_file); + +/* Parses and returns next entry header. */ +__LA_DECL int archive_read_next_header(struct archive *, + struct archive_entry **); + +/* Parses and returns next entry header using the archive_entry passed in */ +__LA_DECL int archive_read_next_header2(struct archive *, + struct archive_entry *); + +/* + * Retrieve the byte offset in UNCOMPRESSED data where last-read + * header started. + */ +__LA_DECL __LA_INT64_T archive_read_header_position(struct archive *); + +/* Read data from the body of an entry. Similar to read(2). */ +__LA_DECL __LA_SSIZE_T archive_read_data(struct archive *, + void *, size_t); + +/* + * A zero-copy version of archive_read_data that also exposes the file offset + * of each returned block. Note that the client has no way to specify + * the desired size of the block. The API does guarantee that offsets will + * be strictly increasing and that returned blocks will not overlap. + */ +#if ARCHIVE_VERSION_NUMBER < 3000000 +__LA_DECL int archive_read_data_block(struct archive *a, + const void **buff, size_t *size, off_t *offset); +#else +__LA_DECL int archive_read_data_block(struct archive *a, + const void **buff, size_t *size, + __LA_INT64_T *offset); +#endif + +/*- + * Some convenience functions that are built on archive_read_data: + * 'skip': skips entire entry + * 'into_buffer': writes data into memory buffer that you provide + * 'into_fd': writes data to specified filedes + */ +__LA_DECL int archive_read_data_skip(struct archive *); +__LA_DECL int archive_read_data_into_buffer(struct archive *, + void *buffer, __LA_SSIZE_T len); +__LA_DECL int archive_read_data_into_fd(struct archive *, int fd); + +/* + * Set read options. + */ +/* Apply option string to the format only. */ +__LA_DECL int archive_read_set_format_options(struct archive *_a, + const char *s); +/* Apply option string to the filter only. */ +__LA_DECL int archive_read_set_filter_options(struct archive *_a, + const char *s); +/* Apply option string to both the format and the filter. */ +__LA_DECL int archive_read_set_options(struct archive *_a, + const char *s); + +/*- + * Convenience function to recreate the current entry (whose header + * has just been read) on disk. + * + * This does quite a bit more than just copy data to disk. It also: + * - Creates intermediate directories as required. + * - Manages directory permissions: non-writable directories will + * be initially created with write permission enabled; when the + * archive is closed, dir permissions are edited to the values specified + * in the archive. + * - Checks hardlinks: hardlinks will not be extracted unless the + * linked-to file was also extracted within the same session. (TODO) + */ + +/* The "flags" argument selects optional behavior, 'OR' the flags you want. */ + +/* Default: Do not try to set owner/group. */ +#define ARCHIVE_EXTRACT_OWNER (0x0001) +/* Default: Do obey umask, do not restore SUID/SGID/SVTX bits. */ +#define ARCHIVE_EXTRACT_PERM (0x0002) +/* Default: Do not restore mtime/atime. */ +#define ARCHIVE_EXTRACT_TIME (0x0004) +/* Default: Replace existing files. */ +#define ARCHIVE_EXTRACT_NO_OVERWRITE (0x0008) +/* Default: Try create first, unlink only if create fails with EEXIST. */ +#define ARCHIVE_EXTRACT_UNLINK (0x0010) +/* Default: Do not restore ACLs. */ +#define ARCHIVE_EXTRACT_ACL (0x0020) +/* Default: Do not restore fflags. */ +#define ARCHIVE_EXTRACT_FFLAGS (0x0040) +/* Default: Do not restore xattrs. */ +#define ARCHIVE_EXTRACT_XATTR (0x0080) +/* Default: Do not try to guard against extracts redirected by symlinks. */ +/* Note: With ARCHIVE_EXTRACT_UNLINK, will remove any intermediate symlink. */ +#define ARCHIVE_EXTRACT_SECURE_SYMLINKS (0x0100) +/* Default: Do not reject entries with '..' as path elements. */ +#define ARCHIVE_EXTRACT_SECURE_NODOTDOT (0x0200) +/* Default: Create parent directories as needed. */ +#define ARCHIVE_EXTRACT_NO_AUTODIR (0x0400) +/* Default: Overwrite files, even if one on disk is newer. */ +#define ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER (0x0800) +/* Detect blocks of 0 and write holes instead. */ +#define ARCHIVE_EXTRACT_SPARSE (0x1000) + +__LA_DECL int archive_read_extract(struct archive *, struct archive_entry *, + int flags); +__LA_DECL int archive_read_extract2(struct archive *, struct archive_entry *, + struct archive * /* dest */); +__LA_DECL void archive_read_extract_set_progress_callback(struct archive *, + void (*_progress_func)(void *), void *_user_data); + +/* Record the dev/ino of a file that will not be written. This is + * generally set to the dev/ino of the archive being read. */ +__LA_DECL void archive_read_extract_set_skip_file(struct archive *, + dev_t, ino_t); + +/* Close the file and release most resources. */ +__LA_DECL int archive_read_close(struct archive *); +/* Release all resources and destroy the object. */ +/* Note that archive_read_finish will call archive_read_close for you. */ +#if ARCHIVE_VERSION_NUMBER < 2000000 +/* Erroneously declared to return void in libarchive 1.x */ +__LA_DECL void archive_read_finish(struct archive *); +#else +__LA_DECL int archive_read_finish(struct archive *); +#endif + +/*- + * To create an archive: + * 1) Ask archive_write_new for a archive writer object. + * 2) Set any global properties. In particular, you should set + * the compression and format to use. + * 3) Call archive_write_open to open the file (most people + * will use archive_write_open_file or archive_write_open_fd, + * which provide convenient canned I/O callbacks for you). + * 4) For each entry: + * - construct an appropriate struct archive_entry structure + * - archive_write_header to write the header + * - archive_write_data to write the entry data + * 5) archive_write_close to close the output + * 6) archive_write_finish to cleanup the writer and release resources + */ +__LA_DECL struct archive *archive_write_new(void); +__LA_DECL int archive_write_set_bytes_per_block(struct archive *, + int bytes_per_block); +__LA_DECL int archive_write_get_bytes_per_block(struct archive *); +/* XXX This is badly misnamed; suggestions appreciated. XXX */ +__LA_DECL int archive_write_set_bytes_in_last_block(struct archive *, + int bytes_in_last_block); +__LA_DECL int archive_write_get_bytes_in_last_block(struct archive *); + +/* The dev/ino of a file that won't be archived. This is used + * to avoid recursively adding an archive to itself. */ +__LA_DECL int archive_write_set_skip_file(struct archive *, dev_t, ino_t); + +__LA_DECL int archive_write_set_compression_bzip2(struct archive *); +__LA_DECL int archive_write_set_compression_compress(struct archive *); +__LA_DECL int archive_write_set_compression_gzip(struct archive *); +__LA_DECL int archive_write_set_compression_lzma(struct archive *); +__LA_DECL int archive_write_set_compression_none(struct archive *); +__LA_DECL int archive_write_set_compression_program(struct archive *, + const char *cmd); +__LA_DECL int archive_write_set_compression_xz(struct archive *); +/* A convenience function to set the format based on the code or name. */ +__LA_DECL int archive_write_set_format(struct archive *, int format_code); +__LA_DECL int archive_write_set_format_by_name(struct archive *, + const char *name); +/* To minimize link pollution, use one or more of the following. */ +__LA_DECL int archive_write_set_format_ar_bsd(struct archive *); +__LA_DECL int archive_write_set_format_ar_svr4(struct archive *); +__LA_DECL int archive_write_set_format_cpio(struct archive *); +__LA_DECL int archive_write_set_format_cpio_newc(struct archive *); +__LA_DECL int archive_write_set_format_mtree(struct archive *); +/* TODO: int archive_write_set_format_old_tar(struct archive *); */ +__LA_DECL int archive_write_set_format_pax(struct archive *); +__LA_DECL int archive_write_set_format_pax_restricted(struct archive *); +__LA_DECL int archive_write_set_format_shar(struct archive *); +__LA_DECL int archive_write_set_format_shar_dump(struct archive *); +__LA_DECL int archive_write_set_format_ustar(struct archive *); +__LA_DECL int archive_write_set_format_zip(struct archive *); +__LA_DECL int archive_write_open(struct archive *, void *, + archive_open_callback *, archive_write_callback *, + archive_close_callback *); +__LA_DECL int archive_write_open_fd(struct archive *, int _fd); +__LA_DECL int archive_write_open_filename(struct archive *, const char *_file); +/* A deprecated synonym for archive_write_open_filename() */ +__LA_DECL int archive_write_open_file(struct archive *, const char *_file); +__LA_DECL int archive_write_open_FILE(struct archive *, FILE *); +/* _buffSize is the size of the buffer, _used refers to a variable that + * will be updated after each write into the buffer. */ +__LA_DECL int archive_write_open_memory(struct archive *, + void *_buffer, size_t _buffSize, size_t *_used); + +/* + * Note that the library will truncate writes beyond the size provided + * to archive_write_header or pad if the provided data is short. + */ +__LA_DECL int archive_write_header(struct archive *, + struct archive_entry *); +#if ARCHIVE_VERSION_NUMBER < 2000000 +/* This was erroneously declared to return "int" in libarchive 1.x. */ +__LA_DECL int archive_write_data(struct archive *, + const void *, size_t); +#else +/* Libarchive 2.0 and later return ssize_t here. */ +__LA_DECL __LA_SSIZE_T archive_write_data(struct archive *, + const void *, size_t); +#endif + +#if ARCHIVE_VERSION_NUMBER < 3000000 +/* Libarchive 1.x and 2.x use off_t for the argument, but that's not + * stable on Linux. */ +__LA_DECL __LA_SSIZE_T archive_write_data_block(struct archive *, + const void *, size_t, off_t); +#else +/* Libarchive 3.0 uses explicit int64_t to ensure consistent 64-bit support. */ +__LA_DECL __LA_SSIZE_T archive_write_data_block(struct archive *, + const void *, size_t, __LA_INT64_T); +#endif +__LA_DECL int archive_write_finish_entry(struct archive *); +__LA_DECL int archive_write_close(struct archive *); +#if ARCHIVE_VERSION_NUMBER < 2000000 +/* Return value was incorrect in libarchive 1.x. */ +__LA_DECL void archive_write_finish(struct archive *); +#else +/* Libarchive 2.x and later returns an error if this fails. */ +/* It can fail if the archive wasn't already closed, in which case + * archive_write_finish() will implicitly call archive_write_close(). */ +__LA_DECL int archive_write_finish(struct archive *); +#endif + +/* + * Set write options. + */ +/* Apply option string to the format only. */ +__LA_DECL int archive_write_set_format_options(struct archive *_a, + const char *s); +/* Apply option string to the compressor only. */ +__LA_DECL int archive_write_set_compressor_options(struct archive *_a, + const char *s); +/* Apply option string to both the format and the compressor. */ +__LA_DECL int archive_write_set_options(struct archive *_a, + const char *s); + + +/*- + * ARCHIVE_WRITE_DISK API + * + * To create objects on disk: + * 1) Ask archive_write_disk_new for a new archive_write_disk object. + * 2) Set any global properties. In particular, you probably + * want to set the options. + * 3) For each entry: + * - construct an appropriate struct archive_entry structure + * - archive_write_header to create the file/dir/etc on disk + * - archive_write_data to write the entry data + * 4) archive_write_finish to cleanup the writer and release resources + * + * In particular, you can use this in conjunction with archive_read() + * to pull entries out of an archive and create them on disk. + */ +__LA_DECL struct archive *archive_write_disk_new(void); +/* This file will not be overwritten. */ +__LA_DECL int archive_write_disk_set_skip_file(struct archive *, + dev_t, ino_t); +/* Set flags to control how the next item gets created. + * This accepts a bitmask of ARCHIVE_EXTRACT_XXX flags defined above. */ +__LA_DECL int archive_write_disk_set_options(struct archive *, + int flags); +/* + * The lookup functions are given uname/uid (or gname/gid) pairs and + * return a uid (gid) suitable for this system. These are used for + * restoring ownership and for setting ACLs. The default functions + * are naive, they just return the uid/gid. These are small, so reasonable + * for applications that don't need to preserve ownership; they + * are probably also appropriate for applications that are doing + * same-system backup and restore. + */ +/* + * The "standard" lookup functions use common system calls to lookup + * the uname/gname, falling back to the uid/gid if the names can't be + * found. They cache lookups and are reasonably fast, but can be very + * large, so they are not used unless you ask for them. In + * particular, these match the specifications of POSIX "pax" and old + * POSIX "tar". + */ +__LA_DECL int archive_write_disk_set_standard_lookup(struct archive *); +/* + * If neither the default (naive) nor the standard (big) functions suit + * your needs, you can write your own and register them. Be sure to + * include a cleanup function if you have allocated private data. + */ +__LA_DECL int archive_write_disk_set_group_lookup(struct archive *, + void * /* private_data */, + __LA_GID_T (*)(void *, const char *, __LA_GID_T), + void (* /* cleanup */)(void *)); +__LA_DECL int archive_write_disk_set_user_lookup(struct archive *, + void * /* private_data */, + __LA_UID_T (*)(void *, const char *, __LA_UID_T), + void (* /* cleanup */)(void *)); + +/* + * ARCHIVE_READ_DISK API + * + * This is still evolving and somewhat experimental. + */ +__LA_DECL struct archive *archive_read_disk_new(void); +/* The names for symlink modes here correspond to an old BSD + * command-line argument convention: -L, -P, -H */ +/* Follow all symlinks. */ +__LA_DECL int archive_read_disk_set_symlink_logical(struct archive *); +/* Follow no symlinks. */ +__LA_DECL int archive_read_disk_set_symlink_physical(struct archive *); +/* Follow symlink initially, then not. */ +__LA_DECL int archive_read_disk_set_symlink_hybrid(struct archive *); +/* TODO: Handle Linux stat32/stat64 ugliness. */ +__LA_DECL int archive_read_disk_entry_from_file(struct archive *, + struct archive_entry *, int /* fd */, const struct stat *); +/* Look up gname for gid or uname for uid. */ +/* Default implementations are very, very stupid. */ +__LA_DECL const char *archive_read_disk_gname(struct archive *, __LA_GID_T); +__LA_DECL const char *archive_read_disk_uname(struct archive *, __LA_UID_T); +/* "Standard" implementation uses getpwuid_r, getgrgid_r and caches the + * results for performance. */ +__LA_DECL int archive_read_disk_set_standard_lookup(struct archive *); +/* You can install your own lookups if you like. */ +__LA_DECL int archive_read_disk_set_gname_lookup(struct archive *, + void * /* private_data */, + const char *(* /* lookup_fn */)(void *, __LA_GID_T), + void (* /* cleanup_fn */)(void *)); +__LA_DECL int archive_read_disk_set_uname_lookup(struct archive *, + void * /* private_data */, + const char *(* /* lookup_fn */)(void *, __LA_UID_T), + void (* /* cleanup_fn */)(void *)); + +/* + * Accessor functions to read/set various information in + * the struct archive object: + */ +/* Bytes written after compression or read before decompression. */ +__LA_DECL __LA_INT64_T archive_position_compressed(struct archive *); +/* Bytes written to compressor or read from decompressor. */ +__LA_DECL __LA_INT64_T archive_position_uncompressed(struct archive *); + +__LA_DECL const char *archive_compression_name(struct archive *); +__LA_DECL int archive_compression(struct archive *); +__LA_DECL int archive_errno(struct archive *); +__LA_DECL const char *archive_error_string(struct archive *); +__LA_DECL const char *archive_format_name(struct archive *); +__LA_DECL int archive_format(struct archive *); +__LA_DECL void archive_clear_error(struct archive *); +__LA_DECL void archive_set_error(struct archive *, int _err, + const char *fmt, ...); +__LA_DECL void archive_copy_error(struct archive *dest, + struct archive *src); +__LA_DECL int archive_file_count(struct archive *); + +#ifdef __cplusplus +} +#endif + +/* These are meaningless outside of this header. */ +#undef __LA_DECL +#undef __LA_GID_T +#undef __LA_UID_T + +/* These need to remain defined because they're used in the + * callback type definitions. XXX Fix this. This is ugly. XXX */ +/* #undef __LA_INT64_T */ +/* #undef __LA_SSIZE_T */ + +#endif /* !ARCHIVE_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/libarchive/archive_check_magic.c b/Utilities/cmlibarchive/libarchive/archive_check_magic.c new file mode 100644 index 000000000..a9177d778 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_check_magic.c @@ -0,0 +1,135 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_check_magic.c,v 1.9 2008/12/06 05:52:01 kientzle Exp $"); + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#include +#endif + +#include "archive_private.h" + +static void +errmsg(const char *m) +{ + size_t s = strlen(m); + ssize_t written; + + while (s > 0) { + written = write(2, m, strlen(m)); + if (written <= 0) + return; + m += written; + s -= written; + } +} + +static void +diediedie(void) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG) + /* Cause a breakpoint exception */ + DebugBreak(); +#endif + *(char *)0 = 1; /* Deliberately segfault and force a coredump. */ + _exit(1); /* If that didn't work, just exit with an error. */ +} + +static const char * +state_name(unsigned s) +{ + switch (s) { + case ARCHIVE_STATE_NEW: return ("new"); + case ARCHIVE_STATE_HEADER: return ("header"); + case ARCHIVE_STATE_DATA: return ("data"); + case ARCHIVE_STATE_EOF: return ("eof"); + case ARCHIVE_STATE_CLOSED: return ("closed"); + case ARCHIVE_STATE_FATAL: return ("fatal"); + default: return ("??"); + } +} + + +static void +write_all_states(unsigned int states) +{ + unsigned int lowbit; + + /* A trick for computing the lowest set bit. */ + while ((lowbit = states & (1 + ~states)) != 0) { + states &= ~lowbit; /* Clear the low bit. */ + errmsg(state_name(lowbit)); + if (states != 0) + errmsg("/"); + } +} + +/* + * Check magic value and current state; bail if it isn't valid. + * + * This is designed to catch serious programming errors that violate + * the libarchive API. + */ +void +__archive_check_magic(struct archive *a, unsigned int magic, + unsigned int state, const char *function) +{ + if (a->magic != magic) { + errmsg("INTERNAL ERROR: Function "); + errmsg(function); + errmsg(" invoked with invalid struct archive structure.\n"); + diediedie(); + } + + if (state == ARCHIVE_STATE_ANY) + return; + + if ((a->state & state) == 0) { + errmsg("INTERNAL ERROR: Function '"); + errmsg(function); + errmsg("' invoked with archive structure in state '"); + write_all_states(a->state); + errmsg("', should be in state '"); + write_all_states(state); + errmsg("'\n"); + diediedie(); + } +} diff --git a/Utilities/cmlibarchive/libarchive/archive_crc32.h b/Utilities/cmlibarchive/libarchive/archive_crc32.h new file mode 100644 index 000000000..108bc5494 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_crc32.h @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 2009 Joerg Sonnenberger + * 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. + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +/* + * When zlib is unavailable, we should still be able to validate + * uncompressed zip archives. That requires us to be able to compute + * the CRC32 check value. This is a drop-in compatible replacement + * for crc32() from zlib. It's slower than the zlib implementation, + * but still pretty fast: This runs about 300MB/s on my 3GHz P4 + * compared to about 800MB/s for the zlib implementation. + */ +static unsigned long +crc32(unsigned long crc, const void *_p, size_t len) +{ + unsigned long crc2, b, i; + const unsigned char *p = _p; + static volatile int crc_tbl_inited = 0; + static unsigned long crc_tbl[256]; + + if (!crc_tbl_inited) { + for (b = 0; b < 256; ++b) { + crc2 = b; + for (i = 8; i > 0; --i) { + if (crc2 & 1) + crc2 = (crc2 >> 1) ^ 0xedb88320UL; + else + crc2 = (crc2 >> 1); + } + crc_tbl[b] = crc2; + } + crc_tbl_inited = 1; + } + + crc = crc ^ 0xffffffffUL; + while (len--) + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + return (crc ^ 0xffffffffUL); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_endian.h b/Utilities/cmlibarchive/libarchive/archive_endian.h new file mode 100644 index 000000000..265f06403 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_endian.h @@ -0,0 +1,162 @@ +/*- + * Copyright (c) 2002 Thomas Moestl + * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. + * + * $FreeBSD: src/lib/libarchive/archive_endian.h,v 1.4 2008/12/06 06:12:24 kientzle Exp $ + * + * Borrowed from FreeBSD's + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +/* Note: This is a purely internal header! */ +/* Do not use this outside of libarchive internal code! */ + +#ifndef ARCHIVE_ENDIAN_H_INCLUDED +#define ARCHIVE_ENDIAN_H_INCLUDED + + +/* + * Disabling inline keyword for compilers known to choke on it: + * - Watcom C++ in C code. (For any version?) + * - SGI MIPSpro + * - Microsoft Visual C++ 6.0 (supposedly newer versions too) + */ +#if defined(__WATCOMC__) || defined(__sgi) +#define inline +#elif defined(_MSC_VER) +#define inline __inline +#endif + +/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ + +static inline uint16_t +archive_be16dec(const void *pp) +{ + unsigned char const *p = (unsigned char const *)pp; + + return ((p[0] << 8) | p[1]); +} + +static inline uint32_t +archive_be32dec(const void *pp) +{ + unsigned char const *p = (unsigned char const *)pp; + + return ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); +} + +static inline uint64_t +archive_be64dec(const void *pp) +{ + unsigned char const *p = (unsigned char const *)pp; + + return (((uint64_t)archive_be32dec(p) << 32) | archive_be32dec(p + 4)); +} + +static inline uint16_t +archive_le16dec(const void *pp) +{ + unsigned char const *p = (unsigned char const *)pp; + + return ((p[1] << 8) | p[0]); +} + +static inline uint32_t +archive_le32dec(const void *pp) +{ + unsigned char const *p = (unsigned char const *)pp; + + return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); +} + +static inline uint64_t +archive_le64dec(const void *pp) +{ + unsigned char const *p = (unsigned char const *)pp; + + return (((uint64_t)archive_le32dec(p + 4) << 32) | archive_le32dec(p)); +} + +static inline void +archive_be16enc(void *pp, uint16_t u) +{ + unsigned char *p = (unsigned char *)pp; + + p[0] = (u >> 8) & 0xff; + p[1] = u & 0xff; +} + +static inline void +archive_be32enc(void *pp, uint32_t u) +{ + unsigned char *p = (unsigned char *)pp; + + p[0] = (u >> 24) & 0xff; + p[1] = (u >> 16) & 0xff; + p[2] = (u >> 8) & 0xff; + p[3] = u & 0xff; +} + +static inline void +archive_be64enc(void *pp, uint64_t u) +{ + unsigned char *p = (unsigned char *)pp; + + archive_be32enc(p, u >> 32); + archive_be32enc(p + 4, u & 0xffffffff); +} + +static inline void +archive_le16enc(void *pp, uint16_t u) +{ + unsigned char *p = (unsigned char *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; +} + +static inline void +archive_le32enc(void *pp, uint32_t u) +{ + unsigned char *p = (unsigned char *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; + p[2] = (u >> 16) & 0xff; + p[3] = (u >> 24) & 0xff; +} + +static inline void +archive_le64enc(void *pp, uint64_t u) +{ + unsigned char *p = (unsigned char *)pp; + + archive_le32enc(p, u & 0xffffffff); + archive_le32enc(p + 4, u >> 32); +} + +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_entry.3 b/Utilities/cmlibarchive/libarchive/archive_entry.3 new file mode 100644 index 000000000..9ceb18b7a --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry.3 @@ -0,0 +1,433 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/archive_entry.3,v 1.18 2008/05/26 17:00:22 kientzle Exp $ +.\" +.Dd May 12, 2008 +.Dt archive_entry 3 +.Os +.Sh NAME +.Nm archive_entry_acl_add_entry , +.Nm archive_entry_acl_add_entry_w , +.Nm archive_entry_acl_clear , +.Nm archive_entry_acl_count , +.Nm archive_entry_acl_next , +.Nm archive_entry_acl_next_w , +.Nm archive_entry_acl_reset , +.Nm archive_entry_acl_text_w , +.Nm archive_entry_atime , +.Nm archive_entry_atime_nsec , +.Nm archive_entry_clear , +.Nm archive_entry_clone , +.Nm archive_entry_copy_fflags_text , +.Nm archive_entry_copy_fflags_text_w , +.Nm archive_entry_copy_gname , +.Nm archive_entry_copy_gname_w , +.Nm archive_entry_copy_hardlink , +.Nm archive_entry_copy_hardlink_w , +.Nm archive_entry_copy_link , +.Nm archive_entry_copy_link_w , +.Nm archive_entry_copy_pathname_w , +.Nm archive_entry_copy_sourcepath , +.Nm archive_entry_copy_stat , +.Nm archive_entry_copy_symlink , +.Nm archive_entry_copy_symlink_w , +.Nm archive_entry_copy_uname , +.Nm archive_entry_copy_uname_w , +.Nm archive_entry_dev , +.Nm archive_entry_devmajor , +.Nm archive_entry_devminor , +.Nm archive_entry_filetype , +.Nm archive_entry_fflags , +.Nm archive_entry_fflags_text , +.Nm archive_entry_free , +.Nm archive_entry_gid , +.Nm archive_entry_gname , +.Nm archive_entry_hardlink , +.Nm archive_entry_ino , +.Nm archive_entry_mode , +.Nm archive_entry_mtime , +.Nm archive_entry_mtime_nsec , +.Nm archive_entry_nlink , +.Nm archive_entry_new , +.Nm archive_entry_pathname , +.Nm archive_entry_pathname_w , +.Nm archive_entry_rdev , +.Nm archive_entry_rdevmajor , +.Nm archive_entry_rdevminor , +.Nm archive_entry_set_atime , +.Nm archive_entry_set_ctime , +.Nm archive_entry_set_dev , +.Nm archive_entry_set_devmajor , +.Nm archive_entry_set_devminor , +.Nm archive_entry_set_filetype , +.Nm archive_entry_set_fflags , +.Nm archive_entry_set_gid , +.Nm archive_entry_set_gname , +.Nm archive_entry_set_hardlink , +.Nm archive_entry_set_link , +.Nm archive_entry_set_mode , +.Nm archive_entry_set_mtime , +.Nm archive_entry_set_pathname , +.Nm archive_entry_set_rdevmajor , +.Nm archive_entry_set_rdevminor , +.Nm archive_entry_set_size , +.Nm archive_entry_set_symlink , +.Nm archive_entry_set_uid , +.Nm archive_entry_set_uname , +.Nm archive_entry_size , +.Nm archive_entry_sourcepath , +.Nm archive_entry_stat , +.Nm archive_entry_symlink , +.Nm archive_entry_uid , +.Nm archive_entry_uname +.Nd functions for manipulating archive entry descriptions +.Sh SYNOPSIS +.In archive_entry.h +.Ft void +.Fo archive_entry_acl_add_entry +.Fa "struct archive_entry *" +.Fa "int type" +.Fa "int permset" +.Fa "int tag" +.Fa "int qual" +.Fa "const char *name" +.Fc +.Ft void +.Fo archive_entry_acl_add_entry_w +.Fa "struct archive_entry *" +.Fa "int type" +.Fa "int permset" +.Fa "int tag" +.Fa "int qual" +.Fa "const wchar_t *name" +.Fc +.Ft void +.Fn archive_entry_acl_clear "struct archive_entry *" +.Ft int +.Fn archive_entry_acl_count "struct archive_entry *" "int type" +.Ft int +.Fo archive_entry_acl_next +.Fa "struct archive_entry *" +.Fa "int want_type" +.Fa "int *type" +.Fa "int *permset" +.Fa "int *tag" +.Fa "int *qual" +.Fa "const char **name" +.Fc +.Ft int +.Fo archive_entry_acl_next_w +.Fa "struct archive_entry *" +.Fa "int want_type" +.Fa "int *type" +.Fa "int *permset" +.Fa "int *tag" +.Fa "int *qual" +.Fa "const wchar_t **name" +.Fc +.Ft int +.Fn archive_entry_acl_reset "struct archive_entry *" "int want_type" +.Ft const wchar_t * +.Fn archive_entry_acl_text_w "struct archive_entry *" "int flags" +.Ft time_t +.Fn archive_entry_atime "struct archive_entry *" +.Ft long +.Fn archive_entry_atime_nsec "struct archive_entry *" +.Ft "struct archive_entry *" +.Fn archive_entry_clear "struct archive_entry *" +.Ft struct archive_entry * +.Fn archive_entry_clone "struct archive_entry *" +.Ft const char * * +.Fn archive_entry_copy_fflags_text_w "struct archive_entry *" "const char *" +.Ft const wchar_t * +.Fn archive_entry_copy_fflags_text_w "struct archive_entry *" "const wchar_t *" +.Ft void +.Fn archive_entry_copy_gname "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_copy_gname_w "struct archive_entry *" "const wchar_t *" +.Ft void +.Fn archive_entry_copy_hardlink "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_copy_hardlink_w "struct archive_entry *" "const wchar_t *" +.Ft void +.Fn archive_entry_copy_sourcepath "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_copy_pathname_w "struct archive_entry *" "const wchar_t *" +.Ft void +.Fn archive_entry_copy_stat "struct archive_entry *" "const struct stat *" +.Ft void +.Fn archive_entry_copy_symlink "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_copy_symlink_w "struct archive_entry *" "const wchar_t *" +.Ft void +.Fn archive_entry_copy_uname "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_copy_uname_w "struct archive_entry *" "const wchar_t *" +.Ft dev_t +.Fn archive_entry_dev "struct archive_entry *" +.Ft dev_t +.Fn archive_entry_devmajor "struct archive_entry *" +.Ft dev_t +.Fn archive_entry_devminor "struct archive_entry *" +.Ft mode_t +.Fn archive_entry_filetype "struct archive_entry *" +.Ft void +.Fo archive_entry_fflags +.Fa "struct archive_entry *" +.Fa "unsigned long *set" +.Fa "unsigned long *clear" +.Fc +.Ft const char * +.Fn archive_entry_fflags_text "struct archive_entry *" +.Ft void +.Fn archive_entry_free "struct archive_entry *" +.Ft const char * +.Fn archive_entry_gname "struct archive_entry *" +.Ft const char * +.Fn archive_entry_hardlink "struct archive_entry *" +.Ft ino_t +.Fn archive_entry_ino "struct archive_entry *" +.Ft mode_t +.Fn archive_entry_mode "struct archive_entry *" +.Ft time_t +.Fn archive_entry_mtime "struct archive_entry *" +.Ft long +.Fn archive_entry_mtime_nsec "struct archive_entry *" +.Ft unsigned int +.Fn archive_entry_nlink "struct archive_entry *" +.Ft struct archive_entry * +.Fn archive_entry_new "void" +.Ft const char * +.Fn archive_entry_pathname "struct archive_entry *" +.Ft const wchar_t * +.Fn archive_entry_pathname_w "struct archive_entry *" +.Ft dev_t +.Fn archive_entry_rdev "struct archive_entry *" +.Ft dev_t +.Fn archive_entry_rdevmajor "struct archive_entry *" +.Ft dev_t +.Fn archive_entry_rdevminor "struct archive_entry *" +.Ft void +.Fn archive_entry_set_dev "struct archive_entry *" "dev_t" +.Ft void +.Fn archive_entry_set_devmajor "struct archive_entry *" "dev_t" +.Ft void +.Fn archive_entry_set_devminor "struct archive_entry *" "dev_t" +.Ft void +.Fn archive_entry_set_filetype "struct archive_entry *" "unsigned int" +.Ft void +.Fo archive_entry_set_fflags +.Fa "struct archive_entry *" +.Fa "unsigned long set" +.Fa "unsigned long clear" +.Fc +.Ft void +.Fn archive_entry_set_gid "struct archive_entry *" "gid_t" +.Ft void +.Fn archive_entry_set_gname "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_set_hardlink "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_set_ino "struct archive_entry *" "unsigned long" +.Ft void +.Fn archive_entry_set_link "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_set_mode "struct archive_entry *" "mode_t" +.Ft void +.Fn archive_entry_set_mtime "struct archive_entry *" "time_t" "long nanos" +.Ft void +.Fn archive_entry_set_nlink "struct archive_entry *" "unsigned int" +.Ft void +.Fn archive_entry_set_pathname "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_set_rdev "struct archive_entry *" "dev_t" +.Ft void +.Fn archive_entry_set_rdevmajor "struct archive_entry *" "dev_t" +.Ft void +.Fn archive_entry_set_rdevminor "struct archive_entry *" "dev_t" +.Ft void +.Fn archive_entry_set_size "struct archive_entry *" "int64_t" +.Ft void +.Fn archive_entry_set_symlink "struct archive_entry *" "const char *" +.Ft void +.Fn archive_entry_set_uid "struct archive_entry *" "uid_t" +.Ft void +.Fn archive_entry_set_uname "struct archive_entry *" "const char *" +.Ft int64_t +.Fn archive_entry_size "struct archive_entry *" +.Ft const char * +.Fn archive_entry_sourcepath "struct archive_entry *" +.Ft const struct stat * +.Fn archive_entry_stat "struct archive_entry *" +.Ft const char * +.Fn archive_entry_symlink "struct archive_entry *" +.Ft const char * +.Fn archive_entry_uname "struct archive_entry *" +.Sh DESCRIPTION +These functions create and manipulate data objects that +represent entries within an archive. +You can think of a +.Tn struct archive_entry +as a heavy-duty version of +.Tn struct stat : +it includes everything from +.Tn struct stat +plus associated pathname, textual group and user names, etc. +These objects are used by +.Xr libarchive 3 +to represent the metadata associated with a particular +entry in an archive. +.Ss Create and Destroy +There are functions to allocate, destroy, clear, and copy +.Va archive_entry +objects: +.Bl -tag -compact -width indent +.It Fn archive_entry_clear +Erases the object, resetting all internal fields to the +same state as a newly-created object. +This is provided to allow you to quickly recycle objects +without thrashing the heap. +.It Fn archive_entry_clone +A deep copy operation; all text fields are duplicated. +.It Fn archive_entry_free +Releases the +.Tn struct archive_entry +object. +.It Fn archive_entry_new +Allocate and return a blank +.Tn struct archive_entry +object. +.El +.Ss Set and Get Functions +Most of the functions here set or read entries in an object. +Such functions have one of the following forms: +.Bl -tag -compact -width indent +.It Fn archive_entry_set_XXXX +Stores the provided data in the object. +In particular, for strings, the pointer is stored, +not the referenced string. +.It Fn archive_entry_copy_XXXX +As above, except that the referenced data is copied +into the object. +.It Fn archive_entry_XXXX +Returns the specified data. +In the case of strings, a const-qualified pointer to +the string is returned. +.El +String data can be set or accessed as wide character strings +or normal +.Va char +strings. +The functions that use wide character strings are suffixed with +.Cm _w . +Note that these are different representations of the same data: +For example, if you store a narrow string and read the corresponding +wide string, the object will transparently convert formats +using the current locale. +Similarly, if you store a wide string and then store a +narrow string for the same data, the previously-set wide string will +be discarded in favor of the new data. +.Pp +There are a few set/get functions that merit additional description: +.Bl -tag -compact -width indent +.It Fn archive_entry_set_link +This function sets the symlink field if it is already set. +Otherwise, it sets the hardlink field. +.El +.Ss File Flags +File flags are transparently converted between a bitmap +representation and a textual format. +For example, if you set the bitmap and ask for text, the library +will build a canonical text format. +However, if you set a text format and request a text format, +you will get back the same text, even if it is ill-formed. +If you need to canonicalize a textual flags string, you should first set the +text form, then request the bitmap form, then use that to set the bitmap form. +Setting the bitmap format will clear the internal text representation +and force it to be reconstructed when you next request the text form. +.Pp +The bitmap format consists of two integers, one containing bits +that should be set, the other specifying bits that should be +cleared. +Bits not mentioned in either bitmap will be ignored. +Usually, the bitmap of bits to be cleared will be set to zero. +In unusual circumstances, you can force a fully-specified set +of file flags by setting the bitmap of flags to clear to the complement +of the bitmap of flags to set. +(This differs from +.Xr fflagstostr 3 , +which only includes names for set bits.) +Converting a bitmap to a textual string is a platform-specific +operation; bits that are not meaningful on the current platform +will be ignored. +.Pp +The canonical text format is a comma-separated list of flag names. +The +.Fn archive_entry_copy_fflags_text +and +.Fn archive_entry_copy_fflags_text_w +functions parse the provided text and sets the internal bitmap values. +This is a platform-specific operation; names that are not meaningful +on the current platform will be ignored. +The function returns a pointer to the start of the first name that was not +recognized, or NULL if every name was recognized. +Note that every name--including names that follow an unrecognized name--will +be evaluated, and the bitmaps will be set to reflect every name that is +recognized. +(In particular, this differs from +.Xr strtofflags 3 , +which stops parsing at the first unrecognized name.) +.Ss ACL Handling +XXX This needs serious help. +XXX +.Pp +An +.Dq Access Control List +(ACL) is a list of permissions that grant access to particular users or +groups beyond what would normally be provided by standard POSIX mode bits. +The ACL handling here addresses some deficiencies in the POSIX.1e draft 17 ACL +specification. +In particular, POSIX.1e draft 17 specifies several different formats, but +none of those formats include both textual user/group names and numeric +UIDs/GIDs. +.Pp +XXX explain ACL stuff XXX +.\" .Sh EXAMPLE +.\" .Sh RETURN VALUES +.\" .Sh ERRORS +.Sh SEE ALSO +.Xr archive 3 +.Sh HISTORY +The +.Nm libarchive +library first appeared in +.Fx 5.3 . +.Sh AUTHORS +.An -nosplit +The +.Nm libarchive +library was written by +.An Tim Kientzle Aq kientzle@acm.org . +.\" .Sh BUGS diff --git a/Utilities/cmlibarchive/libarchive/archive_entry.c b/Utilities/cmlibarchive/libarchive/archive_entry.c new file mode 100644 index 000000000..9c5507193 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry.c @@ -0,0 +1,2117 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry.c,v 1.55 2008/12/23 05:01:43 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef MAJOR_IN_MKDEV +#include +#else +#ifdef MAJOR_IN_SYSMACROS +#include +#endif +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_LINUX_FS_H +#include /* for Linux file flags */ +#endif +/* + * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h. + * As the include guards don't agree, the order of include is important. + */ +#ifdef HAVE_LINUX_EXT2_FS_H +#include /* for Linux file flags */ +#endif +#if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__) +#include /* for Linux file flags */ +#endif +#include +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_WCHAR_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_entry_private.h" + +#undef max +#define max(a, b) ((a)>(b)?(a):(b)) + +/* Play games to come up with a suitable makedev() definition. */ +#ifdef __QNXNTO__ +/* QNX. */ +#include +#define ae_makedev(maj, min) makedev(ND_LOCAL_NODE, (maj), (min)) +#elif defined makedev +/* There's a "makedev" macro. */ +#define ae_makedev(maj, min) makedev((maj), (min)) +#elif defined mkdev || ((defined _WIN32 || defined __WIN32__) && !defined(__CYGWIN__)) +/* Windows. */ +#define ae_makedev(maj, min) mkdev((maj), (min)) +#else +/* There's a "makedev" function. */ +#define ae_makedev(maj, min) makedev((maj), (min)) +#endif + +static void aes_clean(struct aes *); +static void aes_copy(struct aes *dest, struct aes *src); +static const char * aes_get_mbs(struct aes *); +static const wchar_t * aes_get_wcs(struct aes *); +static int aes_set_mbs(struct aes *, const char *mbs); +static int aes_copy_mbs(struct aes *, const char *mbs); +/* static void aes_set_wcs(struct aes *, const wchar_t *wcs); */ +static int aes_copy_wcs(struct aes *, const wchar_t *wcs); +static int aes_copy_wcs_len(struct aes *, const wchar_t *wcs, size_t); + +static char * ae_fflagstostr(unsigned long bitset, unsigned long bitclear); +static const wchar_t *ae_wcstofflags(const wchar_t *stringp, + unsigned long *setp, unsigned long *clrp); +static const char *ae_strtofflags(const char *stringp, + unsigned long *setp, unsigned long *clrp); +static void append_entry_w(wchar_t **wp, const wchar_t *prefix, int tag, + const wchar_t *wname, int perm, int id); +static void append_id_w(wchar_t **wp, int id); + +static int acl_special(struct archive_entry *entry, + int type, int permset, int tag); +static struct ae_acl *acl_new_entry(struct archive_entry *entry, + int type, int permset, int tag, int id); +static int isint_w(const wchar_t *start, const wchar_t *end, int *result); +static int ismode_w(const wchar_t *start, const wchar_t *end, int *result); +static void next_field_w(const wchar_t **wp, const wchar_t **start, + const wchar_t **end, wchar_t *sep); +static int prefix_w(const wchar_t *start, const wchar_t *end, + const wchar_t *test); +static void +archive_entry_acl_add_entry_w_len(struct archive_entry *entry, int type, + int permset, int tag, int id, const wchar_t *name, size_t); + + +#ifndef HAVE_WCSCPY +static wchar_t * wcscpy(wchar_t *s1, const wchar_t *s2) +{ + wchar_t *dest = s1; + while ((*s1 = *s2) != L'\0') + ++s1, ++s2; + return dest; +} +#endif +#ifndef HAVE_WCSLEN +static size_t wcslen(const wchar_t *s) +{ + const wchar_t *p = s; + while (*p != L'\0') + ++p; + return p - s; +} +#endif +#ifndef HAVE_WMEMCMP +/* Good enough for simple equality testing, but not for sorting. */ +#define wmemcmp(a,b,i) memcmp((a), (b), (i) * sizeof(wchar_t)) +#endif +#ifndef HAVE_WMEMCPY +#define wmemcpy(a,b,i) (wchar_t *)memcpy((a), (b), (i) * sizeof(wchar_t)) +#endif + +static void +aes_clean(struct aes *aes) +{ + if (aes->aes_wcs) { + free((wchar_t *)(uintptr_t)aes->aes_wcs); + aes->aes_wcs = NULL; + } + archive_string_free(&(aes->aes_mbs)); + archive_string_free(&(aes->aes_utf8)); + aes->aes_set = 0; +} + +static void +aes_copy(struct aes *dest, struct aes *src) +{ + wchar_t *wp; + + dest->aes_set = src->aes_set; + archive_string_copy(&(dest->aes_mbs), &(src->aes_mbs)); + archive_string_copy(&(dest->aes_utf8), &(src->aes_utf8)); + + if (src->aes_wcs != NULL) { + wp = (wchar_t *)malloc((wcslen(src->aes_wcs) + 1) + * sizeof(wchar_t)); + if (wp == NULL) + __archive_errx(1, "No memory for aes_copy()"); + wcscpy(wp, src->aes_wcs); + dest->aes_wcs = wp; + } +} + +static const char * +aes_get_utf8(struct aes *aes) +{ + if (aes->aes_set & AES_SET_UTF8) + return (aes->aes_utf8.s); + if ((aes->aes_set & AES_SET_WCS) + && archive_strappend_w_utf8(&(aes->aes_utf8), aes->aes_wcs) != NULL) { + aes->aes_set |= AES_SET_UTF8; + return (aes->aes_utf8.s); + } + return (NULL); +} + +static const char * +aes_get_mbs(struct aes *aes) +{ + /* If we already have an MBS form, return that immediately. */ + if (aes->aes_set & AES_SET_MBS) + return (aes->aes_mbs.s); + /* If there's a WCS form, try converting with the native locale. */ + if ((aes->aes_set & AES_SET_WCS) + && archive_strappend_w_mbs(&(aes->aes_mbs), aes->aes_wcs) != NULL) { + aes->aes_set |= AES_SET_MBS; + return (aes->aes_mbs.s); + } + /* We'll use UTF-8 for MBS if all else fails. */ + return (aes_get_utf8(aes)); +} + +static const wchar_t * +aes_get_wcs(struct aes *aes) +{ + wchar_t *w; + int r; + + /* Return WCS form if we already have it. */ + if (aes->aes_set & AES_SET_WCS) + return (aes->aes_wcs); + + if (aes->aes_set & AES_SET_MBS) { + /* Try converting MBS to WCS using native locale. */ + /* + * No single byte will be more than one wide character, + * so this length estimate will always be big enough. + */ + size_t wcs_length = aes->aes_mbs.length; + + w = (wchar_t *)malloc((wcs_length + 1) * sizeof(wchar_t)); + if (w == NULL) + __archive_errx(1, "No memory for aes_get_wcs()"); + r = mbstowcs(w, aes->aes_mbs.s, wcs_length); + if (r > 0) { + w[r] = 0; + aes->aes_set |= AES_SET_WCS; + return (aes->aes_wcs = w); + } + free(w); + } + + if (aes->aes_set & AES_SET_UTF8) { + /* Try converting UTF8 to WCS. */ + aes->aes_wcs = __archive_string_utf8_w(&(aes->aes_utf8)); + if (aes->aes_wcs != NULL) + aes->aes_set |= AES_SET_WCS; + return (aes->aes_wcs); + } + return (NULL); +} + +static int +aes_set_mbs(struct aes *aes, const char *mbs) +{ + return (aes_copy_mbs(aes, mbs)); +} + +static int +aes_copy_mbs(struct aes *aes, const char *mbs) +{ + if (mbs == NULL) { + aes->aes_set = 0; + return (0); + } + aes->aes_set = AES_SET_MBS; /* Only MBS form is set now. */ + archive_strcpy(&(aes->aes_mbs), mbs); + archive_string_empty(&(aes->aes_utf8)); + if (aes->aes_wcs) { + free((wchar_t *)(uintptr_t)aes->aes_wcs); + aes->aes_wcs = NULL; + } + return (0); +} + +/* + * The 'update' form tries to proactively update all forms of + * this string (WCS and MBS) and returns an error if any of + * them fail. This is used by the 'pax' handler, for instance, + * to detect and report character-conversion failures early while + * still allowing clients to get potentially useful values from + * the more tolerant lazy conversions. (get_mbs and get_wcs will + * strive to give the user something useful, so you can get hopefully + * usable values even if some of the character conversions are failing.) + */ +static int +aes_update_utf8(struct aes *aes, const char *utf8) +{ + if (utf8 == NULL) { + aes->aes_set = 0; + return (1); /* Succeeded in clearing everything. */ + } + + /* Save the UTF8 string. */ + archive_strcpy(&(aes->aes_utf8), utf8); + + /* Empty the mbs and wcs strings. */ + archive_string_empty(&(aes->aes_mbs)); + if (aes->aes_wcs) { + free((wchar_t *)(uintptr_t)aes->aes_wcs); + aes->aes_wcs = NULL; + } + + aes->aes_set = AES_SET_UTF8; /* Only UTF8 is set now. */ + + /* TODO: We should just do a direct UTF-8 to MBS conversion + * here. That would be faster, use less space, and give the + * same information. (If a UTF-8 to MBS conversion succeeds, + * then UTF-8->WCS and Unicode->MBS conversions will both + * succeed.) */ + + /* Try converting UTF8 to WCS, return false on failure. */ + aes->aes_wcs = __archive_string_utf8_w(&(aes->aes_utf8)); + if (aes->aes_wcs == NULL) + return (0); + aes->aes_set = AES_SET_UTF8 | AES_SET_WCS; /* Both UTF8 and WCS set. */ + + /* Try converting WCS to MBS, return false on failure. */ + if (archive_strappend_w_mbs(&(aes->aes_mbs), aes->aes_wcs) == NULL) + return (0); + aes->aes_set = AES_SET_UTF8 | AES_SET_WCS | AES_SET_MBS; + + /* All conversions succeeded. */ + return (1); +} + +static int +aes_copy_wcs(struct aes *aes, const wchar_t *wcs) +{ + return aes_copy_wcs_len(aes, wcs, wcs == NULL ? 0 : wcslen(wcs)); +} + +static int +aes_copy_wcs_len(struct aes *aes, const wchar_t *wcs, size_t len) +{ + wchar_t *w; + + if (wcs == NULL) { + aes->aes_set = 0; + return (0); + } + aes->aes_set = AES_SET_WCS; /* Only WCS form set. */ + archive_string_empty(&(aes->aes_mbs)); + archive_string_empty(&(aes->aes_utf8)); + if (aes->aes_wcs) { + free((wchar_t *)(uintptr_t)aes->aes_wcs); + aes->aes_wcs = NULL; + } + w = (wchar_t *)malloc((len + 1) * sizeof(wchar_t)); + if (w == NULL) + __archive_errx(1, "No memory for aes_copy_wcs()"); + wmemcpy(w, wcs, len); + w[len] = L'\0'; + aes->aes_wcs = w; + return (0); +} + +/**************************************************************************** + * + * Public Interface + * + ****************************************************************************/ + +struct archive_entry * +archive_entry_clear(struct archive_entry *entry) +{ + if (entry == NULL) + return (NULL); + aes_clean(&entry->ae_fflags_text); + aes_clean(&entry->ae_gname); + aes_clean(&entry->ae_hardlink); + aes_clean(&entry->ae_pathname); + aes_clean(&entry->ae_sourcepath); + aes_clean(&entry->ae_symlink); + aes_clean(&entry->ae_uname); + archive_entry_acl_clear(entry); + archive_entry_xattr_clear(entry); + free(entry->stat); + memset(entry, 0, sizeof(*entry)); + return entry; +} + +struct archive_entry * +archive_entry_clone(struct archive_entry *entry) +{ + struct archive_entry *entry2; + struct ae_acl *ap, *ap2; + struct ae_xattr *xp; + + /* Allocate new structure and copy over all of the fields. */ + entry2 = (struct archive_entry *)malloc(sizeof(*entry2)); + if (entry2 == NULL) + return (NULL); + memset(entry2, 0, sizeof(*entry2)); + entry2->ae_stat = entry->ae_stat; + entry2->ae_fflags_set = entry->ae_fflags_set; + entry2->ae_fflags_clear = entry->ae_fflags_clear; + + aes_copy(&entry2->ae_fflags_text, &entry->ae_fflags_text); + aes_copy(&entry2->ae_gname, &entry->ae_gname); + aes_copy(&entry2->ae_hardlink, &entry->ae_hardlink); + aes_copy(&entry2->ae_pathname, &entry->ae_pathname); + aes_copy(&entry2->ae_sourcepath, &entry->ae_sourcepath); + aes_copy(&entry2->ae_symlink, &entry->ae_symlink); + entry2->ae_set = entry->ae_set; + aes_copy(&entry2->ae_uname, &entry->ae_uname); + + /* Copy ACL data over. */ + ap = entry->acl_head; + while (ap != NULL) { + ap2 = acl_new_entry(entry2, + ap->type, ap->permset, ap->tag, ap->id); + if (ap2 != NULL) + aes_copy(&ap2->name, &ap->name); + ap = ap->next; + } + + /* Copy xattr data over. */ + xp = entry->xattr_head; + while (xp != NULL) { + archive_entry_xattr_add_entry(entry2, + xp->name, xp->value, xp->size); + xp = xp->next; + } + + return (entry2); +} + +void +archive_entry_free(struct archive_entry *entry) +{ + archive_entry_clear(entry); + free(entry); +} + +struct archive_entry * +archive_entry_new(void) +{ + struct archive_entry *entry; + + entry = (struct archive_entry *)malloc(sizeof(*entry)); + if (entry == NULL) + return (NULL); + memset(entry, 0, sizeof(*entry)); + return (entry); +} + +/* + * Functions for reading fields from an archive_entry. + */ + +time_t +archive_entry_atime(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_atime); +} + +long +archive_entry_atime_nsec(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_atime_nsec); +} + +int +archive_entry_atime_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_ATIME); +} + +time_t +archive_entry_birthtime(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_birthtime); +} + +long +archive_entry_birthtime_nsec(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_birthtime_nsec); +} + +int +archive_entry_birthtime_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_BIRTHTIME); +} + +time_t +archive_entry_ctime(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_ctime); +} + +int +archive_entry_ctime_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_CTIME); +} + +long +archive_entry_ctime_nsec(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_ctime_nsec); +} + +dev_t +archive_entry_dev(struct archive_entry *entry) +{ + if (entry->ae_stat.aest_dev_is_broken_down) + return ae_makedev(entry->ae_stat.aest_devmajor, + entry->ae_stat.aest_devminor); + else + return (entry->ae_stat.aest_dev); +} + +dev_t +archive_entry_devmajor(struct archive_entry *entry) +{ + if (entry->ae_stat.aest_dev_is_broken_down) + return (entry->ae_stat.aest_devmajor); + else + return major(entry->ae_stat.aest_dev); +} + +dev_t +archive_entry_devminor(struct archive_entry *entry) +{ + if (entry->ae_stat.aest_dev_is_broken_down) + return (entry->ae_stat.aest_devminor); + else + return minor(entry->ae_stat.aest_dev); +} + +mode_t +archive_entry_filetype(struct archive_entry *entry) +{ + return (AE_IFMT & entry->ae_stat.aest_mode); +} + +void +archive_entry_fflags(struct archive_entry *entry, + unsigned long *set, unsigned long *clear) +{ + *set = entry->ae_fflags_set; + *clear = entry->ae_fflags_clear; +} + +/* + * Note: if text was provided, this just returns that text. If you + * really need the text to be rebuilt in a canonical form, set the + * text, ask for the bitmaps, then set the bitmaps. (Setting the + * bitmaps clears any stored text.) This design is deliberate: if + * we're editing archives, we don't want to discard flags just because + * they aren't supported on the current system. The bitmap<->text + * conversions are platform-specific (see below). + */ +const char * +archive_entry_fflags_text(struct archive_entry *entry) +{ + const char *f; + char *p; + + f = aes_get_mbs(&entry->ae_fflags_text); + if (f != NULL) + return (f); + + if (entry->ae_fflags_set == 0 && entry->ae_fflags_clear == 0) + return (NULL); + + p = ae_fflagstostr(entry->ae_fflags_set, entry->ae_fflags_clear); + if (p == NULL) + return (NULL); + + aes_copy_mbs(&entry->ae_fflags_text, p); + free(p); + f = aes_get_mbs(&entry->ae_fflags_text); + return (f); +} + +gid_t +archive_entry_gid(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_gid); +} + +const char * +archive_entry_gname(struct archive_entry *entry) +{ + return (aes_get_mbs(&entry->ae_gname)); +} + +const wchar_t * +archive_entry_gname_w(struct archive_entry *entry) +{ + return (aes_get_wcs(&entry->ae_gname)); +} + +const char * +archive_entry_hardlink(struct archive_entry *entry) +{ + if (entry->ae_set & AE_SET_HARDLINK) + return (aes_get_mbs(&entry->ae_hardlink)); + return (NULL); +} + +const wchar_t * +archive_entry_hardlink_w(struct archive_entry *entry) +{ + if (entry->ae_set & AE_SET_HARDLINK) + return (aes_get_wcs(&entry->ae_hardlink)); + return (NULL); +} + +ino_t +archive_entry_ino(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_ino); +} + +int64_t +archive_entry_ino64(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_ino); +} + +mode_t +archive_entry_mode(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_mode); +} + +time_t +archive_entry_mtime(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_mtime); +} + +long +archive_entry_mtime_nsec(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_mtime_nsec); +} + +int +archive_entry_mtime_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_MTIME); +} + +unsigned int +archive_entry_nlink(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_nlink); +} + +const char * +archive_entry_pathname(struct archive_entry *entry) +{ + return (aes_get_mbs(&entry->ae_pathname)); +} + +const wchar_t * +archive_entry_pathname_w(struct archive_entry *entry) +{ + return (aes_get_wcs(&entry->ae_pathname)); +} + +dev_t +archive_entry_rdev(struct archive_entry *entry) +{ + if (entry->ae_stat.aest_rdev_is_broken_down) + return ae_makedev(entry->ae_stat.aest_rdevmajor, + entry->ae_stat.aest_rdevminor); + else + return (entry->ae_stat.aest_rdev); +} + +dev_t +archive_entry_rdevmajor(struct archive_entry *entry) +{ + if (entry->ae_stat.aest_rdev_is_broken_down) + return (entry->ae_stat.aest_rdevmajor); + else + return major(entry->ae_stat.aest_rdev); +} + +dev_t +archive_entry_rdevminor(struct archive_entry *entry) +{ + if (entry->ae_stat.aest_rdev_is_broken_down) + return (entry->ae_stat.aest_rdevminor); + else + return minor(entry->ae_stat.aest_rdev); +} + +int64_t +archive_entry_size(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_size); +} + +int +archive_entry_size_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_SIZE); +} + +const char * +archive_entry_sourcepath(struct archive_entry *entry) +{ + return (aes_get_mbs(&entry->ae_sourcepath)); +} + +const char * +archive_entry_symlink(struct archive_entry *entry) +{ + if (entry->ae_set & AE_SET_SYMLINK) + return (aes_get_mbs(&entry->ae_symlink)); + return (NULL); +} + +const wchar_t * +archive_entry_symlink_w(struct archive_entry *entry) +{ + if (entry->ae_set & AE_SET_SYMLINK) + return (aes_get_wcs(&entry->ae_symlink)); + return (NULL); +} + +uid_t +archive_entry_uid(struct archive_entry *entry) +{ + return (entry->ae_stat.aest_uid); +} + +const char * +archive_entry_uname(struct archive_entry *entry) +{ + return (aes_get_mbs(&entry->ae_uname)); +} + +const wchar_t * +archive_entry_uname_w(struct archive_entry *entry) +{ + return (aes_get_wcs(&entry->ae_uname)); +} + +/* + * Functions to set archive_entry properties. + */ + +void +archive_entry_set_filetype(struct archive_entry *entry, unsigned int type) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_mode &= ~AE_IFMT; + entry->ae_stat.aest_mode |= AE_IFMT & type; +} + +void +archive_entry_set_fflags(struct archive_entry *entry, + unsigned long set, unsigned long clear) +{ + aes_clean(&entry->ae_fflags_text); + entry->ae_fflags_set = set; + entry->ae_fflags_clear = clear; +} + +const char * +archive_entry_copy_fflags_text(struct archive_entry *entry, + const char *flags) +{ + aes_copy_mbs(&entry->ae_fflags_text, flags); + return (ae_strtofflags(flags, + &entry->ae_fflags_set, &entry->ae_fflags_clear)); +} + +const wchar_t * +archive_entry_copy_fflags_text_w(struct archive_entry *entry, + const wchar_t *flags) +{ + aes_copy_wcs(&entry->ae_fflags_text, flags); + return (ae_wcstofflags(flags, + &entry->ae_fflags_set, &entry->ae_fflags_clear)); +} + +void +archive_entry_set_gid(struct archive_entry *entry, gid_t g) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_gid = g; +} + +void +archive_entry_set_gname(struct archive_entry *entry, const char *name) +{ + aes_set_mbs(&entry->ae_gname, name); +} + +void +archive_entry_copy_gname(struct archive_entry *entry, const char *name) +{ + aes_copy_mbs(&entry->ae_gname, name); +} + +void +archive_entry_copy_gname_w(struct archive_entry *entry, const wchar_t *name) +{ + aes_copy_wcs(&entry->ae_gname, name); +} + +int +archive_entry_update_gname_utf8(struct archive_entry *entry, const char *name) +{ + return (aes_update_utf8(&entry->ae_gname, name)); +} + +void +archive_entry_set_ino(struct archive_entry *entry, unsigned long ino) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_ino = ino; +} + +void +archive_entry_set_ino64(struct archive_entry *entry, int64_t ino) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_ino = ino; +} + +void +archive_entry_set_hardlink(struct archive_entry *entry, const char *target) +{ + aes_set_mbs(&entry->ae_hardlink, target); + if (target != NULL) + entry->ae_set |= AE_SET_HARDLINK; + else + entry->ae_set &= ~AE_SET_HARDLINK; +} + +void +archive_entry_copy_hardlink(struct archive_entry *entry, const char *target) +{ + aes_copy_mbs(&entry->ae_hardlink, target); + if (target != NULL) + entry->ae_set |= AE_SET_HARDLINK; + else + entry->ae_set &= ~AE_SET_HARDLINK; +} + +void +archive_entry_copy_hardlink_w(struct archive_entry *entry, const wchar_t *target) +{ + aes_copy_wcs(&entry->ae_hardlink, target); + if (target != NULL) + entry->ae_set |= AE_SET_HARDLINK; + else + entry->ae_set &= ~AE_SET_HARDLINK; +} + +void +archive_entry_set_atime(struct archive_entry *entry, time_t t, long ns) +{ + entry->stat_valid = 0; + entry->ae_set |= AE_SET_ATIME; + entry->ae_stat.aest_atime = t; + entry->ae_stat.aest_atime_nsec = ns; +} + +void +archive_entry_unset_atime(struct archive_entry *entry) +{ + archive_entry_set_atime(entry, 0, 0); + entry->ae_set &= ~AE_SET_ATIME; +} + +void +archive_entry_set_birthtime(struct archive_entry *entry, time_t m, long ns) +{ + entry->stat_valid = 0; + entry->ae_set |= AE_SET_BIRTHTIME; + entry->ae_stat.aest_birthtime = m; + entry->ae_stat.aest_birthtime_nsec = ns; +} + +void +archive_entry_unset_birthtime(struct archive_entry *entry) +{ + archive_entry_set_birthtime(entry, 0, 0); + entry->ae_set &= ~AE_SET_BIRTHTIME; +} + +void +archive_entry_set_ctime(struct archive_entry *entry, time_t t, long ns) +{ + entry->stat_valid = 0; + entry->ae_set |= AE_SET_CTIME; + entry->ae_stat.aest_ctime = t; + entry->ae_stat.aest_ctime_nsec = ns; +} + +void +archive_entry_unset_ctime(struct archive_entry *entry) +{ + archive_entry_set_ctime(entry, 0, 0); + entry->ae_set &= ~AE_SET_CTIME; +} + +void +archive_entry_set_dev(struct archive_entry *entry, dev_t d) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_dev_is_broken_down = 0; + entry->ae_stat.aest_dev = d; +} + +void +archive_entry_set_devmajor(struct archive_entry *entry, dev_t m) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_dev_is_broken_down = 1; + entry->ae_stat.aest_devmajor = m; +} + +void +archive_entry_set_devminor(struct archive_entry *entry, dev_t m) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_dev_is_broken_down = 1; + entry->ae_stat.aest_devminor = m; +} + +/* Set symlink if symlink is already set, else set hardlink. */ +void +archive_entry_set_link(struct archive_entry *entry, const char *target) +{ + if (entry->ae_set & AE_SET_SYMLINK) + aes_set_mbs(&entry->ae_symlink, target); + else + aes_set_mbs(&entry->ae_hardlink, target); +} + +/* Set symlink if symlink is already set, else set hardlink. */ +void +archive_entry_copy_link(struct archive_entry *entry, const char *target) +{ + if (entry->ae_set & AE_SET_SYMLINK) + aes_copy_mbs(&entry->ae_symlink, target); + else + aes_copy_mbs(&entry->ae_hardlink, target); +} + +/* Set symlink if symlink is already set, else set hardlink. */ +void +archive_entry_copy_link_w(struct archive_entry *entry, const wchar_t *target) +{ + if (entry->ae_set & AE_SET_SYMLINK) + aes_copy_wcs(&entry->ae_symlink, target); + else + aes_copy_wcs(&entry->ae_hardlink, target); +} + +int +archive_entry_update_link_utf8(struct archive_entry *entry, const char *target) +{ + if (entry->ae_set & AE_SET_SYMLINK) + return (aes_update_utf8(&entry->ae_symlink, target)); + else + return (aes_update_utf8(&entry->ae_hardlink, target)); +} + +void +archive_entry_set_mode(struct archive_entry *entry, mode_t m) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_mode = m; +} + +void +archive_entry_set_mtime(struct archive_entry *entry, time_t m, long ns) +{ + entry->stat_valid = 0; + entry->ae_set |= AE_SET_MTIME; + entry->ae_stat.aest_mtime = m; + entry->ae_stat.aest_mtime_nsec = ns; +} + +void +archive_entry_unset_mtime(struct archive_entry *entry) +{ + archive_entry_set_mtime(entry, 0, 0); + entry->ae_set &= ~AE_SET_MTIME; +} + +void +archive_entry_set_nlink(struct archive_entry *entry, unsigned int nlink) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_nlink = nlink; +} + +void +archive_entry_set_pathname(struct archive_entry *entry, const char *name) +{ + aes_set_mbs(&entry->ae_pathname, name); +} + +void +archive_entry_copy_pathname(struct archive_entry *entry, const char *name) +{ + aes_copy_mbs(&entry->ae_pathname, name); +} + +void +archive_entry_copy_pathname_w(struct archive_entry *entry, const wchar_t *name) +{ + aes_copy_wcs(&entry->ae_pathname, name); +} + +int +archive_entry_update_pathname_utf8(struct archive_entry *entry, const char *name) +{ + return (aes_update_utf8(&entry->ae_pathname, name)); +} + +void +archive_entry_set_perm(struct archive_entry *entry, mode_t p) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_mode &= AE_IFMT; + entry->ae_stat.aest_mode |= ~AE_IFMT & p; +} + +void +archive_entry_set_rdev(struct archive_entry *entry, dev_t m) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_rdev = m; + entry->ae_stat.aest_rdev_is_broken_down = 0; +} + +void +archive_entry_set_rdevmajor(struct archive_entry *entry, dev_t m) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_rdev_is_broken_down = 1; + entry->ae_stat.aest_rdevmajor = m; +} + +void +archive_entry_set_rdevminor(struct archive_entry *entry, dev_t m) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_rdev_is_broken_down = 1; + entry->ae_stat.aest_rdevminor = m; +} + +void +archive_entry_set_size(struct archive_entry *entry, int64_t s) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_size = s; + entry->ae_set |= AE_SET_SIZE; +} + +void +archive_entry_unset_size(struct archive_entry *entry) +{ + archive_entry_set_size(entry, 0); + entry->ae_set &= ~AE_SET_SIZE; +} + +void +archive_entry_copy_sourcepath(struct archive_entry *entry, const char *path) +{ + aes_set_mbs(&entry->ae_sourcepath, path); +} + +void +archive_entry_set_symlink(struct archive_entry *entry, const char *linkname) +{ + aes_set_mbs(&entry->ae_symlink, linkname); + if (linkname != NULL) + entry->ae_set |= AE_SET_SYMLINK; + else + entry->ae_set &= ~AE_SET_SYMLINK; +} + +void +archive_entry_copy_symlink(struct archive_entry *entry, const char *linkname) +{ + aes_copy_mbs(&entry->ae_symlink, linkname); + if (linkname != NULL) + entry->ae_set |= AE_SET_SYMLINK; + else + entry->ae_set &= ~AE_SET_SYMLINK; +} + +void +archive_entry_copy_symlink_w(struct archive_entry *entry, const wchar_t *linkname) +{ + aes_copy_wcs(&entry->ae_symlink, linkname); + if (linkname != NULL) + entry->ae_set |= AE_SET_SYMLINK; + else + entry->ae_set &= ~AE_SET_SYMLINK; +} + +void +archive_entry_set_uid(struct archive_entry *entry, uid_t u) +{ + entry->stat_valid = 0; + entry->ae_stat.aest_uid = u; +} + +void +archive_entry_set_uname(struct archive_entry *entry, const char *name) +{ + aes_set_mbs(&entry->ae_uname, name); +} + +void +archive_entry_copy_uname(struct archive_entry *entry, const char *name) +{ + aes_copy_mbs(&entry->ae_uname, name); +} + +void +archive_entry_copy_uname_w(struct archive_entry *entry, const wchar_t *name) +{ + aes_copy_wcs(&entry->ae_uname, name); +} + +int +archive_entry_update_uname_utf8(struct archive_entry *entry, const char *name) +{ + return (aes_update_utf8(&entry->ae_uname, name)); +} + +/* + * ACL management. The following would, of course, be a lot simpler + * if: 1) the last draft of POSIX.1e were a really thorough and + * complete standard that addressed the needs of ACL archiving and 2) + * everyone followed it faithfully. Alas, neither is true, so the + * following is a lot more complex than might seem necessary to the + * uninitiated. + */ + +void +archive_entry_acl_clear(struct archive_entry *entry) +{ + struct ae_acl *ap; + + while (entry->acl_head != NULL) { + ap = entry->acl_head->next; + aes_clean(&entry->acl_head->name); + free(entry->acl_head); + entry->acl_head = ap; + } + if (entry->acl_text_w != NULL) { + free(entry->acl_text_w); + entry->acl_text_w = NULL; + } + entry->acl_p = NULL; + entry->acl_state = 0; /* Not counting. */ +} + +/* + * Add a single ACL entry to the internal list of ACL data. + */ +void +archive_entry_acl_add_entry(struct archive_entry *entry, + int type, int permset, int tag, int id, const char *name) +{ + struct ae_acl *ap; + + if (acl_special(entry, type, permset, tag) == 0) + return; + ap = acl_new_entry(entry, type, permset, tag, id); + if (ap == NULL) { + /* XXX Error XXX */ + return; + } + if (name != NULL && *name != '\0') + aes_copy_mbs(&ap->name, name); + else + aes_clean(&ap->name); +} + +/* + * As above, but with a wide-character name. + */ +void +archive_entry_acl_add_entry_w(struct archive_entry *entry, + int type, int permset, int tag, int id, const wchar_t *name) +{ + archive_entry_acl_add_entry_w_len(entry, type, permset, tag, id, name, wcslen(name)); +} + +void +archive_entry_acl_add_entry_w_len(struct archive_entry *entry, + int type, int permset, int tag, int id, const wchar_t *name, size_t len) +{ + struct ae_acl *ap; + + if (acl_special(entry, type, permset, tag) == 0) + return; + ap = acl_new_entry(entry, type, permset, tag, id); + if (ap == NULL) { + /* XXX Error XXX */ + return; + } + if (name != NULL && *name != L'\0' && len > 0) + aes_copy_wcs_len(&ap->name, name, len); + else + aes_clean(&ap->name); +} + +/* + * If this ACL entry is part of the standard POSIX permissions set, + * store the permissions in the stat structure and return zero. + */ +static int +acl_special(struct archive_entry *entry, int type, int permset, int tag) +{ + if (type == ARCHIVE_ENTRY_ACL_TYPE_ACCESS) { + switch (tag) { + case ARCHIVE_ENTRY_ACL_USER_OBJ: + entry->ae_stat.aest_mode &= ~0700; + entry->ae_stat.aest_mode |= (permset & 7) << 6; + return (0); + case ARCHIVE_ENTRY_ACL_GROUP_OBJ: + entry->ae_stat.aest_mode &= ~0070; + entry->ae_stat.aest_mode |= (permset & 7) << 3; + return (0); + case ARCHIVE_ENTRY_ACL_OTHER: + entry->ae_stat.aest_mode &= ~0007; + entry->ae_stat.aest_mode |= permset & 7; + return (0); + } + } + return (1); +} + +/* + * Allocate and populate a new ACL entry with everything but the + * name. + */ +static struct ae_acl * +acl_new_entry(struct archive_entry *entry, + int type, int permset, int tag, int id) +{ + struct ae_acl *ap, *aq; + + if (type != ARCHIVE_ENTRY_ACL_TYPE_ACCESS && + type != ARCHIVE_ENTRY_ACL_TYPE_DEFAULT) + return (NULL); + if (entry->acl_text_w != NULL) { + free(entry->acl_text_w); + entry->acl_text_w = NULL; + } + + /* XXX TODO: More sanity-checks on the arguments XXX */ + + /* If there's a matching entry already in the list, overwrite it. */ + ap = entry->acl_head; + aq = NULL; + while (ap != NULL) { + if (ap->type == type && ap->tag == tag && ap->id == id) { + ap->permset = permset; + return (ap); + } + aq = ap; + ap = ap->next; + } + + /* Add a new entry to the end of the list. */ + ap = (struct ae_acl *)malloc(sizeof(*ap)); + if (ap == NULL) + return (NULL); + memset(ap, 0, sizeof(*ap)); + if (aq == NULL) + entry->acl_head = ap; + else + aq->next = ap; + ap->type = type; + ap->tag = tag; + ap->id = id; + ap->permset = permset; + return (ap); +} + +/* + * Return a count of entries matching "want_type". + */ +int +archive_entry_acl_count(struct archive_entry *entry, int want_type) +{ + int count; + struct ae_acl *ap; + + count = 0; + ap = entry->acl_head; + while (ap != NULL) { + if ((ap->type & want_type) != 0) + count++; + ap = ap->next; + } + + if (count > 0 && ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0)) + count += 3; + return (count); +} + +/* + * Prepare for reading entries from the ACL data. Returns a count + * of entries matching "want_type", or zero if there are no + * non-extended ACL entries of that type. + */ +int +archive_entry_acl_reset(struct archive_entry *entry, int want_type) +{ + int count, cutoff; + + count = archive_entry_acl_count(entry, want_type); + + /* + * If the only entries are the three standard ones, + * then don't return any ACL data. (In this case, + * client can just use chmod(2) to set permissions.) + */ + if ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) + cutoff = 3; + else + cutoff = 0; + + if (count > cutoff) + entry->acl_state = ARCHIVE_ENTRY_ACL_USER_OBJ; + else + entry->acl_state = 0; + entry->acl_p = entry->acl_head; + return (count); +} + +/* + * Return the next ACL entry in the list. Fake entries for the + * standard permissions and include them in the returned list. + */ + +int +archive_entry_acl_next(struct archive_entry *entry, int want_type, int *type, + int *permset, int *tag, int *id, const char **name) +{ + *name = NULL; + *id = -1; + + /* + * The acl_state is either zero (no entries available), -1 + * (reading from list), or an entry type (retrieve that type + * from ae_stat.aest_mode). + */ + if (entry->acl_state == 0) + return (ARCHIVE_WARN); + + /* The first three access entries are special. */ + if ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) { + switch (entry->acl_state) { + case ARCHIVE_ENTRY_ACL_USER_OBJ: + *permset = (entry->ae_stat.aest_mode >> 6) & 7; + *type = ARCHIVE_ENTRY_ACL_TYPE_ACCESS; + *tag = ARCHIVE_ENTRY_ACL_USER_OBJ; + entry->acl_state = ARCHIVE_ENTRY_ACL_GROUP_OBJ; + return (ARCHIVE_OK); + case ARCHIVE_ENTRY_ACL_GROUP_OBJ: + *permset = (entry->ae_stat.aest_mode >> 3) & 7; + *type = ARCHIVE_ENTRY_ACL_TYPE_ACCESS; + *tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ; + entry->acl_state = ARCHIVE_ENTRY_ACL_OTHER; + return (ARCHIVE_OK); + case ARCHIVE_ENTRY_ACL_OTHER: + *permset = entry->ae_stat.aest_mode & 7; + *type = ARCHIVE_ENTRY_ACL_TYPE_ACCESS; + *tag = ARCHIVE_ENTRY_ACL_OTHER; + entry->acl_state = -1; + entry->acl_p = entry->acl_head; + return (ARCHIVE_OK); + default: + break; + } + } + + while (entry->acl_p != NULL && (entry->acl_p->type & want_type) == 0) + entry->acl_p = entry->acl_p->next; + if (entry->acl_p == NULL) { + entry->acl_state = 0; + *type = 0; + *permset = 0; + *tag = 0; + *id = -1; + *name = NULL; + return (ARCHIVE_EOF); /* End of ACL entries. */ + } + *type = entry->acl_p->type; + *permset = entry->acl_p->permset; + *tag = entry->acl_p->tag; + *id = entry->acl_p->id; + *name = aes_get_mbs(&entry->acl_p->name); + entry->acl_p = entry->acl_p->next; + return (ARCHIVE_OK); +} + +/* + * Generate a text version of the ACL. The flags parameter controls + * the style of the generated ACL. + */ +const wchar_t * +archive_entry_acl_text_w(struct archive_entry *entry, int flags) +{ + int count; + size_t length; + const wchar_t *wname; + const wchar_t *prefix; + wchar_t separator; + struct ae_acl *ap; + int id; + wchar_t *wp; + + if (entry->acl_text_w != NULL) { + free (entry->acl_text_w); + entry->acl_text_w = NULL; + } + + separator = L','; + count = 0; + length = 0; + ap = entry->acl_head; + while (ap != NULL) { + if ((ap->type & flags) != 0) { + count++; + if ((flags & ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT) && + (ap->type & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)) + length += 8; /* "default:" */ + length += 5; /* tag name */ + length += 1; /* colon */ + wname = aes_get_wcs(&ap->name); + if (wname != NULL) + length += wcslen(wname); + else + length += sizeof(uid_t) * 3 + 1; + length ++; /* colon */ + length += 3; /* rwx */ + length += 1; /* colon */ + length += max(sizeof(uid_t), sizeof(gid_t)) * 3 + 1; + length ++; /* newline */ + } + ap = ap->next; + } + + if (count > 0 && ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0)) { + length += 10; /* "user::rwx\n" */ + length += 11; /* "group::rwx\n" */ + length += 11; /* "other::rwx\n" */ + } + + if (count == 0) + return (NULL); + + /* Now, allocate the string and actually populate it. */ + wp = entry->acl_text_w = (wchar_t *)malloc(length * sizeof(wchar_t)); + if (wp == NULL) + __archive_errx(1, "No memory to generate the text version of the ACL"); + count = 0; + if ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) { + append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_USER_OBJ, NULL, + entry->ae_stat.aest_mode & 0700, -1); + *wp++ = ','; + append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_GROUP_OBJ, NULL, + entry->ae_stat.aest_mode & 0070, -1); + *wp++ = ','; + append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_OTHER, NULL, + entry->ae_stat.aest_mode & 0007, -1); + count += 3; + + ap = entry->acl_head; + while (ap != NULL) { + if ((ap->type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) { + wname = aes_get_wcs(&ap->name); + *wp++ = separator; + if (flags & ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID) + id = ap->id; + else + id = -1; + append_entry_w(&wp, NULL, ap->tag, wname, + ap->permset, id); + count++; + } + ap = ap->next; + } + } + + + if ((flags & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT) != 0) { + if (flags & ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT) + prefix = L"default:"; + else + prefix = NULL; + ap = entry->acl_head; + count = 0; + while (ap != NULL) { + if ((ap->type & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT) != 0) { + wname = aes_get_wcs(&ap->name); + if (count > 0) + *wp++ = separator; + if (flags & ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID) + id = ap->id; + else + id = -1; + append_entry_w(&wp, prefix, ap->tag, + wname, ap->permset, id); + count ++; + } + ap = ap->next; + } + } + + return (entry->acl_text_w); +} + +static void +append_id_w(wchar_t **wp, int id) +{ + if (id < 0) + id = 0; + if (id > 9) + append_id_w(wp, id / 10); + *(*wp)++ = L"0123456789"[id % 10]; +} + +static void +append_entry_w(wchar_t **wp, const wchar_t *prefix, int tag, + const wchar_t *wname, int perm, int id) +{ + if (prefix != NULL) { + wcscpy(*wp, prefix); + *wp += wcslen(*wp); + } + switch (tag) { + case ARCHIVE_ENTRY_ACL_USER_OBJ: + wname = NULL; + id = -1; + /* FALLTHROUGH */ + case ARCHIVE_ENTRY_ACL_USER: + wcscpy(*wp, L"user"); + break; + case ARCHIVE_ENTRY_ACL_GROUP_OBJ: + wname = NULL; + id = -1; + /* FALLTHROUGH */ + case ARCHIVE_ENTRY_ACL_GROUP: + wcscpy(*wp, L"group"); + break; + case ARCHIVE_ENTRY_ACL_MASK: + wcscpy(*wp, L"mask"); + wname = NULL; + id = -1; + break; + case ARCHIVE_ENTRY_ACL_OTHER: + wcscpy(*wp, L"other"); + wname = NULL; + id = -1; + break; + } + *wp += wcslen(*wp); + *(*wp)++ = L':'; + if (wname != NULL) { + wcscpy(*wp, wname); + *wp += wcslen(*wp); + } else if (tag == ARCHIVE_ENTRY_ACL_USER + || tag == ARCHIVE_ENTRY_ACL_GROUP) { + append_id_w(wp, id); + id = -1; + } + *(*wp)++ = L':'; + *(*wp)++ = (perm & 0444) ? L'r' : L'-'; + *(*wp)++ = (perm & 0222) ? L'w' : L'-'; + *(*wp)++ = (perm & 0111) ? L'x' : L'-'; + if (id != -1) { + *(*wp)++ = L':'; + append_id_w(wp, id); + } + **wp = L'\0'; +} + +/* + * Parse a textual ACL. This automatically recognizes and supports + * extensions described above. The 'type' argument is used to + * indicate the type that should be used for any entries not + * explicitly marked as "default:". + */ +int +__archive_entry_acl_parse_w(struct archive_entry *entry, + const wchar_t *text, int default_type) +{ + struct { + const wchar_t *start; + const wchar_t *end; + } field[4], name; + + int fields; + int type, tag, permset, id; + wchar_t sep; + + while (text != NULL && *text != L'\0') { + /* + * Parse the fields out of the next entry, + * advance 'text' to start of next entry. + */ + fields = 0; + do { + const wchar_t *start, *end; + next_field_w(&text, &start, &end, &sep); + if (fields < 4) { + field[fields].start = start; + field[fields].end = end; + } + ++fields; + } while (sep == L':'); + + /* Check for a numeric ID in field 1 or 3. */ + id = -1; + isint_w(field[1].start, field[1].end, &id); + /* Field 3 is optional. */ + if (id == -1 && fields > 3) + isint_w(field[3].start, field[3].end, &id); + + /* + * Solaris extension: "defaultuser::rwx" is the + * default ACL corresponding to "user::rwx", etc. + */ + if (field[0].end-field[0].start > 7 + && wmemcmp(field[0].start, L"default", 7) == 0) { + type = ARCHIVE_ENTRY_ACL_TYPE_DEFAULT; + field[0].start += 7; + } else + type = default_type; + + name.start = name.end = NULL; + if (prefix_w(field[0].start, field[0].end, L"user")) { + if (!ismode_w(field[2].start, field[2].end, &permset)) + return (ARCHIVE_WARN); + if (id != -1 || field[1].start < field[1].end) { + tag = ARCHIVE_ENTRY_ACL_USER; + name = field[1]; + } else + tag = ARCHIVE_ENTRY_ACL_USER_OBJ; + } else if (prefix_w(field[0].start, field[0].end, L"group")) { + if (!ismode_w(field[2].start, field[2].end, &permset)) + return (ARCHIVE_WARN); + if (id != -1 || field[1].start < field[1].end) { + tag = ARCHIVE_ENTRY_ACL_GROUP; + name = field[1]; + } else + tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ; + } else if (prefix_w(field[0].start, field[0].end, L"other")) { + if (fields == 2 + && field[1].start < field[1].end + && ismode_w(field[1].start, field[2].end, &permset)) { + /* This is Solaris-style "other:rwx" */ + } else if (fields == 3 + && field[1].start == field[1].end + && field[2].start < field[2].end + && ismode_w(field[2].start, field[2].end, &permset)) { + /* This is FreeBSD-style "other::rwx" */ + } else + return (ARCHIVE_WARN); + tag = ARCHIVE_ENTRY_ACL_OTHER; + } else if (prefix_w(field[0].start, field[0].end, L"mask")) { + if (fields == 2 + && field[1].start < field[1].end + && ismode_w(field[1].start, field[1].end, &permset)) { + /* This is Solaris-style "mask:rwx" */ + } else if (fields == 3 + && field[1].start == field[1].end + && field[2].start < field[2].end + && ismode_w(field[2].start, field[2].end, &permset)) { + /* This is FreeBSD-style "mask::rwx" */ + } else + return (ARCHIVE_WARN); + tag = ARCHIVE_ENTRY_ACL_MASK; + } else + return (ARCHIVE_WARN); + + /* Add entry to the internal list. */ + archive_entry_acl_add_entry_w_len(entry, type, permset, + tag, id, name.start, name.end - name.start); + } + return (ARCHIVE_OK); +} + +/* + * Parse a string to a positive decimal integer. Returns true if + * the string is non-empty and consists only of decimal digits, + * false otherwise. + */ +static int +isint_w(const wchar_t *start, const wchar_t *end, int *result) +{ + int n = 0; + if (start >= end) + return (0); + while (start < end) { + if (*start < '0' || *start > '9') + return (0); + if (n > (INT_MAX / 10)) + n = INT_MAX; + else { + n *= 10; + n += *start - '0'; + } + start++; + } + *result = n; + return (1); +} + +/* + * Parse a string as a mode field. Returns true if + * the string is non-empty and consists only of mode characters, + * false otherwise. + */ +static int +ismode_w(const wchar_t *start, const wchar_t *end, int *permset) +{ + const wchar_t *p; + + p = start; + *permset = 0; + while (p < end) { + switch (*p++) { + case 'r': case 'R': + *permset |= ARCHIVE_ENTRY_ACL_READ; + break; + case 'w': case 'W': + *permset |= ARCHIVE_ENTRY_ACL_WRITE; + break; + case 'x': case 'X': + *permset |= ARCHIVE_ENTRY_ACL_EXECUTE; + break; + case '-': + break; + default: + return (0); + } + } + return (1); +} + +/* + * Match "[:whitespace:]*(.*)[:whitespace:]*[:,\n]". *wp is updated + * to point to just after the separator. *start points to the first + * character of the matched text and *end just after the last + * character of the matched identifier. In particular *end - *start + * is the length of the field body, not including leading or trailing + * whitespace. + */ +static void +next_field_w(const wchar_t **wp, const wchar_t **start, + const wchar_t **end, wchar_t *sep) +{ + /* Skip leading whitespace to find start of field. */ + while (**wp == L' ' || **wp == L'\t' || **wp == L'\n') { + (*wp)++; + } + *start = *wp; + + /* Scan for the separator. */ + while (**wp != L'\0' && **wp != L',' && **wp != L':' && + **wp != L'\n') { + (*wp)++; + } + *sep = **wp; + + /* Trim trailing whitespace to locate end of field. */ + *end = *wp - 1; + while (**end == L' ' || **end == L'\t' || **end == L'\n') { + (*end)--; + } + (*end)++; + + /* Adjust scanner location. */ + if (**wp != L'\0') + (*wp)++; +} + +/* + * Return true if the characters [start...end) are a prefix of 'test'. + * This makes it easy to handle the obvious abbreviations: 'u' for 'user', etc. + */ +static int +prefix_w(const wchar_t *start, const wchar_t *end, const wchar_t *test) +{ + if (start == end) + return (0); + + if (*start++ != *test++) + return (0); + + while (start < end && *start++ == *test++) + ; + + if (start < end) + return (0); + + return (1); +} + + +/* + * Following code is modified from UC Berkeley sources, and + * is subject to the following copyright notice. + */ + +/*- + * Copyright (c) 1993 + * The Regents of the University of California. 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. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. + */ + +static struct flag { + const char *name; + const wchar_t *wname; + unsigned long set; + unsigned long clear; +} flags[] = { + /* Preferred (shorter) names per flag first, all prefixed by "no" */ +#ifdef SF_APPEND + { "nosappnd", L"nosappnd", SF_APPEND, 0 }, + { "nosappend", L"nosappend", SF_APPEND, 0 }, +#endif +#ifdef EXT2_APPEND_FL /* 'a' */ + { "nosappnd", L"nosappnd", EXT2_APPEND_FL, 0 }, + { "nosappend", L"nosappend", EXT2_APPEND_FL, 0 }, +#endif +#ifdef SF_ARCHIVED + { "noarch", L"noarch", SF_ARCHIVED, 0 }, + { "noarchived", L"noarchived", SF_ARCHIVED, 0 }, +#endif +#ifdef SF_IMMUTABLE + { "noschg", L"noschg", SF_IMMUTABLE, 0 }, + { "noschange", L"noschange", SF_IMMUTABLE, 0 }, + { "nosimmutable", L"nosimmutable", SF_IMMUTABLE, 0 }, +#endif +#ifdef EXT2_IMMUTABLE_FL /* 'i' */ + { "noschg", L"noschg", EXT2_IMMUTABLE_FL, 0 }, + { "noschange", L"noschange", EXT2_IMMUTABLE_FL, 0 }, + { "nosimmutable", L"nosimmutable", EXT2_IMMUTABLE_FL, 0 }, +#endif +#ifdef SF_NOUNLINK + { "nosunlnk", L"nosunlnk", SF_NOUNLINK, 0 }, + { "nosunlink", L"nosunlink", SF_NOUNLINK, 0 }, +#endif +#ifdef SF_SNAPSHOT + { "nosnapshot", L"nosnapshot", SF_SNAPSHOT, 0 }, +#endif +#ifdef UF_APPEND + { "nouappnd", L"nouappnd", UF_APPEND, 0 }, + { "nouappend", L"nouappend", UF_APPEND, 0 }, +#endif +#ifdef UF_IMMUTABLE + { "nouchg", L"nouchg", UF_IMMUTABLE, 0 }, + { "nouchange", L"nouchange", UF_IMMUTABLE, 0 }, + { "nouimmutable", L"nouimmutable", UF_IMMUTABLE, 0 }, +#endif +#ifdef UF_NODUMP + { "nodump", L"nodump", 0, UF_NODUMP}, +#endif +#ifdef EXT2_NODUMP_FL /* 'd' */ + { "nodump", L"nodump", 0, EXT2_NODUMP_FL}, +#endif +#ifdef UF_OPAQUE + { "noopaque", L"noopaque", UF_OPAQUE, 0 }, +#endif +#ifdef UF_NOUNLINK + { "nouunlnk", L"nouunlnk", UF_NOUNLINK, 0 }, + { "nouunlink", L"nouunlink", UF_NOUNLINK, 0 }, +#endif +#ifdef EXT2_COMPR_FL /* 'c' */ + { "nocompress", L"nocompress", EXT2_COMPR_FL, 0 }, +#endif + +#ifdef EXT2_NOATIME_FL /* 'A' */ + { "noatime", L"noatime", 0, EXT2_NOATIME_FL}, +#endif + { NULL, NULL, 0, 0 } +}; + +/* + * fflagstostr -- + * Convert file flags to a comma-separated string. If no flags + * are set, return the empty string. + */ +static char * +ae_fflagstostr(unsigned long bitset, unsigned long bitclear) +{ + char *string, *dp; + const char *sp; + unsigned long bits; + struct flag *flag; + size_t length; + + bits = bitset | bitclear; + length = 0; + for (flag = flags; flag->name != NULL; flag++) + if (bits & (flag->set | flag->clear)) { + length += strlen(flag->name) + 1; + bits &= ~(flag->set | flag->clear); + } + + if (length == 0) + return (NULL); + string = (char *)malloc(length); + if (string == NULL) + return (NULL); + + dp = string; + for (flag = flags; flag->name != NULL; flag++) { + if (bitset & flag->set || bitclear & flag->clear) { + sp = flag->name + 2; + } else if (bitset & flag->clear || bitclear & flag->set) { + sp = flag->name; + } else + continue; + bitset &= ~(flag->set | flag->clear); + bitclear &= ~(flag->set | flag->clear); + if (dp > string) + *dp++ = ','; + while ((*dp++ = *sp++) != '\0') + ; + dp--; + } + + *dp = '\0'; + return (string); +} + +/* + * strtofflags -- + * Take string of arguments and return file flags. This + * version works a little differently than strtofflags(3). + * In particular, it always tests every token, skipping any + * unrecognized tokens. It returns a pointer to the first + * unrecognized token, or NULL if every token was recognized. + * This version is also const-correct and does not modify the + * provided string. + */ +static const char * +ae_strtofflags(const char *s, unsigned long *setp, unsigned long *clrp) +{ + const char *start, *end; + struct flag *flag; + unsigned long set, clear; + const char *failed; + + set = clear = 0; + start = s; + failed = NULL; + /* Find start of first token. */ + while (*start == '\t' || *start == ' ' || *start == ',') + start++; + while (*start != '\0') { + /* Locate end of token. */ + end = start; + while (*end != '\0' && *end != '\t' && + *end != ' ' && *end != ',') + end++; + for (flag = flags; flag->name != NULL; flag++) { + if (memcmp(start, flag->name, end - start) == 0) { + /* Matched "noXXXX", so reverse the sense. */ + clear |= flag->set; + set |= flag->clear; + break; + } else if (memcmp(start, flag->name + 2, end - start) + == 0) { + /* Matched "XXXX", so don't reverse. */ + set |= flag->set; + clear |= flag->clear; + break; + } + } + /* Ignore unknown flag names. */ + if (flag->name == NULL && failed == NULL) + failed = start; + + /* Find start of next token. */ + start = end; + while (*start == '\t' || *start == ' ' || *start == ',') + start++; + + } + + if (setp) + *setp = set; + if (clrp) + *clrp = clear; + + /* Return location of first failure. */ + return (failed); +} + +/* + * wcstofflags -- + * Take string of arguments and return file flags. This + * version works a little differently than strtofflags(3). + * In particular, it always tests every token, skipping any + * unrecognized tokens. It returns a pointer to the first + * unrecognized token, or NULL if every token was recognized. + * This version is also const-correct and does not modify the + * provided string. + */ +static const wchar_t * +ae_wcstofflags(const wchar_t *s, unsigned long *setp, unsigned long *clrp) +{ + const wchar_t *start, *end; + struct flag *flag; + unsigned long set, clear; + const wchar_t *failed; + + set = clear = 0; + start = s; + failed = NULL; + /* Find start of first token. */ + while (*start == L'\t' || *start == L' ' || *start == L',') + start++; + while (*start != L'\0') { + /* Locate end of token. */ + end = start; + while (*end != L'\0' && *end != L'\t' && + *end != L' ' && *end != L',') + end++; + for (flag = flags; flag->wname != NULL; flag++) { + if (wmemcmp(start, flag->wname, end - start) == 0) { + /* Matched "noXXXX", so reverse the sense. */ + clear |= flag->set; + set |= flag->clear; + break; + } else if (wmemcmp(start, flag->wname + 2, end - start) + == 0) { + /* Matched "XXXX", so don't reverse. */ + set |= flag->set; + clear |= flag->clear; + break; + } + } + /* Ignore unknown flag names. */ + if (flag->wname == NULL && failed == NULL) + failed = start; + + /* Find start of next token. */ + start = end; + while (*start == L'\t' || *start == L' ' || *start == L',') + start++; + + } + + if (setp) + *setp = set; + if (clrp) + *clrp = clear; + + /* Return location of first failure. */ + return (failed); +} + + +#ifdef TEST +#include +int +main(int argc, char **argv) +{ + struct archive_entry *entry = archive_entry_new(); + unsigned long set, clear; + const wchar_t *remainder; + + remainder = archive_entry_copy_fflags_text_w(entry, L"nosappnd dump archive,,,,,,,"); + archive_entry_fflags(entry, &set, &clear); + + wprintf(L"set=0x%lX clear=0x%lX remainder='%ls'\n", set, clear, remainder); + + wprintf(L"new flags='%s'\n", archive_entry_fflags_text(entry)); + return (0); +} +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_entry.h b/Utilities/cmlibarchive/libarchive/archive_entry.h new file mode 100644 index 000000000..9fddd819a --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry.h @@ -0,0 +1,515 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive_entry.h,v 1.31 2008/12/06 06:18:46 kientzle Exp $ + */ + +#ifndef ARCHIVE_ENTRY_H_INCLUDED +#define ARCHIVE_ENTRY_H_INCLUDED + +/* + * Note: archive_entry.h is for use outside of libarchive; the + * configuration headers (config.h, archive_platform.h, etc.) are + * purely internal. Do NOT use HAVE_XXX configuration macros to + * control the behavior of this header! If you must conditionalize, + * use predefined compiler and/or platform macros. + */ + +#include +#include /* for wchar_t */ +#include + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#endif + +/* Get appropriate definitions of standard POSIX-style types. */ +/* These should match the types used in 'struct stat' */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#define __LA_INT64_T __int64 +#define __LA_UID_T short +#define __LA_GID_T short +#define __LA_DEV_T unsigned int +#define __LA_MODE_T unsigned short +#else +#include +#define __LA_INT64_T int64_t +#define __LA_UID_T uid_t +#define __LA_GID_T gid_t +#define __LA_DEV_T dev_t +#define __LA_MODE_T mode_t +#endif + +/* + * XXX Is this defined for all Windows compilers? If so, in what + * header? It would be nice to remove the __LA_INO_T indirection and + * just use plain ino_t everywhere. Likewise for the other types just + * above. + */ +#define __LA_INO_T ino_t + + +/* + * On Windows, define LIBARCHIVE_STATIC if you're building or using a + * .lib. The default here assumes you're building a DLL. Only + * libarchive source should ever define __LIBARCHIVE_BUILD. + */ +#if ((defined __WIN32__) || (defined _WIN32) || defined(__CYGWIN__)) && (!defined LIBARCHIVE_STATIC) +# ifdef __LIBARCHIVE_BUILD +# ifdef __GNUC__ +# define __LA_DECL __attribute__((dllexport)) extern +# else +# define __LA_DECL __declspec(dllexport) +# endif +# else +# ifdef __GNUC__ +# define __LA_DECL __attribute__((dllimport)) extern +# else +# define __LA_DECL __declspec(dllimport) +# endif +# endif +#else +/* Static libraries on all platforms and shared libraries on non-Windows. */ +# define __LA_DECL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Description of an archive entry. + * + * You can think of this as "struct stat" with some text fields added in. + * + * TODO: Add "comment", "charset", and possibly other entries that are + * supported by "pax interchange" format. However, GNU, ustar, cpio, + * and other variants don't support these features, so they're not an + * excruciatingly high priority right now. + * + * TODO: "pax interchange" format allows essentially arbitrary + * key/value attributes to be attached to any entry. Supporting + * such extensions may make this library useful for special + * applications (e.g., a package manager could attach special + * package-management attributes to each entry). + */ +struct archive_entry; + +/* + * File-type constants. These are returned from archive_entry_filetype() + * and passed to archive_entry_set_filetype(). + * + * These values match S_XXX defines on every platform I've checked, + * including Windows, AIX, Linux, Solaris, and BSD. They're + * (re)defined here because platforms generally don't define the ones + * they don't support. For example, Windows doesn't define S_IFLNK or + * S_IFBLK. Instead of having a mass of conditional logic and system + * checks to define any S_XXX values that aren't supported locally, + * I've just defined a new set of such constants so that + * libarchive-based applications can manipulate and identify archive + * entries properly even if the hosting platform can't store them on + * disk. + * + * These values are also used directly within some portable formats, + * such as cpio. If you find a platform that varies from these, the + * correct solution is to leave these alone and translate from these + * portable values to platform-native values when entries are read from + * or written to disk. + */ +#define AE_IFMT 0170000 +#define AE_IFREG 0100000 +#define AE_IFLNK 0120000 +#define AE_IFSOCK 0140000 +#define AE_IFCHR 0020000 +#define AE_IFBLK 0060000 +#define AE_IFDIR 0040000 +#define AE_IFIFO 0010000 + +/* + * Basic object manipulation + */ + +__LA_DECL struct archive_entry *archive_entry_clear(struct archive_entry *); +/* The 'clone' function does a deep copy; all of the strings are copied too. */ +__LA_DECL struct archive_entry *archive_entry_clone(struct archive_entry *); +__LA_DECL void archive_entry_free(struct archive_entry *); +__LA_DECL struct archive_entry *archive_entry_new(void); + +/* + * Retrieve fields from an archive_entry. + * + * There are a number of implicit conversions among these fields. For + * example, if a regular string field is set and you read the _w wide + * character field, the entry will implicitly convert narrow-to-wide + * using the current locale. Similarly, dev values are automatically + * updated when you write devmajor or devminor and vice versa. + * + * In addition, fields can be "set" or "unset." Unset string fields + * return NULL, non-string fields have _is_set() functions to test + * whether they've been set. You can "unset" a string field by + * assigning NULL; non-string fields have _unset() functions to + * unset them. + * + * Note: There is one ambiguity in the above; string fields will + * also return NULL when implicit character set conversions fail. + * This is usually what you want. + */ +__LA_DECL time_t archive_entry_atime(struct archive_entry *); +__LA_DECL long archive_entry_atime_nsec(struct archive_entry *); +__LA_DECL int archive_entry_atime_is_set(struct archive_entry *); +__LA_DECL time_t archive_entry_birthtime(struct archive_entry *); +__LA_DECL long archive_entry_birthtime_nsec(struct archive_entry *); +__LA_DECL int archive_entry_birthtime_is_set(struct archive_entry *); +__LA_DECL time_t archive_entry_ctime(struct archive_entry *); +__LA_DECL long archive_entry_ctime_nsec(struct archive_entry *); +__LA_DECL int archive_entry_ctime_is_set(struct archive_entry *); +__LA_DECL dev_t archive_entry_dev(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 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_GID_T archive_entry_gid(struct archive_entry *); +__LA_DECL const char *archive_entry_gname(struct archive_entry *); +__LA_DECL const wchar_t *archive_entry_gname_w(struct archive_entry *); +__LA_DECL const char *archive_entry_hardlink(struct archive_entry *); +__LA_DECL const wchar_t *archive_entry_hardlink_w(struct archive_entry *); +__LA_DECL __LA_INO_T archive_entry_ino(struct archive_entry *); +__LA_DECL __LA_INT64_T archive_entry_ino64(struct archive_entry *); +__LA_DECL __LA_MODE_T archive_entry_mode(struct archive_entry *); +__LA_DECL time_t archive_entry_mtime(struct archive_entry *); +__LA_DECL long archive_entry_mtime_nsec(struct archive_entry *); +__LA_DECL int archive_entry_mtime_is_set(struct archive_entry *); +__LA_DECL unsigned int archive_entry_nlink(struct archive_entry *); +__LA_DECL const char *archive_entry_pathname(struct archive_entry *); +__LA_DECL const wchar_t *archive_entry_pathname_w(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 *); +__LA_DECL const char *archive_entry_sourcepath(struct archive_entry *); +__LA_DECL __LA_INT64_T archive_entry_size(struct archive_entry *); +__LA_DECL int archive_entry_size_is_set(struct archive_entry *); +__LA_DECL const char *archive_entry_strmode(struct archive_entry *); +__LA_DECL const char *archive_entry_symlink(struct archive_entry *); +__LA_DECL const wchar_t *archive_entry_symlink_w(struct archive_entry *); +__LA_DECL __LA_UID_T archive_entry_uid(struct archive_entry *); +__LA_DECL const char *archive_entry_uname(struct archive_entry *); +__LA_DECL const wchar_t *archive_entry_uname_w(struct archive_entry *); + +/* + * Set fields in an archive_entry. + * + * Note that string 'set' functions do not copy the string, only the pointer. + * In contrast, 'copy' functions do copy the object pointed to. + * + * Note: As of libarchive 2.4, 'set' functions do copy the string and + * are therefore exact synonyms for the 'copy' versions. The 'copy' + * names will be retired in libarchive 3.0. + */ + +__LA_DECL void archive_entry_set_atime(struct archive_entry *, time_t, long); +__LA_DECL void archive_entry_unset_atime(struct archive_entry *); +#if defined(_WIN32) && !defined(__CYGWIN__) +__LA_DECL void archive_entry_copy_bhfi(struct archive_entry *, + BY_HANDLE_FILE_INFORMATION *); +#endif +__LA_DECL void archive_entry_set_birthtime(struct archive_entry *, time_t, long); +__LA_DECL void archive_entry_unset_birthtime(struct archive_entry *); +__LA_DECL void archive_entry_set_ctime(struct archive_entry *, time_t, long); +__LA_DECL void archive_entry_unset_ctime(struct archive_entry *); +__LA_DECL void archive_entry_set_dev(struct archive_entry *, dev_t); +__LA_DECL void archive_entry_set_devmajor(struct archive_entry *, dev_t); +__LA_DECL void archive_entry_set_devminor(struct archive_entry *, dev_t); +__LA_DECL void archive_entry_set_filetype(struct archive_entry *, unsigned int); +__LA_DECL void archive_entry_set_fflags(struct archive_entry *, + unsigned long /* set */, unsigned long /* clear */); +/* Returns pointer to start of first invalid token, or NULL if none. */ +/* Note that all recognized tokens are processed, regardless. */ +__LA_DECL const char *archive_entry_copy_fflags_text(struct archive_entry *, + const char *); +__LA_DECL const wchar_t *archive_entry_copy_fflags_text_w(struct archive_entry *, + const wchar_t *); +__LA_DECL void archive_entry_set_gid(struct archive_entry *, __LA_GID_T); +__LA_DECL void archive_entry_set_gname(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_gname(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_gname_w(struct archive_entry *, const wchar_t *); +__LA_DECL int archive_entry_update_gname_utf8(struct archive_entry *, const char *); +__LA_DECL void archive_entry_set_hardlink(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_hardlink(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_hardlink_w(struct archive_entry *, const wchar_t *); +#if ARCHIVE_VERSION_NUMBER >= 3000000 +/* Starting with libarchive 3.0, this will be synonym for ino64. */ +__LA_DECL void archive_entry_set_ino(struct archive_entry *, int64_t); +#else +__LA_DECL void archive_entry_set_ino(struct archive_entry *, unsigned long); +#endif +__LA_DECL void archive_entry_set_ino64(struct archive_entry *, __LA_INT64_T); +__LA_DECL void archive_entry_set_link(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_link(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_link_w(struct archive_entry *, const wchar_t *); +__LA_DECL int archive_entry_update_link_utf8(struct archive_entry *, const char *); +__LA_DECL void archive_entry_set_mode(struct archive_entry *, __LA_MODE_T); +__LA_DECL void archive_entry_set_mtime(struct archive_entry *, time_t, long); +__LA_DECL void archive_entry_unset_mtime(struct archive_entry *); +__LA_DECL void archive_entry_set_nlink(struct archive_entry *, unsigned int); +__LA_DECL void archive_entry_set_pathname(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_pathname(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_pathname_w(struct archive_entry *, const wchar_t *); +__LA_DECL int archive_entry_update_pathname_utf8(struct archive_entry *, const char *); +__LA_DECL void archive_entry_set_perm(struct archive_entry *, __LA_MODE_T); +__LA_DECL void archive_entry_set_rdev(struct archive_entry *, dev_t); +__LA_DECL void archive_entry_set_rdevmajor(struct archive_entry *, dev_t); +__LA_DECL void archive_entry_set_rdevminor(struct archive_entry *, dev_t); +__LA_DECL void archive_entry_set_size(struct archive_entry *, __LA_INT64_T); +__LA_DECL void archive_entry_unset_size(struct archive_entry *); +__LA_DECL void archive_entry_copy_sourcepath(struct archive_entry *, const char *); +__LA_DECL void archive_entry_set_symlink(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_symlink(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_symlink_w(struct archive_entry *, const wchar_t *); +__LA_DECL void archive_entry_set_uid(struct archive_entry *, __LA_UID_T); +__LA_DECL void archive_entry_set_uname(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_uname(struct archive_entry *, const char *); +__LA_DECL void archive_entry_copy_uname_w(struct archive_entry *, const wchar_t *); +__LA_DECL int archive_entry_update_uname_utf8(struct archive_entry *, const char *); +/* + * Routines to bulk copy fields to/from a platform-native "struct + * stat." Libarchive used to just store a struct stat inside of each + * archive_entry object, but this created issues when trying to + * manipulate archives on systems different than the ones they were + * created on. + * + * TODO: On Linux, provide both stat32 and stat64 versions of these functions. + */ +__LA_DECL const struct stat *archive_entry_stat(struct archive_entry *); +__LA_DECL void archive_entry_copy_stat(struct archive_entry *, const struct stat *); + + +/* + * ACL routines. This used to simply store and return text-format ACL + * strings, but that proved insufficient for a number of reasons: + * = clients need control over uname/uid and gname/gid mappings + * = there are many different ACL text formats + * = would like to be able to read/convert archives containing ACLs + * on platforms that lack ACL libraries + * + * This last point, in particular, forces me to implement a reasonably + * complete set of ACL support routines. + * + * TODO: Extend this to support NFSv4/NTFS permissions. That should + * allow full ACL support on Mac OS, in particular, which uses + * POSIX.1e-style interfaces to manipulate NFSv4/NTFS permissions. + */ + +/* + * Permission bits mimic POSIX.1e. Note that I've not followed POSIX.1e's + * "permset"/"perm" abstract type nonsense. A permset is just a simple + * bitmap, following long-standing Unix tradition. + */ +#define ARCHIVE_ENTRY_ACL_EXECUTE 1 +#define ARCHIVE_ENTRY_ACL_WRITE 2 +#define ARCHIVE_ENTRY_ACL_READ 4 + +/* We need to be able to specify either or both of these. */ +#define ARCHIVE_ENTRY_ACL_TYPE_ACCESS 256 +#define ARCHIVE_ENTRY_ACL_TYPE_DEFAULT 512 + +/* Tag values mimic POSIX.1e */ +#define ARCHIVE_ENTRY_ACL_USER 10001 /* Specified user. */ +#define ARCHIVE_ENTRY_ACL_USER_OBJ 10002 /* User who owns the file. */ +#define ARCHIVE_ENTRY_ACL_GROUP 10003 /* Specified group. */ +#define ARCHIVE_ENTRY_ACL_GROUP_OBJ 10004 /* Group who owns the file. */ +#define ARCHIVE_ENTRY_ACL_MASK 10005 /* Modify group access. */ +#define ARCHIVE_ENTRY_ACL_OTHER 10006 /* Public. */ + +/* + * Set the ACL by clearing it and adding entries one at a time. + * Unlike the POSIX.1e ACL routines, you must specify the type + * (access/default) for each entry. Internally, the ACL data is just + * a soup of entries. API calls here allow you to retrieve just the + * entries of interest. This design (which goes against the spirit of + * POSIX.1e) is useful for handling archive formats that combine + * default and access information in a single ACL list. + */ +__LA_DECL void archive_entry_acl_clear(struct archive_entry *); +__LA_DECL void archive_entry_acl_add_entry(struct archive_entry *, + int /* type */, int /* permset */, int /* tag */, + int /* qual */, const char * /* name */); +__LA_DECL void archive_entry_acl_add_entry_w(struct archive_entry *, + int /* type */, int /* permset */, int /* tag */, + int /* qual */, const wchar_t * /* name */); + +/* + * To retrieve the ACL, first "reset", then repeatedly ask for the + * "next" entry. The want_type parameter allows you to request only + * access entries or only default entries. + */ +__LA_DECL int archive_entry_acl_reset(struct archive_entry *, int /* want_type */); +__LA_DECL int archive_entry_acl_next(struct archive_entry *, int /* want_type */, + int * /* type */, int * /* permset */, int * /* tag */, + int * /* qual */, const char ** /* name */); +__LA_DECL int archive_entry_acl_next_w(struct archive_entry *, int /* want_type */, + int * /* type */, int * /* permset */, int * /* tag */, + int * /* qual */, const wchar_t ** /* name */); + +/* + * Construct a text-format ACL. The flags argument is a bitmask that + * can include any of the following: + * + * ARCHIVE_ENTRY_ACL_TYPE_ACCESS - Include access entries. + * ARCHIVE_ENTRY_ACL_TYPE_DEFAULT - Include default entries. + * ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID - Include extra numeric ID field in + * each ACL entry. (As used by 'star'.) + * ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT - Include "default:" before each + * default ACL entry. + */ +#define ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID 1024 +#define ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT 2048 +__LA_DECL const wchar_t *archive_entry_acl_text_w(struct archive_entry *, + int /* flags */); + +/* Return a count of entries matching 'want_type' */ +__LA_DECL int archive_entry_acl_count(struct archive_entry *, int /* want_type */); + +/* + * Private ACL parser. This is private because it handles some + * very weird formats that clients should not be messing with. + * Clients should only deal with their platform-native formats. + * Because of the need to support many formats cleanly, new arguments + * are likely to get added on a regular basis. Clients who try to use + * this interface are likely to be surprised when it changes. + * + * You were warned! + * + * TODO: Move this declaration out of the public header and into + * a private header. Warnings above are silly. + */ +__LA_DECL int __archive_entry_acl_parse_w(struct archive_entry *, + const wchar_t *, int /* type */); + +/* + * extended attributes + */ + +__LA_DECL void archive_entry_xattr_clear(struct archive_entry *); +__LA_DECL void archive_entry_xattr_add_entry(struct archive_entry *, + const char * /* name */, const void * /* value */, + size_t /* size */); + +/* + * To retrieve the xattr list, first "reset", then repeatedly ask for the + * "next" entry. + */ + +__LA_DECL int archive_entry_xattr_count(struct archive_entry *); +__LA_DECL int archive_entry_xattr_reset(struct archive_entry *); +__LA_DECL int archive_entry_xattr_next(struct archive_entry *, + const char ** /* name */, const void ** /* value */, size_t *); + +/* + * Utility to match up hardlinks. + * + * The 'struct archive_entry_linkresolver' is a cache of archive entries + * for files with multiple links. Here's how to use it: + * 1. Create a lookup object with archive_entry_linkresolver_new() + * 2. Tell it the archive format you're using. + * 3. Hand each archive_entry to archive_entry_linkify(). + * That function will return 0, 1, or 2 entries that should + * be written. + * 4. Call archive_entry_linkify(resolver, NULL) until + * no more entries are returned. + * 5. Call archive_entry_link_resolver_free(resolver) to free resources. + * + * The entries returned have their hardlink and size fields updated + * appropriately. If an entry is passed in that does not refer to + * a file with multiple links, it is returned unchanged. The intention + * is that you should be able to simply filter all entries through + * this machine. + * + * To make things more efficient, be sure that each entry has a valid + * nlinks value. The hardlink cache uses this to track when all links + * have been found. If the nlinks value is zero, it will keep every + * name in the cache indefinitely, which can use a lot of memory. + * + * Note that archive_entry_size() is reset to zero if the file + * body should not be written to the archive. Pay attention! + */ +struct archive_entry_linkresolver; + +/* + * There are three different strategies for marking hardlinks. + * The descriptions below name them after the best-known + * formats that rely on each strategy: + * + * "Old cpio" is the simplest, it always returns any entry unmodified. + * As far as I know, only cpio formats use this. Old cpio archives + * store every link with the full body; the onus is on the dearchiver + * to detect and properly link the files as they are restored. + * "tar" is also pretty simple; it caches a copy the first time it sees + * any link. Subsequent appearances are modified to be hardlink + * references to the first one without any body. Used by all tar + * formats, although the newest tar formats permit the "old cpio" strategy + * as well. This strategy is very simple for the dearchiver, + * and reasonably straightforward for the archiver. + * "new cpio" is trickier. It stores the body only with the last + * occurrence. The complication is that we might not + * see every link to a particular file in a single session, so + * there's no easy way to know when we've seen the last occurrence. + * The solution here is to queue one link until we see the next. + * At the end of the session, you can enumerate any remaining + * entries by calling archive_entry_linkify(NULL) and store those + * bodies. If you have a file with three links l1, l2, and l3, + * you'll get the following behavior if you see all three links: + * linkify(l1) => NULL (the resolver stores l1 internally) + * linkify(l2) => l1 (resolver stores l2, you write l1) + * linkify(l3) => l2, l3 (all links seen, you can write both). + * If you only see l1 and l2, you'll get this behavior: + * linkify(l1) => NULL + * linkify(l2) => l1 + * linkify(NULL) => l2 (at end, you retrieve remaining links) + * As the name suggests, this strategy is used by newer cpio variants. + * It's noticably more complex for the archiver, slightly more complex + * for the dearchiver than the tar strategy, but makes it straightforward + * to restore a file using any link by simply continuing to scan until + * you see a link that is stored with a body. In contrast, the tar + * strategy requires you to rescan the archive from the beginning to + * correctly extract an arbitrary link. + */ + +__LA_DECL struct archive_entry_linkresolver *archive_entry_linkresolver_new(void); +__LA_DECL void archive_entry_linkresolver_set_strategy( + struct archive_entry_linkresolver *, int /* format_code */); +__LA_DECL void archive_entry_linkresolver_free(struct archive_entry_linkresolver *); +__LA_DECL void archive_entry_linkify(struct archive_entry_linkresolver *, + struct archive_entry **, struct archive_entry **); + +#ifdef __cplusplus +} +#endif + +/* This is meaningless outside of this header. */ +#undef __LA_DECL + +#endif /* !ARCHIVE_ENTRY_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/libarchive/archive_entry_copy_bhfi.c b/Utilities/cmlibarchive/libarchive/archive_entry_copy_bhfi.c new file mode 100644 index 000000000..50c081734 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry_copy_bhfi.c @@ -0,0 +1,73 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD$"); + +#include "archive_entry.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) + +#define EPOC_TIME (116444736000000000ULL) + +__inline static void +fileTimeToUtc(const FILETIME *filetime, time_t *time, long *ns) +{ + ULARGE_INTEGER utc; + + utc.HighPart = filetime->dwHighDateTime; + utc.LowPart = filetime->dwLowDateTime; + if (utc.QuadPart >= EPOC_TIME) { + utc.QuadPart -= EPOC_TIME; + *time = (time_t)(utc.QuadPart / 10000000); /* milli seconds base */ + *ns = (long)(utc.QuadPart % 10000000) * 100;/* nano seconds base */ + } else { + *time = 0; + *ns = 0; + } +} + +void +archive_entry_copy_bhfi(struct archive_entry *entry, + BY_HANDLE_FILE_INFORMATION *bhfi) +{ + time_t secs; + long nsecs; + + fileTimeToUtc(&bhfi->ftLastAccessTime, &secs, &nsecs); + archive_entry_set_atime(entry, secs, nsecs); + fileTimeToUtc(&bhfi->ftLastWriteTime, &secs, &nsecs); + archive_entry_set_mtime(entry, secs, nsecs); + fileTimeToUtc(&bhfi->ftCreationTime, &secs, &nsecs); + archive_entry_set_birthtime(entry, secs, nsecs); + archive_entry_set_dev(entry, bhfi->dwVolumeSerialNumber); + archive_entry_set_ino64(entry, (((int64_t)bhfi->nFileIndexHigh) << 32) + + bhfi->nFileIndexLow); + archive_entry_set_nlink(entry, bhfi->nNumberOfLinks); + archive_entry_set_size(entry, (((int64_t)bhfi->nFileSizeHigh) << 32) + + bhfi->nFileSizeLow); +// archive_entry_set_mode(entry, st->st_mode); +} +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_entry_copy_stat.c b/Utilities/cmlibarchive/libarchive/archive_entry_copy_stat.c new file mode 100644 index 000000000..94da56b4e --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry_copy_stat.c @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_copy_stat.c,v 1.2 2008/09/30 03:53:03 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif + +#include "archive_entry.h" + +void +archive_entry_copy_stat(struct archive_entry *entry, const struct stat *st) +{ +#if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC + archive_entry_set_atime(entry, st->st_atime, st->st_atimespec.tv_nsec); + archive_entry_set_ctime(entry, st->st_ctime, st->st_ctimespec.tv_nsec); + archive_entry_set_mtime(entry, st->st_mtime, st->st_mtimespec.tv_nsec); +#elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC + archive_entry_set_atime(entry, st->st_atime, st->st_atim.tv_nsec); + archive_entry_set_ctime(entry, st->st_ctime, st->st_ctim.tv_nsec); + archive_entry_set_mtime(entry, st->st_mtime, st->st_mtim.tv_nsec); +#elif HAVE_STRUCT_STAT_ST_MTIME_N + archive_entry_set_atime(entry, st->st_atime, st->st_atime_n); + archive_entry_set_ctime(entry, st->st_ctime, st->st_ctime_n); + archive_entry_set_mtime(entry, st->st_mtime, st->st_mtime_n); +#elif HAVE_STRUCT_STAT_ST_UMTIME + archive_entry_set_atime(entry, st->st_atime, st->st_uatime * 1000); + archive_entry_set_ctime(entry, st->st_ctime, st->st_uctime * 1000); + archive_entry_set_mtime(entry, st->st_mtime, st->st_umtime * 1000); +#elif HAVE_STRUCT_STAT_ST_MTIME_USEC + archive_entry_set_atime(entry, st->st_atime, st->st_atime_usec * 1000); + archive_entry_set_ctime(entry, st->st_ctime, st->st_ctime_usec * 1000); + archive_entry_set_mtime(entry, st->st_mtime, st->st_mtime_usec * 1000); +#else + archive_entry_set_atime(entry, st->st_atime, 0); + archive_entry_set_ctime(entry, st->st_ctime, 0); + archive_entry_set_mtime(entry, st->st_mtime, 0); +#if HAVE_STRUCT_STAT_ST_BIRTHTIME + archive_entry_set_birthtime(entry, st->st_birthtime, 0); +#endif +#endif +#if HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC + archive_entry_set_birthtime(entry, st->st_birthtime, st->st_birthtimespec.tv_nsec); +#endif + archive_entry_set_dev(entry, st->st_dev); + archive_entry_set_gid(entry, st->st_gid); + archive_entry_set_uid(entry, st->st_uid); + archive_entry_set_ino(entry, st->st_ino); + archive_entry_set_nlink(entry, st->st_nlink); + archive_entry_set_rdev(entry, st->st_rdev); + archive_entry_set_size(entry, st->st_size); + archive_entry_set_mode(entry, st->st_mode); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_entry_link_resolver.c b/Utilities/cmlibarchive/libarchive/archive_entry_link_resolver.c new file mode 100644 index 000000000..41cf64860 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry_link_resolver.c @@ -0,0 +1,403 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_link_resolver.c,v 1.4 2008/09/05 06:15:25 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" + +/* + * This is mostly a pretty straightforward hash table implementation. + * The only interesting bit is the different strategies used to + * match up links. These strategies match those used by various + * archiving formats: + * tar - content stored with first link, remainder refer back to it. + * This requires us to match each subsequent link up with the + * first appearance. + * cpio - Old cpio just stored body with each link, match-ups were + * implicit. This is trivial. + * new cpio - New cpio only stores body with last link, match-ups + * are implicit. This is actually quite tricky; see the notes + * below. + */ + +/* Users pass us a format code, we translate that into a strategy here. */ +#define ARCHIVE_ENTRY_LINKIFY_LIKE_TAR 0 +#define ARCHIVE_ENTRY_LINKIFY_LIKE_MTREE 1 +#define ARCHIVE_ENTRY_LINKIFY_LIKE_OLD_CPIO 2 +#define ARCHIVE_ENTRY_LINKIFY_LIKE_NEW_CPIO 3 + +/* Initial size of link cache. */ +#define links_cache_initial_size 1024 + +struct links_entry { + struct links_entry *next; + struct links_entry *previous; + int links; /* # links not yet seen */ + int hash; + struct archive_entry *canonical; + struct archive_entry *entry; +}; + +struct archive_entry_linkresolver { + struct links_entry **buckets; + struct links_entry *spare; + unsigned long number_entries; + size_t number_buckets; + int strategy; +}; + +static struct links_entry *find_entry(struct archive_entry_linkresolver *, + struct archive_entry *); +static void grow_hash(struct archive_entry_linkresolver *); +static struct links_entry *insert_entry(struct archive_entry_linkresolver *, + struct archive_entry *); +static struct links_entry *next_entry(struct archive_entry_linkresolver *); + +struct archive_entry_linkresolver * +archive_entry_linkresolver_new(void) +{ + struct archive_entry_linkresolver *res; + size_t i; + + res = malloc(sizeof(struct archive_entry_linkresolver)); + if (res == NULL) + return (NULL); + memset(res, 0, sizeof(struct archive_entry_linkresolver)); + res->number_buckets = links_cache_initial_size; + res->buckets = malloc(res->number_buckets * + sizeof(res->buckets[0])); + if (res->buckets == NULL) { + free(res); + return (NULL); + } + for (i = 0; i < res->number_buckets; i++) + res->buckets[i] = NULL; + return (res); +} + +void +archive_entry_linkresolver_set_strategy(struct archive_entry_linkresolver *res, + int fmt) +{ + int fmtbase = fmt & ARCHIVE_FORMAT_BASE_MASK; + + switch (fmtbase) { + case ARCHIVE_FORMAT_CPIO: + switch (fmt) { + case ARCHIVE_FORMAT_CPIO_SVR4_NOCRC: + case ARCHIVE_FORMAT_CPIO_SVR4_CRC: + res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_NEW_CPIO; + break; + default: + res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_OLD_CPIO; + break; + } + break; + case ARCHIVE_FORMAT_MTREE: + res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_MTREE; + break; + case ARCHIVE_FORMAT_TAR: + res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_TAR; + break; + default: + res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_TAR; + break; + } +} + +void +archive_entry_linkresolver_free(struct archive_entry_linkresolver *res) +{ + struct links_entry *le; + + if (res == NULL) + return; + + if (res->buckets != NULL) { + while ((le = next_entry(res)) != NULL) + archive_entry_free(le->entry); + free(res->buckets); + res->buckets = NULL; + } + free(res); +} + +void +archive_entry_linkify(struct archive_entry_linkresolver *res, + struct archive_entry **e, struct archive_entry **f) +{ + struct links_entry *le; + struct archive_entry *t; + + *f = NULL; /* Default: Don't return a second entry. */ + + if (*e == NULL) { + le = next_entry(res); + if (le != NULL) { + *e = le->entry; + le->entry = NULL; + } + return; + } + + /* If it has only one link, then we're done. */ + if (archive_entry_nlink(*e) == 1) + return; + /* Directories never have hardlinks. */ + if (archive_entry_filetype(*e) == AE_IFDIR) + return; + + switch (res->strategy) { + case ARCHIVE_ENTRY_LINKIFY_LIKE_TAR: + le = find_entry(res, *e); + if (le != NULL) { + archive_entry_unset_size(*e); + archive_entry_copy_hardlink(*e, + archive_entry_pathname(le->canonical)); + } else + insert_entry(res, *e); + return; + case ARCHIVE_ENTRY_LINKIFY_LIKE_MTREE: + le = find_entry(res, *e); + if (le != NULL) { + archive_entry_copy_hardlink(*e, + archive_entry_pathname(le->canonical)); + } else + insert_entry(res, *e); + return; + case ARCHIVE_ENTRY_LINKIFY_LIKE_OLD_CPIO: + /* This one is trivial. */ + return; + case ARCHIVE_ENTRY_LINKIFY_LIKE_NEW_CPIO: + le = find_entry(res, *e); + if (le != NULL) { + /* + * Put the new entry in le, return the + * old entry from le. + */ + t = *e; + *e = le->entry; + le->entry = t; + /* Make the old entry into a hardlink. */ + archive_entry_unset_size(*e); + archive_entry_copy_hardlink(*e, + archive_entry_pathname(le->canonical)); + /* If we ran out of links, return the + * final entry as well. */ + if (le->links == 0) { + *f = le->entry; + le->entry = NULL; + } + } else { + /* + * If we haven't seen it, tuck it away + * for future use. + */ + le = insert_entry(res, *e); + le->entry = *e; + *e = NULL; + } + return; + default: + break; + } + return; +} + +static struct links_entry * +find_entry(struct archive_entry_linkresolver *res, + struct archive_entry *entry) +{ + struct links_entry *le; + int hash, bucket; + dev_t dev; + int64_t ino; + + /* Free a held entry. */ + if (res->spare != NULL) { + archive_entry_free(res->spare->canonical); + archive_entry_free(res->spare->entry); + free(res->spare); + res->spare = NULL; + } + + /* If the links cache overflowed and got flushed, don't bother. */ + if (res->buckets == NULL) + return (NULL); + + dev = archive_entry_dev(entry); + ino = archive_entry_ino64(entry); + hash = (int)(dev ^ ino); + + /* Try to locate this entry in the links cache. */ + bucket = hash % res->number_buckets; + for (le = res->buckets[bucket]; le != NULL; le = le->next) { + if (le->hash == hash + && dev == archive_entry_dev(le->canonical) + && ino == archive_entry_ino64(le->canonical)) { + /* + * Decrement link count each time and release + * the entry if it hits zero. This saves + * memory and is necessary for detecting + * missed links. + */ + --le->links; + if (le->links > 0) + return (le); + /* Remove it from this hash bucket. */ + if (le->previous != NULL) + le->previous->next = le->next; + if (le->next != NULL) + le->next->previous = le->previous; + if (res->buckets[bucket] == le) + res->buckets[bucket] = le->next; + res->number_entries--; + /* Defer freeing this entry. */ + res->spare = le; + return (le); + } + } + return (NULL); +} + +static struct links_entry * +next_entry(struct archive_entry_linkresolver *res) +{ + struct links_entry *le; + size_t bucket; + + /* Free a held entry. */ + if (res->spare != NULL) { + archive_entry_free(res->spare->canonical); + free(res->spare); + res->spare = NULL; + } + + /* If the links cache overflowed and got flushed, don't bother. */ + if (res->buckets == NULL) + return (NULL); + + /* Look for next non-empty bucket in the links cache. */ + for (bucket = 0; bucket < res->number_buckets; bucket++) { + le = res->buckets[bucket]; + if (le != NULL) { + /* Remove it from this hash bucket. */ + if (le->next != NULL) + le->next->previous = le->previous; + res->buckets[bucket] = le->next; + res->number_entries--; + /* Defer freeing this entry. */ + res->spare = le; + return (le); + } + } + return (NULL); +} + +static struct links_entry * +insert_entry(struct archive_entry_linkresolver *res, + struct archive_entry *entry) +{ + struct links_entry *le; + int hash, bucket; + + /* Add this entry to the links cache. */ + le = malloc(sizeof(struct links_entry)); + if (le == NULL) + return (NULL); + memset(le, 0, sizeof(*le)); + le->canonical = archive_entry_clone(entry); + + /* If the links cache is getting too full, enlarge the hash table. */ + if (res->number_entries > res->number_buckets * 2) + grow_hash(res); + + hash = archive_entry_dev(entry) ^ archive_entry_ino64(entry); + bucket = hash % res->number_buckets; + + /* If we could allocate the entry, record it. */ + if (res->buckets[bucket] != NULL) + res->buckets[bucket]->previous = le; + res->number_entries++; + le->next = res->buckets[bucket]; + le->previous = NULL; + res->buckets[bucket] = le; + le->hash = hash; + le->links = archive_entry_nlink(entry) - 1; + return (le); +} + +static void +grow_hash(struct archive_entry_linkresolver *res) +{ + struct links_entry *le, **new_buckets; + size_t new_size; + size_t i, bucket; + + /* Try to enlarge the bucket list. */ + new_size = res->number_buckets * 2; + new_buckets = malloc(new_size * sizeof(struct links_entry *)); + + if (new_buckets != NULL) { + memset(new_buckets, 0, + new_size * sizeof(struct links_entry *)); + for (i = 0; i < res->number_buckets; i++) { + while (res->buckets[i] != NULL) { + /* Remove entry from old bucket. */ + le = res->buckets[i]; + res->buckets[i] = le->next; + + /* Add entry to new bucket. */ + bucket = le->hash % new_size; + + if (new_buckets[bucket] != NULL) + new_buckets[bucket]->previous = + le; + le->next = new_buckets[bucket]; + le->previous = NULL; + new_buckets[bucket] = le; + } + } + free(res->buckets); + res->buckets = new_buckets; + res->number_buckets = new_size; + } +} diff --git a/Utilities/cmlibarchive/libarchive/archive_entry_private.h b/Utilities/cmlibarchive/libarchive/archive_entry_private.h new file mode 100644 index 000000000..6caf53176 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry_private.h @@ -0,0 +1,184 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive_entry_private.h,v 1.6 2008/09/30 03:53:03 kientzle Exp $ + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef ARCHIVE_ENTRY_PRIVATE_H_INCLUDED +#define ARCHIVE_ENTRY_PRIVATE_H_INCLUDED + +#include "archive_string.h" + +/* + * Handle wide character (i.e., Unicode) and non-wide character + * strings transparently. + */ + +struct aes { + struct archive_string aes_mbs; + struct archive_string aes_utf8; + const wchar_t *aes_wcs; + /* Bitmap of which of the above are valid. Because we're lazy + * about malloc-ing and reusing the underlying storage, we + * can't rely on NULL pointers to indicate whether a string + * has been set. */ + int aes_set; +#define AES_SET_MBS 1 +#define AES_SET_UTF8 2 +#define AES_SET_WCS 4 +}; + +struct ae_acl { + struct ae_acl *next; + int type; /* E.g., access or default */ + int tag; /* E.g., user/group/other/mask */ + int permset; /* r/w/x bits */ + int id; /* uid/gid for user/group */ + struct aes name; /* uname/gname */ +}; + +struct ae_xattr { + struct ae_xattr *next; + + char *name; + void *value; + size_t size; +}; + +/* + * Description of an archive entry. + * + * Basically, this is a "struct stat" with a few text fields added in. + * + * TODO: Add "comment", "charset", and possibly other entries + * that are supported by "pax interchange" format. However, GNU, ustar, + * cpio, and other variants don't support these features, so they're not an + * excruciatingly high priority right now. + * + * TODO: "pax interchange" format allows essentially arbitrary + * key/value attributes to be attached to any entry. Supporting + * such extensions may make this library useful for special + * applications (e.g., a package manager could attach special + * package-management attributes to each entry). There are tricky + * API issues involved, so this is not going to happen until + * there's a real demand for it. + * + * TODO: Design a good API for handling sparse files. + */ +struct archive_entry { + /* + * Note that ae_stat.st_mode & AE_IFMT can be 0! + * + * This occurs when the actual file type of the object is not + * in the archive. For example, 'tar' archives store + * hardlinks without marking the type of the underlying + * object. + */ + + /* + * Read archive_entry_copy_stat.c for an explanation of why I + * don't just use "struct stat" instead of "struct aest" here + * and why I have this odd pointer to a separately-allocated + * struct stat. + */ + void *stat; + int stat_valid; /* Set to 0 whenever a field in aest changes. */ + + struct aest { + int64_t aest_atime; + uint32_t aest_atime_nsec; + int64_t aest_ctime; + uint32_t aest_ctime_nsec; + int64_t aest_mtime; + uint32_t aest_mtime_nsec; + int64_t aest_birthtime; + uint32_t aest_birthtime_nsec; + gid_t aest_gid; + int64_t aest_ino; + mode_t aest_mode; + uint32_t aest_nlink; + uint64_t aest_size; + uid_t aest_uid; + /* + * Because converting between device codes and + * major/minor values is platform-specific and + * inherently a bit risky, we only do that conversion + * lazily. That way, we will do a better job of + * preserving information in those cases where no + * conversion is actually required. + */ + int aest_dev_is_broken_down; + dev_t aest_dev; + dev_t aest_devmajor; + dev_t aest_devminor; + int aest_rdev_is_broken_down; + dev_t aest_rdev; + dev_t aest_rdevmajor; + dev_t aest_rdevminor; + } ae_stat; + + int ae_set; /* bitmap of fields that are currently set */ +#define AE_SET_HARDLINK 1 +#define AE_SET_SYMLINK 2 +#define AE_SET_ATIME 4 +#define AE_SET_CTIME 8 +#define AE_SET_MTIME 16 +#define AE_SET_BIRTHTIME 32 +#define AE_SET_SIZE 64 + + /* + * Use aes here so that we get transparent mbs<->wcs conversions. + */ + struct aes ae_fflags_text; /* Text fflags per fflagstostr(3) */ + unsigned long ae_fflags_set; /* Bitmap fflags */ + unsigned long ae_fflags_clear; + struct aes ae_gname; /* Name of owning group */ + struct aes ae_hardlink; /* Name of target for hardlink */ + struct aes ae_pathname; /* Name of entry */ + struct aes ae_symlink; /* symlink contents */ + struct aes ae_uname; /* Name of owner */ + + /* Not used within libarchive; useful for some clients. */ + struct aes ae_sourcepath; /* Path this entry is sourced from. */ + + /* ACL support. */ + struct ae_acl *acl_head; + struct ae_acl *acl_p; + int acl_state; /* See acl_next for details. */ + wchar_t *acl_text_w; + + /* extattr support. */ + struct ae_xattr *xattr_head; + struct ae_xattr *xattr_p; + + /* Miscellaneous. */ + char strmode[12]; +}; + + +#endif /* ARCHIVE_ENTRY_PRIVATE_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/libarchive/archive_entry_stat.c b/Utilities/cmlibarchive/libarchive/archive_entry_stat.c new file mode 100644 index 000000000..1c661659a --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry_stat.c @@ -0,0 +1,118 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_stat.c,v 1.2 2008/09/30 03:53:03 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#include "archive_entry.h" +#include "archive_entry_private.h" + +const struct stat * +archive_entry_stat(struct archive_entry *entry) +{ + struct stat *st; + if (entry->stat == NULL) { + entry->stat = malloc(sizeof(*st)); + if (entry->stat == NULL) + return (NULL); + entry->stat_valid = 0; + } + + /* + * If none of the underlying fields have been changed, we + * don't need to regenerate. In theory, we could use a bitmap + * here to flag only those items that have changed, but the + * extra complexity probably isn't worth it. It will be very + * rare for anyone to change just one field then request a new + * stat structure. + */ + if (entry->stat_valid) + return (entry->stat); + + st = entry->stat; + /* + * Use the public interfaces to extract items, so that + * the appropriate conversions get invoked. + */ + st->st_atime = archive_entry_atime(entry); +#if HAVE_STRUCT_STAT_ST_BIRTHTIME + st->st_birthtime = archive_entry_birthtime(entry); +#endif + st->st_ctime = archive_entry_ctime(entry); + st->st_mtime = archive_entry_mtime(entry); + st->st_dev = archive_entry_dev(entry); + st->st_gid = archive_entry_gid(entry); + st->st_uid = archive_entry_uid(entry); + st->st_ino = archive_entry_ino64(entry); + st->st_nlink = archive_entry_nlink(entry); + st->st_rdev = archive_entry_rdev(entry); + st->st_size = archive_entry_size(entry); + st->st_mode = archive_entry_mode(entry); + + /* + * On systems that support high-res timestamps, copy that + * information into struct stat. + */ +#if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC + st->st_atimespec.tv_nsec = archive_entry_atime_nsec(entry); + st->st_ctimespec.tv_nsec = archive_entry_ctime_nsec(entry); + st->st_mtimespec.tv_nsec = archive_entry_mtime_nsec(entry); +#elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC + st->st_atim.tv_nsec = archive_entry_atime_nsec(entry); + st->st_ctim.tv_nsec = archive_entry_ctime_nsec(entry); + st->st_mtim.tv_nsec = archive_entry_mtime_nsec(entry); +#elif HAVE_STRUCT_STAT_ST_MTIME_N + st->st_atime_n = archive_entry_atime_nsec(entry); + st->st_ctime_n = archive_entry_ctime_nsec(entry); + st->st_mtime_n = archive_entry_mtime_nsec(entry); +#elif HAVE_STRUCT_STAT_ST_UMTIME + st->st_uatime = archive_entry_atime_nsec(entry) / 1000; + st->st_uctime = archive_entry_ctime_nsec(entry) / 1000; + st->st_umtime = archive_entry_mtime_nsec(entry) / 1000; +#elif HAVE_STRUCT_STAT_ST_MTIME_USEC + st->st_atime_usec = archive_entry_atime_nsec(entry) / 1000; + st->st_ctime_usec = archive_entry_ctime_nsec(entry) / 1000; + st->st_mtime_usec = archive_entry_mtime_nsec(entry) / 1000; +#endif +#if HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC + st->st_birthtimespec.tv_nsec = archive_entry_birthtime_nsec(entry); +#endif + + /* + * TODO: On Linux, store 32 or 64 here depending on whether + * the cached stat structure is a stat32 or a stat64. This + * will allow us to support both variants interchangably. + */ + entry->stat_valid = 1; + + return (st); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_entry_strmode.c b/Utilities/cmlibarchive/libarchive/archive_entry_strmode.c new file mode 100644 index 000000000..3ff314975 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry_strmode.c @@ -0,0 +1,87 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive_entry.h" +#include "archive_entry_private.h" + +const char * +archive_entry_strmode(struct archive_entry *entry) +{ + static const mode_t permbits[] = + { 0400, 0200, 0100, 0040, 0020, 0010, 0004, 0002, 0001 }; + char *bp = entry->strmode; + mode_t mode; + int i; + + /* Fill in a default string, then selectively override. */ + strcpy(bp, "?rwxrwxrwx "); + + mode = archive_entry_mode(entry); + switch (archive_entry_filetype(entry)) { + case AE_IFREG: bp[0] = '-'; break; + case AE_IFBLK: bp[0] = 'b'; break; + case AE_IFCHR: bp[0] = 'c'; break; + case AE_IFDIR: bp[0] = 'd'; break; + case AE_IFLNK: bp[0] = 'l'; break; + case AE_IFSOCK: bp[0] = 's'; break; + case AE_IFIFO: bp[0] = 'p'; break; + default: + if (archive_entry_hardlink(entry) != NULL) { + bp[0] = 'h'; + break; + } + } + + for (i = 0; i < 9; i++) + if (!(mode & permbits[i])) + bp[i+1] = '-'; + + if (mode & S_ISUID) { + if (mode & 0100) bp[3] = 's'; + else bp[3] = 'S'; + } + if (mode & S_ISGID) { + if (mode & 0010) bp[6] = 's'; + else bp[6] = 'S'; + } + if (mode & S_ISVTX) { + if (mode & 0001) bp[9] = 't'; + else bp[9] = 'T'; + } + if (archive_entry_acl_count(entry, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)) + bp[10] = '+'; + + return (bp); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_entry_xattr.c b/Utilities/cmlibarchive/libarchive/archive_entry_xattr.c new file mode 100644 index 000000000..c35c7b3d1 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_entry_xattr.c @@ -0,0 +1,165 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry.c,v 1.55 2008/12/23 05:01:43 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef MAJOR_IN_MKDEV +#include +#else +#ifdef MAJOR_IN_SYSMACROS +#include +#endif +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_LINUX_FS_H +#include /* for Linux file flags */ +#endif +/* + * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h. + * As the include guards don't agree, the order of include is important. + */ +#ifdef HAVE_LINUX_EXT2_FS_H +#include /* for Linux file flags */ +#endif +#if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__) +#include /* for Linux file flags */ +#endif +#include +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_WCHAR_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_entry_private.h" + +/* + * extended attribute handling + */ + +void +archive_entry_xattr_clear(struct archive_entry *entry) +{ + struct ae_xattr *xp; + + while (entry->xattr_head != NULL) { + xp = entry->xattr_head->next; + free(entry->xattr_head->name); + free(entry->xattr_head->value); + free(entry->xattr_head); + entry->xattr_head = xp; + } + + entry->xattr_head = NULL; +} + +void +archive_entry_xattr_add_entry(struct archive_entry *entry, + const char *name, const void *value, size_t size) +{ + struct ae_xattr *xp; + + for (xp = entry->xattr_head; xp != NULL; xp = xp->next) + ; + + if ((xp = (struct ae_xattr *)malloc(sizeof(struct ae_xattr))) == NULL) + /* XXX Error XXX */ + return; + + xp->name = strdup(name); + if ((xp->value = malloc(size)) != NULL) { + memcpy(xp->value, value, size); + xp->size = size; + } else + xp->size = 0; + + xp->next = entry->xattr_head; + entry->xattr_head = xp; +} + + +/* + * returns number of the extended attribute entries + */ +int +archive_entry_xattr_count(struct archive_entry *entry) +{ + struct ae_xattr *xp; + int count = 0; + + for (xp = entry->xattr_head; xp != NULL; xp = xp->next) + count++; + + return count; +} + +int +archive_entry_xattr_reset(struct archive_entry * entry) +{ + entry->xattr_p = entry->xattr_head; + + return archive_entry_xattr_count(entry); +} + +int +archive_entry_xattr_next(struct archive_entry * entry, + const char **name, const void **value, size_t *size) +{ + if (entry->xattr_p) { + *name = entry->xattr_p->name; + *value = entry->xattr_p->value; + *size = entry->xattr_p->size; + + entry->xattr_p = entry->xattr_p->next; + + return (ARCHIVE_OK); + } else { + *name = NULL; + *value = NULL; + *size = (size_t)0; + return (ARCHIVE_WARN); + } +} + +/* + * end of xattr handling + */ diff --git a/Utilities/cmlibarchive/libarchive/archive_hash.h b/Utilities/cmlibarchive/libarchive/archive_hash.h new file mode 100644 index 000000000..ab84552c8 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_hash.h @@ -0,0 +1,164 @@ +/*- + * Copyright (c) 2009 Joerg Sonnenberger + * 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. + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +/* + * Hash function support in various Operating Systems: + * + * NetBSD: + * - MD5 and SHA1 in libc: without _ after algorithm name + * - SHA2 in libc: with _ after algorithm name + * + * OpenBSD: + * - MD5, SHA1 and SHA2 in libc: without _ after algorithm name + * - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name + * + * DragonFly and FreeBSD (XXX not used yet): + * - MD5 and SHA1 in libmd: without _ after algorithm name + * - SHA256: with _ after algorithm name + * + * OpenSSL: + * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name + */ + +#if defined(HAVE_MD5_H) && defined(HAVE_MD5INIT) +# include +# define ARCHIVE_HAS_MD5 +typedef MD5_CTX archive_md5_ctx; +# define archive_md5_init(ctx) MD5Init(ctx) +# define archive_md5_final(ctx, buf) MD5Final(buf, ctx) +# define archive_md5_update(ctx, buf, n) MD5Update(ctx, buf, n) +#elif defined(HAVE_OPENSSL_MD5_H) +# include +# define ARCHIVE_HAS_MD5 +typedef MD5_CTX archive_md5_ctx; +# define archive_md5_init(ctx) MD5_Init(ctx) +# define archive_md5_final(ctx, buf) MD5_Final(buf, ctx) +# define archive_md5_update(ctx, buf, n) MD5_Update(ctx, buf, n) +#endif + +#if defined(HAVE_RMD160_H) && defined(HAVE_RMD160INIT) +# include +# define ARCHIVE_HAS_RMD160 +typedef RMD160_CTX archive_rmd160_ctx; +# define archive_rmd160_init(ctx) RMD160Init(ctx) +# define archive_rmd160_final(ctx, buf) RMD160Final(buf, ctx) +# define archive_rmd160_update(ctx, buf, n) RMD160Update(ctx, buf, n) +#elif defined(HAVE_OPENSSL_RIPEMD_H) +# include +# define ARCHIVE_HAS_RMD160 +typedef RIPEMD160_CTX archive_rmd160_ctx; +# define archive_rmd160_init(ctx) RIPEMD160_Init(ctx) +# define archive_rmd160_final(ctx, buf) RIPEMD160_Final(buf, ctx) +# define archive_rmd160_update(ctx, buf, n) RIPEMD160_Update(ctx, buf, n) +#endif + +#if defined(HAVE_SHA1_H) && defined(HAVE_SHA1INIT) +# include +# define ARCHIVE_HAS_SHA1 +typedef SHA1_CTX archive_sha1_ctx; +# define archive_sha1_init(ctx) SHA1Init(ctx) +# define archive_sha1_final(ctx, buf) SHA1Final(buf, ctx) +# define archive_sha1_update(ctx, buf, n) SHA1Update(ctx, buf, n) +#elif defined(HAVE_OPENSSL_SHA_H) +# include +# define ARCHIVE_HAS_SHA1 +typedef SHA_CTX archive_sha1_ctx; +# define archive_sha1_init(ctx) SHA1_Init(ctx) +# define archive_sha1_final(ctx, buf) SHA1_Final(buf, ctx) +# define archive_sha1_update(ctx, buf, n) SHA1_Update(ctx, buf, n) +#endif + +#if defined(HAVE_SHA2_H) && defined(HAVE_SHA256_INIT) +# include +# define ARCHIVE_HAS_SHA256 +typedef SHA256_CTX archive_sha256_ctx; +# define archive_sha256_init(ctx) SHA256_Init(ctx) +# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) +# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) +#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA256INIT) +# include +# define ARCHIVE_HAS_SHA256 +typedef SHA256_CTX archive_sha256_ctx; +# define archive_sha256_init(ctx) SHA256Init(ctx) +# define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx) +# define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n) +#elif defined(HAVE_OPENSSL_SHA_H) +# include +# define ARCHIVE_HAS_SHA256 +typedef SHA256_CTX archive_sha256_ctx; +# define archive_sha256_init(ctx) SHA256_Init(ctx) +# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) +# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) +#endif + +#if defined(HAVE_SHA2_H) && defined(HAVE_SHA384_INIT) +# include +# define ARCHIVE_HAS_SHA384 +typedef SHA384_CTX archive_sha384_ctx; +# define archive_sha384_init(ctx) SHA384_Init(ctx) +# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx) +# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n) +#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA384INIT) +# include +# define ARCHIVE_HAS_SHA384 +typedef SHA384_CTX archive_sha384_ctx; +# define archive_sha384_init(ctx) SHA384Init(ctx) +# define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx) +# define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n) +#elif defined(HAVE_OPENSSL_SHA_H) +# include +# define ARCHIVE_HAS_SHA384 +typedef SHA512_CTX archive_sha384_ctx; +# define archive_sha384_init(ctx) SHA384_Init(ctx) +# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx) +# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n) +#endif + +#if defined(HAVE_SHA2_H) && defined(HAVE_SHA512_INIT) +# include +# define ARCHIVE_HAS_SHA512 +typedef SHA512_CTX archive_sha512_ctx; +# define archive_sha512_init(ctx) SHA512_Init(ctx) +# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) +# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) +#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA512INIT) +# include +# define ARCHIVE_HAS_SHA512 +typedef SHA512_CTX archive_sha512_ctx; +# define archive_sha512_init(ctx) SHA512Init(ctx) +# define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx) +# define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n) +#elif defined(HAVE_OPENSSL_SHA_H) +# include +# define ARCHIVE_HAS_SHA512 +typedef SHA512_CTX archive_sha512_ctx; +# define archive_sha512_init(ctx) SHA512_Init(ctx) +# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) +# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_platform.h b/Utilities/cmlibarchive/libarchive/archive_platform.h new file mode 100644 index 000000000..103c6dc79 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_platform.h @@ -0,0 +1,143 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive_platform.h,v 1.32 2008/12/06 05:53:05 kientzle Exp $ + */ + +/* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ + +/* + * This header is the first thing included in any of the libarchive + * source files. As far as possible, platform-specific issues should + * be dealt with here and not within individual source files. I'm + * actively trying to minimize #if blocks within the main source, + * since they obfuscate the code. + */ + +#ifndef ARCHIVE_PLATFORM_H_INCLUDED +#define ARCHIVE_PLATFORM_H_INCLUDED + +/* archive.h and archive_entry.h require this. */ +#define __LIBARCHIVE_BUILD 1 + +#if defined(PLATFORM_CONFIG_H) +/* Use hand-built config.h in environments that need it. */ +#include PLATFORM_CONFIG_H +#elif defined(HAVE_CONFIG_H) +/* Most POSIX platforms use the 'configure' script to build config.h */ +#include "config.h" +#else +/* Warn if the library hasn't been (automatically or manually) configured. */ +#error Oops: No config.h and no pre-built configuration in archive_platform.h. +#endif + +/* It should be possible to get rid of this by extending the feature-test + * macros to cover Windows API functions, probably along with non-trivial + * refactoring of code to find structures that sit more cleanly on top of + * either Windows or Posix APIs. */ +#if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) +#include "archive_windows.h" +#endif + +/* + * The config files define a lot of feature macros. The following + * uses those macros to select/define replacements and include key + * headers as required. + */ + +/* 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 + +/* Try to get standard C99-style integer type definitions. */ +#if HAVE_INTTYPES_H +#include +#endif +#if HAVE_STDINT_H +#include +#endif + +/* Some platforms lack the standard *_MAX definitions. */ +#if !HAVE_DECL_SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif +#if !HAVE_DECL_SSIZE_MAX +#define SSIZE_MAX ((ssize_t)(SIZE_MAX >> 1)) +#endif +#if !HAVE_DECL_UINT32_MAX +#define UINT32_MAX (~(uint32_t)0) +#endif +#if !HAVE_DECL_UINT64_MAX +#define UINT64_MAX (~(uint64_t)0) +#endif +#if !HAVE_DECL_INT64_MAX +#define INT64_MAX ((int64_t)(UINT64_MAX >> 1)) +#endif +#if !HAVE_DECL_INT64_MIN +#define INT64_MIN ((int64_t)(~INT64_MAX)) +#endif + +/* + * If this platform has , acl_create(), acl_init(), + * acl_set_file(), and ACL_USER, we assume it has the rest of the + * POSIX.1e draft functions used in archive_read_extract.c. + */ +#if HAVE_SYS_ACL_H && HAVE_ACL_CREATE_ENTRY && HAVE_ACL_INIT && HAVE_ACL_SET_FILE && HAVE_ACL_USER +#define HAVE_POSIX_ACL 1 +#endif + +/* + * If we can't restore metadata using a file descriptor, then + * for compatibility's sake, close files before trying to restore metadata. + */ +#if defined(HAVE_FCHMOD) || defined(HAVE_FUTIMES) || defined(HAVE_ACL_SET_FD) || defined(HAVE_ACL_SET_FD_NP) || defined(HAVE_FCHOWN) +#define CAN_RESTORE_METADATA_FD +#endif + +/* Set up defaults for internal error codes. */ +#ifndef ARCHIVE_ERRNO_FILE_FORMAT +#if HAVE_EFTYPE +#define ARCHIVE_ERRNO_FILE_FORMAT EFTYPE +#else +#if HAVE_EILSEQ +#define ARCHIVE_ERRNO_FILE_FORMAT EILSEQ +#else +#define ARCHIVE_ERRNO_FILE_FORMAT EINVAL +#endif +#endif +#endif + +#ifndef ARCHIVE_ERRNO_PROGRAMMER +#define ARCHIVE_ERRNO_PROGRAMMER EINVAL +#endif + +#ifndef ARCHIVE_ERRNO_MISC +#define ARCHIVE_ERRNO_MISC (-1) +#endif + +#endif /* !ARCHIVE_PLATFORM_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/libarchive/archive_private.h b/Utilities/cmlibarchive/libarchive/archive_private.h new file mode 100644 index 000000000..4a184c663 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_private.h @@ -0,0 +1,116 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive_private.h,v 1.32 2008/12/06 06:23:37 kientzle Exp $ + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef ARCHIVE_PRIVATE_H_INCLUDED +#define ARCHIVE_PRIVATE_H_INCLUDED + +#include "archive.h" +#include "archive_string.h" + +#if defined(__GNUC__) && (__GNUC__ > 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_DEAD __attribute__((__noreturn__)) +#else +#define __LA_DEAD +#endif + +#define ARCHIVE_WRITE_MAGIC (0xb0c5c0deU) +#define ARCHIVE_READ_MAGIC (0xdeb0c5U) +#define ARCHIVE_WRITE_DISK_MAGIC (0xc001b0c5U) +#define ARCHIVE_READ_DISK_MAGIC (0xbadb0c5U) + +#define ARCHIVE_STATE_ANY 0xFFFFU +#define ARCHIVE_STATE_NEW 1U +#define ARCHIVE_STATE_HEADER 2U +#define ARCHIVE_STATE_DATA 4U +#define ARCHIVE_STATE_DATA_END 8U +#define ARCHIVE_STATE_EOF 0x10U +#define ARCHIVE_STATE_CLOSED 0x20U +#define ARCHIVE_STATE_FATAL 0x8000U + +struct archive_vtable { + int (*archive_close)(struct archive *); + int (*archive_finish)(struct archive *); + int (*archive_write_header)(struct archive *, + struct archive_entry *); + int (*archive_write_finish_entry)(struct archive *); + ssize_t (*archive_write_data)(struct archive *, + const void *, size_t); + ssize_t (*archive_write_data_block)(struct archive *, + const void *, size_t, off_t); +}; + +struct archive { + /* + * The magic/state values are used to sanity-check the + * client's usage. If an API function is called at a + * ridiculous time, or the client passes us an invalid + * pointer, these values allow me to catch that. + */ + unsigned int magic; + unsigned int state; + + /* + * Some public API functions depend on the "real" type of the + * archive object. + */ + struct archive_vtable *vtable; + + int archive_format; + const char *archive_format_name; + + int compression_code; /* Currently active compression. */ + const char *compression_name; + + /* Position in UNCOMPRESSED data stream. */ + int64_t file_position; + /* Position in COMPRESSED data stream. */ + int64_t raw_position; + /* Number of file entries processed. */ + int file_count; + + int archive_error_number; + const char *error; + struct archive_string error_string; +}; + +/* Check magic value and state; exit if it isn't valid. */ +void __archive_check_magic(struct archive *, unsigned int magic, + unsigned int state, const char *func); + +void __archive_errx(int retvalue, const char *msg) __LA_DEAD; + +int __archive_parse_options(const char *p, const char *fn, + int keysize, char *key, int valsize, char *val); + +#define err_combine(a,b) ((a) < (b) ? (a) : (b)) + +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_read.3 b/Utilities/cmlibarchive/libarchive/archive_read.3 new file mode 100644 index 000000000..0124c04da --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read.3 @@ -0,0 +1,714 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/archive_read.3,v 1.37 2008/05/26 17:00:22 kientzle Exp $ +.\" +.Dd April 13, 2009 +.Dt archive_read 3 +.Os +.Sh NAME +.Nm archive_read_new , +.Nm archive_read_set_filter_options , +.Nm archive_read_set_format_options , +.Nm archive_read_set_options , +.Nm archive_read_support_compression_all , +.Nm archive_read_support_compression_bzip2 , +.Nm archive_read_support_compression_compress , +.Nm archive_read_support_compression_gzip , +.Nm archive_read_support_compression_lzma , +.Nm archive_read_support_compression_none , +.Nm archive_read_support_compression_xz , +.Nm archive_read_support_compression_program , +.Nm archive_read_support_compression_program_signature , +.Nm archive_read_support_format_all , +.Nm archive_read_support_format_ar , +.Nm archive_read_support_format_cpio , +.Nm archive_read_support_format_empty , +.Nm archive_read_support_format_iso9660 , +.Nm archive_read_support_format_mtree, +.Nm archive_read_support_format_raw, +.Nm archive_read_support_format_tar , +.Nm archive_read_support_format_zip , +.Nm archive_read_open , +.Nm archive_read_open2 , +.Nm archive_read_open_fd , +.Nm archive_read_open_FILE , +.Nm archive_read_open_filename , +.Nm archive_read_open_memory , +.Nm archive_read_next_header , +.Nm archive_read_next_header2 , +.Nm archive_read_data , +.Nm archive_read_data_block , +.Nm archive_read_data_skip , +.\" #if ARCHIVE_API_VERSION < 3 +.Nm archive_read_data_into_buffer , +.\" #endif +.Nm archive_read_data_into_fd , +.Nm archive_read_extract , +.Nm archive_read_extract2 , +.Nm archive_read_extract_set_progress_callback , +.Nm archive_read_close , +.Nm archive_read_finish +.Nd functions for reading streaming archives +.Sh SYNOPSIS +.In archive.h +.Ft struct archive * +.Fn archive_read_new "void" +.Ft int +.Fn archive_read_support_compression_all "struct archive *" +.Ft int +.Fn archive_read_support_compression_bzip2 "struct archive *" +.Ft int +.Fn archive_read_support_compression_compress "struct archive *" +.Ft int +.Fn archive_read_support_compression_gzip "struct archive *" +.Ft int +.Fn archive_read_support_compression_lzma "struct archive *" +.Ft int +.Fn archive_read_support_compression_none "struct archive *" +.Ft int +.Fn archive_read_support_compression_xz "struct archive *" +.Ft int +.Fo archive_read_support_compression_program +.Fa "struct archive *" +.Fa "const char *cmd" +.Fc +.Ft int +.Fo archive_read_support_compression_program_signature +.Fa "struct archive *" +.Fa "const char *cmd" +.Fa "const void *signature" +.Fa "size_t signature_length" +.Fc +.Ft int +.Fn archive_read_support_format_all "struct archive *" +.Ft int +.Fn archive_read_support_format_ar "struct archive *" +.Ft int +.Fn archive_read_support_format_cpio "struct archive *" +.Ft int +.Fn archive_read_support_format_empty "struct archive *" +.Ft int +.Fn archive_read_support_format_iso9660 "struct archive *" +.Ft int +.Fn archive_read_support_format_mtree "struct archive *" +.Ft int +.Fn archive_read_support_format_raw "struct archive *" +.Ft int +.Fn archive_read_support_format_tar "struct archive *" +.Ft int +.Fn archive_read_support_format_zip "struct archive *" +.Ft int +.Fn archive_read_set_filter_options "struct archive *" "const char *" +.Ft int +.Fn archive_read_set_format_options "struct archive *" "const char *" +.Ft int +.Fn archive_read_set_options "struct archive *" "const char *" +.Ft int +.Fo archive_read_open +.Fa "struct archive *" +.Fa "void *client_data" +.Fa "archive_open_callback *" +.Fa "archive_read_callback *" +.Fa "archive_close_callback *" +.Fc +.Ft int +.Fo archive_read_open2 +.Fa "struct archive *" +.Fa "void *client_data" +.Fa "archive_open_callback *" +.Fa "archive_read_callback *" +.Fa "archive_skip_callback *" +.Fa "archive_close_callback *" +.Fc +.Ft int +.Fn archive_read_open_FILE "struct archive *" "FILE *file" +.Ft int +.Fn archive_read_open_fd "struct archive *" "int fd" "size_t block_size" +.Ft int +.Fo archive_read_open_filename +.Fa "struct archive *" +.Fa "const char *filename" +.Fa "size_t block_size" +.Fc +.Ft int +.Fn archive_read_open_memory "struct archive *" "void *buff" "size_t size" +.Ft int +.Fn archive_read_next_header "struct archive *" "struct archive_entry **" +.Ft int +.Fn archive_read_next_header2 "struct archive *" "struct archive_entry *" +.Ft ssize_t +.Fn archive_read_data "struct archive *" "void *buff" "size_t len" +.Ft int +.Fo archive_read_data_block +.Fa "struct archive *" +.Fa "const void **buff" +.Fa "size_t *len" +.Fa "off_t *offset" +.Fc +.Ft int +.Fn archive_read_data_skip "struct archive *" +.\" #if ARCHIVE_API_VERSION < 3 +.Ft int +.Fn archive_read_data_into_buffer "struct archive *" "void *" "ssize_t len" +.\" #endif +.Ft int +.Fn archive_read_data_into_fd "struct archive *" "int fd" +.Ft int +.Fo archive_read_extract +.Fa "struct archive *" +.Fa "struct archive_entry *" +.Fa "int flags" +.Fc +.Ft int +.Fo archive_read_extract2 +.Fa "struct archive *src" +.Fa "struct archive_entry *" +.Fa "struct archive *dest" +.Fc +.Ft void +.Fo archive_read_extract_set_progress_callback +.Fa "struct archive *" +.Fa "void (*func)(void *)" +.Fa "void *user_data" +.Fc +.Ft int +.Fn archive_read_close "struct archive *" +.Ft int +.Fn archive_read_finish "struct archive *" +.Sh DESCRIPTION +These functions provide a complete API for reading streaming archives. +The general process is to first create the +.Tn struct archive +object, set options, initialize the reader, iterate over the archive +headers and associated data, then close the archive and release all +resources. +The following summary describes the functions in approximately the +order they would be used: +.Bl -tag -compact -width indent +.It Fn archive_read_new +Allocates and initializes a +.Tn struct archive +object suitable for reading from an archive. +.It Xo +.Fn archive_read_support_compression_bzip2 , +.Fn archive_read_support_compression_compress , +.Fn archive_read_support_compression_gzip , +.Fn archive_read_support_compression_lzma , +.Fn archive_read_support_compression_none , +.Fn archive_read_support_compression_xz +.Xc +Enables auto-detection code and decompression support for the +specified compression. +Returns +.Cm ARCHIVE_OK +if the compression is fully supported, or +.Cm ARCHIVE_WARN +if the compression is supported only through an external program. +Note that decompression using an external program is usually slower than +decompression through built-in libraries. +Note that +.Dq none +is always enabled by default. +.It Fn archive_read_support_compression_all +Enables all available decompression filters. +.It Fn archive_read_support_compression_program +Data is fed through the specified external program before being dearchived. +Note that this disables automatic detection of the compression format, +so it makes no sense to specify this in conjunction with any other +decompression option. +.It Fn archive_read_support_compression_program_signature +This feeds data through the specified external program +but only if the initial bytes of the data match the specified +signature value. +.It Xo +.Fn archive_read_support_format_all , +.Fn archive_read_support_format_ar , +.Fn archive_read_support_format_cpio , +.Fn archive_read_support_format_empty , +.Fn archive_read_support_format_iso9660 , +.Fn archive_read_support_format_mtree , +.Fn archive_read_support_format_tar , +.Fn archive_read_support_format_zip +.Xc +Enables support---including auto-detection code---for the +specified archive format. +For example, +.Fn archive_read_support_format_tar +enables support for a variety of standard tar formats, old-style tar, +ustar, pax interchange format, and many common variants. +For convenience, +.Fn archive_read_support_format_all +enables support for all available formats. +Only empty archives are supported by default. +.It Fn archive_read_support_format_raw +The +.Dq raw +format handler allows libarchive to be used to read arbitrary data. +It treats any data stream as an archive with a single entry. +The pathname of this entry is +.Dq data ; +all other entry fields are unset. +This is not enabled by +.Fn archive_read_support_format_all +in order to avoid erroneous handling of damaged archives. +.It Xo +.Fn archive_read_set_filter_options , +.Fn archive_read_set_format_options , +.Fn archive_read_set_options +.Xc +Specifies options that will be passed to currently-registered +filters (including decompression filters) and/or format readers. +The argument is a comma-separated list of individual options. +Individual options have one of the following forms: +.Bl -tag -compact -width indent +.It Ar option=value +The option/value pair will be provided to every module. +Modules that do not accept an option with this name will ignore it. +.It Ar option +The option will be provided to every module with a value of +.Dq 1 . +.It Ar !option +The option will be provided to every module with a NULL value. +.It Ar module:option=value , Ar module:option , Ar module:!option +As above, but the corresponding option and value will be provided +only to modules whose name matches +.Ar module . +.El +The return value will be +.Cm ARCHIVE_OK +if any module accepts the option, or +.Cm ARCHIVE_WARN +if no module accepted the option, or +.Cm ARCHIVE_FATAL +if there was a fatal error while attempting to process the option. +.Pp +The currently supported options are: +.Bl -tag -compact -width indent +.It Format iso9660 +.Bl -tag -compact -width indent +.It Cm joliet +Support Joliet extensions. +Defaults to enabled, use +.Cm !joliet +to disable. +.El +.El +.It Fn archive_read_open +The same as +.Fn archive_read_open2 , +except that the skip callback is assumed to be +.Dv NULL . +.It Fn archive_read_open2 +Freeze the settings, open the archive, and prepare for reading entries. +This is the most generic version of this call, which accepts +four callback functions. +Most clients will want to use +.Fn archive_read_open_filename , +.Fn archive_read_open_FILE , +.Fn archive_read_open_fd , +or +.Fn archive_read_open_memory +instead. +The library invokes the client-provided functions to obtain +raw bytes from the archive. +.It Fn archive_read_open_FILE +Like +.Fn archive_read_open , +except that it accepts a +.Ft "FILE *" +pointer. +This function should not be used with tape drives or other devices +that require strict I/O blocking. +.It Fn archive_read_open_fd +Like +.Fn archive_read_open , +except that it accepts a file descriptor and block size rather than +a set of function pointers. +Note that the file descriptor will not be automatically closed at +end-of-archive. +This function is safe for use with tape drives or other blocked devices. +.It Fn archive_read_open_file +This is a deprecated synonym for +.Fn archive_read_open_filename . +.It Fn archive_read_open_filename +Like +.Fn archive_read_open , +except that it accepts a simple filename and a block size. +A NULL filename represents standard input. +This function is safe for use with tape drives or other blocked devices. +.It Fn archive_read_open_memory +Like +.Fn archive_read_open , +except that it accepts a pointer and size of a block of +memory containing the archive data. +.It Fn archive_read_next_header +Read the header for the next entry and return a pointer to +a +.Tn struct archive_entry . +This is a convenience wrapper around +.Fn archive_read_next_header2 +that reuses an internal +.Tn struct archive_entry +object for each request. +.It Fn archive_read_next_header2 +Read the header for the next entry and populate the provided +.Tn struct archive_entry . +.It Fn archive_read_data +Read data associated with the header just read. +Internally, this is a convenience function that calls +.Fn archive_read_data_block +and fills any gaps with nulls so that callers see a single +continuous stream of data. +.It Fn archive_read_data_block +Return the next available block of data for this entry. +Unlike +.Fn archive_read_data , +the +.Fn archive_read_data_block +function avoids copying data and allows you to correctly handle +sparse files, as supported by some archive formats. +The library guarantees that offsets will increase and that blocks +will not overlap. +Note that the blocks returned from this function can be much larger +than the block size read from disk, due to compression +and internal buffer optimizations. +.It Fn archive_read_data_skip +A convenience function that repeatedly calls +.Fn archive_read_data_block +to skip all of the data for this archive entry. +.\" #if ARCHIVE_API_VERSION < 3 +.It Fn archive_read_data_into_buffer +This function is deprecated and will be removed. +Use +.Fn archive_read_data +instead. +.\" #endif +.It Fn archive_read_data_into_fd +A convenience function that repeatedly calls +.Fn archive_read_data_block +to copy the entire entry to the provided file descriptor. +.It Fn archive_read_extract , Fn archive_read_extract_set_skip_file +A convenience function that wraps the corresponding +.Xr archive_write_disk 3 +interfaces. +The first call to +.Fn archive_read_extract +creates a restore object using +.Xr archive_write_disk_new 3 +and +.Xr archive_write_disk_set_standard_lookup 3 , +then transparently invokes +.Xr archive_write_disk_set_options 3 , +.Xr archive_write_header 3 , +.Xr archive_write_data 3 , +and +.Xr archive_write_finish_entry 3 +to create the entry on disk and copy data into it. +The +.Va flags +argument is passed unmodified to +.Xr archive_write_disk_set_options 3 . +.It Fn archive_read_extract2 +This is another version of +.Fn archive_read_extract +that allows you to provide your own restore object. +In particular, this allows you to override the standard lookup functions +using +.Xr archive_write_disk_set_group_lookup 3 , +and +.Xr archive_write_disk_set_user_lookup 3 . +Note that +.Fn archive_read_extract2 +does not accept a +.Va flags +argument; you should use +.Fn archive_write_disk_set_options +to set the restore options yourself. +.It Fn archive_read_extract_set_progress_callback +Sets a pointer to a user-defined callback that can be used +for updating progress displays during extraction. +The progress function will be invoked during the extraction of large +regular files. +The progress function will be invoked with the pointer provided to this call. +Generally, the data pointed to should include a reference to the archive +object and the archive_entry object so that various statistics +can be retrieved for the progress display. +.It Fn archive_read_close +Complete the archive and invoke the close callback. +.It Fn archive_read_finish +Invokes +.Fn archive_read_close +if it was not invoked manually, then release all resources. +Note: In libarchive 1.x, this function was declared to return +.Ft void , +which made it impossible to detect certain errors when +.Fn archive_read_close +was invoked implicitly from this function. +The declaration is corrected beginning with libarchive 2.0. +.El +.Pp +Note that the library determines most of the relevant information about +the archive by inspection. +In particular, it automatically detects +.Xr gzip 1 +or +.Xr bzip2 1 +compression and transparently performs the appropriate decompression. +It also automatically detects the archive format. +.Pp +A complete description of the +.Tn struct archive +and +.Tn struct archive_entry +objects can be found in the overview manual page for +.Xr libarchive 3 . +.Sh CLIENT CALLBACKS +The callback functions must match the following prototypes: +.Bl -item -offset indent +.It +.Ft typedef ssize_t +.Fo archive_read_callback +.Fa "struct archive *" +.Fa "void *client_data" +.Fa "const void **buffer" +.Fc +.It +.\" #if ARCHIVE_API_VERSION < 2 +.Ft typedef int +.Fo archive_skip_callback +.Fa "struct archive *" +.Fa "void *client_data" +.Fa "size_t request" +.Fc +.\" #else +.\" .Ft typedef off_t +.\" .Fo archive_skip_callback +.\" .Fa "struct archive *" +.\" .Fa "void *client_data" +.\" .Fa "off_t request" +.\" .Fc +.\" #endif +.It +.Ft typedef int +.Fn archive_open_callback "struct archive *" "void *client_data" +.It +.Ft typedef int +.Fn archive_close_callback "struct archive *" "void *client_data" +.El +.Pp +The open callback is invoked by +.Fn archive_open . +It should return +.Cm ARCHIVE_OK +if the underlying file or data source is successfully +opened. +If the open fails, it should call +.Fn archive_set_error +to register an error code and message and return +.Cm ARCHIVE_FATAL . +.Pp +The read callback is invoked whenever the library +requires raw bytes from the archive. +The read callback should read data into a buffer, +set the +.Li const void **buffer +argument to point to the available data, and +return a count of the number of bytes available. +The library will invoke the read callback again +only after it has consumed this data. +The library imposes no constraints on the size +of the data blocks returned. +On end-of-file, the read callback should +return zero. +On error, the read callback should invoke +.Fn archive_set_error +to register an error code and message and +return -1. +.Pp +The skip callback is invoked when the +library wants to ignore a block of data. +The return value is the number of bytes actually +skipped, which may differ from the request. +If the callback cannot skip data, it should return +zero. +If the skip callback is not provided (the +function pointer is +.Dv NULL ), +the library will invoke the read function +instead and simply discard the result. +A skip callback can provide significant +performance gains when reading uncompressed +archives from slow disk drives or other media +that can skip quickly. +.Pp +The close callback is invoked by archive_close when +the archive processing is complete. +The callback should return +.Cm ARCHIVE_OK +on success. +On failure, the callback should invoke +.Fn archive_set_error +to register an error code and message and +return +.Cm ARCHIVE_FATAL. +.Sh EXAMPLE +The following illustrates basic usage of the library. +In this example, +the callback functions are simply wrappers around the standard +.Xr open 2 , +.Xr read 2 , +and +.Xr close 2 +system calls. +.Bd -literal -offset indent +void +list_archive(const char *name) +{ + struct mydata *mydata; + struct archive *a; + struct archive_entry *entry; + + mydata = malloc(sizeof(struct mydata)); + a = archive_read_new(); + mydata->name = name; + archive_read_support_compression_all(a); + archive_read_support_format_all(a); + archive_read_open(a, mydata, myopen, myread, myclose); + while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { + printf("%s\\n",archive_entry_pathname(entry)); + archive_read_data_skip(a); + } + archive_read_finish(a); + free(mydata); +} + +ssize_t +myread(struct archive *a, void *client_data, const void **buff) +{ + struct mydata *mydata = client_data; + + *buff = mydata->buff; + return (read(mydata->fd, mydata->buff, 10240)); +} + +int +myopen(struct archive *a, void *client_data) +{ + struct mydata *mydata = client_data; + + mydata->fd = open(mydata->name, O_RDONLY); + return (mydata->fd >= 0 ? ARCHIVE_OK : ARCHIVE_FATAL); +} + +int +myclose(struct archive *a, void *client_data) +{ + struct mydata *mydata = client_data; + + if (mydata->fd > 0) + close(mydata->fd); + return (ARCHIVE_OK); +} +.Ed +.Sh RETURN VALUES +Most functions return zero on success, non-zero on error. +The possible return codes include: +.Cm ARCHIVE_OK +(the operation succeeded), +.Cm ARCHIVE_WARN +(the operation succeeded but a non-critical error was encountered), +.Cm ARCHIVE_EOF +(end-of-archive was encountered), +.Cm ARCHIVE_RETRY +(the operation failed but can be retried), +and +.Cm ARCHIVE_FATAL +(there was a fatal error; the archive should be closed immediately). +Detailed error codes and textual descriptions are available from the +.Fn archive_errno +and +.Fn archive_error_string +functions. +.Pp +.Fn archive_read_new +returns a pointer to a freshly allocated +.Tn struct archive +object. +It returns +.Dv NULL +on error. +.Pp +.Fn archive_read_data +returns a count of bytes actually read or zero at the end of the entry. +On error, a value of +.Cm ARCHIVE_FATAL , +.Cm ARCHIVE_WARN , +or +.Cm ARCHIVE_RETRY +is returned and an error code and textual description can be retrieved from the +.Fn archive_errno +and +.Fn archive_error_string +functions. +.Pp +The library expects the client callbacks to behave similarly. +If there is an error, you can use +.Fn archive_set_error +to set an appropriate error code and description, +then return one of the non-zero values above. +(Note that the value eventually returned to the client may +not be the same; many errors that are not critical at the level +of basic I/O can prevent the archive from being properly read, +thus most I/O errors eventually cause +.Cm ARCHIVE_FATAL +to be returned.) +.\" .Sh ERRORS +.Sh SEE ALSO +.Xr tar 1 , +.Xr archive 3 , +.Xr archive_util 3 , +.Xr tar 5 +.Sh HISTORY +The +.Nm libarchive +library first appeared in +.Fx 5.3 . +.Sh AUTHORS +.An -nosplit +The +.Nm libarchive +library was written by +.An Tim Kientzle Aq kientzle@acm.org . +.Sh BUGS +Many traditional archiver programs treat +empty files as valid empty archives. +For example, many implementations of +.Xr tar 1 +allow you to append entries to an empty file. +Of course, it is impossible to determine the format of an empty file +by inspecting the contents, so this library treats empty files as +having a special +.Dq empty +format. diff --git a/Utilities/cmlibarchive/libarchive/archive_read.c b/Utilities/cmlibarchive/libarchive/archive_read.c new file mode 100644 index 000000000..cd4416ca8 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read.c @@ -0,0 +1,1241 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + */ + +/* + * This file contains the "essential" portions of the read API, that + * is, stuff that will probably always be used by any client that + * actually needs to read an archive. Optional pieces have been, as + * far as possible, separated out into separate files to avoid + * needlessly bloating statically-linked clients. + */ + +#include "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read.c,v 1.39 2008/12/06 06:45:15 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" + +#define minimum(a, b) (a < b ? a : b) + +static int build_stream(struct archive_read *); +static int choose_format(struct archive_read *); +static struct archive_vtable *archive_read_vtable(void); +static int _archive_read_close(struct archive *); +static int _archive_read_finish(struct archive *); + +static struct archive_vtable * +archive_read_vtable(void) +{ + static struct archive_vtable av; + static int inited = 0; + + if (!inited) { + av.archive_finish = _archive_read_finish; + av.archive_close = _archive_read_close; + } + return (&av); +} + +/* + * Allocate, initialize and return a struct archive object. + */ +struct archive * +archive_read_new(void) +{ + struct archive_read *a; + + a = (struct archive_read *)malloc(sizeof(*a)); + if (a == NULL) + return (NULL); + memset(a, 0, sizeof(*a)); + a->archive.magic = ARCHIVE_READ_MAGIC; + + a->archive.state = ARCHIVE_STATE_NEW; + a->entry = archive_entry_new(); + a->archive.vtable = archive_read_vtable(); + + return (&a->archive); +} + +/* + * Record the do-not-extract-to file. This belongs in archive_read_extract.c. + */ +void +archive_read_extract_set_skip_file(struct archive *_a, dev_t d, ino_t i) +{ + struct archive_read *a = (struct archive_read *)_a; + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_ANY, + "archive_read_extract_set_skip_file"); + a->skip_file_dev = d; + a->skip_file_ino = i; +} + +/* + * Set read options for the format. + */ +int +archive_read_set_format_options(struct archive *_a, const char *s) +{ + struct archive_read *a; + struct archive_format_descriptor *format; + char key[64], val[64]; + char *valp; + size_t i; + int len, r; + + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, + "archive_read_set_format_options"); + + if (s == NULL || *s == '\0') + return (ARCHIVE_OK); + a = (struct archive_read *)_a; + __archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC, + ARCHIVE_STATE_NEW, "archive_read_set_format_options"); + len = 0; + for (i = 0; i < sizeof(a->formats)/sizeof(a->formats[0]); i++) { + format = &a->formats[i]; + if (format == NULL || format->options == NULL || + format->name == NULL) + /* This format does not support option. */ + continue; + + while ((len = __archive_parse_options(s, format->name, + sizeof(key), key, sizeof(val), val)) > 0) { + valp = val[0] == '\0' ? NULL : val; + a->format = format; + r = format->options(a, key, valp); + a->format = NULL; + if (r == ARCHIVE_FATAL) + return (r); + s += len; + } + } + if (len < 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Illegal format options."); + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); +} + +/* + * Set read options for the filter. + */ +int +archive_read_set_filter_options(struct archive *_a, const char *s) +{ + struct archive_read *a; + struct archive_read_filter *filter; + struct archive_read_filter_bidder *bidder; + char key[64], val[64]; + int len, r; + + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, + "archive_read_set_filter_options"); + + if (s == NULL || *s == '\0') + return (ARCHIVE_OK); + a = (struct archive_read *)_a; + __archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC, + ARCHIVE_STATE_NEW, "archive_read_set_filter_options"); + filter = a->filter; + len = 0; + for (filter = a->filter; filter != NULL; filter = filter->upstream) { + bidder = filter->bidder; + if (bidder == NULL) + continue; + if (bidder->options == NULL) + /* This bidder does not support option */ + continue; + while ((len = __archive_parse_options(s, filter->name, + sizeof(key), key, sizeof(val), val)) > 0) { + if (val[0] == '\0') + r = bidder->options(bidder, key, NULL); + else + r = bidder->options(bidder, key, val); + if (r == ARCHIVE_FATAL) + return (r); + s += len; + } + } + if (len < 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Illegal format options."); + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); +} + +/* + * Set read options for the format and the filter. + */ +int +archive_read_set_options(struct archive *_a, const char *s) +{ + int r; + + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, + "archive_read_set_options"); + archive_clear_error(_a); + + r = archive_read_set_format_options(_a, s); + if (r != ARCHIVE_OK) + return (r); + r = archive_read_set_filter_options(_a, s); + if (r != ARCHIVE_OK) + return (r); + return (ARCHIVE_OK); +} + +/* + * Open the archive + */ +int +archive_read_open(struct archive *a, void *client_data, + archive_open_callback *client_opener, archive_read_callback *client_reader, + archive_close_callback *client_closer) +{ + /* Old archive_read_open() is just a thin shell around + * archive_read_open2. */ + return archive_read_open2(a, client_data, client_opener, + client_reader, NULL, client_closer); +} + +static ssize_t +client_read_proxy(struct archive_read_filter *self, const void **buff) +{ + ssize_t r; + r = (self->archive->client.reader)(&self->archive->archive, + self->data, buff); + self->archive->archive.raw_position += r; + return (r); +} + +static int64_t +client_skip_proxy(struct archive_read_filter *self, int64_t request) +{ + int64_t ask, get, total; + /* Limit our maximum seek request to 1GB on platforms + * with 32-bit off_t (such as Windows). */ + int64_t skip_limit = ((int64_t)1) << (sizeof(off_t) * 8 - 2); + + if (self->archive->client.skipper == NULL) + return (0); + total = 0; + for (;;) { + ask = request; + if (ask > skip_limit) + ask = skip_limit; + get = (self->archive->client.skipper)(&self->archive->archive, + self->data, ask); + if (get == 0) + return (total); + request -= get; + self->archive->archive.raw_position += get; + total += get; + } +} + +static int +client_close_proxy(struct archive_read_filter *self) +{ + int r = ARCHIVE_OK; + + if (self->archive->client.closer != NULL) + r = (self->archive->client.closer)((struct archive *)self->archive, + self->data); + self->data = NULL; + return (r); +} + + +int +archive_read_open2(struct archive *_a, void *client_data, + archive_open_callback *client_opener, + archive_read_callback *client_reader, + archive_skip_callback *client_skipper, + archive_close_callback *client_closer) +{ + struct archive_read *a = (struct archive_read *)_a; + struct archive_read_filter *filter; + int e; + + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, + "archive_read_open"); + archive_clear_error(&a->archive); + + if (client_reader == NULL) + __archive_errx(1, + "No reader function provided to archive_read_open"); + + /* Open data source. */ + if (client_opener != NULL) { + e =(client_opener)(&a->archive, client_data); + if (e != 0) { + /* If the open failed, call the closer to clean up. */ + if (client_closer) + (client_closer)(&a->archive, client_data); + return (e); + } + } + + /* Save the client functions and mock up the initial source. */ + a->client.reader = client_reader; + a->client.skipper = client_skipper; + a->client.closer = client_closer; + + filter = calloc(1, sizeof(*filter)); + if (filter == NULL) + return (ARCHIVE_FATAL); + filter->bidder = NULL; + filter->upstream = NULL; + filter->archive = a; + filter->data = client_data; + filter->read = client_read_proxy; + filter->skip = client_skip_proxy; + filter->close = client_close_proxy; + filter->name = "none"; + filter->code = ARCHIVE_COMPRESSION_NONE; + a->filter = filter; + + /* Build out the input pipeline. */ + e = build_stream(a); + if (e == ARCHIVE_OK) + a->archive.state = ARCHIVE_STATE_HEADER; + + return (e); +} + +/* + * Allow each registered stream transform to bid on whether + * it wants to handle this stream. Repeat until we've finished + * building the pipeline. + */ +static int +build_stream(struct archive_read *a) +{ + int number_bidders, i, bid, best_bid; + struct archive_read_filter_bidder *bidder, *best_bidder; + struct archive_read_filter *filter; + ssize_t avail; + int r; + + for (;;) { + number_bidders = sizeof(a->bidders) / sizeof(a->bidders[0]); + + best_bid = 0; + best_bidder = NULL; + + bidder = a->bidders; + for (i = 0; i < number_bidders; i++, bidder++) { + if (bidder->bid != NULL) { + bid = (bidder->bid)(bidder, a->filter); + if (bid > best_bid) { + best_bid = bid; + best_bidder = bidder; + } + } + } + + /* If no bidder, we're done. */ + if (best_bidder == NULL) { + a->archive.compression_name = a->filter->name; + a->archive.compression_code = a->filter->code; + return (ARCHIVE_OK); + } + + filter + = (struct archive_read_filter *)calloc(1, sizeof(*filter)); + if (filter == NULL) + return (ARCHIVE_FATAL); + filter->bidder = best_bidder; + filter->archive = a; + filter->upstream = a->filter; + r = (best_bidder->init)(filter); + if (r != ARCHIVE_OK) { + free(filter); + return (r); + } + /* Verify the filter by asking it for some data. */ + __archive_read_filter_ahead(filter, 1, &avail); + if (avail < 0) { + /* If the read failed, bail out now. */ + free(filter); + return (avail); + } + a->filter = filter; + } +} + +/* + * Read header of next entry. + */ +int +archive_read_next_header2(struct archive *_a, struct archive_entry *entry) +{ + struct archive_read *a = (struct archive_read *)_a; + int slot, ret; + + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, + ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_read_next_header"); + + ++_a->file_count; + archive_entry_clear(entry); + archive_clear_error(&a->archive); + + /* + * If no format has yet been chosen, choose one. + */ + if (a->format == NULL) { + slot = choose_format(a); + if (slot < 0) { + a->archive.state = ARCHIVE_STATE_FATAL; + return (ARCHIVE_FATAL); + } + a->format = &(a->formats[slot]); + } + + /* + * If client didn't consume entire data, skip any remainder + * (This is especially important for GNU incremental directories.) + */ + if (a->archive.state == ARCHIVE_STATE_DATA) { + ret = archive_read_data_skip(&a->archive); + if (ret == ARCHIVE_EOF) { + archive_set_error(&a->archive, EIO, "Premature end-of-file."); + a->archive.state = ARCHIVE_STATE_FATAL; + return (ARCHIVE_FATAL); + } + if (ret != ARCHIVE_OK) + return (ret); + } + + /* Record start-of-header. */ + a->header_position = a->archive.file_position; + + ret = (a->format->read_header)(a, entry); + + /* + * EOF and FATAL are persistent at this layer. By + * modifying the state, we guarantee that future calls to + * read a header or read data will fail. + */ + switch (ret) { + case ARCHIVE_EOF: + a->archive.state = ARCHIVE_STATE_EOF; + break; + case ARCHIVE_OK: + a->archive.state = ARCHIVE_STATE_DATA; + break; + case ARCHIVE_WARN: + a->archive.state = ARCHIVE_STATE_DATA; + break; + case ARCHIVE_RETRY: + break; + case ARCHIVE_FATAL: + a->archive.state = ARCHIVE_STATE_FATAL; + break; + } + + a->read_data_output_offset = 0; + a->read_data_remaining = 0; + return (ret); +} + +int +archive_read_next_header(struct archive *_a, struct archive_entry **entryp) +{ + int ret; + struct archive_read *a = (struct archive_read *)_a; + *entryp = NULL; + ret = archive_read_next_header2(_a, a->entry); + *entryp = a->entry; + return ret; +} + +/* + * Allow each registered format to bid on whether it wants to handle + * the next entry. Return index of winning bidder. + */ +static int +choose_format(struct archive_read *a) +{ + int slots; + int i; + int bid, best_bid; + int best_bid_slot; + + slots = sizeof(a->formats) / sizeof(a->formats[0]); + best_bid = -1; + best_bid_slot = -1; + + /* Set up a->format and a->pformat_data for convenience of bidders. */ + a->format = &(a->formats[0]); + for (i = 0; i < slots; i++, a->format++) { + if (a->format->bid) { + bid = (a->format->bid)(a); + if (bid == ARCHIVE_FATAL) + return (ARCHIVE_FATAL); + if ((bid > best_bid) || (best_bid_slot < 0)) { + best_bid = bid; + best_bid_slot = i; + } + } + } + + /* + * There were no bidders; this is a serious programmer error + * and demands a quick and definitive abort. + */ + if (best_bid_slot < 0) + __archive_errx(1, "No formats were registered; you must " + "invoke at least one archive_read_support_format_XXX " + "function in order to successfully read an archive."); + + /* + * There were bidders, but no non-zero bids; this means we + * can't support this stream. + */ + if (best_bid < 1) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unrecognized archive format"); + return (ARCHIVE_FATAL); + } + + return (best_bid_slot); +} + +/* + * Return the file offset (within the uncompressed data stream) where + * the last header started. + */ +int64_t +archive_read_header_position(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, + ARCHIVE_STATE_ANY, "archive_read_header_position"); + return (a->header_position); +} + +/* + * Read data from an archive entry, using a read(2)-style interface. + * This is a convenience routine that just calls + * archive_read_data_block and copies the results into the client + * buffer, filling any gaps with zero bytes. Clients using this + * API can be completely ignorant of sparse-file issues; sparse files + * will simply be padded with nulls. + * + * DO NOT intermingle calls to this function and archive_read_data_block + * to read a single entry body. + */ +ssize_t +archive_read_data(struct archive *_a, void *buff, size_t s) +{ + struct archive_read *a = (struct archive_read *)_a; + char *dest; + const void *read_buf; + size_t bytes_read; + size_t len; + int r; + + bytes_read = 0; + dest = (char *)buff; + + while (s > 0) { + if (a->read_data_remaining == 0) { + read_buf = a->read_data_block; + r = archive_read_data_block(&a->archive, &read_buf, + &a->read_data_remaining, &a->read_data_offset); + a->read_data_block = read_buf; + if (r == ARCHIVE_EOF) + return (bytes_read); + /* + * Error codes are all negative, so the status + * return here cannot be confused with a valid + * byte count. (ARCHIVE_OK is zero.) + */ + if (r < ARCHIVE_OK) + return (r); + } + + if (a->read_data_offset < a->read_data_output_offset) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Encountered out-of-order sparse blocks"); + return (ARCHIVE_RETRY); + } + + /* Compute the amount of zero padding needed. */ + if (a->read_data_output_offset + (off_t)s < + a->read_data_offset) { + len = s; + } else if (a->read_data_output_offset < + a->read_data_offset) { + len = a->read_data_offset - + a->read_data_output_offset; + } else + len = 0; + + /* Add zeroes. */ + memset(dest, 0, len); + s -= len; + a->read_data_output_offset += len; + dest += len; + bytes_read += len; + + /* Copy data if there is any space left. */ + if (s > 0) { + len = a->read_data_remaining; + if (len > s) + len = s; + memcpy(dest, a->read_data_block, len); + s -= len; + a->read_data_block += len; + a->read_data_remaining -= len; + a->read_data_output_offset += len; + a->read_data_offset += len; + dest += len; + bytes_read += len; + } + } + return (bytes_read); +} + +#if ARCHIVE_API_VERSION < 3 +/* + * Obsolete function provided for compatibility only. Note that the API + * of this function doesn't allow the caller to detect if the remaining + * data from the archive entry is shorter than the buffer provided, or + * even if an error occurred while reading data. + */ +int +archive_read_data_into_buffer(struct archive *a, void *d, ssize_t len) +{ + + archive_read_data(a, d, len); + return (ARCHIVE_OK); +} +#endif + +/* + * Skip over all remaining data in this entry. + */ +int +archive_read_data_skip(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + int r; + const void *buff; + size_t size; + off_t offset; + + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_DATA, + "archive_read_data_skip"); + + if (a->format->read_data_skip != NULL) + r = (a->format->read_data_skip)(a); + else { + while ((r = archive_read_data_block(&a->archive, + &buff, &size, &offset)) + == ARCHIVE_OK) + ; + } + + if (r == ARCHIVE_EOF) + r = ARCHIVE_OK; + + a->archive.state = ARCHIVE_STATE_HEADER; + return (r); +} + +/* + * Read the next block of entry data from the archive. + * This is a zero-copy interface; the client receives a pointer, + * size, and file offset of the next available block of data. + * + * Returns ARCHIVE_OK if the operation is successful, ARCHIVE_EOF if + * the end of entry is encountered. + */ +int +archive_read_data_block(struct archive *_a, + const void **buff, size_t *size, off_t *offset) +{ + struct archive_read *a = (struct archive_read *)_a; + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_DATA, + "archive_read_data_block"); + + if (a->format->read_data == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "Internal error: " + "No format_read_data_block function registered"); + return (ARCHIVE_FATAL); + } + + return (a->format->read_data)(a, buff, size, offset); +} + +/* + * Close the file and release most resources. + * + * Be careful: client might just call read_new and then read_finish. + * Don't assume we actually read anything or performed any non-trivial + * initialization. + */ +static int +_archive_read_close(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + int r = ARCHIVE_OK, r1 = ARCHIVE_OK; + size_t i, n; + + __archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC, + ARCHIVE_STATE_ANY, "archive_read_close"); + archive_clear_error(&a->archive); + a->archive.state = ARCHIVE_STATE_CLOSED; + + + /* Call cleanup functions registered by optional components. */ + if (a->cleanup_archive_extract != NULL) + r = (a->cleanup_archive_extract)(a); + + /* TODO: Clean up the formatters. */ + + /* Clean up the filter pipeline. */ + while (a->filter != NULL) { + struct archive_read_filter *t = a->filter->upstream; + if (a->filter->close != NULL) { + r1 = (a->filter->close)(a->filter); + if (r1 < r) + r = r1; + } + free(a->filter->buffer); + free(a->filter); + a->filter = t; + } + + /* Release the bidder objects. */ + n = sizeof(a->bidders)/sizeof(a->bidders[0]); + for (i = 0; i < n; i++) { + if (a->bidders[i].free != NULL) { + r1 = (a->bidders[i].free)(&a->bidders[i]); + if (r1 < r) + r = r1; + } + } + + return (r); +} + +/* + * Release memory and other resources. + */ +int +_archive_read_finish(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + int i; + int slots; + int r = ARCHIVE_OK; + + __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_ANY, + "archive_read_finish"); + if (a->archive.state != ARCHIVE_STATE_CLOSED) + r = archive_read_close(&a->archive); + + /* Cleanup format-specific data. */ + slots = sizeof(a->formats) / sizeof(a->formats[0]); + for (i = 0; i < slots; i++) { + a->format = &(a->formats[i]); + if (a->formats[i].cleanup) + (a->formats[i].cleanup)(a); + } + + archive_string_free(&a->archive.error_string); + if (a->entry) + archive_entry_free(a->entry); + a->archive.magic = 0; + free(a); +#if ARCHIVE_API_VERSION > 1 + return (r); +#endif +} + +/* + * Used internally by read format handlers to register their bid and + * initialization functions. + */ +int +__archive_read_register_format(struct archive_read *a, + void *format_data, + const char *name, + int (*bid)(struct archive_read *), + int (*options)(struct archive_read *, const char *, const char *), + int (*read_header)(struct archive_read *, struct archive_entry *), + int (*read_data)(struct archive_read *, const void **, size_t *, off_t *), + int (*read_data_skip)(struct archive_read *), + int (*cleanup)(struct archive_read *)) +{ + int i, number_slots; + + __archive_check_magic(&a->archive, + ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, + "__archive_read_register_format"); + + number_slots = sizeof(a->formats) / sizeof(a->formats[0]); + + for (i = 0; i < number_slots; i++) { + if (a->formats[i].bid == bid) + return (ARCHIVE_WARN); /* We've already installed */ + if (a->formats[i].bid == NULL) { + a->formats[i].bid = bid; + a->formats[i].options = options; + a->formats[i].read_header = read_header; + a->formats[i].read_data = read_data; + a->formats[i].read_data_skip = read_data_skip; + a->formats[i].cleanup = cleanup; + a->formats[i].data = format_data; + a->formats[i].name = name; + return (ARCHIVE_OK); + } + } + + __archive_errx(1, "Not enough slots for format registration"); + return (ARCHIVE_FATAL); /* Never actually called. */ +} + +/* + * Used internally by decompression routines to register their bid and + * initialization functions. + */ +struct archive_read_filter_bidder * +__archive_read_get_bidder(struct archive_read *a) +{ + int i, number_slots; + + __archive_check_magic(&a->archive, + ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, + "__archive_read_get_bidder"); + + number_slots = sizeof(a->bidders) / sizeof(a->bidders[0]); + + for (i = 0; i < number_slots; i++) { + if (a->bidders[i].bid == NULL) { + memset(a->bidders + i, 0, sizeof(a->bidders[0])); + return (a->bidders + i); + } + } + + __archive_errx(1, "Not enough slots for compression registration"); + return (NULL); /* Never actually executed. */ +} + +/* + * The next three functions comprise the peek/consume internal I/O + * system used by archive format readers. This system allows fairly + * flexible read-ahead and allows the I/O code to operate in a + * zero-copy manner most of the time. + * + * In the ideal case, filters generate blocks of data + * and __archive_read_ahead() just returns pointers directly into + * those blocks. Then __archive_read_consume() just bumps those + * pointers. Only if your request would span blocks does the I/O + * layer use a copy buffer to provide you with a contiguous block of + * data. The __archive_read_skip() is an optimization; it scans ahead + * very quickly (it usually translates into a seek() operation if + * you're reading uncompressed disk files). + * + * A couple of useful idioms: + * * "I just want some data." Ask for 1 byte and pay attention to + * the "number of bytes available" from __archive_read_ahead(). + * You can consume more than you asked for; you just can't consume + * more than is available. If you consume everything that's + * immediately available, the next read_ahead() call will pull + * the next block. + * * "I want to output a large block of data." As above, ask for 1 byte, + * emit all that's available (up to whatever limit you have), then + * repeat until you're done. + * * "I want to peek ahead by a large amount." Ask for 4k or so, then + * double and repeat until you get an error or have enough. Note + * that the I/O layer will likely end up expanding its copy buffer + * to fit your request, so use this technique cautiously. This + * technique is used, for example, by some of the format tasting + * code that has uncertain look-ahead needs. + * + * TODO: Someday, provide a more generic __archive_read_seek() for + * those cases where it's useful. This is tricky because there are lots + * of cases where seek() is not available (reading gzip data from a + * network socket, for instance), so there needs to be a good way to + * communicate whether seek() is available and users of that interface + * need to use non-seeking strategies whenever seek() is not available. + */ + +/* + * Looks ahead in the input stream: + * * If 'avail' pointer is provided, that returns number of bytes available + * in the current buffer, which may be much larger than requested. + * * If end-of-file, *avail gets set to zero. + * * If error, *avail gets error code. + * * If request can be met, returns pointer to data, returns NULL + * if request is not met. + * + * Note: If you just want "some data", ask for 1 byte and pay attention + * to *avail, which will have the actual amount available. If you + * know exactly how many bytes you need, just ask for that and treat + * a NULL return as an error. + * + * Important: This does NOT move the file pointer. See + * __archive_read_consume() below. + */ + +/* + * This is tricky. We need to provide our clients with pointers to + * contiguous blocks of memory but we want to avoid copying whenever + * possible. + * + * Mostly, this code returns pointers directly into the block of data + * provided by the client_read routine. It can do this unless the + * request would split across blocks. In that case, we have to copy + * into an internal buffer to combine reads. + */ +const void * +__archive_read_ahead(struct archive_read *a, size_t min, ssize_t *avail) +{ + return (__archive_read_filter_ahead(a->filter, min, avail)); +} + +const void * +__archive_read_filter_ahead(struct archive_read_filter *filter, + size_t min, ssize_t *avail) +{ + ssize_t bytes_read; + size_t tocopy; + + if (filter->fatal) { + if (avail) + *avail = ARCHIVE_FATAL; + return (NULL); + } + + /* + * Keep pulling more data until we can satisfy the request. + */ + for (;;) { + + /* + * If we can satisfy from the copy buffer (and the + * copy buffer isn't empty), we're done. In particular, + * note that min == 0 is a perfectly well-defined + * request. + */ + if (filter->avail >= min && filter->avail > 0) { + if (avail != NULL) + *avail = filter->avail; + return (filter->next); + } + + /* + * We can satisfy directly from client buffer if everything + * currently in the copy buffer is still in the client buffer. + */ + if (filter->client_total >= filter->client_avail + filter->avail + && filter->client_avail + filter->avail >= min) { + /* "Roll back" to client buffer. */ + filter->client_avail += filter->avail; + filter->client_next -= filter->avail; + /* Copy buffer is now empty. */ + filter->avail = 0; + filter->next = filter->buffer; + /* Return data from client buffer. */ + if (avail != NULL) + *avail = filter->client_avail; + return (filter->client_next); + } + + /* Move data forward in copy buffer if necessary. */ + if (filter->next > filter->buffer && + filter->next + min > filter->buffer + filter->buffer_size) { + if (filter->avail > 0) + memmove(filter->buffer, filter->next, filter->avail); + filter->next = filter->buffer; + } + + /* If we've used up the client data, get more. */ + if (filter->client_avail <= 0) { + if (filter->end_of_file) { + if (avail != NULL) + *avail = 0; + return (NULL); + } + bytes_read = (filter->read)(filter, + &filter->client_buff); + if (bytes_read < 0) { /* Read error. */ + filter->client_total = filter->client_avail = 0; + filter->client_next = filter->client_buff = NULL; + filter->fatal = 1; + if (avail != NULL) + *avail = ARCHIVE_FATAL; + return (NULL); + } + if (bytes_read == 0) { /* Premature end-of-file. */ + filter->client_total = filter->client_avail = 0; + filter->client_next = filter->client_buff = NULL; + filter->end_of_file = 1; + /* Return whatever we do have. */ + if (avail != NULL) + *avail = filter->avail; + return (NULL); + } + filter->position += bytes_read; + filter->client_total = bytes_read; + filter->client_avail = filter->client_total; + filter->client_next = filter->client_buff; + } + else + { + /* + * We can't satisfy the request from the copy + * buffer or the existing client data, so we + * need to copy more client data over to the + * copy buffer. + */ + + /* Ensure the buffer is big enough. */ + if (min > filter->buffer_size) { + size_t s, t; + char *p; + + /* Double the buffer; watch for overflow. */ + s = t = filter->buffer_size; + if (s == 0) + s = min; + while (s < min) { + t *= 2; + if (t <= s) { /* Integer overflow! */ + archive_set_error( + &filter->archive->archive, + ENOMEM, + "Unable to allocate copy buffer"); + filter->fatal = 1; + if (avail != NULL) + *avail = ARCHIVE_FATAL; + return (NULL); + } + s = t; + } + /* Now s >= min, so allocate a new buffer. */ + p = (char *)malloc(s); + if (p == NULL) { + archive_set_error( + &filter->archive->archive, + ENOMEM, + "Unable to allocate copy buffer"); + filter->fatal = 1; + if (avail != NULL) + *avail = ARCHIVE_FATAL; + return (NULL); + } + /* Move data into newly-enlarged buffer. */ + if (filter->avail > 0) + memmove(p, filter->next, filter->avail); + free(filter->buffer); + filter->next = filter->buffer = p; + filter->buffer_size = s; + } + + /* We can add client data to copy buffer. */ + /* First estimate: copy to fill rest of buffer. */ + tocopy = (filter->buffer + filter->buffer_size) + - (filter->next + filter->avail); + /* Don't waste time buffering more than we need to. */ + if (tocopy + filter->avail > min) + tocopy = min - filter->avail; + /* Don't copy more than is available. */ + if (tocopy > filter->client_avail) + tocopy = filter->client_avail; + + memcpy(filter->next + filter->avail, filter->client_next, + tocopy); + /* Remove this data from client buffer. */ + filter->client_next += tocopy; + filter->client_avail -= tocopy; + /* add it to copy buffer. */ + filter->avail += tocopy; + } + } +} + +/* + * Move the file pointer forward. This should be called after + * __archive_read_ahead() returns data to you. Don't try to move + * ahead by more than the amount of data available according to + * __archive_read_ahead(). + */ +/* + * Mark the appropriate data as used. Note that the request here will + * often be much smaller than the size of the previous read_ahead + * request. + */ +ssize_t +__archive_read_consume(struct archive_read *a, size_t request) +{ + ssize_t r; + r = __archive_read_filter_consume(a->filter, request); + a->archive.file_position += r; + return (r); +} + +ssize_t +__archive_read_filter_consume(struct archive_read_filter * filter, + size_t request) +{ + if (filter->avail > 0) { + /* Read came from copy buffer. */ + filter->next += request; + filter->avail -= request; + } else { + /* Read came from client buffer. */ + filter->client_next += request; + filter->client_avail -= request; + } + return (request); +} + +/* + * Move the file pointer ahead by an arbitrary amount. If you're + * reading uncompressed data from a disk file, this will actually + * translate into a seek() operation. Even in cases where seek() + * isn't feasible, this at least pushes the read-and-discard loop + * down closer to the data source. + */ +int64_t +__archive_read_skip(struct archive_read *a, int64_t request) +{ + int64_t skipped = __archive_read_skip_lenient(a, request); + if (skipped == request) + return (skipped); + /* We hit EOF before we satisfied the skip request. */ + if (skipped < 0) // Map error code to 0 for error message below. + skipped = 0; + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Truncated input file (needed %jd bytes, only %jd available)", + (intmax_t)request, (intmax_t)skipped); + return (ARCHIVE_FATAL); +} + +int64_t +__archive_read_skip_lenient(struct archive_read *a, int64_t request) +{ + int64_t skipped = __archive_read_filter_skip(a->filter, request); + if (skipped > 0) + a->archive.file_position += skipped; + return (skipped); +} + +int64_t +__archive_read_filter_skip(struct archive_read_filter *filter, int64_t request) +{ + int64_t bytes_skipped, total_bytes_skipped = 0; + size_t min; + + if (filter->fatal) + return (-1); + /* + * If there is data in the buffers already, use that first. + */ + if (filter->avail > 0) { + min = minimum(request, (off_t)filter->avail); + bytes_skipped = __archive_read_filter_consume(filter, min); + request -= bytes_skipped; + total_bytes_skipped += bytes_skipped; + } + if (filter->client_avail > 0) { + min = minimum(request, (int64_t)filter->client_avail); + bytes_skipped = __archive_read_filter_consume(filter, min); + request -= bytes_skipped; + total_bytes_skipped += bytes_skipped; + } + if (request == 0) + return (total_bytes_skipped); + /* + * If a client_skipper was provided, try that first. + */ +#if ARCHIVE_API_VERSION < 2 + if ((filter->skip != NULL) && (request < SSIZE_MAX)) { +#else + if (filter->skip != NULL) { +#endif + bytes_skipped = (filter->skip)(filter, request); + if (bytes_skipped < 0) { /* error */ + filter->client_total = filter->client_avail = 0; + filter->client_next = filter->client_buff = NULL; + filter->fatal = 1; + return (bytes_skipped); + } + total_bytes_skipped += bytes_skipped; + request -= bytes_skipped; + filter->client_next = filter->client_buff; + filter->client_avail = filter->client_total = 0; + } + /* + * Note that client_skipper will usually not satisfy the + * full request (due to low-level blocking concerns), + * so even if client_skipper is provided, we may still + * have to use ordinary reads to finish out the request. + */ + while (request > 0) { + const void* dummy_buffer; + ssize_t bytes_read; + dummy_buffer = __archive_read_filter_ahead(filter, + 1, &bytes_read); + if (bytes_read < 0) + return (bytes_read); + if (bytes_read == 0) { + return (total_bytes_skipped); + } + min = (size_t)(minimum(bytes_read, request)); + bytes_read = __archive_read_filter_consume(filter, min); + total_bytes_skipped += bytes_read; + request -= bytes_read; + } + return (total_bytes_skipped); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_data_into_fd.c b/Utilities/cmlibarchive/libarchive/archive_read_data_into_fd.c new file mode 100644 index 000000000..0628a1e0c --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_data_into_fd.c @@ -0,0 +1,93 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" + +/* Maximum amount of data to write at one time. */ +#define MAX_WRITE (1024 * 1024) + +/* + * This implementation minimizes copying of data and is sparse-file aware. + */ +int +archive_read_data_into_fd(struct archive *a, int fd) +{ + int r; + const void *buff; + size_t size, bytes_to_write; + ssize_t bytes_written, total_written; + off_t offset; + off_t output_offset; + + __archive_check_magic(a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_DATA, "archive_read_data_into_fd"); + + total_written = 0; + output_offset = 0; + + while ((r = archive_read_data_block(a, &buff, &size, &offset)) == + ARCHIVE_OK) { + const char *p = buff; + if (offset > output_offset) { + output_offset = lseek(fd, + offset - output_offset, SEEK_CUR); + if (output_offset != offset) { + archive_set_error(a, errno, "Seek error"); + return (ARCHIVE_FATAL); + } + } + while (size > 0) { + bytes_to_write = size; + if (bytes_to_write > MAX_WRITE) + bytes_to_write = MAX_WRITE; + bytes_written = write(fd, p, bytes_to_write); + if (bytes_written < 0) { + archive_set_error(a, errno, "Write error"); + return (ARCHIVE_FATAL); + } + output_offset += bytes_written; + total_written += bytes_written; + p += bytes_written; + size -= bytes_written; + } + } + + if (r != ARCHIVE_EOF) + return (r); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_disk.3 b/Utilities/cmlibarchive/libarchive/archive_read_disk.3 new file mode 100644 index 000000000..fd5309535 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_disk.3 @@ -0,0 +1,308 @@ +.\" Copyright (c) 2003-2009 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD$ +.\" +.Dd March 10, 2009 +.Dt archive_read_disk 3 +.Os +.Sh NAME +.Nm archive_read_disk_new , +.Nm archive_read_disk_set_symlink_logical , +.Nm archive_read_disk_set_symlink_physical , +.Nm archive_read_disk_set_symlink_hybrid , +.Nm archive_read_disk_entry_from_file , +.Nm archive_read_disk_gname , +.Nm archive_read_disk_uname , +.Nm archive_read_disk_set_uname_lookup , +.Nm archive_read_disk_set_gname_lookup , +.Nm archive_read_disk_set_standard_lookup , +.Nm archive_read_close , +.Nm archive_read_finish +.Nd functions for reading objects from disk +.Sh SYNOPSIS +.In archive.h +.Ft struct archive * +.Fn archive_read_disk_new "void" +.Ft int +.Fn archive_read_disk_set_symlink_logical "struct archive *" +.Ft int +.Fn archive_read_disk_set_symlink_physical "struct archive *" +.Ft int +.Fn archive_read_disk_set_symlink_hybrid "struct archive *" +.Ft int +.Fn archive_read_disk_gname "struct archive *" "gid_t" +.Ft int +.Fn archive_read_disk_uname "struct archive *" "uid_t" +.Ft int +.Fo archive_read_disk_set_gname_lookup +.Fa "struct archive *" +.Fa "void *" +.Fa "const char *(*lookup)(void *, gid_t)" +.Fa "void (*cleanup)(void *)" +.Fc +.Ft int +.Fo archive_read_disk_set_uname_lookup +.Fa "struct archive *" +.Fa "void *" +.Fa "const char *(*lookup)(void *, uid_t)" +.Fa "void (*cleanup)(void *)" +.Fc +.Ft int +.Fn archive_read_disk_set_standard_lookup "struct archive *" +.Ft int +.Fo archive_read_disk_entry_from_file +.Fa "struct archive *" +.Fa "struct archive_entry *" +.Fa "int fd" +.Fa "const struct stat *" +.Fc +.Ft int +.Fn archive_read_close "struct archive *" +.Ft int +.Fn archive_read_finish "struct archive *" +.Sh DESCRIPTION +These functions provide an API for reading information about +objects on disk. +In particular, they provide an interface for populating +.Tn struct archive_entry +objects. +.Bl -tag -width indent +.It Fn archive_read_disk_new +Allocates and initializes a +.Tn struct archive +object suitable for reading object information from disk. +.It Xo +.Fn archive_read_disk_set_symlink_logical , +.Fn archive_read_disk_set_symlink_physical , +.Fn archive_read_disk_set_symlink_hybrid +.Xc +This sets the mode used for handling symbolic links. +The +.Dq logical +mode follows all symbolic links. +The +.Dq physical +mode does not follow any symbolic links. +The +.Dq hybrid +mode currently behaves identically to the +.Dq logical +mode. +.It Xo +.Fn archive_read_disk_gname , +.Fn archive_read_disk_uname +.Xc +Returns a user or group name given a gid or uid value. +By default, these always return a NULL string. +.It Xo +.Fn archive_read_disk_set_gname_lookup , +.Fn archive_read_disk_set_uname_lookup +.Xc +These allow you to override the functions used for +user and group name lookups. +You may also provide a +.Tn void * +pointer to a private data structure and a cleanup function for +that data. +The cleanup function will be invoked when the +.Tn struct archive +object is destroyed or when new lookup functions are registered. +.It Fn archive_read_disk_set_standard_lookup +This convenience function installs a standard set of user +and group name lookup functions. +These functions use +.Xr getpwid 3 +and +.Xr getgrid 3 +to convert ids to names, defaulting to NULL if the names cannot +be looked up. +These functions also implement a simple memory cache to reduce +the number of calls to +.Xr getpwid 3 +and +.Xr getgrid 3 . +.It Fn archive_read_disk_entry_from_file +Populates a +.Tn struct archive_entry +object with information about a particular file. +The +.Tn archive_entry +object must have already been created with +.Xr archive_entry_new 3 +and at least one of the source path or path fields must already be set. +(If both are set, the source path will be used.) +.Pp +Information is read from disk using the path name from the +.Tn struct archive_entry +object. +If a file descriptor is provided, some information will be obtained using +that file descriptor, on platforms that support the appropriate +system calls. +.Pp +If a pointer to a +.Tn struct stat +is provided, information from that structure will be used instead +of reading from the disk where appropriate. +This can provide performance benefits in scenarios where +.Tn struct stat +information has already been read from the disk as a side effect +of some other operation. +(For example, directory traversal libraries often provide this information.) +.Pp +Where necessary, user and group ids are converted to user and group names +using the currently registered lookup functions above. +This affects the file ownership fields and ACL values in the +.Tn struct archive_entry +object. +.It Fn archive_read_close +This currently does nothing. +.It Fn archive_write_finish +Invokes +.Fn archive_write_close +if it was not invoked manually, then releases all resources. +.El +More information about the +.Va struct archive +object and the overall design of the library can be found in the +.Xr libarchive 3 +overview. +.Sh EXAMPLE +The following illustrates basic usage of the library by +showing how to use it to copy an item on disk into an archive. +.Bd -literal -offset indent +void +file_to_archive(struct archive *a, const char *name) +{ + char buff[8192]; + size_t bytes_read; + struct archive *ard; + struct archive_entry *entry; + int fd; + + ard = archive_read_disk_new(); + archive_read_disk_set_standard_lookup(ard); + entry = archive_entry_new(); + fd = open(name, O_RDONLY); + if (fd < 0) + return; + archive_entry_copy_sourcepath(entry, name); + archive_read_disk_entry_from_file(ard, entry, fd, NULL); + archive_write_header(a, entry); + while ((bytes_read = read(fd, buff, sizeof(buff))) > 0) + archive_write_data(a, buff, bytes_read); + archive_write_finish_entry(a); + archive_read_finish(ard); + archive_entry_free(entry); +} +.Ed +.Sh RETURN VALUES +Most functions return +.Cm ARCHIVE_OK +(zero) on success, or one of several negative +error codes for errors. +Specific error codes include: +.Cm ARCHIVE_RETRY +for operations that might succeed if retried, +.Cm ARCHIVE_WARN +for unusual conditions that do not prevent further operations, and +.Cm ARCHIVE_FATAL +for serious errors that make remaining operations impossible. +The +.Xr archive_errno 3 +and +.Xr archive_error_string 3 +functions can be used to retrieve an appropriate error code and a +textual error message. +(See +.Xr archive_util 3 +for details.) +.Pp +.Fn archive_read_disk_new +returns a pointer to a newly-allocated +.Tn struct archive +object or NULL if the allocation failed for any reason. +.Pp +.Fn archive_read_disk_gname +and +.Fn archive_read_disk_uname +return +.Tn const char * +pointers to the textual name or NULL if the lookup failed for any reason. +The returned pointer points to internal storage that +may be reused on the next call to either of these functions; +callers should copy the string if they need to continue accessing it. +.Pp +.Sh SEE ALSO +.Xr archive_read 3 , +.Xr archive_write 3 , +.Xr archive_write_disk 3 , +.Xr tar 1 , +.Xr libarchive 3 +.Sh HISTORY +The +.Nm libarchive +library first appeared in +.Fx 5.3 . +The +.Nm archive_read_disk +interface was added to +.Nm libarchive 2.6 +and first appeared in +.Fx 8.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm libarchive +library was written by +.An Tim Kientzle Aq kientzle@freebsd.org . +.Sh BUGS +The +.Dq standard +user name and group name lookup functions are not the defaults because +.Xr getgrid 3 +and +.Xr getpwid 3 +are sometimes too large for particular applications. +The current design allows the application author to use a more +compact implementation when appropriate. +.Pp +The full list of metadata read from disk by +.Fn archive_read_disk_entry_from_file +is necessarily system-dependent. +.Pp +The +.Fn archive_read_disk_entry_from_file +function reads as much information as it can from disk. +Some method should be provided to limit this so that clients who +do not need ACLs, for instance, can avoid the extra work needed +to look up such information. +.Pp +This API should provide a set of methods for walking a directory tree. +That would make it a direct parallel of the +.Xr archive_read 3 +API. +When such methods are implemented, the +.Dq hybrid +symbolic link mode will make sense. diff --git a/Utilities/cmlibarchive/libarchive/archive_read_disk.c b/Utilities/cmlibarchive/libarchive/archive_read_disk.c new file mode 100644 index 000000000..219268e3b --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_disk.c @@ -0,0 +1,198 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD$"); + +#include "archive.h" +#include "archive_string.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_disk_private.h" + +static int _archive_read_finish(struct archive *); +static int _archive_read_close(struct archive *); +static const char *trivial_lookup_gname(void *, gid_t gid); +static const char *trivial_lookup_uname(void *, uid_t uid); + +static struct archive_vtable * +archive_read_disk_vtable(void) +{ + static struct archive_vtable av; + static int inited = 0; + + if (!inited) { + av.archive_finish = _archive_read_finish; + av.archive_close = _archive_read_close; + } + return (&av); +} + +const char * +archive_read_disk_gname(struct archive *_a, gid_t gid) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + if (a->lookup_gname != NULL) + return ((*a->lookup_gname)(a->lookup_gname_data, gid)); + return (NULL); +} + +const char * +archive_read_disk_uname(struct archive *_a, uid_t uid) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + if (a->lookup_uname != NULL) + return ((*a->lookup_uname)(a->lookup_uname_data, uid)); + return (NULL); +} + +int +archive_read_disk_set_gname_lookup(struct archive *_a, + void *private_data, + const char * (*lookup_gname)(void *private, gid_t gid), + void (*cleanup_gname)(void *private)) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + __archive_check_magic(&a->archive, ARCHIVE_READ_DISK_MAGIC, + ARCHIVE_STATE_ANY, "archive_read_disk_set_gname_lookup"); + + if (a->cleanup_gname != NULL && a->lookup_gname_data != NULL) + (a->cleanup_gname)(a->lookup_gname_data); + + a->lookup_gname = lookup_gname; + a->cleanup_gname = cleanup_gname; + a->lookup_gname_data = private_data; + return (ARCHIVE_OK); +} + +int +archive_read_disk_set_uname_lookup(struct archive *_a, + void *private_data, + const char * (*lookup_uname)(void *private, uid_t uid), + void (*cleanup_uname)(void *private)) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + __archive_check_magic(&a->archive, ARCHIVE_READ_DISK_MAGIC, + ARCHIVE_STATE_ANY, "archive_read_disk_set_uname_lookup"); + + if (a->cleanup_uname != NULL && a->lookup_uname_data != NULL) + (a->cleanup_uname)(a->lookup_uname_data); + + a->lookup_uname = lookup_uname; + a->cleanup_uname = cleanup_uname; + a->lookup_uname_data = private_data; + return (ARCHIVE_OK); +} + +/* + * Create a new archive_read_disk object and initialize it with global state. + */ +struct archive * +archive_read_disk_new(void) +{ + struct archive_read_disk *a; + + a = (struct archive_read_disk *)malloc(sizeof(*a)); + if (a == NULL) + return (NULL); + memset(a, 0, sizeof(*a)); + a->archive.magic = ARCHIVE_READ_DISK_MAGIC; + /* We're ready to write a header immediately. */ + a->archive.state = ARCHIVE_STATE_HEADER; + a->archive.vtable = archive_read_disk_vtable(); + a->lookup_uname = trivial_lookup_uname; + a->lookup_gname = trivial_lookup_gname; + return (&a->archive); +} + +static int +_archive_read_finish(struct archive *_a) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + + if (a->cleanup_gname != NULL && a->lookup_gname_data != NULL) + (a->cleanup_gname)(a->lookup_gname_data); + if (a->cleanup_uname != NULL && a->lookup_uname_data != NULL) + (a->cleanup_uname)(a->lookup_uname_data); + archive_string_free(&a->archive.error_string); + free(a); + return (ARCHIVE_OK); +} + +static int +_archive_read_close(struct archive *_a) +{ + (void)_a; /* UNUSED */ + return (ARCHIVE_OK); +} + +int +archive_read_disk_set_symlink_logical(struct archive *_a) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + a->symlink_mode = 'L'; + a->follow_symlinks = 1; + return (ARCHIVE_OK); +} + +int +archive_read_disk_set_symlink_physical(struct archive *_a) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + a->symlink_mode = 'P'; + a->follow_symlinks = 0; + return (ARCHIVE_OK); +} + +int +archive_read_disk_set_symlink_hybrid(struct archive *_a) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + a->symlink_mode = 'H'; + a->follow_symlinks = 1; /* Follow symlinks initially. */ + return (ARCHIVE_OK); +} + +/* + * Trivial implementations of gname/uname lookup functions. + * These are normally overridden by the client, but these stub + * versions ensure that we always have something that works. + */ +static const char * +trivial_lookup_gname(void *private_data, gid_t gid) +{ + (void)private_data; /* UNUSED */ + (void)gid; /* UNUSED */ + return (NULL); +} + +static const char * +trivial_lookup_uname(void *private_data, uid_t uid) +{ + (void)private_data; /* UNUSED */ + (void)uid; /* UNUSED */ + return (NULL); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_disk_entry_from_file.c b/Utilities/cmlibarchive/libarchive/archive_read_disk_entry_from_file.c new file mode 100644 index 000000000..cb685c8dc --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_disk_entry_from_file.c @@ -0,0 +1,554 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_SYS_TYPES_H +/* Mac OSX requires sys/types.h before sys/acl.h. */ +#include +#endif +#ifdef HAVE_SYS_ACL_H +#include +#endif +#ifdef HAVE_SYS_EXTATTR_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_XATTR_H +#include +#endif +#ifdef HAVE_ACL_LIBACL_H +#include +#endif +#ifdef HAVE_ATTR_XATTR_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_WINDOWS_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_disk_private.h" + +/* + * Linux and FreeBSD plug this obvious hole in POSIX.1e in + * different ways. + */ +#if HAVE_ACL_GET_PERM +#define ACL_GET_PERM acl_get_perm +#elif HAVE_ACL_GET_PERM_NP +#define ACL_GET_PERM acl_get_perm_np +#endif + +static int setup_acls_posix1e(struct archive_read_disk *, + struct archive_entry *, int fd); +static int setup_xattrs(struct archive_read_disk *, + struct archive_entry *, int fd); + +int +archive_read_disk_entry_from_file(struct archive *_a, + struct archive_entry *entry, + int fd, const struct stat *st) +{ + struct archive_read_disk *a = (struct archive_read_disk *)_a; + const char *path, *name; + struct stat s; + int initial_fd = fd; + int r, r1; + + archive_clear_error(_a); + path = archive_entry_sourcepath(entry); + if (path == NULL) + path = archive_entry_pathname(entry); + +#ifdef EXT2_IOC_GETFLAGS + /* Linux requires an extra ioctl to pull the flags. Although + * this is an extra step, it has a nice side-effect: We get an + * open file descriptor which we can use in the subsequent lookups. */ + if ((S_ISREG(st->st_mode) || S_ISDIR(st->st_mode))) { + if (fd < 0) + fd = open(pathname, O_RDONLY | O_NONBLOCK | O_BINARY); + if (fd >= 0) { + unsigned long stflags; + int r = ioctl(fd, EXT2_IOC_GETFLAGS, &stflags); + if (r == 0 && stflags != 0) + archive_entry_set_fflags(entry, stflags, 0); + } + } +#endif + + if (st == NULL) { + /* TODO: On Windows, use GetFileInfoByHandle() here. + * Using Windows stat() call is badly broken, but + * even the stat() wrapper has problems because + * 'struct stat' is broken on Windows. + */ +#if HAVE_FSTAT + if (fd >= 0) { + if (fstat(fd, &s) != 0) + return (ARCHIVE_FATAL); + } else +#endif +#if HAVE_LSTAT + if (!a->follow_symlinks) { + if (lstat(path, &s) != 0) + return (ARCHIVE_FATAL); + } else +#endif + if (stat(path, &s) != 0) + return (ARCHIVE_FATAL); + st = &s; + } + archive_entry_copy_stat(entry, st); + + /* Lookup uname/gname */ + name = archive_read_disk_uname(_a, archive_entry_uid(entry)); + if (name != NULL) + archive_entry_copy_uname(entry, name); + name = archive_read_disk_gname(_a, archive_entry_gid(entry)); + if (name != NULL) + archive_entry_copy_gname(entry, name); + +#ifdef HAVE_STRUCT_STAT_ST_FLAGS + /* On FreeBSD, we get flags for free with the stat. */ + /* TODO: Does this belong in copy_stat()? */ + if (st->st_flags != 0) + archive_entry_set_fflags(entry, st->st_flags, 0); +#endif + +#ifdef HAVE_READLINK + if (S_ISLNK(st->st_mode)) { + char linkbuffer[PATH_MAX + 1]; + int lnklen = readlink(path, linkbuffer, PATH_MAX); + if (lnklen < 0) { + archive_set_error(&a->archive, errno, + "Couldn't read link data"); + return (ARCHIVE_WARN); + } + linkbuffer[lnklen] = 0; + archive_entry_set_symlink(entry, linkbuffer); + } +#endif + + r = setup_acls_posix1e(a, entry, fd); + r1 = setup_xattrs(a, entry, fd); + if (r1 < r) + r = r1; + /* If we opened the file earlier in this function, close it. */ + if (initial_fd != fd) + close(fd); + return (r); +} + +#ifdef HAVE_POSIX_ACL +static void setup_acl_posix1e(struct archive_read_disk *a, + struct archive_entry *entry, acl_t acl, int archive_entry_acl_type); + +static int +setup_acls_posix1e(struct archive_read_disk *a, + struct archive_entry *entry, int fd) +{ + const char *accpath; + acl_t acl; + + accpath = archive_entry_sourcepath(entry); + if (accpath == NULL) + accpath = archive_entry_pathname(entry); + + archive_entry_acl_clear(entry); + + /* Retrieve access ACL from file. */ + if (fd >= 0) + acl = acl_get_fd(fd); +#if HAVE_ACL_GET_LINK_NP + else if (!a->follow_symlinks) + acl = acl_get_link_np(accpath, ACL_TYPE_ACCESS); +#endif + else + acl = acl_get_file(accpath, ACL_TYPE_ACCESS); + if (acl != NULL) { + setup_acl_posix1e(a, entry, acl, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + acl_free(acl); + } + + /* Only directories can have default ACLs. */ + if (S_ISDIR(archive_entry_mode(entry))) { + acl = acl_get_file(accpath, ACL_TYPE_DEFAULT); + if (acl != NULL) { + setup_acl_posix1e(a, entry, acl, + ARCHIVE_ENTRY_ACL_TYPE_DEFAULT); + acl_free(acl); + } + } + return (ARCHIVE_OK); +} + +/* + * Translate POSIX.1e ACL into libarchive internal structure. + */ +static void +setup_acl_posix1e(struct archive_read_disk *a, + struct archive_entry *entry, acl_t acl, int archive_entry_acl_type) +{ + acl_tag_t acl_tag; + acl_entry_t acl_entry; + acl_permset_t acl_permset; + int s, ae_id, ae_tag, ae_perm; + const char *ae_name; + + s = acl_get_entry(acl, ACL_FIRST_ENTRY, &acl_entry); + while (s == 1) { + ae_id = -1; + ae_name = NULL; + + acl_get_tag_type(acl_entry, &acl_tag); + if (acl_tag == ACL_USER) { + ae_id = (int)*(uid_t *)acl_get_qualifier(acl_entry); + ae_name = archive_read_disk_uname(&a->archive, ae_id); + ae_tag = ARCHIVE_ENTRY_ACL_USER; + } else if (acl_tag == ACL_GROUP) { + ae_id = (int)*(gid_t *)acl_get_qualifier(acl_entry); + ae_name = archive_read_disk_gname(&a->archive, ae_id); + ae_tag = ARCHIVE_ENTRY_ACL_GROUP; + } else if (acl_tag == ACL_MASK) { + ae_tag = ARCHIVE_ENTRY_ACL_MASK; + } else if (acl_tag == ACL_USER_OBJ) { + ae_tag = ARCHIVE_ENTRY_ACL_USER_OBJ; + } else if (acl_tag == ACL_GROUP_OBJ) { + ae_tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ; + } else if (acl_tag == ACL_OTHER) { + ae_tag = ARCHIVE_ENTRY_ACL_OTHER; + } else { + /* Skip types that libarchive can't support. */ + continue; + } + + acl_get_permset(acl_entry, &acl_permset); + ae_perm = 0; + /* + * acl_get_perm() is spelled differently on different + * platforms; see above. + */ + if (ACL_GET_PERM(acl_permset, ACL_EXECUTE)) + ae_perm |= ARCHIVE_ENTRY_ACL_EXECUTE; + if (ACL_GET_PERM(acl_permset, ACL_READ)) + ae_perm |= ARCHIVE_ENTRY_ACL_READ; + if (ACL_GET_PERM(acl_permset, ACL_WRITE)) + ae_perm |= ARCHIVE_ENTRY_ACL_WRITE; + + archive_entry_acl_add_entry(entry, + archive_entry_acl_type, ae_perm, ae_tag, + ae_id, ae_name); + + s = acl_get_entry(acl, ACL_NEXT_ENTRY, &acl_entry); + } +} +#else +static int +setup_acls_posix1e(struct archive_read_disk *a, + struct archive_entry *entry, int fd) +{ + (void)a; /* UNUSED */ + (void)entry; /* UNUSED */ + (void)fd; /* UNUSED */ + return (ARCHIVE_OK); +} +#endif + +#if HAVE_LISTXATTR && HAVE_LLISTXATTR && HAVE_GETXATTR && HAVE_LGETXATTR + +/* + * Linux extended attribute support. + * + * TODO: By using a stack-allocated buffer for the first + * call to getxattr(), we might be able to avoid the second + * call entirely. We only need the second call if the + * stack-allocated buffer is too small. But a modest buffer + * of 1024 bytes or so will often be big enough. Same applies + * to listxattr(). + */ + + +static int +setup_xattr(struct archive_read_disk *a, + struct archive_entry *entry, const char *name, int fd) +{ + ssize_t size; + void *value = NULL; + const char *accpath; + + (void)fd; /* UNUSED */ + + accpath = archive_entry_sourcepath(entry); + if (accpath == NULL) + accpath = archive_entry_pathname(entry); + + if (!a->follow_symlinks) + size = lgetxattr(accpath, name, NULL, 0); + else + size = getxattr(accpath, name, NULL, 0); + + if (size == -1) { + archive_set_error(&a->archive, errno, + "Couldn't query extended attribute"); + return (ARCHIVE_WARN); + } + + if (size > 0 && (value = malloc(size)) == NULL) { + archive_set_error(&a->archive, errno, "Out of memory"); + return (ARCHIVE_FATAL); + } + + if (!a->follow_symlinks) + size = lgetxattr(accpath, name, value, size); + else + size = getxattr(accpath, name, value, size); + + if (size == -1) { + archive_set_error(&a->archive, errno, + "Couldn't read extended attribute"); + return (ARCHIVE_WARN); + } + + archive_entry_xattr_add_entry(entry, name, value, size); + + free(value); + return (ARCHIVE_OK); +} + +static int +setup_xattrs(struct archive_read_disk *a, + struct archive_entry *entry, int fd) +{ + char *list, *p; + const char *path; + ssize_t list_size; + + + path = archive_entry_sourcepath(entry); + if (path == NULL) + path = archive_entry_pathname(entry); + + if (!a->follow_symlinks) + list_size = llistxattr(path, NULL, 0); + else + list_size = listxattr(path, NULL, 0); + + if (list_size == -1) { + if (errno == ENOTSUP) + return (ARCHIVE_OK); + archive_set_error(&a->archive, errno, + "Couldn't list extended attributes"); + return (ARCHIVE_WARN); + } + + if (list_size == 0) + return (ARCHIVE_OK); + + if ((list = malloc(list_size)) == NULL) { + archive_set_error(&a->archive, errno, "Out of memory"); + return (ARCHIVE_FATAL); + } + + if (!a->follow_symlinks) + list_size = llistxattr(path, list, list_size); + else + list_size = listxattr(path, list, list_size); + + if (list_size == -1) { + archive_set_error(&a->archive, errno, + "Couldn't retrieve extended attributes"); + free(list); + return (ARCHIVE_WARN); + } + + for (p = list; (p - list) < list_size; p += strlen(p) + 1) { + if (strncmp(p, "system.", 7) == 0 || + strncmp(p, "xfsroot.", 8) == 0) + continue; + setup_xattr(a, entry, p, fd); + } + + free(list); + return (ARCHIVE_OK); +} + +#elif HAVE_EXTATTR_GET_FILE && HAVE_EXTATTR_LIST_FILE + +/* + * FreeBSD extattr interface. + */ + +/* TODO: Implement this. Follow the Linux model above, but + * with FreeBSD-specific system calls, of course. Be careful + * to not include the system extattrs that hold ACLs; we handle + * those separately. + */ +int +setup_xattr(struct archive_read_disk *a, struct archive_entry *entry, + int namespace, const char *name, const char *fullname, int fd); + +int +setup_xattr(struct archive_read_disk *a, struct archive_entry *entry, + int namespace, const char *name, const char *fullname, int fd) +{ + ssize_t size; + void *value = NULL; + const char *accpath; + + (void)fd; /* UNUSED */ + + accpath = archive_entry_sourcepath(entry); + if (accpath == NULL) + accpath = archive_entry_pathname(entry); + + if (!a->follow_symlinks) + size = extattr_get_link(accpath, namespace, name, NULL, 0); + else + size = extattr_get_file(accpath, namespace, name, NULL, 0); + + if (size == -1) { + archive_set_error(&a->archive, errno, + "Couldn't query extended attribute"); + return (ARCHIVE_WARN); + } + + if (size > 0 && (value = malloc(size)) == NULL) { + archive_set_error(&a->archive, errno, "Out of memory"); + return (ARCHIVE_FATAL); + } + + if (!a->follow_symlinks) + size = extattr_get_link(accpath, namespace, name, value, size); + else + size = extattr_get_file(accpath, namespace, name, value, size); + + if (size == -1) { + archive_set_error(&a->archive, errno, + "Couldn't read extended attribute"); + return (ARCHIVE_WARN); + } + + archive_entry_xattr_add_entry(entry, fullname, value, size); + + free(value); + return (ARCHIVE_OK); +} + +static int +setup_xattrs(struct archive_read_disk *a, + struct archive_entry *entry, int fd) +{ + char buff[512]; + char *list, *p; + ssize_t list_size; + const char *path; + int namespace = EXTATTR_NAMESPACE_USER; + + path = archive_entry_sourcepath(entry); + if (path == NULL) + path = archive_entry_pathname(entry); + + if (!a->follow_symlinks) + list_size = extattr_list_link(path, namespace, NULL, 0); + else + list_size = extattr_list_file(path, namespace, NULL, 0); + + if (list_size == -1 && errno == EOPNOTSUPP) + return (ARCHIVE_OK); + if (list_size == -1) { + archive_set_error(&a->archive, errno, + "Couldn't list extended attributes"); + return (ARCHIVE_WARN); + } + + if (list_size == 0) + return (ARCHIVE_OK); + + if ((list = malloc(list_size)) == NULL) { + archive_set_error(&a->archive, errno, "Out of memory"); + return (ARCHIVE_FATAL); + } + + if (!a->follow_symlinks) + list_size = extattr_list_link(path, namespace, list, list_size); + else + list_size = extattr_list_file(path, namespace, list, list_size); + + if (list_size == -1) { + archive_set_error(&a->archive, errno, + "Couldn't retrieve extended attributes"); + free(list); + return (ARCHIVE_WARN); + } + + p = list; + while ((p - list) < list_size) { + size_t len = 255 & (int)*p; + char *name; + + strcpy(buff, "user."); + name = buff + strlen(buff); + memcpy(name, p + 1, len); + name[len] = '\0'; + setup_xattr(a, entry, namespace, name, buff, fd); + p += 1 + len; + } + + free(list); + return (ARCHIVE_OK); +} + +#else + +/* + * Generic (stub) extended attribute support. + */ +static int +setup_xattrs(struct archive_read_disk *a, + struct archive_entry *entry, int fd) +{ + (void)a; /* UNUSED */ + (void)entry; /* UNUSED */ + (void)fd; /* UNUSED */ + return (ARCHIVE_OK); +} + +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_read_disk_private.h b/Utilities/cmlibarchive/libarchive/archive_read_disk_private.h new file mode 100644 index 000000000..3f739e859 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_disk_private.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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. + * + * $FreeBSD$ + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef ARCHIVE_READ_DISK_PRIVATE_H_INCLUDED +#define ARCHIVE_READ_DISK_PRIVATE_H_INCLUDED + +struct archive_read_disk { + struct archive archive; + + /* + * Symlink mode is one of 'L'ogical, 'P'hysical, or 'H'ybrid, + * following an old BSD convention. 'L' follows all symlinks, + * 'P' follows none, 'H' follows symlinks only for the first + * item. + */ + char symlink_mode; + + /* + * Since symlink interaction changes, we need to track whether + * we're following symlinks for the current item. 'L' mode above + * sets this true, 'P' sets it false, 'H' changes it as we traverse. + */ + char follow_symlinks; /* Either 'L' or 'P'. */ + + const char * (*lookup_gname)(void *private, gid_t gid); + void (*cleanup_gname)(void *private); + void *lookup_gname_data; + const char * (*lookup_uname)(void *private, gid_t gid); + void (*cleanup_uname)(void *private); + void *lookup_uname_data; +}; + +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_read_disk_set_standard_lookup.c b/Utilities/cmlibarchive/libarchive/archive_read_disk_set_standard_lookup.c new file mode 100644 index 000000000..fc4e9f211 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_disk_set_standard_lookup.c @@ -0,0 +1,270 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) +int +archive_read_disk_set_standard_lookup(struct archive *a) +{ + archive_set_error(a, -1, "Standard lookups not available on Windows"); + return (ARCHIVE_FATAL); +} +#else /* ! (_WIN32 && !__CYGWIN__) */ +#define name_cache_size 127 + +static const char * const NO_NAME = "(noname)"; + +struct name_cache { + struct archive *archive; + char *buff; + size_t buff_size; + int probes; + int hits; + size_t size; + struct { + id_t id; + const char *name; + } cache[name_cache_size]; +}; + +static const char * lookup_gname(void *, gid_t); +static const char * lookup_uname(void *, uid_t); +static void cleanup(void *); +static const char * lookup_gname_helper(struct name_cache *, id_t gid); +static const char * lookup_uname_helper(struct name_cache *, id_t uid); + +/* + * Installs functions that use getpwuid()/getgrgid()---along with + * a simple cache to accelerate such lookups---into the archive_read_disk + * object. This is in a separate file because getpwuid()/getgrgid() + * can pull in a LOT of library code (including NIS/LDAP functions, which + * pull in DNS resolveers, etc). This can easily top 500kB, which makes + * it inappropriate for some space-constrained applications. + * + * Applications that are size-sensitive may want to just use the + * real default functions (defined in archive_read_disk.c) that just + * use the uid/gid without the lookup. Or define your own custom functions + * if you prefer. + */ +int +archive_read_disk_set_standard_lookup(struct archive *a) +{ + struct name_cache *ucache = malloc(sizeof(struct name_cache)); + struct name_cache *gcache = malloc(sizeof(struct name_cache)); + + if (ucache == NULL || gcache == NULL) { + archive_set_error(a, ENOMEM, + "Can't allocate uname/gname lookup cache"); + free(ucache); + free(gcache); + return (ARCHIVE_FATAL); + } + + memset(ucache, 0, sizeof(*ucache)); + ucache->archive = a; + ucache->size = name_cache_size; + memset(gcache, 0, sizeof(*gcache)); + gcache->archive = a; + gcache->size = name_cache_size; + + archive_read_disk_set_gname_lookup(a, gcache, lookup_gname, cleanup); + archive_read_disk_set_uname_lookup(a, ucache, lookup_uname, cleanup); + + return (ARCHIVE_OK); +} + +static void +cleanup(void *data) +{ + struct name_cache *cache = (struct name_cache *)data; + size_t i; + + if (cache != NULL) { + for (i = 0; i < cache->size; i++) { + if (cache->cache[i].name != NULL && + cache->cache[i].name != NO_NAME) + free((void *)(uintptr_t)cache->cache[i].name); + } + free(cache->buff); + free(cache); + } +} + +/* + * Lookup uid/gid from uname/gname, return NULL if no match. + */ +static const char * +lookup_name(struct name_cache *cache, + const char * (*lookup_fn)(struct name_cache *, id_t), id_t id) +{ + const char *name; + int slot; + + + cache->probes++; + + slot = id % cache->size; + if (cache->cache[slot].name != NULL) { + if (cache->cache[slot].id == id) { + cache->hits++; + if (cache->cache[slot].name == NO_NAME) + return (NULL); + return (cache->cache[slot].name); + } + if (cache->cache[slot].name != NO_NAME) + free((void *)(uintptr_t)cache->cache[slot].name); + cache->cache[slot].name = NULL; + } + + name = (lookup_fn)(cache, id); + if (name == NULL) { + /* Cache and return the negative response. */ + cache->cache[slot].name = NO_NAME; + cache->cache[slot].id = id; + return (NULL); + } + + cache->cache[slot].name = name; + cache->cache[slot].id = id; + return (cache->cache[slot].name); +} + +static const char * +lookup_uname(void *data, uid_t uid) +{ + struct name_cache *uname_cache = (struct name_cache *)data; + return (lookup_name(uname_cache, + &lookup_uname_helper, (id_t)uid)); +} + +static const char * +lookup_uname_helper(struct name_cache *cache, id_t id) +{ + struct passwd pwent, *result; + int r; + + if (cache->buff_size == 0) { + cache->buff_size = 256; + cache->buff = malloc(cache->buff_size); + } + if (cache->buff == NULL) + return (NULL); + for (;;) { + r = getpwuid_r((uid_t)id, &pwent, + cache->buff, cache->buff_size, &result); + if (r == 0) + break; + if (r != ERANGE) + break; + /* ERANGE means our buffer was too small, but POSIX + * doesn't tell us how big the buffer should be, so + * we just double it and try again. Because the buffer + * is kept around in the cache object, we shouldn't + * have to do this very often. */ + cache->buff_size *= 2; + cache->buff = realloc(cache->buff, cache->buff_size); + if (cache->buff == NULL) + break; + } + if (r != 0) { + archive_set_error(cache->archive, errno, + "Can't lookup user for id %d", (int)id); + return (NULL); + } + if (result == NULL) + return (NULL); + + return strdup(result->pw_name); +} + +static const char * +lookup_gname(void *data, gid_t gid) +{ + struct name_cache *gname_cache = (struct name_cache *)data; + return (lookup_name(gname_cache, + &lookup_gname_helper, (id_t)gid)); +} + +static const char * +lookup_gname_helper(struct name_cache *cache, id_t id) +{ + struct group grent, *result; + int r; + + if (cache->buff_size == 0) { + cache->buff_size = 256; + cache->buff = malloc(cache->buff_size); + } + if (cache->buff == NULL) + return (NULL); + for (;;) { + r = getgrgid_r((gid_t)id, &grent, + cache->buff, cache->buff_size, &result); + if (r == 0) + break; + if (r != ERANGE) + break; + /* ERANGE means our buffer was too small, but POSIX + * doesn't tell us how big the buffer should be, so + * we just double it and try again. */ + cache->buff_size *= 2; + cache->buff = realloc(cache->buff, cache->buff_size); + if (cache->buff == NULL) + break; + } + if (r != 0) { + archive_set_error(cache->archive, errno, + "Can't lookup group for id %d", (int)id); + return (NULL); + } + if (result == NULL) + return (NULL); + + return strdup(result->gr_name); +} +#endif /* ! (_WIN32 && !__CYGWIN__) */ diff --git a/Utilities/cmlibarchive/libarchive/archive_read_extract.c b/Utilities/cmlibarchive/libarchive/archive_read_extract.c new file mode 100644 index 000000000..4f142fd94 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_extract.c @@ -0,0 +1,182 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_read_private.h" +#include "archive_write_disk_private.h" + +struct extract { + struct archive *ad; /* archive_write_disk object */ + + /* Progress function invoked during extract. */ + void (*extract_progress)(void *); + void *extract_progress_user_data; +}; + +static int archive_read_extract_cleanup(struct archive_read *); +static int copy_data(struct archive *ar, struct archive *aw); +static struct extract *get_extract(struct archive_read *); + +static struct extract * +get_extract(struct archive_read *a) +{ + /* If we haven't initialized, do it now. */ + /* This also sets up a lot of global state. */ + if (a->extract == NULL) { + a->extract = (struct extract *)malloc(sizeof(*a->extract)); + if (a->extract == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't extract"); + return (NULL); + } + memset(a->extract, 0, sizeof(*a->extract)); + a->extract->ad = archive_write_disk_new(); + if (a->extract->ad == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't extract"); + return (NULL); + } + archive_write_disk_set_standard_lookup(a->extract->ad); + a->cleanup_archive_extract = archive_read_extract_cleanup; + } + return (a->extract); +} + +int +archive_read_extract(struct archive *_a, struct archive_entry *entry, int flags) +{ + struct extract *extract; + + extract = get_extract((struct archive_read *)_a); + if (extract == NULL) + return (ARCHIVE_FATAL); + archive_write_disk_set_options(extract->ad, flags); + return (archive_read_extract2(_a, entry, extract->ad)); +} + +int +archive_read_extract2(struct archive *_a, struct archive_entry *entry, + struct archive *ad) +{ + struct archive_read *a = (struct archive_read *)_a; + int r, r2; + + /* Set up for this particular entry. */ + archive_write_disk_set_skip_file(ad, + a->skip_file_dev, a->skip_file_ino); + r = archive_write_header(ad, entry); + if (r < ARCHIVE_WARN) + r = ARCHIVE_WARN; + if (r != ARCHIVE_OK) + /* If _write_header failed, copy the error. */ + archive_copy_error(&a->archive, ad); + else + /* Otherwise, pour data into the entry. */ + r = copy_data(_a, ad); + r2 = archive_write_finish_entry(ad); + if (r2 < ARCHIVE_WARN) + r2 = ARCHIVE_WARN; + /* Use the first message. */ + if (r2 != ARCHIVE_OK && r == ARCHIVE_OK) + archive_copy_error(&a->archive, ad); + /* Use the worst error return. */ + if (r2 < r) + r = r2; + return (r); +} + +void +archive_read_extract_set_progress_callback(struct archive *_a, + void (*progress_func)(void *), void *user_data) +{ + struct archive_read *a = (struct archive_read *)_a; + struct extract *extract = get_extract(a); + if (extract != NULL) { + extract->extract_progress = progress_func; + extract->extract_progress_user_data = user_data; + } +} + +static int +copy_data(struct archive *ar, struct archive *aw) +{ + off_t offset; + const void *buff; + struct extract *extract; + size_t size; + int r; + + extract = get_extract((struct archive_read *)ar); + for (;;) { + r = archive_read_data_block(ar, &buff, &size, &offset); + if (r == ARCHIVE_EOF) + return (ARCHIVE_OK); + if (r != ARCHIVE_OK) + return (r); + r = archive_write_data_block(aw, buff, size, offset); + if (r < ARCHIVE_WARN) + r = ARCHIVE_WARN; + if (r != ARCHIVE_OK) { + archive_set_error(ar, archive_errno(aw), + "%s", archive_error_string(aw)); + return (r); + } + if (extract->extract_progress) + (extract->extract_progress) + (extract->extract_progress_user_data); + } +} + +/* + * Cleanup function for archive_extract. + */ +static int +archive_read_extract_cleanup(struct archive_read *a) +{ + int ret = ARCHIVE_OK; + +#if ARCHIVE_API_VERSION > 1 + ret = +#endif + archive_write_finish(a->extract->ad); + free(a->extract); + a->extract = NULL; + return (ret); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_open_fd.c b/Utilities/cmlibarchive/libarchive/archive_read_open_fd.c new file mode 100644 index 000000000..b02c1c636 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_open_fd.c @@ -0,0 +1,188 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_open_fd.c,v 1.13 2007/06/26 03:06:48 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" + +struct read_fd_data { + int fd; + size_t block_size; + char can_skip; + void *buffer; +}; + +static int file_close(struct archive *, void *); +static ssize_t file_read(struct archive *, void *, const void **buff); +#if ARCHIVE_API_VERSION < 2 +static ssize_t file_skip(struct archive *, void *, size_t request); +#else +static off_t file_skip(struct archive *, void *, off_t request); +#endif + +int +archive_read_open_fd(struct archive *a, int fd, size_t block_size) +{ + struct stat st; + struct read_fd_data *mine; + void *b; + + archive_clear_error(a); + if (fstat(fd, &st) != 0) { + archive_set_error(a, errno, "Can't stat fd %d", fd); + return (ARCHIVE_FATAL); + } + + mine = (struct read_fd_data *)malloc(sizeof(*mine)); + b = malloc(block_size); + if (mine == NULL || b == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + free(mine); + free(b); + return (ARCHIVE_FATAL); + } + mine->block_size = block_size; + mine->buffer = b; + mine->fd = fd; + /* + * Skip support is a performance optimization for anything + * that supports lseek(). On FreeBSD, only regular files and + * raw disk devices support lseek() and there's no portable + * way to determine if a device is a raw disk device, so we + * only enable this optimization for regular files. + */ + if (S_ISREG(st.st_mode)) { + archive_read_extract_set_skip_file(a, st.st_dev, st.st_ino); + mine->can_skip = 1; + } else + mine->can_skip = 0; +#if defined(__CYGWIN__) + setmode(mine->fd, O_BINARY); +#elif defined(_WIN32) + _setmode(mine->fd, _O_BINARY); +#endif + + return (archive_read_open2(a, mine, + NULL, file_read, file_skip, file_close)); +} + +static ssize_t +file_read(struct archive *a, void *client_data, const void **buff) +{ + struct read_fd_data *mine = (struct read_fd_data *)client_data; + ssize_t bytes_read; + + *buff = mine->buffer; + bytes_read = read(mine->fd, mine->buffer, mine->block_size); + if (bytes_read < 0) { + archive_set_error(a, errno, "Error reading fd %d", mine->fd); + } + return (bytes_read); +} + +#if ARCHIVE_API_VERSION < 2 +static ssize_t +file_skip(struct archive *a, void *client_data, size_t request) +#else +static off_t +file_skip(struct archive *a, void *client_data, off_t request) +#endif +{ + struct read_fd_data *mine = (struct read_fd_data *)client_data; + off_t old_offset, new_offset; + + if (!mine->can_skip) + return (0); + + /* Reduce request to the next smallest multiple of block_size */ + request = (request / mine->block_size) * mine->block_size; + if (request == 0) + return (0); + + /* + * Hurray for lazy evaluation: if the first lseek fails, the second + * one will not be executed. + */ + if (((old_offset = lseek(mine->fd, 0, SEEK_CUR)) < 0) || + ((new_offset = lseek(mine->fd, request, SEEK_CUR)) < 0)) + { + /* If seek failed once, it will probably fail again. */ + mine->can_skip = 0; + + if (errno == ESPIPE) + { + /* + * Failure to lseek() can be caused by the file + * descriptor pointing to a pipe, socket or FIFO. + * Return 0 here, so the compression layer will use + * read()s instead to advance the file descriptor. + * It's slower of course, but works as well. + */ + return (0); + } + /* + * There's been an error other than ESPIPE. This is most + * likely caused by a programmer error (too large request) + * or a corrupted archive file. + */ + archive_set_error(a, errno, "Error seeking"); + return (-1); + } + return (new_offset - old_offset); +} + +static int +file_close(struct archive *a, void *client_data) +{ + struct read_fd_data *mine = (struct read_fd_data *)client_data; + + (void)a; /* UNUSED */ + free(mine->buffer); + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_open_file.c b/Utilities/cmlibarchive/libarchive/archive_read_open_file.c new file mode 100644 index 000000000..a6d87b420 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_open_file.c @@ -0,0 +1,167 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_open_file.c,v 1.20 2007/06/26 03:06:48 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" + +struct read_FILE_data { + FILE *f; + size_t block_size; + void *buffer; + char can_skip; +}; + +static int file_close(struct archive *, void *); +static ssize_t file_read(struct archive *, void *, const void **buff); +#if ARCHIVE_API_VERSION < 2 +static ssize_t file_skip(struct archive *, void *, size_t request); +#else +static off_t file_skip(struct archive *, void *, off_t request); +#endif + +int +archive_read_open_FILE(struct archive *a, FILE *f) +{ + struct stat st; + struct read_FILE_data *mine; + size_t block_size = 128 * 1024; + void *b; + + archive_clear_error(a); + mine = (struct read_FILE_data *)malloc(sizeof(*mine)); + b = malloc(block_size); + if (mine == NULL || b == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + free(mine); + free(b); + return (ARCHIVE_FATAL); + } + mine->block_size = block_size; + mine->buffer = b; + mine->f = f; + /* + * If we can't fstat() the file, it may just be that it's not + * a file. (FILE * objects can wrap many kinds of I/O + * streams, some of which don't support fileno()).) + */ + if (fstat(fileno(mine->f), &st) == 0 && S_ISREG(st.st_mode)) { + archive_read_extract_set_skip_file(a, st.st_dev, st.st_ino); + /* Enable the seek optimization only for regular files. */ + mine->can_skip = 1; + } else + mine->can_skip = 0; + +#if defined(__CYGWIN__) + setmode(fileno(mine->f), O_BINARY); +#elif defined(_WIN32) + _setmode(_fileno(mine->f), _O_BINARY); +#endif + + return (archive_read_open2(a, mine, NULL, file_read, + file_skip, file_close)); +} + +static ssize_t +file_read(struct archive *a, void *client_data, const void **buff) +{ + struct read_FILE_data *mine = (struct read_FILE_data *)client_data; + ssize_t bytes_read; + + *buff = mine->buffer; + bytes_read = fread(mine->buffer, 1, mine->block_size, mine->f); + if (bytes_read < 0) { + archive_set_error(a, errno, "Error reading file"); + } + return (bytes_read); +} + +#if ARCHIVE_API_VERSION < 2 +static ssize_t +file_skip(struct archive *a, void *client_data, size_t request) +#else +static off_t +file_skip(struct archive *a, void *client_data, off_t request) +#endif +{ + struct read_FILE_data *mine = (struct read_FILE_data *)client_data; + + (void)a; /* UNUSED */ + + /* + * If we can't skip, return 0 as the amount we did step and + * the caller will work around by reading and discarding. + */ + if (!mine->can_skip) + return (0); + if (request == 0) + return (0); + +#if HAVE_FSEEKO + if (fseeko(mine->f, request, SEEK_CUR) != 0) +#else + if (fseek(mine->f, request, SEEK_CUR) != 0) +#endif + { + mine->can_skip = 0; + return (0); + } + return (request); +} + +static int +file_close(struct archive *a, void *client_data) +{ + struct read_FILE_data *mine = (struct read_FILE_data *)client_data; + + (void)a; /* UNUSED */ + if (mine->buffer != NULL) + free(mine->buffer); + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_open_filename.c b/Utilities/cmlibarchive/libarchive/archive_read_open_filename.c new file mode 100644 index 000000000..bb681e55d --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_open_filename.c @@ -0,0 +1,270 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_open_filename.c,v 1.21 2008/02/19 06:10:48 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +struct read_file_data { + int fd; + size_t block_size; + void *buffer; + mode_t st_mode; /* Mode bits for opened file. */ + char can_skip; /* This file supports skipping. */ + char filename[1]; /* Must be last! */ +}; + +static int file_close(struct archive *, void *); +static ssize_t file_read(struct archive *, void *, const void **buff); +#if ARCHIVE_API_VERSION < 2 +static ssize_t file_skip(struct archive *, void *, size_t request); +#else +static off_t file_skip(struct archive *, void *, off_t request); +#endif + +int +archive_read_open_file(struct archive *a, const char *filename, + size_t block_size) +{ + return (archive_read_open_filename(a, filename, block_size)); +} + +int +archive_read_open_filename(struct archive *a, const char *filename, + size_t block_size) +{ + struct stat st; + struct read_file_data *mine; + void *b; + int fd; + + archive_clear_error(a); + if (filename == NULL || filename[0] == '\0') { + /* We used to invoke archive_read_open_fd(a,0,block_size) + * here, but that doesn't (and shouldn't) handle the + * end-of-file flush when reading stdout from a pipe. + * Basically, read_open_fd() is intended for folks who + * are willing to handle such details themselves. This + * API is intended to be a little smarter for folks who + * want easy handling of the common case. + */ + filename = ""; /* Normalize NULL to "" */ + fd = 0; +#if defined(__CYGWIN__) + setmode(0, O_BINARY); +#elif defined(_WIN32) + _setmode(0, _O_BINARY); +#endif + } else { + fd = open(filename, O_RDONLY | O_BINARY); + if (fd < 0) { + archive_set_error(a, errno, + "Failed to open '%s'", filename); + return (ARCHIVE_FATAL); + } + } + if (fstat(fd, &st) != 0) { + archive_set_error(a, errno, "Can't stat '%s'", filename); + return (ARCHIVE_FATAL); + } + + mine = (struct read_file_data *)calloc(1, + sizeof(*mine) + strlen(filename)); + b = malloc(block_size); + if (mine == NULL || b == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + free(mine); + free(b); + return (ARCHIVE_FATAL); + } + strcpy(mine->filename, filename); + mine->block_size = block_size; + mine->buffer = b; + mine->fd = fd; + /* Remember mode so close can decide whether to flush. */ + mine->st_mode = st.st_mode; + /* If we're reading a file from disk, ensure that we don't + overwrite it with an extracted file. */ + if (S_ISREG(st.st_mode)) { + archive_read_extract_set_skip_file(a, st.st_dev, st.st_ino); + /* + * Enabling skip here is a performance optimization + * for anything that supports lseek(). On FreeBSD + * (and probably many other systems), only regular + * files and raw disk devices support lseek() (on + * other input types, lseek() returns success but + * doesn't actually change the file pointer, which + * just completely screws up the position-tracking + * logic). In addition, I've yet to find a portable + * way to determine if a device is a raw disk device. + * So I don't see a way to do much better than to only + * enable this optimization for regular files. + */ + mine->can_skip = 1; + } + return (archive_read_open2(a, mine, + NULL, file_read, file_skip, file_close)); +} + +static ssize_t +file_read(struct archive *a, void *client_data, const void **buff) +{ + struct read_file_data *mine = (struct read_file_data *)client_data; + ssize_t bytes_read; + + *buff = mine->buffer; + bytes_read = read(mine->fd, mine->buffer, mine->block_size); + if (bytes_read < 0) { + if (mine->filename[0] == '\0') + archive_set_error(a, errno, "Error reading stdin"); + else + archive_set_error(a, errno, "Error reading '%s'", + mine->filename); + } + return (bytes_read); +} + +#if ARCHIVE_API_VERSION < 2 +static ssize_t +file_skip(struct archive *a, void *client_data, size_t request) +#else +static off_t +file_skip(struct archive *a, void *client_data, off_t request) +#endif +{ + struct read_file_data *mine = (struct read_file_data *)client_data; + off_t old_offset, new_offset; + + if (!mine->can_skip) /* We can't skip, so ... */ + return (0); /* ... skip zero bytes. */ + + /* Reduce request to the next smallest multiple of block_size */ + request = (request / mine->block_size) * mine->block_size; + if (request == 0) + return (0); + + /* + * Hurray for lazy evaluation: if the first lseek fails, the second + * one will not be executed. + */ + if (((old_offset = lseek(mine->fd, 0, SEEK_CUR)) < 0) || + ((new_offset = lseek(mine->fd, request, SEEK_CUR)) < 0)) + { + /* If skip failed once, it will probably fail again. */ + mine->can_skip = 0; + + if (errno == ESPIPE) + { + /* + * Failure to lseek() can be caused by the file + * descriptor pointing to a pipe, socket or FIFO. + * Return 0 here, so the compression layer will use + * read()s instead to advance the file descriptor. + * It's slower of course, but works as well. + */ + return (0); + } + /* + * There's been an error other than ESPIPE. This is most + * likely caused by a programmer error (too large request) + * or a corrupted archive file. + */ + if (mine->filename[0] == '\0') + /* + * Should never get here, since lseek() on stdin ought + * to return an ESPIPE error. + */ + archive_set_error(a, errno, "Error seeking in stdin"); + else + archive_set_error(a, errno, "Error seeking in '%s'", + mine->filename); + return (-1); + } + return (new_offset - old_offset); +} + +static int +file_close(struct archive *a, void *client_data) +{ + struct read_file_data *mine = (struct read_file_data *)client_data; + + (void)a; /* UNUSED */ + + /* Only flush and close if open succeeded. */ + if (mine->fd >= 0) { + /* + * Sometimes, we should flush the input before closing. + * Regular files: faster to just close without flush. + * Devices: must not flush (user might need to + * read the "next" item on a non-rewind device). + * Pipes and sockets: must flush (otherwise, the + * program feeding the pipe or socket may complain). + * Here, I flush everything except for regular files and + * device nodes. + */ + if (!S_ISREG(mine->st_mode) + && !S_ISCHR(mine->st_mode) + && !S_ISBLK(mine->st_mode)) { + ssize_t bytesRead; + do { + bytesRead = read(mine->fd, mine->buffer, + mine->block_size); + } while (bytesRead > 0); + } + /* If a named file was opened, then it needs to be closed. */ + if (mine->filename[0] != '\0') + close(mine->fd); + } + free(mine->buffer); + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_open_memory.c b/Utilities/cmlibarchive/libarchive/archive_read_open_memory.c new file mode 100644 index 000000000..6ed3d9126 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_open_memory.c @@ -0,0 +1,156 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#include + +#include "archive.h" + +/* + * Glue to read an archive from a block of memory. + * + * This is mostly a huge help in building test harnesses; + * test programs can build archives in memory and read them + * back again without having to mess with files on disk. + */ + +struct read_memory_data { + unsigned char *buffer; + unsigned char *end; + ssize_t read_size; +}; + +static int memory_read_close(struct archive *, void *); +static int memory_read_open(struct archive *, void *); +#if ARCHIVE_API_VERSION < 2 +static ssize_t memory_read_skip(struct archive *, void *, size_t request); +#else +static off_t memory_read_skip(struct archive *, void *, off_t request); +#endif +static ssize_t memory_read(struct archive *, void *, const void **buff); + +int +archive_read_open_memory(struct archive *a, void *buff, size_t size) +{ + return archive_read_open_memory2(a, buff, size, size); +} + +/* + * Don't use _open_memory2() in production code; the archive_read_open_memory() + * version is the one you really want. This is just here so that + * test harnesses can exercise block operations inside the library. + */ +int +archive_read_open_memory2(struct archive *a, void *buff, + size_t size, size_t read_size) +{ + struct read_memory_data *mine; + + mine = (struct read_memory_data *)malloc(sizeof(*mine)); + if (mine == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); + } + memset(mine, 0, sizeof(*mine)); + mine->buffer = (unsigned char *)buff; + mine->end = mine->buffer + size; + mine->read_size = read_size; + return (archive_read_open2(a, mine, memory_read_open, + memory_read, memory_read_skip, memory_read_close)); +} + +/* + * There's nothing to open. + */ +static int +memory_read_open(struct archive *a, void *client_data) +{ + (void)a; /* UNUSED */ + (void)client_data; /* UNUSED */ + return (ARCHIVE_OK); +} + +/* + * This is scary simple: Just advance a pointer. Limiting + * to read_size is not technically necessary, but it exercises + * more of the internal logic when used with a small block size + * in a test harness. Production use should not specify a block + * size; then this is much faster. + */ +static ssize_t +memory_read(struct archive *a, void *client_data, const void **buff) +{ + struct read_memory_data *mine = (struct read_memory_data *)client_data; + ssize_t size; + + (void)a; /* UNUSED */ + *buff = mine->buffer; + size = mine->end - mine->buffer; + if (size > mine->read_size) + size = mine->read_size; + mine->buffer += size; + return (size); +} + +/* + * Advancing is just as simple. Again, this is doing more than + * necessary in order to better exercise internal code when used + * as a test harness. + */ +#if ARCHIVE_API_VERSION < 2 +static ssize_t +memory_read_skip(struct archive *a, void *client_data, size_t skip) +#else +static off_t +memory_read_skip(struct archive *a, void *client_data, off_t skip) +#endif +{ + struct read_memory_data *mine = (struct read_memory_data *)client_data; + + (void)a; /* UNUSED */ + if ((off_t)skip > (off_t)(mine->end - mine->buffer)) + skip = mine->end - mine->buffer; + /* Round down to block size. */ + skip /= mine->read_size; + skip *= mine->read_size; + mine->buffer += skip; + return (skip); +} + +/* + * Close is just cleaning up our one small bit of data. + */ +static int +memory_read_close(struct archive *a, void *client_data) +{ + struct read_memory_data *mine = (struct read_memory_data *)client_data; + (void)a; /* UNUSED */ + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_private.h b/Utilities/cmlibarchive/libarchive/archive_read_private.h new file mode 100644 index 000000000..3a5e3f2df --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_private.h @@ -0,0 +1,199 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive_read_private.h,v 1.7 2008/12/06 06:45:15 kientzle Exp $ + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef ARCHIVE_READ_PRIVATE_H_INCLUDED +#define ARCHIVE_READ_PRIVATE_H_INCLUDED + +#include "archive.h" +#include "archive_string.h" +#include "archive_private.h" + +struct archive_read; +struct archive_read_filter_bidder; +struct archive_read_filter; + +/* + * How bidding works for filters: + * * The bid manager reads the first block from the current source. + * * It shows that block to each registered bidder. + * * The bid manager creates a new filter structure for the winning + * bidder and gives the winning bidder a chance to initialize it. + * * The new filter becomes the top filter in the archive_read structure + * and we repeat the process. + * This ends only when no bidder provides a non-zero bid. + */ +struct archive_read_filter_bidder { + /* Configuration data for the bidder. */ + void *data; + /* Taste the upstream filter to see if we handle this. */ + int (*bid)(struct archive_read_filter_bidder *, + struct archive_read_filter *); + /* Initialize a newly-created filter. */ + int (*init)(struct archive_read_filter *); + /* Set an option for the filter bidder. */ + int (*options)(struct archive_read_filter_bidder *, + const char *key, const char *value); + /* Release the bidder's configuration data. */ + int (*free)(struct archive_read_filter_bidder *); +}; + +/* + * This structure is allocated within the archive_read core + * and initialized by archive_read and the init() method of the + * corresponding bidder above. + */ +struct archive_read_filter { + /* Essentially all filters will need these values, so + * just declare them here. */ + struct archive_read_filter_bidder *bidder; /* My bidder. */ + struct archive_read_filter *upstream; /* Who I read from. */ + struct archive_read *archive; /* Associated archive. */ + /* Return next block. */ + ssize_t (*read)(struct archive_read_filter *, const void **); + /* Skip forward this many bytes. */ + int64_t (*skip)(struct archive_read_filter *self, int64_t request); + /* Close (just this filter) and free(self). */ + int (*close)(struct archive_read_filter *self); + /* My private data. */ + void *data; + + const char *name; + int code; + + /* Used by reblocking logic. */ + char *buffer; + size_t buffer_size; + char *next; /* Current read location. */ + size_t avail; /* Bytes in my buffer. */ + const void *client_buff; /* Client buffer information. */ + size_t client_total; + const char *client_next; + size_t client_avail; + int64_t position; + char end_of_file; + char fatal; +}; + +/* + * The client looks a lot like a filter, so we just wrap it here. + * + * TODO: Make archive_read_filter and archive_read_client identical so + * that users of the library can easily register their own + * transformation filters. This will probably break the API/ABI and + * so should be deferred at least until libarchive 3.0. + */ +struct archive_read_client { + archive_read_callback *reader; + archive_skip_callback *skipper; + archive_close_callback *closer; +}; + +struct archive_read { + struct archive archive; + + struct archive_entry *entry; + + /* Dev/ino of the archive being read/written. */ + dev_t skip_file_dev; + ino_t skip_file_ino; + + /* + * Used by archive_read_data() to track blocks and copy + * data to client buffers, filling gaps with zero bytes. + */ + const char *read_data_block; + off_t read_data_offset; + off_t read_data_output_offset; + size_t read_data_remaining; + + /* Callbacks to open/read/write/close client archive stream. */ + struct archive_read_client client; + + /* Registered filter bidders. */ + struct archive_read_filter_bidder bidders[8]; + + /* Last filter in chain */ + struct archive_read_filter *filter; + + /* File offset of beginning of most recently-read header. */ + off_t header_position; + + /* + * Format detection is mostly the same as compression + * detection, with one significant difference: The bidders + * use the read_ahead calls above to examine the stream rather + * than having the supervisor hand them a block of data to + * examine. + */ + + struct archive_format_descriptor { + void *data; + const char *name; + int (*bid)(struct archive_read *); + int (*options)(struct archive_read *, const char *key, + const char *value); + int (*read_header)(struct archive_read *, struct archive_entry *); + int (*read_data)(struct archive_read *, const void **, size_t *, off_t *); + int (*read_data_skip)(struct archive_read *); + int (*cleanup)(struct archive_read *); + } formats[8]; + struct archive_format_descriptor *format; /* Active format. */ + + /* + * Various information needed by archive_extract. + */ + struct extract *extract; + int (*cleanup_archive_extract)(struct archive_read *); +}; + +int __archive_read_register_format(struct archive_read *a, + void *format_data, + const char *name, + int (*bid)(struct archive_read *), + int (*options)(struct archive_read *, const char *, const char *), + int (*read_header)(struct archive_read *, struct archive_entry *), + int (*read_data)(struct archive_read *, const void **, size_t *, off_t *), + int (*read_data_skip)(struct archive_read *), + int (*cleanup)(struct archive_read *)); + +struct archive_read_filter_bidder + *__archive_read_get_bidder(struct archive_read *a); + +const void *__archive_read_ahead(struct archive_read *, size_t, ssize_t *); +const void *__archive_read_filter_ahead(struct archive_read_filter *, + size_t, ssize_t *); +ssize_t __archive_read_consume(struct archive_read *, size_t); +ssize_t __archive_read_filter_consume(struct archive_read_filter *, size_t); +int64_t __archive_read_skip(struct archive_read *, int64_t); +int64_t __archive_read_skip_lenient(struct archive_read *, int64_t); +int64_t __archive_read_filter_skip(struct archive_read_filter *, int64_t); +int __archive_read_program(struct archive_read_filter *, const char *); +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_compression_all.c b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_all.c new file mode 100644 index 000000000..9105e0670 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_all.c @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_all.c,v 1.7 2008/12/06 06:45:15 kientzle Exp $"); + +#include "archive.h" + +int +archive_read_support_compression_all(struct archive *a) +{ + /* Bzip falls back to "bunzip2" command-line */ + archive_read_support_compression_bzip2(a); + /* The decompress code doesn't use an outside library. */ + archive_read_support_compression_compress(a); + /* Gzip decompress falls back to "gunzip" command-line. */ + archive_read_support_compression_gzip(a); + /* The LZMA file format has a very weak signature, so it + * may not be feasible to keep this here, but we'll try. + * This will come back out if there are problems. */ + /* Lzma falls back to "unlzma" command-line program. */ + archive_read_support_compression_lzma(a); + /* Xz falls back to "unxz" command-line program. */ + archive_read_support_compression_xz(a); + + /* Note: We always return ARCHIVE_OK here, even if some of the + * above return ARCHIVE_WARN. The intent here is to enable + * "as much as possible." Clients who need specific + * compression should enable those individually so they can + * verify the level of support. */ + /* Clear any warning messages set by the above functions. */ + archive_clear_error(a); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_compression_bzip2.c b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_bzip2.c new file mode 100644 index 000000000..8726fb34e --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_bzip2.c @@ -0,0 +1,354 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" + +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_bzip2.c,v 1.19 2008/12/06 06:45:15 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_BZLIB_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_read_private.h" + +#if HAVE_BZLIB_H +struct private_data { + bz_stream stream; + char *out_block; + size_t out_block_size; + char valid; /* True = decompressor is initialized */ + char eof; /* True = found end of compressed data. */ +}; + +/* Bzip2 filter */ +static ssize_t bzip2_filter_read(struct archive_read_filter *, const void **); +static int bzip2_filter_close(struct archive_read_filter *); +#endif + +/* + * Note that we can detect bzip2 archives even if we can't decompress + * them. (In fact, we like detecting them because we can give better + * error messages.) So the bid framework here gets compiled even + * if bzlib is unavailable. + */ +static int bzip2_reader_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); +static int bzip2_reader_init(struct archive_read_filter *); +static int bzip2_reader_free(struct archive_read_filter_bidder *); + +int +archive_read_support_compression_bzip2(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct archive_read_filter_bidder *reader = __archive_read_get_bidder(a); + + if (reader == NULL) + return (ARCHIVE_FATAL); + + reader->data = NULL; + reader->bid = bzip2_reader_bid; + reader->init = bzip2_reader_init; + reader->options = NULL; + reader->free = bzip2_reader_free; +#if HAVE_BZLIB_H + return (ARCHIVE_OK); +#else + archive_set_error(_a, ARCHIVE_ERRNO_MISC, + "Using external bunzip2 program"); + return (ARCHIVE_WARN); +#endif +} + +static int +bzip2_reader_free(struct archive_read_filter_bidder *self){ + (void)self; /* UNUSED */ + return (ARCHIVE_OK); +} + +/* + * Test whether we can handle this data. + * + * This logic returns zero if any part of the signature fails. It + * also tries to Do The Right Thing if a very short buffer prevents us + * from verifying as much as we would like. + */ +static int +bzip2_reader_bid(struct archive_read_filter_bidder *self, struct archive_read_filter *filter) +{ + const unsigned char *buffer; + ssize_t avail; + int bits_checked; + + (void)self; /* UNUSED */ + + /* Minimal bzip2 archive is 14 bytes. */ + buffer = __archive_read_filter_ahead(filter, 14, &avail); + if (buffer == NULL) + return (0); + + /* First three bytes must be "BZh" */ + bits_checked = 0; + if (buffer[0] != 'B' || buffer[1] != 'Z' || buffer[2] != 'h') + return (0); + bits_checked += 24; + + /* Next follows a compression flag which must be an ASCII digit. */ + if (buffer[3] < '1' || buffer[3] > '9') + return (0); + bits_checked += 5; + + /* After BZh[1-9], there must be either a data block + * which begins with 0x314159265359 or an end-of-data + * marker of 0x177245385090. */ + if (memcmp(buffer + 4, "\x31\x41\x59\x26\x53\x59", 6) == 0) + bits_checked += 48; + else if (memcmp(buffer + 4, "\x17\x72\x45\x38\x50\x90", 6) == 0) + bits_checked += 48; + else + return (0); + + return (bits_checked); +} + +#ifndef HAVE_BZLIB_H + +/* + * If we don't have the library on this system, we can't actually do the + * decompression. We can, however, still detect compressed archives + * and emit a useful message. + */ +static int +bzip2_reader_init(struct archive_read_filter *self) +{ + int r; + + r = __archive_read_program(self, "bunzip2"); + /* Note: We set the format here even if __archive_read_program() + * above fails. We do, after all, know what the format is + * even if we weren't able to read it. */ + self->code = ARCHIVE_COMPRESSION_BZIP2; + self->name = "bzip2"; + return (r); +} + + +#else + +/* + * Setup the callbacks. + */ +static int +bzip2_reader_init(struct archive_read_filter *self) +{ + static const size_t out_block_size = 64 * 1024; + void *out_block; + struct private_data *state; + + self->code = ARCHIVE_COMPRESSION_BZIP2; + self->name = "bzip2"; + + state = (struct private_data *)calloc(sizeof(*state), 1); + out_block = (unsigned char *)malloc(out_block_size); + if (self == NULL || state == NULL || out_block == NULL) { + archive_set_error(&self->archive->archive, ENOMEM, + "Can't allocate data for bzip2 decompression"); + free(out_block); + free(state); + return (ARCHIVE_FATAL); + } + + self->data = state; + state->out_block_size = out_block_size; + state->out_block = out_block; + self->read = bzip2_filter_read; + self->skip = NULL; /* not supported */ + self->close = bzip2_filter_close; + + return (ARCHIVE_OK); +} + +/* + * Return the next block of decompressed data. + */ +static ssize_t +bzip2_filter_read(struct archive_read_filter *self, const void **p) +{ + struct private_data *state; + size_t read_avail, decompressed; + const char *read_buf; + ssize_t ret; + + state = (struct private_data *)self->data; + read_avail = 0; + + if (state->eof) { + *p = NULL; + return (0); + } + + /* Empty our output buffer. */ + state->stream.next_out = state->out_block; + state->stream.avail_out = state->out_block_size; + + /* Try to fill the output buffer. */ + for (;;) { + if (!state->valid) { + if (bzip2_reader_bid(self->bidder, self->upstream) == 0) { + state->eof = 1; + *p = state->out_block; + decompressed = state->stream.next_out + - state->out_block; + return (decompressed); + } + /* Initialize compression library. */ + ret = BZ2_bzDecompressInit(&(state->stream), + 0 /* library verbosity */, + 0 /* don't use low-mem algorithm */); + + /* If init fails, try low-memory algorithm instead. */ + if (ret == BZ_MEM_ERROR) + ret = BZ2_bzDecompressInit(&(state->stream), + 0 /* library verbosity */, + 1 /* do use low-mem algo */); + + if (ret != BZ_OK) { + const char *detail = NULL; + int err = ARCHIVE_ERRNO_MISC; + switch (ret) { + case BZ_PARAM_ERROR: + detail = "invalid setup parameter"; + break; + case BZ_MEM_ERROR: + err = ENOMEM; + detail = "out of memory"; + break; + case BZ_CONFIG_ERROR: + detail = "mis-compiled library"; + break; + } + archive_set_error(&self->archive->archive, err, + "Internal error initializing decompressor%s%s", + detail == NULL ? "" : ": ", + detail); + return (ARCHIVE_FATAL); + } + state->valid = 1; + } + + /* stream.next_in is really const, but bzlib + * doesn't declare it so. */ + read_buf = + __archive_read_filter_ahead(self->upstream, 1, &ret); + if (read_buf == NULL) + return (ARCHIVE_FATAL); + state->stream.next_in = (char *)(uintptr_t)read_buf; + state->stream.avail_in = ret; + /* There is no more data, return whatever we have. */ + if (ret == 0) { + state->eof = 1; + *p = state->out_block; + decompressed = state->stream.next_out + - state->out_block; + return (decompressed); + } + + /* Decompress as much as we can in one pass. */ + ret = BZ2_bzDecompress(&(state->stream)); + __archive_read_filter_consume(self->upstream, + state->stream.next_in - read_buf); + + switch (ret) { + case BZ_STREAM_END: /* Found end of stream. */ + switch (BZ2_bzDecompressEnd(&(state->stream))) { + case BZ_OK: + break; + default: + archive_set_error(&(self->archive->archive), + ARCHIVE_ERRNO_MISC, + "Failed to clean up decompressor"); + return (ARCHIVE_FATAL); + } + state->valid = 0; + /* FALLTHROUGH */ + case BZ_OK: /* Decompressor made some progress. */ + /* If we filled our buffer, update stats and return. */ + if (state->stream.avail_out == 0) { + *p = state->out_block; + decompressed = state->stream.next_out + - state->out_block; + return (decompressed); + } + break; + default: /* Return an error. */ + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, "bzip decompression failed"); + return (ARCHIVE_FATAL); + } + } +} + +/* + * Clean up the decompressor. + */ +static int +bzip2_filter_close(struct archive_read_filter *self) +{ + struct private_data *state; + int ret = ARCHIVE_OK; + + state = (struct private_data *)self->data; + + if (state->valid) { + switch (BZ2_bzDecompressEnd(&state->stream)) { + case BZ_OK: + break; + default: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Failed to clean up decompressor"); + ret = ARCHIVE_FATAL; + } + } + + free(state->out_block); + free(state); + return (ARCHIVE_OK); +} + +#endif /* HAVE_BZLIB_H */ diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_compression_compress.c b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_compress.c new file mode 100644 index 000000000..4be4cbe0f --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_compress.c @@ -0,0 +1,444 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + */ + +/* + * This code borrows heavily from "compress" source code, which is + * protected by the following copyright. (Clause 3 dropped by request + * of the Regents.) + */ + +/*- + * Copyright (c) 1985, 1986, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Diomidis Spinellis and James A. Woods, derived from original + * work by Spencer Thomas and Joseph Orost. + * + * 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. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_compress.c,v 1.11 2008/12/06 06:45:15 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_read_private.h" + +/* + * Because LZW decompression is pretty simple, I've just implemented + * the whole decompressor here (cribbing from "compress" source code, + * of course), rather than relying on an external library. I have + * made an effort to clarify and simplify the algorithm, so the + * names and structure here don't exactly match those used by compress. + */ + +struct private_data { + /* Input variables. */ + const unsigned char *next_in; + size_t avail_in; + int bit_buffer; + int bits_avail; + size_t bytes_in_section; + + /* Output variables. */ + size_t out_block_size; + void *out_block; + + /* Decompression status variables. */ + int use_reset_code; + int end_of_stream; /* EOF status. */ + int maxcode; /* Largest code. */ + int maxcode_bits; /* Length of largest code. */ + int section_end_code; /* When to increase bits. */ + int bits; /* Current code length. */ + int oldcode; /* Previous code. */ + int finbyte; /* Last byte of prev code. */ + + /* Dictionary. */ + int free_ent; /* Next dictionary entry. */ + unsigned char suffix[65536]; + uint16_t prefix[65536]; + + /* + * Scratch area for expanding dictionary entries. Note: + * "worst" case here comes from compressing /dev/zero: the + * last code in the dictionary will code a sequence of + * 65536-256 zero bytes. Thus, we need stack space to expand + * a 65280-byte dictionary entry. (Of course, 32640:1 + * compression could also be considered the "best" case. ;-) + */ + unsigned char *stackp; + unsigned char stack[65300]; +}; + +static int compress_bidder_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); +static int compress_bidder_init(struct archive_read_filter *); +static int compress_bidder_free(struct archive_read_filter_bidder *); + +static ssize_t compress_filter_read(struct archive_read_filter *, const void **); +static int compress_filter_close(struct archive_read_filter *); + +static int getbits(struct archive_read_filter *, int n); +static int next_code(struct archive_read_filter *); + +int +archive_read_support_compression_compress(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct archive_read_filter_bidder *bidder = __archive_read_get_bidder(a); + + if (bidder == NULL) + return (ARCHIVE_FATAL); + + bidder->data = NULL; + bidder->bid = compress_bidder_bid; + bidder->init = compress_bidder_init; + bidder->options = NULL; + bidder->free = compress_bidder_free; + return (ARCHIVE_OK); +} + +/* + * Test whether we can handle this data. + * + * This logic returns zero if any part of the signature fails. It + * also tries to Do The Right Thing if a very short buffer prevents us + * from verifying as much as we would like. + */ +static int +compress_bidder_bid(struct archive_read_filter_bidder *self, + struct archive_read_filter *filter) +{ + const unsigned char *buffer; + ssize_t avail; + int bits_checked; + + (void)self; /* UNUSED */ + + buffer = __archive_read_filter_ahead(filter, 2, &avail); + + if (buffer == NULL) + return (0); + + bits_checked = 0; + if (buffer[0] != 037) /* Verify first ID byte. */ + return (0); + bits_checked += 8; + + if (buffer[1] != 0235) /* Verify second ID byte. */ + return (0); + bits_checked += 8; + + /* + * TODO: Verify more. + */ + + return (bits_checked); +} + +/* + * Setup the callbacks. + */ +static int +compress_bidder_init(struct archive_read_filter *self) +{ + struct private_data *state; + static const size_t out_block_size = 64 * 1024; + void *out_block; + int code; + + self->code = ARCHIVE_COMPRESSION_COMPRESS; + self->name = "compress (.Z)"; + + state = (struct private_data *)calloc(sizeof(*state), 1); + out_block = malloc(out_block_size); + if (state == NULL || out_block == NULL) { + free(out_block); + free(state); + archive_set_error(&self->archive->archive, ENOMEM, + "Can't allocate data for %s decompression", + self->name); + return (ARCHIVE_FATAL); + } + + self->data = state; + state->out_block_size = out_block_size; + state->out_block = out_block; + self->read = compress_filter_read; + self->skip = NULL; /* not supported */ + self->close = compress_filter_close; + + /* XXX MOVE THE FOLLOWING OUT OF INIT() XXX */ + + code = getbits(self, 8); /* Skip first signature byte. */ + code = getbits(self, 8); /* Skip second signature byte. */ + + code = getbits(self, 8); + state->maxcode_bits = code & 0x1f; + state->maxcode = (1 << state->maxcode_bits); + state->use_reset_code = code & 0x80; + + /* Initialize decompressor. */ + state->free_ent = 256; + state->stackp = state->stack; + if (state->use_reset_code) + state->free_ent++; + state->bits = 9; + state->section_end_code = (1<bits) - 1; + state->oldcode = -1; + for (code = 255; code >= 0; code--) { + state->prefix[code] = 0; + state->suffix[code] = code; + } + next_code(self); + + return (ARCHIVE_OK); +} + +/* + * Return a block of data from the decompression buffer. Decompress more + * as necessary. + */ +static ssize_t +compress_filter_read(struct archive_read_filter *self, const void **pblock) +{ + struct private_data *state; + unsigned char *p, *start, *end; + int ret; + + state = (struct private_data *)self->data; + if (state->end_of_stream) { + *pblock = NULL; + return (0); + } + p = start = (unsigned char *)state->out_block; + end = start + state->out_block_size; + + while (p < end && !state->end_of_stream) { + if (state->stackp > state->stack) { + *p++ = *--state->stackp; + } else { + ret = next_code(self); + if (ret == -1) + state->end_of_stream = ret; + else if (ret != ARCHIVE_OK) + return (ret); + } + } + + *pblock = start; + return (p - start); +} + +/* + * Clean up the reader. + */ +static int +compress_bidder_free(struct archive_read_filter_bidder *self) +{ + self->data = NULL; + return (ARCHIVE_OK); +} + +/* + * Close and release the filter. + */ +static int +compress_filter_close(struct archive_read_filter *self) +{ + struct private_data *state = (struct private_data *)self->data; + + free(state->out_block); + free(state); + return (ARCHIVE_OK); +} + +/* + * Process the next code and fill the stack with the expansion + * of the code. Returns ARCHIVE_FATAL if there is a fatal I/O or + * format error, ARCHIVE_EOF if we hit end of data, ARCHIVE_OK otherwise. + */ +static int +next_code(struct archive_read_filter *self) +{ + struct private_data *state = (struct private_data *)self->data; + int code, newcode; + + static int debug_buff[1024]; + static unsigned debug_index; + + code = newcode = getbits(self, state->bits); + if (code < 0) + return (code); + + debug_buff[debug_index++] = code; + if (debug_index >= sizeof(debug_buff)/sizeof(debug_buff[0])) + debug_index = 0; + + /* If it's a reset code, reset the dictionary. */ + if ((code == 256) && state->use_reset_code) { + /* + * The original 'compress' implementation blocked its + * I/O in a manner that resulted in junk bytes being + * inserted after every reset. The next section skips + * this junk. (Yes, the number of *bytes* to skip is + * a function of the current *bit* length.) + */ + int skip_bytes = state->bits - + (state->bytes_in_section % state->bits); + skip_bytes %= state->bits; + state->bits_avail = 0; /* Discard rest of this byte. */ + while (skip_bytes-- > 0) { + code = getbits(self, 8); + if (code < 0) + return (code); + } + /* Now, actually do the reset. */ + state->bytes_in_section = 0; + state->bits = 9; + state->section_end_code = (1 << state->bits) - 1; + state->free_ent = 257; + state->oldcode = -1; + return (next_code(self)); + } + + if (code > state->free_ent) { + /* An invalid code is a fatal error. */ + archive_set_error(&(self->archive->archive), -1, + "Invalid compressed data"); + return (ARCHIVE_FATAL); + } + + /* Special case for KwKwK string. */ + if (code >= state->free_ent) { + *state->stackp++ = state->finbyte; + code = state->oldcode; + } + + /* Generate output characters in reverse order. */ + while (code >= 256) { + *state->stackp++ = state->suffix[code]; + code = state->prefix[code]; + } + *state->stackp++ = state->finbyte = code; + + /* Generate the new entry. */ + code = state->free_ent; + if (code < state->maxcode && state->oldcode >= 0) { + state->prefix[code] = state->oldcode; + state->suffix[code] = state->finbyte; + ++state->free_ent; + } + if (state->free_ent > state->section_end_code) { + state->bits++; + state->bytes_in_section = 0; + if (state->bits == state->maxcode_bits) + state->section_end_code = state->maxcode; + else + state->section_end_code = (1 << state->bits) - 1; + } + + /* Remember previous code. */ + state->oldcode = newcode; + return (ARCHIVE_OK); +} + +/* + * Return next 'n' bits from stream. + * + * -1 indicates end of available data. + */ +static int +getbits(struct archive_read_filter *self, int n) +{ + struct private_data *state = (struct private_data *)self->data; + int code; + ssize_t ret; + static const int mask[] = { + 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, + 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff + }; + + while (state->bits_avail < n) { + if (state->avail_in <= 0) { + state->next_in + = __archive_read_filter_ahead(self->upstream, + 1, &ret); + if (ret == 0) + return (-1); + if (ret < 0 || state->next_in == NULL) + return (ARCHIVE_FATAL); + state->avail_in = ret; + __archive_read_filter_consume(self->upstream, ret); + } + state->bit_buffer |= *state->next_in++ << state->bits_avail; + state->avail_in--; + state->bits_avail += 8; + state->bytes_in_section++; + } + + code = state->bit_buffer; + state->bit_buffer >>= n; + state->bits_avail -= n; + + return (code & mask[n]); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_compression_gzip.c b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_gzip.c new file mode 100644 index 000000000..5424b9619 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_gzip.c @@ -0,0 +1,463 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" + +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_gzip.c,v 1.17 2008/12/06 06:45:15 kientzle Exp $"); + + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_ZLIB_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_read_private.h" + +#ifdef HAVE_ZLIB_H +struct private_data { + z_stream stream; + char in_stream; + unsigned char *out_block; + size_t out_block_size; + int64_t total_out; + unsigned long crc; + char eof; /* True = found end of compressed data. */ +}; + +/* Gzip Filter. */ +static ssize_t gzip_filter_read(struct archive_read_filter *, const void **); +static int gzip_filter_close(struct archive_read_filter *); +#endif + +/* + * Note that we can detect gzip archives even if we can't decompress + * them. (In fact, we like detecting them because we can give better + * error messages.) So the bid framework here gets compiled even + * if zlib is unavailable. + * + * TODO: If zlib is unavailable, gzip_bidder_init() should + * use the compress_program framework to try to fire up an external + * gunzip program. + */ +static int gzip_bidder_bid(struct archive_read_filter_bidder *, + struct archive_read_filter *); +static int gzip_bidder_init(struct archive_read_filter *); + +int +archive_read_support_compression_gzip(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct archive_read_filter_bidder *bidder = __archive_read_get_bidder(a); + + if (bidder == NULL) + return (ARCHIVE_FATAL); + + bidder->data = NULL; + bidder->bid = gzip_bidder_bid; + bidder->init = gzip_bidder_init; + bidder->options = NULL; + bidder->free = NULL; /* No data, so no cleanup necessary. */ + /* Signal the extent of gzip support with the return value here. */ +#if HAVE_ZLIB_H + return (ARCHIVE_OK); +#else + archive_set_error(_a, ARCHIVE_ERRNO_MISC, + "Using external gunzip program"); + return (ARCHIVE_WARN); +#endif +} + +/* + * Read and verify the header. + * + * Returns zero if the header couldn't be validated, else returns + * number of bytes in header. If pbits is non-NULL, it receives a + * count of bits verified, suitable for use by bidder. + */ +static int +peek_at_header(struct archive_read_filter *filter, int *pbits) +{ + const unsigned char *p; + ssize_t avail, len; + int bits = 0; + int header_flags; + + /* Start by looking at the first ten bytes of the header, which + * is all fixed layout. */ + len = 10; + p = __archive_read_filter_ahead(filter, len, &avail); + if (p == NULL || avail == 0) + return (0); + if (p[0] != 037) + return (0); + bits += 8; + if (p[1] != 0213) + return (0); + bits += 8; + if (p[2] != 8) /* We only support deflation. */ + return (0); + bits += 8; + if ((p[3] & 0xE0)!= 0) /* No reserved flags set. */ + return (0); + bits += 3; + header_flags = p[3]; + /* Bytes 4-7 are mod time. */ + /* Byte 8 is deflate flags. */ + /* XXXX TODO: return deflate flags back to consume_header for use + in initializing the decompressor. */ + /* Byte 9 is OS. */ + + /* Optional extra data: 2 byte length plus variable body. */ + if (header_flags & 4) { + p = __archive_read_filter_ahead(filter, len + 2, &avail); + if (p == NULL) + return (0); + len += ((int)p[len + 1] << 8) | (int)p[len]; + len += 2; + } + + /* Null-terminated optional filename. */ + if (header_flags & 8) { + do { + ++len; + if (avail < len) + p = __archive_read_filter_ahead(filter, + len, &avail); + if (p == NULL) + return (0); + } while (p[len - 1] != 0); + } + + /* Null-terminated optional comment. */ + if (header_flags & 16) { + do { + ++len; + if (avail < len) + p = __archive_read_filter_ahead(filter, + len, &avail); + if (p == NULL) + return (0); + } while (p[len - 1] != 0); + } + + /* Optional header CRC */ + if ((header_flags & 2)) { + p = __archive_read_filter_ahead(filter, len + 2, &avail); + if (p == NULL) + return (0); +#if 0 + int hcrc = ((int)p[len + 1] << 8) | (int)p[len]; + int crc = /* XXX TODO: Compute header CRC. */; + if (crc != hcrc) + return (0); + bits += 16; +#endif + len += 2; + } + + if (pbits != NULL) + *pbits = bits; + return (len); +} + +/* + * Bidder just verifies the header and returns the number of verified bits. + */ +static int +gzip_bidder_bid(struct archive_read_filter_bidder *self, + struct archive_read_filter *filter) +{ + int bits_checked; + + (void)self; /* UNUSED */ + + if (peek_at_header(filter, &bits_checked)) + return (bits_checked); + return (0); +} + + +#ifndef HAVE_ZLIB_H + +/* + * If we don't have the library on this system, we can't do the + * decompression directly. We can, however, try to run gunzip + * in case that's available. + */ +static int +gzip_bidder_init(struct archive_read_filter *self) +{ + int r; + + r = __archive_read_program(self, "gunzip"); + /* Note: We set the format here even if __archive_read_program() + * above fails. We do, after all, know what the format is + * even if we weren't able to read it. */ + self->code = ARCHIVE_COMPRESSION_GZIP; + self->name = "gzip"; + return (r); +} + +#else + +/* + * Initialize the filter object. + */ +static int +gzip_bidder_init(struct archive_read_filter *self) +{ + struct private_data *state; + static const size_t out_block_size = 64 * 1024; + void *out_block; + + self->code = ARCHIVE_COMPRESSION_GZIP; + self->name = "gzip"; + + state = (struct private_data *)calloc(sizeof(*state), 1); + out_block = (unsigned char *)malloc(out_block_size); + if (state == NULL || out_block == NULL) { + free(out_block); + free(state); + archive_set_error(&self->archive->archive, ENOMEM, + "Can't allocate data for gzip decompression"); + return (ARCHIVE_FATAL); + } + + self->data = state; + state->out_block_size = out_block_size; + state->out_block = out_block; + self->read = gzip_filter_read; + self->skip = NULL; /* not supported */ + self->close = gzip_filter_close; + + state->in_stream = 0; /* We're not actually within a stream yet. */ + + return (ARCHIVE_OK); +} + +static int +consume_header(struct archive_read_filter *self) +{ + struct private_data *state; + ssize_t avail; + size_t len; + int ret; + + state = (struct private_data *)self->data; + + /* If this is a real header, consume it. */ + len = peek_at_header(self->upstream, NULL); + if (len == 0) + return (ARCHIVE_EOF); + __archive_read_filter_consume(self->upstream, len); + + /* Initialize CRC accumulator. */ + state->crc = crc32(0L, NULL, 0); + + /* Initialize compression library. */ + state->stream.next_in = (unsigned char *)(uintptr_t) + __archive_read_filter_ahead(self->upstream, 1, &avail); + state->stream.avail_in = avail; + ret = inflateInit2(&(state->stream), + -15 /* Don't check for zlib header */); + + /* Decipher the error code. */ + switch (ret) { + case Z_OK: + state->in_stream = 1; + return (ARCHIVE_OK); + case Z_STREAM_ERROR: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library: " + "invalid setup parameter"); + break; + case Z_MEM_ERROR: + archive_set_error(&self->archive->archive, ENOMEM, + "Internal error initializing compression library: " + "out of memory"); + break; + case Z_VERSION_ERROR: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library: " + "invalid library version"); + break; + default: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library: " + " Zlib error %d", ret); + break; + } + return (ARCHIVE_FATAL); +} + +static int +consume_trailer(struct archive_read_filter *self) +{ + struct private_data *state; + const unsigned char *p; + ssize_t avail; + + state = (struct private_data *)self->data; + + state->in_stream = 0; + switch (inflateEnd(&(state->stream))) { + case Z_OK: + break; + default: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Failed to clean up gzip decompressor"); + return (ARCHIVE_FATAL); + } + + /* GZip trailer is a fixed 8 byte structure. */ + p = __archive_read_filter_ahead(self->upstream, 8, &avail); + if (p == NULL || avail == 0) + return (ARCHIVE_FATAL); + + /* XXX TODO: Verify the length and CRC. */ + + /* We've verified the trailer, so consume it now. */ + __archive_read_filter_consume(self->upstream, 8); + + return (ARCHIVE_OK); +} + +static ssize_t +gzip_filter_read(struct archive_read_filter *self, const void **p) +{ + struct private_data *state; + size_t decompressed; + ssize_t avail_in; + int ret; + + state = (struct private_data *)self->data; + + /* Empty our output buffer. */ + state->stream.next_out = state->out_block; + state->stream.avail_out = state->out_block_size; + + /* Try to fill the output buffer. */ + while (state->stream.avail_out > 0 && !state->eof) { + /* If we're not in a stream, read a header + * and initialize the decompression library. */ + if (!state->in_stream) { + ret = consume_header(self); + if (ret == ARCHIVE_EOF) { + state->eof = 1; + break; + } + if (ret < ARCHIVE_OK) + return (ret); + } + + /* Peek at the next available data. */ + /* ZLib treats stream.next_in as const but doesn't declare + * it so, hence this ugly cast. */ + state->stream.next_in = (unsigned char *)(uintptr_t) + __archive_read_filter_ahead(self->upstream, 1, &avail_in); + if (state->stream.next_in == NULL) + return (ARCHIVE_FATAL); + state->stream.avail_in = avail_in; + + /* Decompress and consume some of that data. */ + ret = inflate(&(state->stream), 0); + switch (ret) { + case Z_OK: /* Decompressor made some progress. */ + __archive_read_filter_consume(self->upstream, + avail_in - state->stream.avail_in); + break; + case Z_STREAM_END: /* Found end of stream. */ + __archive_read_filter_consume(self->upstream, + avail_in - state->stream.avail_in); + /* Consume the stream trailer; release the + * decompression library. */ + ret = consume_trailer(self); + break; + default: + /* Return an error. */ + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "gzip decompression failed"); + return (ARCHIVE_FATAL); + } + } + + /* We've read as much as we can. */ + decompressed = state->stream.next_out - state->out_block; + state->total_out += decompressed; + if (decompressed == 0) + *p = NULL; + else + *p = state->out_block; + return (decompressed); +} + +/* + * Clean up the decompressor. + */ +static int +gzip_filter_close(struct archive_read_filter *self) +{ + struct private_data *state; + int ret; + + state = (struct private_data *)self->data; + ret = ARCHIVE_OK; + + if (state->in_stream) { + switch (inflateEnd(&(state->stream))) { + case Z_OK: + break; + default: + archive_set_error(&(self->archive->archive), + ARCHIVE_ERRNO_MISC, + "Failed to clean up gzip compressor"); + ret = ARCHIVE_FATAL; + } + } + + free(state->out_block); + free(state); + return (ret); +} + +#endif /* HAVE_ZLIB_H */ diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_compression_none.c b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_none.c new file mode 100644 index 000000000..1456a1184 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_none.c @@ -0,0 +1,40 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_none.c,v 1.20 2008/12/06 06:45:15 kientzle Exp $"); + +#include "archive.h" + +/* + * Uncompressed streams are handled implicitly by the read core, + * so this is now a no-op. + */ +int +archive_read_support_compression_none(struct archive *a) +{ + (void)a; /* UNUSED */ + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_compression_program.c b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_program.c new file mode 100644 index 000000000..972fb03d0 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_program.c @@ -0,0 +1,457 @@ +/*- + * Copyright (c) 2007 Joerg Sonnenberger + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_program.c,v 1.6 2008/12/06 06:45:15 kientzle Exp $"); + +#ifdef HAVE_SYS_WAIT_H +# include +#endif +#ifdef HAVE_ERRNO_H +# include +#endif +#ifdef HAVE_FCNTL_H +# include +#endif +#ifdef HAVE_LIMITS_H +# include +#endif +#ifdef HAVE_SIGNAL_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_read_private.h" + +int +archive_read_support_compression_program(struct archive *a, const char *cmd) +{ + return (archive_read_support_compression_program_signature(a, cmd, NULL, 0)); +} + + +/* This capability is only available on POSIX systems. */ +#if (!defined(HAVE_PIPE) || !defined(HAVE_FCNTL) || \ + !(defined(HAVE_FORK) || defined(HAVE_VFORK))) && (!defined(_WIN32) || defined(__CYGWIN__)) + +/* + * On non-Posix systems, allow the program to build, but choke if + * this function is actually invoked. + */ +int +archive_read_support_compression_program_signature(struct archive *_a, + const char *cmd, void *signature, size_t signature_len) +{ + (void)_a; /* UNUSED */ + (void)cmd; /* UNUSED */ + (void)signature; /* UNUSED */ + (void)signature_len; /* UNUSED */ + + archive_set_error(_a, -1, + "External compression programs not supported on this platform"); + return (ARCHIVE_FATAL); +} + +int +__archive_read_program(struct archive_read_filter *self, const char *cmd) +{ + (void)self; /* UNUSED */ + (void)cmd; /* UNUSED */ + + archive_set_error(&self->archive->archive, -1, + "External compression programs not supported on this platform"); + return (ARCHIVE_FATAL); +} + +#else + +#include "filter_fork.h" + +/* + * The bidder object stores the command and the signature to watch for. + * The 'inhibit' entry here is used to ensure that unchecked filters never + * bid twice in the same pipeline. + */ +struct program_bidder { + char *cmd; + void *signature; + size_t signature_len; + int inhibit; +}; + +static int program_bidder_bid(struct archive_read_filter_bidder *, + struct archive_read_filter *upstream); +static int program_bidder_init(struct archive_read_filter *); +static int program_bidder_free(struct archive_read_filter_bidder *); + +/* + * The actual filter needs to track input and output data. + */ +struct program_filter { + char *description; + pid_t child; + int exit_status; + int waitpid_return; + int child_stdin, child_stdout; + + char *out_buf; + size_t out_buf_len; +}; + +static ssize_t program_filter_read(struct archive_read_filter *, + const void **); +static int program_filter_close(struct archive_read_filter *); + +int +archive_read_support_compression_program_signature(struct archive *_a, + const char *cmd, const void *signature, size_t signature_len) +{ + struct archive_read *a = (struct archive_read *)_a; + struct archive_read_filter_bidder *bidder; + struct program_bidder *state; + + /* + * Get a bidder object from the read core. + */ + bidder = __archive_read_get_bidder(a); + if (bidder == NULL) + return (ARCHIVE_FATAL); + + /* + * Allocate our private state. + */ + state = (struct program_bidder *)calloc(sizeof (*state), 1); + if (state == NULL) + return (ARCHIVE_FATAL); + state->cmd = strdup(cmd); + if (signature != NULL && signature_len > 0) { + state->signature_len = signature_len; + state->signature = malloc(signature_len); + memcpy(state->signature, signature, signature_len); + } + + /* + * Fill in the bidder object. + */ + bidder->data = state; + bidder->bid = program_bidder_bid; + bidder->init = program_bidder_init; + bidder->options = NULL; + bidder->free = program_bidder_free; + return (ARCHIVE_OK); +} + +static int +program_bidder_free(struct archive_read_filter_bidder *self) +{ + struct program_bidder *state = (struct program_bidder *)self->data; + free(state->cmd); + free(state->signature); + free(self->data); + return (ARCHIVE_OK); +} + +/* + * If we do have a signature, bid only if that matches. + * + * If there's no signature, we bid INT_MAX the first time + * we're called, then never bid again. + */ +static int +program_bidder_bid(struct archive_read_filter_bidder *self, + struct archive_read_filter *upstream) +{ + struct program_bidder *state = self->data; + const char *p; + + /* If we have a signature, use that to match. */ + if (state->signature_len > 0) { + p = __archive_read_filter_ahead(upstream, + state->signature_len, NULL); + if (p == NULL) + return (0); + /* No match, so don't bid. */ + if (memcmp(p, state->signature, state->signature_len) != 0) + return (0); + return (state->signature_len * 8); + } + + /* Otherwise, bid once and then never bid again. */ + if (state->inhibit) + return (0); + state->inhibit = 1; + return (INT_MAX); +} + +/* + * Shut down the child, return ARCHIVE_OK if it exited normally. + * + * Note that the return value is sticky; if we're called again, + * we won't reap the child again, but we will return the same status + * (including error message if the child came to a bad end). + */ +static int +child_stop(struct archive_read_filter *self, struct program_filter *state) +{ + /* Close our side of the I/O with the child. */ + if (state->child_stdin != -1) { + close(state->child_stdin); + state->child_stdin = -1; + } + if (state->child_stdout != -1) { + close(state->child_stdout); + state->child_stdout = -1; + } + + if (state->child != 0) { + /* Reap the child. */ + do { + state->waitpid_return + = waitpid(state->child, &state->exit_status, 0); + } while (state->waitpid_return == -1 && errno == EINTR); + state->child = 0; + } + + if (state->waitpid_return < 0) { + /* waitpid() failed? This is ugly. */ + archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, + "Child process exited badly"); + return (ARCHIVE_WARN); + } + + if (WIFSIGNALED(state->exit_status)) { +#ifdef SIGPIPE + /* If the child died because we stopped reading before + * it was done, that's okay. Some archive formats + * have padding at the end that we routinely ignore. */ + /* The alternative to this would be to add a step + * before close(child_stdout) above to read from the + * child until the child has no more to write. */ + if (WTERMSIG(state->exit_status) == SIGPIPE) + return (ARCHIVE_OK); +#endif + archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, + "Child process exited with signal %d", + WTERMSIG(state->exit_status)); + return (ARCHIVE_WARN); + } + + if (WIFEXITED(state->exit_status)) { + if (WEXITSTATUS(state->exit_status) == 0) + return (ARCHIVE_OK); + + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Child process exited with status %d", + WEXITSTATUS(state->exit_status)); + return (ARCHIVE_WARN); + } + + return (ARCHIVE_WARN); +} + +/* + * Use select() to decide whether the child is ready for read or write. + */ +static ssize_t +child_read(struct archive_read_filter *self, char *buf, size_t buf_len) +{ + struct program_filter *state = self->data; + ssize_t ret, requested, avail; + const char *p; + + requested = buf_len > SSIZE_MAX ? SSIZE_MAX : buf_len; + + for (;;) { + do { + ret = read(state->child_stdout, buf, requested); + } while (ret == -1 && errno == EINTR); + + if (ret > 0) + return (ret); + if (ret == 0 || (ret == -1 && errno == EPIPE)) + /* Child has closed its output; reap the child + * and return the status. */ + return (child_stop(self, state)); + if (ret == -1 && errno != EAGAIN) + return (-1); + + if (state->child_stdin == -1) { + /* Block until child has some I/O ready. */ + __archive_check_child(state->child_stdin, + state->child_stdout); + continue; + } + + /* Get some more data from upstream. */ + p = __archive_read_filter_ahead(self->upstream, 1, &avail); + if (p == NULL) { + close(state->child_stdin); + state->child_stdin = -1; + fcntl(state->child_stdout, F_SETFL, 0); + if (avail < 0) + return (avail); + continue; + } + + do { + ret = write(state->child_stdin, p, avail); + } while (ret == -1 && errno == EINTR); + + if (ret > 0) { + /* Consume whatever we managed to write. */ + __archive_read_filter_consume(self->upstream, ret); + } else if (ret == -1 && errno == EAGAIN) { + /* Block until child has some I/O ready. */ + __archive_check_child(state->child_stdin, + state->child_stdout); + } else { + /* Write failed. */ + close(state->child_stdin); + state->child_stdin = -1; + fcntl(state->child_stdout, F_SETFL, 0); + /* If it was a bad error, we're done; otherwise + * it was EPIPE or EOF, and we can still read + * from the child. */ + if (ret == -1 && errno != EPIPE) + return (-1); + } + } +} + +int +__archive_read_program(struct archive_read_filter *self, const char *cmd) +{ + struct program_filter *state; + static const size_t out_buf_len = 65536; + char *out_buf; + char *description; + const char *prefix = "Program: "; + + state = (struct program_filter *)calloc(1, sizeof(*state)); + out_buf = (char *)malloc(out_buf_len); + description = (char *)malloc(strlen(prefix) + strlen(cmd) + 1); + if (state == NULL || out_buf == NULL || description == NULL) { + archive_set_error(&self->archive->archive, ENOMEM, + "Can't allocate input data"); + free(state); + free(out_buf); + free(description); + return (ARCHIVE_FATAL); + } + + self->code = ARCHIVE_COMPRESSION_PROGRAM; + state->description = description; + strcpy(state->description, prefix); + strcat(state->description, cmd); + self->name = state->description; + + state->out_buf = out_buf; + state->out_buf_len = out_buf_len; + + if ((state->child = __archive_create_child(cmd, + &state->child_stdin, &state->child_stdout)) == -1) { + free(state->out_buf); + free(state); + archive_set_error(&self->archive->archive, EINVAL, + "Can't initialise filter"); + return (ARCHIVE_FATAL); + } + + self->data = state; + self->read = program_filter_read; + self->skip = NULL; + self->close = program_filter_close; + + /* XXX Check that we can read at least one byte? */ + return (ARCHIVE_OK); +} + +static int +program_bidder_init(struct archive_read_filter *self) +{ + struct program_bidder *bidder_state; + + bidder_state = (struct program_bidder *)self->bidder->data; + return (__archive_read_program(self, bidder_state->cmd)); +} + +static ssize_t +program_filter_read(struct archive_read_filter *self, const void **buff) +{ + struct program_filter *state; + ssize_t bytes; + size_t total; + char *p; + + state = (struct program_filter *)self->data; + + total = 0; + p = state->out_buf; + while (state->child_stdout != -1 && total < state->out_buf_len) { + bytes = child_read(self, p, state->out_buf_len - total); + if (bytes < 0) + /* No recovery is possible if we can no longer + * read from the child. */ + return (ARCHIVE_FATAL); + if (bytes == 0) + /* We got EOF from the child. */ + break; + total += bytes; + p += bytes; + } + + *buff = state->out_buf; + return (total); +} + +static int +program_filter_close(struct archive_read_filter *self) +{ + struct program_filter *state; + int e; + + state = (struct program_filter *)self->data; + e = child_stop(self, state); + + /* Release our private data. */ + free(state->out_buf); + free(state->description); + free(state); + + return (e); +} + +#endif /* !defined(HAVE_PIPE) || !defined(HAVE_VFORK) || !defined(HAVE_FCNTL) */ diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_compression_xz.c b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_xz.c new file mode 100644 index 000000000..cb284cc78 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_compression_xz.c @@ -0,0 +1,644 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2008 Tim Kientzle and Miklos Vajna + * 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 "archive_platform.h" + +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#if HAVE_LZMA_H +#include +#elif HAVE_LZMADEC_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_read_private.h" + +#if HAVE_LZMA_H && HAVE_LIBLZMA + +struct private_data { + lzma_stream stream; + unsigned char *out_block; + size_t out_block_size; + int64_t total_out; + char eof; /* True = found end of compressed data. */ +}; + +/* Combined lzma/xz filter */ +static ssize_t xz_filter_read(struct archive_read_filter *, const void **); +static int xz_filter_close(struct archive_read_filter *); +static int xz_lzma_bidder_init(struct archive_read_filter *); + +#elif HAVE_LZMADEC_H && HAVE_LIBLZMADEC + +struct private_data { + lzmadec_stream stream; + unsigned char *out_block; + size_t out_block_size; + int64_t total_out; + char eof; /* True = found end of compressed data. */ +}; + +/* Lzma-only filter */ +static ssize_t lzma_filter_read(struct archive_read_filter *, const void **); +static int lzma_filter_close(struct archive_read_filter *); +#endif + +/* + * Note that we can detect xz and lzma compressed files even if we + * can't decompress them. (In fact, we like detecting them because we + * can give better error messages.) So the bid framework here gets + * compiled even if no lzma library is available. + */ +static int xz_bidder_bid(struct archive_read_filter_bidder *, + struct archive_read_filter *); +static int xz_bidder_init(struct archive_read_filter *); +static int lzma_bidder_bid(struct archive_read_filter_bidder *, + struct archive_read_filter *); +static int lzma_bidder_init(struct archive_read_filter *); + +int +archive_read_support_compression_xz(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct archive_read_filter_bidder *bidder = __archive_read_get_bidder(a); + + archive_clear_error(_a); + if (bidder == NULL) + return (ARCHIVE_FATAL); + + bidder->data = NULL; + bidder->bid = xz_bidder_bid; + bidder->init = xz_bidder_init; + bidder->options = NULL; + bidder->free = NULL; +#if HAVE_LZMA_H && HAVE_LIBLZMA + return (ARCHIVE_OK); +#else + archive_set_error(_a, ARCHIVE_ERRNO_MISC, + "Using external unxz program for xz decompression"); + return (ARCHIVE_WARN); +#endif +} + +int +archive_read_support_compression_lzma(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct archive_read_filter_bidder *bidder = __archive_read_get_bidder(a); + + archive_clear_error(_a); + if (bidder == NULL) + return (ARCHIVE_FATAL); + + bidder->data = NULL; + bidder->bid = lzma_bidder_bid; + bidder->init = lzma_bidder_init; + bidder->options = NULL; + bidder->free = NULL; +#if HAVE_LZMA_H && HAVE_LIBLZMA + return (ARCHIVE_OK); +#elif HAVE_LZMADEC_H && HAVE_LIBLZMADEC + return (ARCHIVE_OK); +#else + archive_set_error(_a, ARCHIVE_ERRNO_MISC, + "Using external unlzma program for lzma decompression"); + return (ARCHIVE_WARN); +#endif +} + +/* + * Test whether we can handle this data. + */ +static int +xz_bidder_bid(struct archive_read_filter_bidder *self, + struct archive_read_filter *filter) +{ + const unsigned char *buffer; + ssize_t avail; + int bits_checked; + + (void)self; /* UNUSED */ + + buffer = __archive_read_filter_ahead(filter, 6, &avail); + if (buffer == NULL) + return (0); + + /* + * Verify Header Magic Bytes : FD 37 7A 58 5A 00 + */ + bits_checked = 0; + if (buffer[0] != 0xFD) + return (0); + bits_checked += 8; + if (buffer[1] != 0x37) + return (0); + bits_checked += 8; + if (buffer[2] != 0x7A) + return (0); + bits_checked += 8; + if (buffer[3] != 0x58) + return (0); + bits_checked += 8; + if (buffer[4] != 0x5A) + return (0); + bits_checked += 8; + if (buffer[5] != 0x00) + return (0); + bits_checked += 8; + + return (bits_checked); +} + +/* + * Test whether we can handle this data. + * + * LZMA has a rather poor file signature. Zeros do not + * make good signature bytes as a rule, and the only non-zero byte + * here is an ASCII character. For example, an uncompressed tar + * archive whose first file is ']' would satisfy this check. It may + * be necessary to exclude LZMA from compression_all() because of + * this. Clients of libarchive would then have to explicitly enable + * LZMA checking instead of (or in addition to) compression_all() when + * they have other evidence (file name, command-line option) to go on. + */ +static int +lzma_bidder_bid(struct archive_read_filter_bidder *self, + struct archive_read_filter *filter) +{ + const unsigned char *buffer; + ssize_t avail; + int bits_checked; + + (void)self; /* UNUSED */ + + buffer = __archive_read_filter_ahead(filter, 6, &avail); + if (buffer == NULL) + return (0); + + /* First byte of raw LZMA stream is always 0x5d. */ + bits_checked = 0; + if (buffer[0] != 0x5d) + return (0); + bits_checked += 8; + + /* Second through fifth bytes are dictionary code, stored in + * little-endian order. The two least-significant bytes are + * always zero. */ + if (buffer[1] != 0 || buffer[2] != 0) + return (0); + bits_checked += 16; + + /* ??? TODO: Fix this. ??? */ + /* NSIS format check uses this, but I've seen tar.lzma + * archives where this byte is 0xff, not 0. Can it + * ever be anything other than 0 or 0xff? + */ +#if 0 + if (buffer[5] != 0) + return (0); + bits_checked += 8; +#endif + + /* TODO: The above test is still very weak. It would be + * good to do better. */ + + return (bits_checked); +} + +#if HAVE_LZMA_H && HAVE_LIBLZMA + +/* + * liblzma 4.999.7 and later support both lzma and xz streams. + */ +static int +xz_bidder_init(struct archive_read_filter *self) +{ + self->code = ARCHIVE_COMPRESSION_XZ; + self->name = "xz"; + return (xz_lzma_bidder_init(self)); +} + +static int +lzma_bidder_init(struct archive_read_filter *self) +{ + self->code = ARCHIVE_COMPRESSION_LZMA; + self->name = "lzma"; + return (xz_lzma_bidder_init(self)); +} + +/* + * Setup the callbacks. + */ +static int +xz_lzma_bidder_init(struct archive_read_filter *self) +{ + static const size_t out_block_size = 64 * 1024; + void *out_block; + struct private_data *state; + int ret; + + state = (struct private_data *)calloc(sizeof(*state), 1); + out_block = (unsigned char *)malloc(out_block_size); + if (state == NULL || out_block == NULL) { + archive_set_error(&self->archive->archive, ENOMEM, + "Can't allocate data for xz decompression"); + free(out_block); + free(state); + return (ARCHIVE_FATAL); + } + + self->data = state; + state->out_block_size = out_block_size; + state->out_block = out_block; + self->read = xz_filter_read; + self->skip = NULL; /* not supported */ + self->close = xz_filter_close; + + state->stream.avail_in = 0; + + state->stream.next_out = state->out_block; + state->stream.avail_out = state->out_block_size; + + /* Initialize compression library. + * TODO: I don't know what value is best for memlimit. + * maybe, it needs to check memory size which + * running system has. + */ + if (self->code == ARCHIVE_COMPRESSION_XZ) + ret = lzma_stream_decoder(&(state->stream), + (1U << 30),/* memlimit */ + LZMA_CONCATENATED); + else + ret = lzma_alone_decoder(&(state->stream), + (1U << 30));/* memlimit */ + + if (ret == LZMA_OK) + return (ARCHIVE_OK); + + /* Library setup failed: Choose an error message and clean up. */ + switch (ret) { + case LZMA_MEM_ERROR: + archive_set_error(&self->archive->archive, ENOMEM, + "Internal error initializing compression library: " + "Cannot allocate memory"); + break; + case LZMA_OPTIONS_ERROR: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library: " + "Invalid or unsupported options"); + break; + default: + archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing lzma library"); + break; + } + + free(state->out_block); + free(state); + self->data = NULL; + return (ARCHIVE_FATAL); +} + +/* + * Return the next block of decompressed data. + */ +static ssize_t +xz_filter_read(struct archive_read_filter *self, const void **p) +{ + struct private_data *state; + size_t decompressed; + ssize_t avail_in; + int ret; + + state = (struct private_data *)self->data; + + /* Empty our output buffer. */ + state->stream.next_out = state->out_block; + state->stream.avail_out = state->out_block_size; + + /* Try to fill the output buffer. */ + while (state->stream.avail_out > 0 && !state->eof) { + state->stream.next_in = + __archive_read_filter_ahead(self->upstream, 1, &avail_in); + if (state->stream.next_in == NULL && avail_in < 0) + return (ARCHIVE_FATAL); + state->stream.avail_in = avail_in; + + /* Decompress as much as we can in one pass. */ + ret = lzma_code(&(state->stream), + (state->stream.avail_in == 0)? LZMA_FINISH: LZMA_RUN); + switch (ret) { + case LZMA_STREAM_END: /* Found end of stream. */ + state->eof = 1; + /* FALL THROUGH */ + case LZMA_OK: /* Decompressor made some progress. */ + __archive_read_filter_consume(self->upstream, + avail_in - state->stream.avail_in); + break; + case LZMA_MEM_ERROR: + archive_set_error(&self->archive->archive, ENOMEM, + "Lzma library error: Cannot allocate memory"); + return (ARCHIVE_FATAL); + case LZMA_MEMLIMIT_ERROR: + archive_set_error(&self->archive->archive, ENOMEM, + "Lzma library error: Out of memory"); + return (ARCHIVE_FATAL); + case LZMA_FORMAT_ERROR: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Lzma library error: format not recognized"); + return (ARCHIVE_FATAL); + case LZMA_OPTIONS_ERROR: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Lzma library error: Invalid options"); + return (ARCHIVE_FATAL); + case LZMA_DATA_ERROR: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Lzma library error: Corrupted input data"); + return (ARCHIVE_FATAL); + case LZMA_BUF_ERROR: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Lzma library error: No progress is possible"); + return (ARCHIVE_FATAL); + default: + /* Return an error. */ + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Lzma decompression failed: Unknown error"); + return (ARCHIVE_FATAL); + } + } + + decompressed = state->stream.next_out - state->out_block; + state->total_out += decompressed; + if (decompressed == 0) + *p = NULL; + else + *p = state->out_block; + return (decompressed); +} + +/* + * Clean up the decompressor. + */ +static int +xz_filter_close(struct archive_read_filter *self) +{ + struct private_data *state; + + state = (struct private_data *)self->data; + lzma_end(&(state->stream)); + free(state->out_block); + free(state); + return (ARCHIVE_OK); +} + +#else + +#if HAVE_LZMADEC_H && HAVE_LIBLZMADEC + +/* + * If we have the older liblzmadec library, then we can handle + * LZMA streams but not XZ streams. + */ + +/* + * Setup the callbacks. + */ +static int +lzma_bidder_init(struct archive_read_filter *self) +{ + static const size_t out_block_size = 64 * 1024; + void *out_block; + struct private_data *state; + ssize_t ret, avail_in; + + self->code = ARCHIVE_COMPRESSION_LZMA; + self->name = "lzma"; + + state = (struct private_data *)calloc(sizeof(*state), 1); + out_block = (unsigned char *)malloc(out_block_size); + if (state == NULL || out_block == NULL) { + archive_set_error(&self->archive->archive, ENOMEM, + "Can't allocate data for lzma decompression"); + free(out_block); + free(state); + return (ARCHIVE_FATAL); + } + + self->data = state; + state->out_block_size = out_block_size; + state->out_block = out_block; + self->read = lzma_filter_read; + self->skip = NULL; /* not supported */ + self->close = lzma_filter_close; + + /* Prime the lzma library with 18 bytes of input. */ + state->stream.next_in = (unsigned char *)(uintptr_t) + __archive_read_filter_ahead(self->upstream, 18, &avail_in); + if (state->stream.next_in == NULL) + return (ARCHIVE_FATAL); + state->stream.avail_in = avail_in; + state->stream.next_out = state->out_block; + state->stream.avail_out = state->out_block_size; + + /* Initialize compression library. */ + ret = lzmadec_init(&(state->stream)); + __archive_read_filter_consume(self->upstream, + avail_in - state->stream.avail_in); + if (ret == LZMADEC_OK) + return (ARCHIVE_OK); + + /* Library setup failed: Clean up. */ + archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing lzma library"); + + /* Override the error message if we know what really went wrong. */ + switch (ret) { + case LZMADEC_HEADER_ERROR: + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library: " + "invalid header"); + break; + case LZMADEC_MEM_ERROR: + archive_set_error(&self->archive->archive, ENOMEM, + "Internal error initializing compression library: " + "out of memory"); + break; + } + + free(state->out_block); + free(state); + self->data = NULL; + return (ARCHIVE_FATAL); +} + +/* + * Return the next block of decompressed data. + */ +static ssize_t +lzma_filter_read(struct archive_read_filter *self, const void **p) +{ + struct private_data *state; + size_t decompressed; + ssize_t avail_in, ret; + + state = (struct private_data *)self->data; + + /* Empty our output buffer. */ + state->stream.next_out = state->out_block; + state->stream.avail_out = state->out_block_size; + + /* Try to fill the output buffer. */ + while (state->stream.avail_out > 0 && !state->eof) { + state->stream.next_in = (unsigned char *)(uintptr_t) + __archive_read_filter_ahead(self->upstream, 1, &avail_in); + if (state->stream.next_in == NULL && avail_in < 0) + return (ARCHIVE_FATAL); + state->stream.avail_in = avail_in; + + /* Decompress as much as we can in one pass. */ + ret = lzmadec_decode(&(state->stream), avail_in == 0); + switch (ret) { + case LZMADEC_STREAM_END: /* Found end of stream. */ + state->eof = 1; + /* FALL THROUGH */ + case LZMADEC_OK: /* Decompressor made some progress. */ + __archive_read_filter_consume(self->upstream, + avail_in - state->stream.avail_in); + break; + case LZMADEC_BUF_ERROR: /* Insufficient input data? */ + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Insufficient compressed data"); + return (ARCHIVE_FATAL); + default: + /* Return an error. */ + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Lzma decompression failed"); + return (ARCHIVE_FATAL); + } + } + + decompressed = state->stream.next_out - state->out_block; + state->total_out += decompressed; + if (decompressed == 0) + *p = NULL; + else + *p = state->out_block; + return (decompressed); +} + +/* + * Clean up the decompressor. + */ +static int +lzma_filter_close(struct archive_read_filter *self) +{ + struct private_data *state; + int ret; + + state = (struct private_data *)self->data; + ret = ARCHIVE_OK; + switch (lzmadec_end(&(state->stream))) { + case LZMADEC_OK: + break; + default: + archive_set_error(&(self->archive->archive), + ARCHIVE_ERRNO_MISC, + "Failed to clean up %s compressor", + self->archive->archive.compression_name); + ret = ARCHIVE_FATAL; + } + + free(state->out_block); + free(state); + return (ret); +} + +#else + +/* + * + * If we have no suitable library on this system, we can't actually do + * the decompression. We can, however, still detect compressed + * archives and emit a useful message. + * + */ +static int +lzma_bidder_init(struct archive_read_filter *self) +{ + int r; + + r = __archive_read_program(self, "unlzma"); + /* Note: We set the format here even if __archive_read_program() + * above fails. We do, after all, know what the format is + * even if we weren't able to read it. */ + self->code = ARCHIVE_COMPRESSION_LZMA; + self->name = "lzma"; + return (r); +} + +#endif /* HAVE_LZMADEC_H */ + + +static int +xz_bidder_init(struct archive_read_filter *self) +{ + int r; + + r = __archive_read_program(self, "unxz"); + /* Note: We set the format here even if __archive_read_program() + * above fails. We do, after all, know what the format is + * even if we weren't able to read it. */ + self->code = ARCHIVE_COMPRESSION_XZ; + self->name = "xz"; + return (r); +} + + +#endif /* HAVE_LZMA_H */ diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_all.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_all.c new file mode 100644 index 000000000..84b9bd34b --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_all.c @@ -0,0 +1,42 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_all.c,v 1.10 2007/12/30 04:58:21 kientzle Exp $"); + +#include "archive.h" + +int +archive_read_support_format_all(struct archive *a) +{ + archive_read_support_format_ar(a); + archive_read_support_format_cpio(a); + archive_read_support_format_empty(a); + archive_read_support_format_iso9660(a); + archive_read_support_format_mtree(a); + archive_read_support_format_tar(a); + archive_read_support_format_zip(a); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_ar.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_ar.c new file mode 100644 index 000000000..0513cf4c2 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_ar.c @@ -0,0 +1,584 @@ +/*- + * Copyright (c) 2007 Kai Wang + * Copyright (c) 2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_ar.c,v 1.12 2008/12/17 19:02:42 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" + +struct ar { + off_t entry_bytes_remaining; + off_t entry_offset; + off_t entry_padding; + char *strtab; + size_t strtab_size; +}; + +/* + * Define structure of the "ar" header. + */ +#define AR_name_offset 0 +#define AR_name_size 16 +#define AR_date_offset 16 +#define AR_date_size 12 +#define AR_uid_offset 28 +#define AR_uid_size 6 +#define AR_gid_offset 34 +#define AR_gid_size 6 +#define AR_mode_offset 40 +#define AR_mode_size 8 +#define AR_size_offset 48 +#define AR_size_size 10 +#define AR_fmag_offset 58 +#define AR_fmag_size 2 + +static int archive_read_format_ar_bid(struct archive_read *a); +static int archive_read_format_ar_cleanup(struct archive_read *a); +static int archive_read_format_ar_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset); +static int archive_read_format_ar_skip(struct archive_read *a); +static int archive_read_format_ar_read_header(struct archive_read *a, + struct archive_entry *e); +static uint64_t ar_atol8(const char *p, unsigned char_cnt); +static uint64_t ar_atol10(const char *p, unsigned char_cnt); +static int ar_parse_gnu_filename_table(struct archive_read *a); +static int ar_parse_common_header(struct ar *ar, struct archive_entry *, + const char *h); + +int +archive_read_support_format_ar(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct ar *ar; + int r; + + ar = (struct ar *)malloc(sizeof(*ar)); + if (ar == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate ar data"); + return (ARCHIVE_FATAL); + } + memset(ar, 0, sizeof(*ar)); + ar->strtab = NULL; + + r = __archive_read_register_format(a, + ar, + "ar", + archive_read_format_ar_bid, + NULL, + archive_read_format_ar_read_header, + archive_read_format_ar_read_data, + archive_read_format_ar_skip, + archive_read_format_ar_cleanup); + + if (r != ARCHIVE_OK) { + free(ar); + return (r); + } + return (ARCHIVE_OK); +} + +static int +archive_read_format_ar_cleanup(struct archive_read *a) +{ + struct ar *ar; + + ar = (struct ar *)(a->format->data); + if (ar->strtab) + free(ar->strtab); + free(ar); + (a->format->data) = NULL; + return (ARCHIVE_OK); +} + +static int +archive_read_format_ar_bid(struct archive_read *a) +{ + struct ar *ar; + const void *h; + + if (a->archive.archive_format != 0 && + (a->archive.archive_format & ARCHIVE_FORMAT_BASE_MASK) != + ARCHIVE_FORMAT_AR) + return(0); + + ar = (struct ar *)(a->format->data); + + /* + * Verify the 8-byte file signature. + * TODO: Do we need to check more than this? + */ + if ((h = __archive_read_ahead(a, 8, NULL)) == NULL) + return (-1); + if (strncmp((const char*)h, "!\n", 8) == 0) { + return (64); + } + return (-1); +} + +static int +archive_read_format_ar_read_header(struct archive_read *a, + struct archive_entry *entry) +{ + char filename[AR_name_size + 1]; + struct ar *ar; + uint64_t number; /* Used to hold parsed numbers before validation. */ + ssize_t bytes_read; + size_t bsd_name_length, entry_size; + char *p, *st; + const void *b; + const char *h; + int r; + + ar = (struct ar*)(a->format->data); + + if (a->archive.file_position == 0) { + /* + * We are now at the beginning of the archive, + * so we need first consume the ar global header. + */ + __archive_read_consume(a, 8); + /* Set a default format code for now. */ + a->archive.archive_format = ARCHIVE_FORMAT_AR; + } + + /* Read the header for the next file entry. */ + if ((b = __archive_read_ahead(a, 60, &bytes_read)) == NULL) + /* Broken header. */ + return (ARCHIVE_EOF); + __archive_read_consume(a, 60); + h = (const char *)b; + + /* Verify the magic signature on the file header. */ + if (strncmp(h + AR_fmag_offset, "`\n", 2) != 0) { + archive_set_error(&a->archive, EINVAL, + "Incorrect file header signature"); + return (ARCHIVE_WARN); + } + + /* Copy filename into work buffer. */ + strncpy(filename, h + AR_name_offset, AR_name_size); + filename[AR_name_size] = '\0'; + + /* + * Guess the format variant based on the filename. + */ + if (a->archive.archive_format == ARCHIVE_FORMAT_AR) { + /* We don't already know the variant, so let's guess. */ + /* + * Biggest clue is presence of '/': GNU starts special + * filenames with '/', appends '/' as terminator to + * non-special names, so anything with '/' should be + * GNU except for BSD long filenames. + */ + if (strncmp(filename, "#1/", 3) == 0) + a->archive.archive_format = ARCHIVE_FORMAT_AR_BSD; + else if (strchr(filename, '/') != NULL) + a->archive.archive_format = ARCHIVE_FORMAT_AR_GNU; + else if (strncmp(filename, "__.SYMDEF", 9) == 0) + a->archive.archive_format = ARCHIVE_FORMAT_AR_BSD; + /* + * XXX Do GNU/SVR4 'ar' programs ever omit trailing '/' + * if name exactly fills 16-byte field? If so, we + * can't assume entries without '/' are BSD. XXX + */ + } + + /* Update format name from the code. */ + if (a->archive.archive_format == ARCHIVE_FORMAT_AR_GNU) + a->archive.archive_format_name = "ar (GNU/SVR4)"; + else if (a->archive.archive_format == ARCHIVE_FORMAT_AR_BSD) + a->archive.archive_format_name = "ar (BSD)"; + else + a->archive.archive_format_name = "ar"; + + /* + * Remove trailing spaces from the filename. GNU and BSD + * variants both pad filename area out with spaces. + * This will only be wrong if GNU/SVR4 'ar' implementations + * omit trailing '/' for 16-char filenames and we have + * a 16-char filename that ends in ' '. + */ + p = filename + AR_name_size - 1; + while (p >= filename && *p == ' ') { + *p = '\0'; + p--; + } + + /* + * Remove trailing slash unless first character is '/'. + * (BSD entries never end in '/', so this will only trim + * GNU-format entries. GNU special entries start with '/' + * and are not terminated in '/', so we don't trim anything + * that starts with '/'.) + */ + if (filename[0] != '/' && *p == '/') + *p = '\0'; + + /* + * '//' is the GNU filename table. + * Later entries can refer to names in this table. + */ + if (strcmp(filename, "//") == 0) { + /* This must come before any call to _read_ahead. */ + ar_parse_common_header(ar, entry, h); + archive_entry_copy_pathname(entry, filename); + archive_entry_set_filetype(entry, AE_IFREG); + /* Get the size of the filename table. */ + number = ar_atol10(h + AR_size_offset, AR_size_size); + if (number > SIZE_MAX) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Filename table too large"); + return (ARCHIVE_FATAL); + } + entry_size = (size_t)number; + if (entry_size == 0) { + archive_set_error(&a->archive, EINVAL, + "Invalid string table"); + return (ARCHIVE_WARN); + } + if (ar->strtab != NULL) { + archive_set_error(&a->archive, EINVAL, + "More than one string tables exist"); + return (ARCHIVE_WARN); + } + + /* Read the filename table into memory. */ + st = malloc(entry_size); + if (st == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate filename table buffer"); + return (ARCHIVE_FATAL); + } + ar->strtab = st; + ar->strtab_size = entry_size; + if ((b = __archive_read_ahead(a, entry_size, NULL)) == NULL) + return (ARCHIVE_FATAL); + memcpy(st, b, entry_size); + __archive_read_consume(a, entry_size); + /* All contents are consumed. */ + ar->entry_bytes_remaining = 0; + archive_entry_set_size(entry, ar->entry_bytes_remaining); + + /* Parse the filename table. */ + return (ar_parse_gnu_filename_table(a)); + } + + /* + * GNU variant handles long filenames by storing / + * to indicate a name stored in the filename table. + * XXX TODO: Verify that it's all digits... Don't be fooled + * by "/9xyz" XXX + */ + if (filename[0] == '/' && filename[1] >= '0' && filename[1] <= '9') { + number = ar_atol10(h + AR_name_offset + 1, AR_name_size - 1); + /* + * If we can't look up the real name, warn and return + * the entry with the wrong name. + */ + if (ar->strtab == NULL || number > ar->strtab_size) { + archive_set_error(&a->archive, EINVAL, + "Can't find long filename for entry"); + archive_entry_copy_pathname(entry, filename); + /* Parse the time, owner, mode, size fields. */ + ar_parse_common_header(ar, entry, h); + return (ARCHIVE_WARN); + } + + archive_entry_copy_pathname(entry, &ar->strtab[(size_t)number]); + /* Parse the time, owner, mode, size fields. */ + return (ar_parse_common_header(ar, entry, h)); + } + + /* + * BSD handles long filenames by storing "#1/" followed by the + * length of filename as a decimal number, then prepends the + * the filename to the file contents. + */ + if (strncmp(filename, "#1/", 3) == 0) { + /* Parse the time, owner, mode, size fields. */ + /* This must occur before _read_ahead is called again. */ + ar_parse_common_header(ar, entry, h); + + /* Parse the size of the name, adjust the file size. */ + number = ar_atol10(h + AR_name_offset + 3, AR_name_size - 3); + bsd_name_length = (size_t)number; + /* Guard against the filename + trailing NUL + * overflowing a size_t and against the filename size + * being larger than the entire entry. */ + if (number > (uint64_t)(bsd_name_length + 1) + || (off_t)bsd_name_length > ar->entry_bytes_remaining) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Bad input file size"); + return (ARCHIVE_FATAL); + } + ar->entry_bytes_remaining -= bsd_name_length; + /* Adjust file size reported to client. */ + archive_entry_set_size(entry, ar->entry_bytes_remaining); + + /* Read the long name into memory. */ + if ((b = __archive_read_ahead(a, bsd_name_length, NULL)) == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Truncated input file"); + return (ARCHIVE_FATAL); + } + __archive_read_consume(a, bsd_name_length); + + /* Store it in the entry. */ + p = (char *)malloc(bsd_name_length + 1); + if (p == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate fname buffer"); + return (ARCHIVE_FATAL); + } + strncpy(p, b, bsd_name_length); + p[bsd_name_length] = '\0'; + archive_entry_copy_pathname(entry, p); + free(p); + return (ARCHIVE_OK); + } + + /* + * "/" is the SVR4/GNU archive symbol table. + */ + if (strcmp(filename, "/") == 0) { + archive_entry_copy_pathname(entry, "/"); + /* Parse the time, owner, mode, size fields. */ + r = ar_parse_common_header(ar, entry, h); + /* Force the file type to a regular file. */ + archive_entry_set_filetype(entry, AE_IFREG); + return (r); + } + + /* + * "__.SYMDEF" is a BSD archive symbol table. + */ + if (strcmp(filename, "__.SYMDEF") == 0) { + archive_entry_copy_pathname(entry, filename); + /* Parse the time, owner, mode, size fields. */ + return (ar_parse_common_header(ar, entry, h)); + } + + /* + * Otherwise, this is a standard entry. The filename + * has already been trimmed as much as possible, based + * on our current knowledge of the format. + */ + archive_entry_copy_pathname(entry, filename); + return (ar_parse_common_header(ar, entry, h)); +} + +static int +ar_parse_common_header(struct ar *ar, struct archive_entry *entry, + const char *h) +{ + uint64_t n; + + /* Copy remaining header */ + archive_entry_set_mtime(entry, + (time_t)ar_atol10(h + AR_date_offset, AR_date_size), 0L); + archive_entry_set_uid(entry, + (uid_t)ar_atol10(h + AR_uid_offset, AR_uid_size)); + archive_entry_set_gid(entry, + (gid_t)ar_atol10(h + AR_gid_offset, AR_gid_size)); + archive_entry_set_mode(entry, + (mode_t)ar_atol8(h + AR_mode_offset, AR_mode_size)); + n = ar_atol10(h + AR_size_offset, AR_size_size); + + ar->entry_offset = 0; + ar->entry_padding = n % 2; + archive_entry_set_size(entry, n); + ar->entry_bytes_remaining = n; + return (ARCHIVE_OK); +} + +static int +archive_read_format_ar_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + ssize_t bytes_read; + struct ar *ar; + + ar = (struct ar *)(a->format->data); + + if (ar->entry_bytes_remaining > 0) { + *buff = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read == 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Truncated ar archive"); + return (ARCHIVE_FATAL); + } + if (bytes_read < 0) + return (ARCHIVE_FATAL); + if (bytes_read > ar->entry_bytes_remaining) + bytes_read = (ssize_t)ar->entry_bytes_remaining; + *size = bytes_read; + *offset = ar->entry_offset; + ar->entry_offset += bytes_read; + ar->entry_bytes_remaining -= bytes_read; + __archive_read_consume(a, (size_t)bytes_read); + return (ARCHIVE_OK); + } else { + while (ar->entry_padding > 0) { + *buff = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read <= 0) + return (ARCHIVE_FATAL); + if (bytes_read > ar->entry_padding) + bytes_read = (ssize_t)ar->entry_padding; + __archive_read_consume(a, (size_t)bytes_read); + ar->entry_padding -= bytes_read; + } + *buff = NULL; + *size = 0; + *offset = ar->entry_offset; + return (ARCHIVE_EOF); + } +} + +static int +archive_read_format_ar_skip(struct archive_read *a) +{ + off_t bytes_skipped; + struct ar* ar; + + ar = (struct ar *)(a->format->data); + + bytes_skipped = __archive_read_skip(a, + ar->entry_bytes_remaining + ar->entry_padding); + if (bytes_skipped < 0) + return (ARCHIVE_FATAL); + + ar->entry_bytes_remaining = 0; + ar->entry_padding = 0; + + return (ARCHIVE_OK); +} + +static int +ar_parse_gnu_filename_table(struct archive_read *a) +{ + struct ar *ar; + char *p; + size_t size; + + ar = (struct ar*)(a->format->data); + size = ar->strtab_size; + + for (p = ar->strtab; p < ar->strtab + size - 1; ++p) { + if (*p == '/') { + *p++ = '\0'; + if (*p != '\n') + goto bad_string_table; + *p = '\0'; + } + } + /* + * GNU ar always pads the table to an even size. + * The pad character is either '\n' or '`'. + */ + if (p != ar->strtab + size && *p != '\n' && *p != '`') + goto bad_string_table; + + /* Enforce zero termination. */ + ar->strtab[size - 1] = '\0'; + + return (ARCHIVE_OK); + +bad_string_table: + archive_set_error(&a->archive, EINVAL, + "Invalid string table"); + free(ar->strtab); + ar->strtab = NULL; + return (ARCHIVE_WARN); +} + +static uint64_t +ar_atol8(const char *p, unsigned char_cnt) +{ + uint64_t l, limit, last_digit_limit; + unsigned int digit, base; + + base = 8; + limit = UINT64_MAX / base; + last_digit_limit = UINT64_MAX % base; + + while ((*p == ' ' || *p == '\t') && char_cnt-- > 0) + p++; + + l = 0; + digit = *p - '0'; + while (*p >= '0' && digit < base && char_cnt-- > 0) { + if (l>limit || (l == limit && digit > last_digit_limit)) { + l = UINT64_MAX; /* Truncate on overflow. */ + break; + } + l = (l * base) + digit; + digit = *++p - '0'; + } + return (l); +} + +static uint64_t +ar_atol10(const char *p, unsigned char_cnt) +{ + uint64_t l, limit, last_digit_limit; + unsigned int base, digit; + + base = 10; + limit = UINT64_MAX / base; + last_digit_limit = UINT64_MAX % base; + + while ((*p == ' ' || *p == '\t') && char_cnt-- > 0) + p++; + l = 0; + digit = *p - '0'; + while (*p >= '0' && digit < base && char_cnt-- > 0) { + if (l > limit || (l == limit && digit > last_digit_limit)) { + l = UINT64_MAX; /* Truncate on overflow. */ + break; + } + l = (l * base) + digit; + digit = *++p - '0'; + } + return (l); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_cpio.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_cpio.c new file mode 100644 index 000000000..1519f34f9 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_cpio.c @@ -0,0 +1,774 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_cpio.c,v 1.27 2008/12/06 06:45:15 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +/* #include */ /* See archive_platform.h */ +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" + +struct cpio_bin_header { + unsigned char c_magic[2]; + unsigned char c_dev[2]; + unsigned char c_ino[2]; + unsigned char c_mode[2]; + unsigned char c_uid[2]; + unsigned char c_gid[2]; + unsigned char c_nlink[2]; + unsigned char c_rdev[2]; + unsigned char c_mtime[4]; + unsigned char c_namesize[2]; + unsigned char c_filesize[4]; +}; + +struct cpio_odc_header { + char c_magic[6]; + char c_dev[6]; + char c_ino[6]; + char c_mode[6]; + char c_uid[6]; + char c_gid[6]; + char c_nlink[6]; + char c_rdev[6]; + char c_mtime[11]; + char c_namesize[6]; + char c_filesize[11]; +}; + +struct cpio_newc_header { + char c_magic[6]; + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_crc[8]; +}; + +struct links_entry { + struct links_entry *next; + struct links_entry *previous; + int links; + dev_t dev; + int64_t ino; + char *name; +}; + +#define CPIO_MAGIC 0x13141516 +struct cpio { + int magic; + int (*read_header)(struct archive_read *, struct cpio *, + struct archive_entry *, size_t *, size_t *); + struct links_entry *links_head; + struct archive_string entry_name; + struct archive_string entry_linkname; + off_t entry_bytes_remaining; + off_t entry_offset; + off_t entry_padding; +}; + +static int64_t atol16(const char *, unsigned); +static int64_t atol8(const char *, unsigned); +static int archive_read_format_cpio_bid(struct archive_read *); +static int archive_read_format_cpio_cleanup(struct archive_read *); +static int archive_read_format_cpio_read_data(struct archive_read *, + const void **, size_t *, off_t *); +static int archive_read_format_cpio_read_header(struct archive_read *, + struct archive_entry *); +static int be4(const unsigned char *); +static int find_odc_header(struct archive_read *); +static int find_newc_header(struct archive_read *); +static int header_bin_be(struct archive_read *, struct cpio *, + struct archive_entry *, size_t *, size_t *); +static int header_bin_le(struct archive_read *, struct cpio *, + struct archive_entry *, size_t *, size_t *); +static int header_newc(struct archive_read *, struct cpio *, + struct archive_entry *, size_t *, size_t *); +static int header_odc(struct archive_read *, struct cpio *, + struct archive_entry *, size_t *, size_t *); +static int is_octal(const char *, size_t); +static int is_hex(const char *, size_t); +static int le4(const unsigned char *); +static void record_hardlink(struct cpio *cpio, struct archive_entry *entry); + +int +archive_read_support_format_cpio(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct cpio *cpio; + int r; + + cpio = (struct cpio *)malloc(sizeof(*cpio)); + if (cpio == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate cpio data"); + return (ARCHIVE_FATAL); + } + memset(cpio, 0, sizeof(*cpio)); + cpio->magic = CPIO_MAGIC; + + r = __archive_read_register_format(a, + cpio, + "cpio", + archive_read_format_cpio_bid, + NULL, + archive_read_format_cpio_read_header, + archive_read_format_cpio_read_data, + NULL, + archive_read_format_cpio_cleanup); + + if (r != ARCHIVE_OK) + free(cpio); + return (ARCHIVE_OK); +} + + +static int +archive_read_format_cpio_bid(struct archive_read *a) +{ + const void *h; + const unsigned char *p; + struct cpio *cpio; + int bid; + + cpio = (struct cpio *)(a->format->data); + + if ((h = __archive_read_ahead(a, 6, NULL)) == NULL) + return (-1); + + p = (const unsigned char *)h; + bid = 0; + if (memcmp(p, "070707", 6) == 0) { + /* ASCII cpio archive (odc, POSIX.1) */ + cpio->read_header = header_odc; + bid += 48; + /* + * XXX TODO: More verification; Could check that only octal + * digits appear in appropriate header locations. XXX + */ + } else if (memcmp(p, "070701", 6) == 0) { + /* ASCII cpio archive (SVR4 without CRC) */ + cpio->read_header = header_newc; + bid += 48; + /* + * XXX TODO: More verification; Could check that only hex + * digits appear in appropriate header locations. XXX + */ + } else if (memcmp(p, "070702", 6) == 0) { + /* ASCII cpio archive (SVR4 with CRC) */ + /* XXX TODO: Flag that we should check the CRC. XXX */ + cpio->read_header = header_newc; + bid += 48; + /* + * XXX TODO: More verification; Could check that only hex + * digits appear in appropriate header locations. XXX + */ + } else if (p[0] * 256 + p[1] == 070707) { + /* big-endian binary cpio archives */ + cpio->read_header = header_bin_be; + bid += 16; + /* Is more verification possible here? */ + } else if (p[0] + p[1] * 256 == 070707) { + /* little-endian binary cpio archives */ + cpio->read_header = header_bin_le; + bid += 16; + /* Is more verification possible here? */ + } else + return (ARCHIVE_WARN); + + return (bid); +} + +static int +archive_read_format_cpio_read_header(struct archive_read *a, + struct archive_entry *entry) +{ + struct cpio *cpio; + const void *h; + size_t namelength; + size_t name_pad; + int r; + + cpio = (struct cpio *)(a->format->data); + r = (cpio->read_header(a, cpio, entry, &namelength, &name_pad)); + + if (r < ARCHIVE_WARN) + return (r); + + /* Read name from buffer. */ + h = __archive_read_ahead(a, namelength + name_pad, NULL); + if (h == NULL) + return (ARCHIVE_FATAL); + __archive_read_consume(a, namelength + name_pad); + archive_strncpy(&cpio->entry_name, (const char *)h, namelength); + archive_entry_set_pathname(entry, cpio->entry_name.s); + cpio->entry_offset = 0; + + /* If this is a symlink, read the link contents. */ + if (archive_entry_filetype(entry) == AE_IFLNK) { + h = __archive_read_ahead(a, cpio->entry_bytes_remaining, NULL); + if (h == NULL) + return (ARCHIVE_FATAL); + __archive_read_consume(a, cpio->entry_bytes_remaining); + archive_strncpy(&cpio->entry_linkname, (const char *)h, + cpio->entry_bytes_remaining); + archive_entry_set_symlink(entry, cpio->entry_linkname.s); + cpio->entry_bytes_remaining = 0; + } + + /* XXX TODO: If the full mode is 0160200, then this is a Solaris + * ACL description for the following entry. Read this body + * and parse it as a Solaris-style ACL, then read the next + * header. XXX */ + + /* Compare name to "TRAILER!!!" to test for end-of-archive. */ + if (namelength == 11 && strcmp((const char *)h, "TRAILER!!!") == 0) { + /* TODO: Store file location of start of block. */ + archive_set_error(&a->archive, 0, NULL); + return (ARCHIVE_EOF); + } + + /* Detect and record hardlinks to previously-extracted entries. */ + record_hardlink(cpio, entry); + + return (r); +} + +static int +archive_read_format_cpio_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + ssize_t bytes_read; + struct cpio *cpio; + + cpio = (struct cpio *)(a->format->data); + if (cpio->entry_bytes_remaining > 0) { + *buff = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read <= 0) + return (ARCHIVE_FATAL); + if (bytes_read > cpio->entry_bytes_remaining) + bytes_read = cpio->entry_bytes_remaining; + *size = bytes_read; + *offset = cpio->entry_offset; + cpio->entry_offset += bytes_read; + cpio->entry_bytes_remaining -= bytes_read; + __archive_read_consume(a, bytes_read); + return (ARCHIVE_OK); + } else { + while (cpio->entry_padding > 0) { + *buff = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read <= 0) + return (ARCHIVE_FATAL); + if (bytes_read > cpio->entry_padding) + bytes_read = cpio->entry_padding; + __archive_read_consume(a, bytes_read); + cpio->entry_padding -= bytes_read; + } + *buff = NULL; + *size = 0; + *offset = cpio->entry_offset; + return (ARCHIVE_EOF); + } +} + +/* + * Skip forward to the next cpio newc header by searching for the + * 07070[12] string. This should be generalized and merged with + * find_odc_header below. + */ +static int +is_hex(const char *p, size_t len) +{ + while (len-- > 0) { + if ((*p >= '0' && *p <= '9') + || (*p >= 'a' && *p <= 'f') + || (*p >= 'A' && *p <= 'F')) + ++p; + else + return (0); + } + return (1); +} + +static int +find_newc_header(struct archive_read *a) +{ + const void *h; + const char *p, *q; + size_t skip, skipped = 0; + ssize_t bytes; + + for (;;) { + h = __archive_read_ahead(a, sizeof(struct cpio_newc_header), &bytes); + if (h == NULL) + return (ARCHIVE_FATAL); + p = h; + q = p + bytes; + + /* Try the typical case first, then go into the slow search.*/ + if (memcmp("07070", p, 5) == 0 + && (p[5] == '1' || p[5] == '2') + && is_hex(p, sizeof(struct cpio_newc_header))) + return (ARCHIVE_OK); + + /* + * Scan ahead until we find something that looks + * like an odc header. + */ + while (p + sizeof(struct cpio_newc_header) < q) { + switch (p[5]) { + case '1': + case '2': + if (memcmp("07070", p, 5) == 0 + && is_hex(p, sizeof(struct cpio_newc_header))) { + skip = p - (const char *)h; + __archive_read_consume(a, skip); + skipped += skip; + if (skipped > 0) { + archive_set_error(&a->archive, + 0, + "Skipped %d bytes before " + "finding valid header", + (int)skipped); + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); + } + p += 2; + break; + case '0': + p++; + break; + default: + p += 6; + break; + } + } + skip = p - (const char *)h; + __archive_read_consume(a, skip); + skipped += skip; + } +} + +static int +header_newc(struct archive_read *a, struct cpio *cpio, + struct archive_entry *entry, size_t *namelength, size_t *name_pad) +{ + const void *h; + const struct cpio_newc_header *header; + int r; + + r = find_newc_header(a); + if (r < ARCHIVE_WARN) + return (r); + + /* Read fixed-size portion of header. */ + h = __archive_read_ahead(a, sizeof(struct cpio_newc_header), NULL); + if (h == NULL) + return (ARCHIVE_FATAL); + __archive_read_consume(a, sizeof(struct cpio_newc_header)); + + /* Parse out hex fields. */ + header = (const struct cpio_newc_header *)h; + + if (memcmp(header->c_magic, "070701", 6) == 0) { + a->archive.archive_format = ARCHIVE_FORMAT_CPIO_SVR4_NOCRC; + a->archive.archive_format_name = "ASCII cpio (SVR4 with no CRC)"; + } else if (memcmp(header->c_magic, "070702", 6) == 0) { + a->archive.archive_format = ARCHIVE_FORMAT_CPIO_SVR4_CRC; + a->archive.archive_format_name = "ASCII cpio (SVR4 with CRC)"; + } else { + /* TODO: Abort here? */ + } + + archive_entry_set_devmajor(entry, atol16(header->c_devmajor, sizeof(header->c_devmajor))); + archive_entry_set_devminor(entry, atol16(header->c_devminor, sizeof(header->c_devminor))); + archive_entry_set_ino(entry, atol16(header->c_ino, sizeof(header->c_ino))); + archive_entry_set_mode(entry, atol16(header->c_mode, sizeof(header->c_mode))); + archive_entry_set_uid(entry, atol16(header->c_uid, sizeof(header->c_uid))); + archive_entry_set_gid(entry, atol16(header->c_gid, sizeof(header->c_gid))); + archive_entry_set_nlink(entry, atol16(header->c_nlink, sizeof(header->c_nlink))); + archive_entry_set_rdevmajor(entry, atol16(header->c_rdevmajor, sizeof(header->c_rdevmajor))); + archive_entry_set_rdevminor(entry, atol16(header->c_rdevminor, sizeof(header->c_rdevminor))); + archive_entry_set_mtime(entry, atol16(header->c_mtime, sizeof(header->c_mtime)), 0); + *namelength = atol16(header->c_namesize, sizeof(header->c_namesize)); + /* Pad name to 2 more than a multiple of 4. */ + *name_pad = (2 - *namelength) & 3; + + /* + * Note: entry_bytes_remaining is at least 64 bits and + * therefore guaranteed to be big enough for a 33-bit file + * size. + */ + cpio->entry_bytes_remaining = + atol16(header->c_filesize, sizeof(header->c_filesize)); + archive_entry_set_size(entry, cpio->entry_bytes_remaining); + /* Pad file contents to a multiple of 4. */ + cpio->entry_padding = 3 & -cpio->entry_bytes_remaining; + return (r); +} + +/* + * Skip forward to the next cpio odc header by searching for the + * 070707 string. This is a hand-optimized search that could + * probably be easily generalized to handle all character-based + * cpio variants. + */ +static int +is_octal(const char *p, size_t len) +{ + while (len-- > 0) { + if (*p < '0' || *p > '7') + return (0); + ++p; + } + return (1); +} + +static int +find_odc_header(struct archive_read *a) +{ + const void *h; + const char *p, *q; + size_t skip, skipped = 0; + ssize_t bytes; + + for (;;) { + h = __archive_read_ahead(a, sizeof(struct cpio_odc_header), &bytes); + if (h == NULL) + return (ARCHIVE_FATAL); + p = h; + q = p + bytes; + + /* Try the typical case first, then go into the slow search.*/ + if (memcmp("070707", p, 6) == 0 + && is_octal(p, sizeof(struct cpio_odc_header))) + return (ARCHIVE_OK); + + /* + * Scan ahead until we find something that looks + * like an odc header. + */ + while (p + sizeof(struct cpio_odc_header) < q) { + switch (p[5]) { + case '7': + if (memcmp("070707", p, 6) == 0 + && is_octal(p, sizeof(struct cpio_odc_header))) { + skip = p - (const char *)h; + __archive_read_consume(a, skip); + skipped += skip; + if (skipped > 0) { + archive_set_error(&a->archive, + 0, + "Skipped %d bytes before " + "finding valid header", + (int)skipped); + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); + } + p += 2; + break; + case '0': + p++; + break; + default: + p += 6; + break; + } + } + skip = p - (const char *)h; + __archive_read_consume(a, skip); + skipped += skip; + } +} + +static int +header_odc(struct archive_read *a, struct cpio *cpio, + struct archive_entry *entry, size_t *namelength, size_t *name_pad) +{ + const void *h; + int r; + const struct cpio_odc_header *header; + + a->archive.archive_format = ARCHIVE_FORMAT_CPIO_POSIX; + a->archive.archive_format_name = "POSIX octet-oriented cpio"; + + /* Find the start of the next header. */ + r = find_odc_header(a); + if (r < ARCHIVE_WARN) + return (r); + + /* Read fixed-size portion of header. */ + h = __archive_read_ahead(a, sizeof(struct cpio_odc_header), NULL); + if (h == NULL) + return (ARCHIVE_FATAL); + __archive_read_consume(a, sizeof(struct cpio_odc_header)); + + /* Parse out octal fields. */ + header = (const struct cpio_odc_header *)h; + + archive_entry_set_dev(entry, atol8(header->c_dev, sizeof(header->c_dev))); + archive_entry_set_ino(entry, atol8(header->c_ino, sizeof(header->c_ino))); + archive_entry_set_mode(entry, atol8(header->c_mode, sizeof(header->c_mode))); + archive_entry_set_uid(entry, atol8(header->c_uid, sizeof(header->c_uid))); + archive_entry_set_gid(entry, atol8(header->c_gid, sizeof(header->c_gid))); + archive_entry_set_nlink(entry, atol8(header->c_nlink, sizeof(header->c_nlink))); + archive_entry_set_rdev(entry, atol8(header->c_rdev, sizeof(header->c_rdev))); + archive_entry_set_mtime(entry, atol8(header->c_mtime, sizeof(header->c_mtime)), 0); + *namelength = atol8(header->c_namesize, sizeof(header->c_namesize)); + *name_pad = 0; /* No padding of filename. */ + + /* + * Note: entry_bytes_remaining is at least 64 bits and + * therefore guaranteed to be big enough for a 33-bit file + * size. + */ + cpio->entry_bytes_remaining = + atol8(header->c_filesize, sizeof(header->c_filesize)); + archive_entry_set_size(entry, cpio->entry_bytes_remaining); + cpio->entry_padding = 0; + return (r); +} + +static int +header_bin_le(struct archive_read *a, struct cpio *cpio, + struct archive_entry *entry, size_t *namelength, size_t *name_pad) +{ + const void *h; + const struct cpio_bin_header *header; + + a->archive.archive_format = ARCHIVE_FORMAT_CPIO_BIN_LE; + a->archive.archive_format_name = "cpio (little-endian binary)"; + + /* Read fixed-size portion of header. */ + h = __archive_read_ahead(a, sizeof(struct cpio_bin_header), NULL); + if (h == NULL) + return (ARCHIVE_FATAL); + __archive_read_consume(a, sizeof(struct cpio_bin_header)); + + /* Parse out binary fields. */ + header = (const struct cpio_bin_header *)h; + + archive_entry_set_dev(entry, header->c_dev[0] + header->c_dev[1] * 256); + archive_entry_set_ino(entry, header->c_ino[0] + header->c_ino[1] * 256); + archive_entry_set_mode(entry, header->c_mode[0] + header->c_mode[1] * 256); + archive_entry_set_uid(entry, header->c_uid[0] + header->c_uid[1] * 256); + archive_entry_set_gid(entry, header->c_gid[0] + header->c_gid[1] * 256); + archive_entry_set_nlink(entry, header->c_nlink[0] + header->c_nlink[1] * 256); + archive_entry_set_rdev(entry, header->c_rdev[0] + header->c_rdev[1] * 256); + archive_entry_set_mtime(entry, le4(header->c_mtime), 0); + *namelength = header->c_namesize[0] + header->c_namesize[1] * 256; + *name_pad = *namelength & 1; /* Pad to even. */ + + cpio->entry_bytes_remaining = le4(header->c_filesize); + archive_entry_set_size(entry, cpio->entry_bytes_remaining); + cpio->entry_padding = cpio->entry_bytes_remaining & 1; /* Pad to even. */ + return (ARCHIVE_OK); +} + +static int +header_bin_be(struct archive_read *a, struct cpio *cpio, + struct archive_entry *entry, size_t *namelength, size_t *name_pad) +{ + const void *h; + const struct cpio_bin_header *header; + + a->archive.archive_format = ARCHIVE_FORMAT_CPIO_BIN_BE; + a->archive.archive_format_name = "cpio (big-endian binary)"; + + /* Read fixed-size portion of header. */ + h = __archive_read_ahead(a, sizeof(struct cpio_bin_header), NULL); + if (h == NULL) + return (ARCHIVE_FATAL); + __archive_read_consume(a, sizeof(struct cpio_bin_header)); + + /* Parse out binary fields. */ + header = (const struct cpio_bin_header *)h; + archive_entry_set_dev(entry, header->c_dev[0] * 256 + header->c_dev[1]); + archive_entry_set_ino(entry, header->c_ino[0] * 256 + header->c_ino[1]); + archive_entry_set_mode(entry, header->c_mode[0] * 256 + header->c_mode[1]); + archive_entry_set_uid(entry, header->c_uid[0] * 256 + header->c_uid[1]); + archive_entry_set_gid(entry, header->c_gid[0] * 256 + header->c_gid[1]); + archive_entry_set_nlink(entry, header->c_nlink[0] * 256 + header->c_nlink[1]); + archive_entry_set_rdev(entry, header->c_rdev[0] * 256 + header->c_rdev[1]); + archive_entry_set_mtime(entry, be4(header->c_mtime), 0); + *namelength = header->c_namesize[0] * 256 + header->c_namesize[1]; + *name_pad = *namelength & 1; /* Pad to even. */ + + cpio->entry_bytes_remaining = be4(header->c_filesize); + archive_entry_set_size(entry, cpio->entry_bytes_remaining); + cpio->entry_padding = cpio->entry_bytes_remaining & 1; /* Pad to even. */ + return (ARCHIVE_OK); +} + +static int +archive_read_format_cpio_cleanup(struct archive_read *a) +{ + struct cpio *cpio; + + cpio = (struct cpio *)(a->format->data); + /* Free inode->name map */ + while (cpio->links_head != NULL) { + struct links_entry *lp = cpio->links_head->next; + + if (cpio->links_head->name) + free(cpio->links_head->name); + free(cpio->links_head); + cpio->links_head = lp; + } + archive_string_free(&cpio->entry_name); + free(cpio); + (a->format->data) = NULL; + return (ARCHIVE_OK); +} + +static int +le4(const unsigned char *p) +{ + return ((p[0]<<16) + (p[1]<<24) + (p[2]<<0) + (p[3]<<8)); +} + + +static int +be4(const unsigned char *p) +{ + return ((p[0]<<24) + (p[1]<<16) + (p[2]<<8) + (p[3])); +} + +/* + * Note that this implementation does not (and should not!) obey + * locale settings; you cannot simply substitute strtol here, since + * it does obey locale. + */ +static int64_t +atol8(const char *p, unsigned char_cnt) +{ + int64_t l; + int digit; + + l = 0; + while (char_cnt-- > 0) { + if (*p >= '0' && *p <= '7') + digit = *p - '0'; + else + return (l); + p++; + l <<= 3; + l |= digit; + } + return (l); +} + +static int64_t +atol16(const char *p, unsigned char_cnt) +{ + int64_t l; + int digit; + + l = 0; + while (char_cnt-- > 0) { + if (*p >= 'a' && *p <= 'f') + digit = *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') + digit = *p - 'A' + 10; + else if (*p >= '0' && *p <= '9') + digit = *p - '0'; + else + return (l); + p++; + l <<= 4; + l |= digit; + } + return (l); +} + +static void +record_hardlink(struct cpio *cpio, struct archive_entry *entry) +{ + struct links_entry *le; + dev_t dev; + int64_t ino; + + dev = archive_entry_dev(entry); + ino = archive_entry_ino64(entry); + + /* + * First look in the list of multiply-linked files. If we've + * already dumped it, convert this entry to a hard link entry. + */ + for (le = cpio->links_head; le; le = le->next) { + if (le->dev == dev && le->ino == ino) { + archive_entry_copy_hardlink(entry, le->name); + + if (--le->links <= 0) { + if (le->previous != NULL) + le->previous->next = le->next; + if (le->next != NULL) + le->next->previous = le->previous; + if (cpio->links_head == le) + cpio->links_head = le->next; + free(le->name); + free(le); + } + + return; + } + } + + le = (struct links_entry *)malloc(sizeof(struct links_entry)); + if (le == NULL) + __archive_errx(1, "Out of memory adding file to list"); + if (cpio->links_head != NULL) + cpio->links_head->previous = le; + le->next = cpio->links_head; + le->previous = NULL; + cpio->links_head = le; + le->dev = dev; + le->ino = ino; + le->links = archive_entry_nlink(entry) - 1; + le->name = strdup(archive_entry_pathname(entry)); + if (le->name == NULL) + __archive_errx(1, "Out of memory adding file to list"); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_empty.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_empty.c new file mode 100644 index 000000000..f0bb75359 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_empty.c @@ -0,0 +1,93 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_empty.c,v 1.4 2008/12/06 06:45:15 kientzle Exp $"); + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" + +static int archive_read_format_empty_bid(struct archive_read *); +static int archive_read_format_empty_read_data(struct archive_read *, + const void **, size_t *, off_t *); +static int archive_read_format_empty_read_header(struct archive_read *, + struct archive_entry *); +int +archive_read_support_format_empty(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + int r; + + r = __archive_read_register_format(a, + NULL, + NULL, + archive_read_format_empty_bid, + NULL, + archive_read_format_empty_read_header, + archive_read_format_empty_read_data, + NULL, + NULL); + + return (r); +} + + +static int +archive_read_format_empty_bid(struct archive_read *a) +{ + ssize_t avail; + + (void)__archive_read_ahead(a, 1, &avail); + if (avail != 0) + return (-1); + return (1); +} + +static int +archive_read_format_empty_read_header(struct archive_read *a, + struct archive_entry *entry) +{ + (void)a; /* UNUSED */ + (void)entry; /* UNUSED */ + + a->archive.archive_format = ARCHIVE_FORMAT_EMPTY; + a->archive.archive_format_name = "Empty file"; + + return (ARCHIVE_EOF); +} + +static int +archive_read_format_empty_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + (void)a; /* UNUSED */ + (void)buff; /* UNUSED */ + (void)size; /* UNUSED */ + (void)offset; /* UNUSED */ + + return (ARCHIVE_EOF); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_iso9660.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_iso9660.c new file mode 100644 index 000000000..7d844052a --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_iso9660.c @@ -0,0 +1,2075 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * Copyright (c) 2009 Andreas Henriksson + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_iso9660.c,v 1.30 2008/12/06 06:57:45 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +/* #include */ /* See archive_platform.h */ +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#ifdef HAVE_ZLIB_H +#include +#endif + +#include "archive.h" +#include "archive_endian.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" +#include "archive_string.h" + +/* + * An overview of ISO 9660 format: + * + * Each disk is laid out as follows: + * * 32k reserved for private use + * * Volume descriptor table. Each volume descriptor + * is 2k and specifies basic format information. + * The "Primary Volume Descriptor" (PVD) is defined by the + * standard and should always be present; other volume + * descriptors include various vendor-specific extensions. + * * Files and directories. Each file/dir is specified by + * an "extent" (starting sector and length in bytes). + * Dirs are just files with directory records packed one + * after another. The PVD contains a single dir entry + * specifying the location of the root directory. Everything + * else follows from there. + * + * This module works by first reading the volume descriptors, then + * building a list of directory entries, sorted by starting + * sector. At each step, I look for the earliest dir entry that + * hasn't yet been read, seek forward to that location and read + * that entry. If it's a dir, I slurp in the new dir entries and + * add them to the heap; if it's a regular file, I return the + * corresponding archive_entry and wait for the client to request + * the file body. This strategy allows us to read most compliant + * CDs with a single pass through the data, as required by libarchive. + */ +#define LOGICAL_BLOCK_SIZE 2048 +#define SYSTEM_AREA_BLOCK 16 + +/* Structure of on-disk primary volume descriptor. */ +#define PVD_type_offset 0 +#define PVD_type_size 1 +#define PVD_id_offset (PVD_type_offset + PVD_type_size) +#define PVD_id_size 5 +#define PVD_version_offset (PVD_id_offset + PVD_id_size) +#define PVD_version_size 1 +#define PVD_reserved1_offset (PVD_version_offset + PVD_version_size) +#define PVD_reserved1_size 1 +#define PVD_system_id_offset (PVD_reserved1_offset + PVD_reserved1_size) +#define PVD_system_id_size 32 +#define PVD_volume_id_offset (PVD_system_id_offset + PVD_system_id_size) +#define PVD_volume_id_size 32 +#define PVD_reserved2_offset (PVD_volume_id_offset + PVD_volume_id_size) +#define PVD_reserved2_size 8 +#define PVD_volume_space_size_offset (PVD_reserved2_offset + PVD_reserved2_size) +#define PVD_volume_space_size_size 8 +#define PVD_reserved3_offset (PVD_volume_space_size_offset + PVD_volume_space_size_size) +#define PVD_reserved3_size 32 +#define PVD_volume_set_size_offset (PVD_reserved3_offset + PVD_reserved3_size) +#define PVD_volume_set_size_size 4 +#define PVD_volume_sequence_number_offset (PVD_volume_set_size_offset + PVD_volume_set_size_size) +#define PVD_volume_sequence_number_size 4 +#define PVD_logical_block_size_offset (PVD_volume_sequence_number_offset + PVD_volume_sequence_number_size) +#define PVD_logical_block_size_size 4 +#define PVD_path_table_size_offset (PVD_logical_block_size_offset + PVD_logical_block_size_size) +#define PVD_path_table_size_size 8 +#define PVD_type_1_path_table_offset (PVD_path_table_size_offset + PVD_path_table_size_size) +#define PVD_type_1_path_table_size 4 +#define PVD_opt_type_1_path_table_offset (PVD_type_1_path_table_offset + PVD_type_1_path_table_size) +#define PVD_opt_type_1_path_table_size 4 +#define PVD_type_m_path_table_offset (PVD_opt_type_1_path_table_offset + PVD_opt_type_1_path_table_size) +#define PVD_type_m_path_table_size 4 +#define PVD_opt_type_m_path_table_offset (PVD_type_m_path_table_offset + PVD_type_m_path_table_size) +#define PVD_opt_type_m_path_table_size 4 +#define PVD_root_directory_record_offset (PVD_opt_type_m_path_table_offset + PVD_opt_type_m_path_table_size) +#define PVD_root_directory_record_size 34 +#define PVD_volume_set_id_offset (PVD_root_directory_record_offset + PVD_root_directory_record_size) +#define PVD_volume_set_id_size 128 +#define PVD_publisher_id_offset (PVD_volume_set_id_offset + PVD_volume_set_id_size) +#define PVD_publisher_id_size 128 +#define PVD_preparer_id_offset (PVD_publisher_id_offset + PVD_publisher_id_size) +#define PVD_preparer_id_size 128 +#define PVD_application_id_offset (PVD_preparer_id_offset + PVD_preparer_id_size) +#define PVD_application_id_size 128 +#define PVD_copyright_file_id_offset (PVD_application_id_offset + PVD_application_id_size) +#define PVD_copyright_file_id_size 37 +#define PVD_abstract_file_id_offset (PVD_copyright_file_id_offset + PVD_copyright_file_id_size) +#define PVD_abstract_file_id_size 37 +#define PVD_bibliographic_file_id_offset (PVD_abstract_file_id_offset + PVD_abstract_file_id_size) +#define PVD_bibliographic_file_id_size 37 +#define PVD_creation_date_offset (PVD_bibliographic_file_id_offset + PVD_bibliographic_file_id_size) +#define PVD_creation_date_size 17 +#define PVD_modification_date_offset (PVD_creation_date_offset + PVD_creation_date_size) +#define PVD_modification_date_size 17 +#define PVD_expiration_date_offset (PVD_modification_date_offset + PVD_modification_date_size) +#define PVD_expiration_date_size 17 +#define PVD_effective_date_offset (PVD_expiration_date_offset + PVD_expiration_date_size) +#define PVD_effective_date_size 17 +#define PVD_file_structure_version_offset (PVD_effective_date_offset + PVD_effective_date_size) +#define PVD_file_structure_version_size 1 +#define PVD_reserved4_offset (PVD_file_structure_version_offset + PVD_file_structure_version_size) +#define PVD_reserved4_size 1 +#define PVD_application_data_offset (PVD_reserved4_offset + PVD_reserved4_size) +#define PVD_application_data_size 512 +#define PVD_reserved5_offset (PVD_application_data_offset + PVD_application_data_size) +#define PVD_reserved5_size (2048 - PVD_reserved5_offset) + +/* TODO: It would make future maintenance easier to just hardcode the + * above values. In particular, ECMA119 states the offsets as part of + * the standard. That would eliminate the need for the following check.*/ +#if PVD_reserved5_offset != 1395 +#error PVD offset and size definitions are wrong. +#endif + + +/* Structure of optional on-disk supplementary volume descriptor. */ +#define SVD_type_offset 0 +#define SVD_type_size 1 +#define SVD_id_offset (SVD_type_offset + SVD_type_size) +#define SVD_id_size 5 +#define SVD_version_offset (SVD_id_offset + SVD_id_size) +#define SVD_version_size 1 +/* ... */ +#define SVD_reserved1_offset 72 +#define SVD_reserved1_size 8 +#define SVD_volume_space_size_offset 80 +#define SVD_volume_space_size_size 8 +#define SVD_escape_sequences_offset (SVD_volume_space_size_offset + SVD_volume_space_size_size) +#define SVD_escape_sequences_size 32 +/* ... */ +#define SVD_logical_block_size_offset 128 +#define SVD_logical_block_size_size 4 +/* ... */ +#define SVD_root_directory_record_offset 156 +#define SVD_root_directory_record_size 34 +#define SVD_reserved2_offset 882 +#define SVD_reserved2_size 1 +#define SVD_reserved3_offset 1395 +#define SVD_reserved3_size 653 +/* ... */ +/* FIXME: validate correctness of last SVD entry offset. */ + +/* Structure of an on-disk directory record. */ +/* Note: ISO9660 stores each multi-byte integer twice, once in + * each byte order. The sizes here are the size of just one + * of the two integers. (This is why the offset of a field isn't + * the same as the offset+size of the previous field.) */ +#define DR_length_offset 0 +#define DR_length_size 1 +#define DR_ext_attr_length_offset 1 +#define DR_ext_attr_length_size 1 +#define DR_extent_offset 2 +#define DR_extent_size 4 +#define DR_size_offset 10 +#define DR_size_size 4 +#define DR_date_offset 18 +#define DR_date_size 7 +#define DR_flags_offset 25 +#define DR_flags_size 1 +#define DR_file_unit_size_offset 26 +#define DR_file_unit_size_size 1 +#define DR_interleave_offset 27 +#define DR_interleave_size 1 +#define DR_volume_sequence_number_offset 28 +#define DR_volume_sequence_number_size 2 +#define DR_name_len_offset 32 +#define DR_name_len_size 1 +#define DR_name_offset 33 + +#ifdef HAVE_ZLIB_H +static const unsigned char zisofs_magic[8] = { + 0x37, 0xE4, 0x53, 0x96, 0xC9, 0xDB, 0xD6, 0x07 +}; + +struct zisofs { + /* Set 1 if this file compressed by paged zlib */ + int pz; + int pz_log2_bs; /* Log2 of block size */ + uint64_t pz_uncompressed_size; + + int initialized; + unsigned char *uncompressed_buffer; + size_t uncompressed_buffer_size; + + uint32_t pz_offset; + unsigned char header[16]; + size_t header_avail; + int header_passed; + unsigned char *block_pointers; + size_t block_pointers_alloc; + size_t block_pointers_size; + size_t block_pointers_avail; + size_t block_off; + uint32_t block_avail; + + z_stream stream; + int stream_valid; +}; +#else +struct zisofs { + /* Set 1 if this file compressed by paged zlib */ + int pz; +}; +#endif + +/* In-memory storage for a directory record. */ +struct file_info { + struct file_info *parent; + int refcount; + uint64_t offset; /* Offset on disk. */ + uint64_t size; /* File size in bytes. */ + uint64_t ce_offset; /* Offset of CE */ + uint64_t ce_size; /* Size of CE */ + time_t birthtime; /* File created time. */ + time_t mtime; /* File last modified time. */ + time_t atime; /* File last accessed time. */ + time_t ctime; /* File attribute change time. */ + uint64_t rdev; /* Device number */ + mode_t mode; + uid_t uid; + gid_t gid; + ino_t inode; + int nlinks; + struct archive_string name; /* Pathname */ + char name_continues; /* Non-zero if name continues */ + struct archive_string symlink; + char symlink_continues; /* Non-zero if link continues */ + /* Set 1 if this file compressed by paged zlib(zisofs) */ + int pz; + int pz_log2_bs; /* Log2 of block size */ + uint64_t pz_uncompressed_size; +}; + + +struct iso9660 { + int magic; +#define ISO9660_MAGIC 0x96609660 + + int option_ignore_joliet; + int option_ignore_rockridge; + + struct archive_string pathname; + char seenRockridge; /* Set true if RR extensions are used. */ + unsigned char suspOffset; + char seenJoliet; + + uint64_t previous_offset; + uint64_t previous_size; + struct archive_string previous_pathname; + + /* TODO: Make this a heap for fast inserts and deletions. */ + struct file_info **pending_files; + int pending_files_allocated; + int pending_files_used; + + uint64_t current_position; + ssize_t logical_block_size; + uint64_t volume_size; /* Total size of volume in bytes. */ + int32_t volume_block;/* Total size of volume in logical blocks. */ + + struct vd { + int sector_number; /* Logical Sector Number. */ + uint32_t block_size; + } primary, joliet; + + off_t entry_sparse_offset; + int64_t entry_bytes_remaining; + struct zisofs entry_zisofs; +}; + +static void add_entry(struct iso9660 *iso9660, struct file_info *file); +static int archive_read_format_iso9660_bid(struct archive_read *); +static int archive_read_format_iso9660_options(struct archive_read *, + const char *, const char *); +static int archive_read_format_iso9660_cleanup(struct archive_read *); +static int archive_read_format_iso9660_read_data(struct archive_read *, + const void **, size_t *, off_t *); +static int archive_read_format_iso9660_read_data_skip(struct archive_read *); +static int archive_read_format_iso9660_read_header(struct archive_read *, + struct archive_entry *); +static const char *build_pathname(struct archive_string *, struct file_info *); +#if DEBUG +static void dump_isodirrec(FILE *, const unsigned char *isodirrec); +#endif +static time_t time_from_tm(struct tm *); +static time_t isodate17(const unsigned char *); +static time_t isodate7(const unsigned char *); +static int isVDSetTerminator(struct iso9660 *iso9660, + const unsigned char *h); +static int isJolietSVD(struct iso9660 *, const unsigned char *); +static int isPVD(struct iso9660 *, const unsigned char *); +static struct file_info *next_entry(struct iso9660 *); +static int next_entry_seek(struct archive_read *a, struct iso9660 *iso9660, + struct file_info **pfile); +static struct file_info * + parse_file_info(struct archive_read *a, + struct file_info *parent, const unsigned char *isodirrec); +static void parse_rockridge(struct iso9660 *iso9660, + struct file_info *file, const unsigned char *start, + const unsigned char *end); +static void parse_rockridge_NM1(struct file_info *, + const unsigned char *, int); +static void parse_rockridge_SL1(struct file_info *, + const unsigned char *, int); +static void parse_rockridge_TF1(struct file_info *, + const unsigned char *, int); +static void parse_rockridge_ZF1(struct file_info *, + const unsigned char *, int); +static void release_file(struct iso9660 *, struct file_info *); +static unsigned toi(const void *p, int n); + +int +archive_read_support_format_iso9660(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct iso9660 *iso9660; + int r; + + iso9660 = (struct iso9660 *)malloc(sizeof(*iso9660)); + if (iso9660 == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate iso9660 data"); + return (ARCHIVE_FATAL); + } + memset(iso9660, 0, sizeof(*iso9660)); + iso9660->magic = ISO9660_MAGIC; + + r = __archive_read_register_format(a, + iso9660, + "iso9660", + archive_read_format_iso9660_bid, + archive_read_format_iso9660_options, + archive_read_format_iso9660_read_header, + archive_read_format_iso9660_read_data, + archive_read_format_iso9660_read_data_skip, + archive_read_format_iso9660_cleanup); + + if (r != ARCHIVE_OK) { + free(iso9660); + return (r); + } + return (ARCHIVE_OK); +} + + +static int +archive_read_format_iso9660_bid(struct archive_read *a) +{ + struct iso9660 *iso9660; + ssize_t bytes_read; + const void *h; + const unsigned char *p; + int seenTerminator; + + iso9660 = (struct iso9660 *)(a->format->data); + + /* + * Skip the first 32k (reserved area) and get the first + * 8 sectors of the volume descriptor table. Of course, + * if the I/O layer gives us more, we'll take it. + */ +#define RESERVED_AREA (SYSTEM_AREA_BLOCK * LOGICAL_BLOCK_SIZE) + h = __archive_read_ahead(a, + RESERVED_AREA + 8 * LOGICAL_BLOCK_SIZE, + &bytes_read); + if (h == NULL) + return (-1); + p = (const unsigned char *)h; + + /* Skip the reserved area. */ + bytes_read -= RESERVED_AREA; + p += RESERVED_AREA; + + /* Check each volume descriptor. */ + seenTerminator = 0; + for (; bytes_read > LOGICAL_BLOCK_SIZE; + bytes_read -= LOGICAL_BLOCK_SIZE, p += LOGICAL_BLOCK_SIZE) { + int bid = 0; + + /* Do not handle undefined Volume Descriptor Type. */ + if (p[0] >= 4 && p[0] <= 254) + return (0); + /* Standard Identifier must be "CD001" */ + if (memcmp(p + 1, "CD001", 5) != 0) + return (0); + bid += isPVD(iso9660, p); + bid += isJolietSVD(iso9660, p); + if (bid == 0) { + if (isVDSetTerminator(iso9660, p)) { + seenTerminator = 1; + break; + } + return (0); + } + } + /* + * ISO 9660 format must have Primary Volume Descriptor and + * Volume Descriptor Set Terminator. + */ + if (seenTerminator && iso9660->primary.sector_number > 16) + return (48); + + /* We didn't find a valid PVD; return a bid of zero. */ + return (0); +} + +static int +archive_read_format_iso9660_options(struct archive_read *a, + const char *key, const char *val) +{ + struct iso9660 *iso9660; + + iso9660 = (struct iso9660 *)(a->format->data); + + if (strcmp(key, "joliet") == 0) { + if (val == NULL || strcmp(val, "off") == 0 || + strcmp(val, "ignore") == 0 || + strcmp(val, "disable") == 0 || + strcmp(val, "0") == 0) + iso9660->option_ignore_joliet = 1; + else + iso9660->option_ignore_joliet = 0; + return (ARCHIVE_OK); + } + if (strcmp(key, "rock-ridge") == 0) { + iso9660->option_ignore_rockridge = val == NULL; + return (ARCHIVE_OK); + } + + /* Note: The "warn" return is just to inform the options + * supervisor that we didn't handle it. It will generate + * a suitable error if noone used this option. */ + return (ARCHIVE_WARN); +} + +static int +isVDSetTerminator(struct iso9660 *iso9660, const unsigned char *h) +{ + int i; + + /* Type of the Volume Descriptor Set Terminator must be 255. */ + if (h[0] != 255) + return (0); + + /* Volume Descriptor Version must be 1. */ + if (h[6] != 1) + return (0); + + /* Reserved field must be 0. */ + for (i = 7; i < 2048; ++i) + if (h[i] != 0) + return (0); + + return (1); +} + +static int +isJolietSVD(struct iso9660 *iso9660, const unsigned char *h) +{ + const unsigned char *p; + int i; + + /* Type 2 means it's a SVD. */ + if (h[SVD_type_offset] != 2) + return (0); + + /* ID must be "CD001" */ + if (memcmp(h + SVD_id_offset, "CD001", 5) != 0) + return (0); + + /* Reserved field must be 0. */ + for (i = 0; i < SVD_reserved1_size; ++i) + if (h[SVD_reserved1_offset + i] != 0) + return (0); + for (i = 0; i < SVD_reserved2_size; ++i) + if (h[SVD_reserved2_offset + i] != 0) + return (0); + for (i = 0; i < SVD_reserved3_size; ++i) + if (h[SVD_reserved3_offset + i] != 0) + return (0); + + /* FIXME: do more validations according to joliet spec. */ + + /* check if this SVD contains joliet extension! */ + p = h + SVD_escape_sequences_offset; + /* N.B. Joliet spec says p[1] == '\\', but.... */ + if (p[0] == '%' && p[1] == '/') { + int level = 0; + + if (p[2] == '@') + level = 1; + else if (p[2] == 'C') + level = 2; + else if (p[2] == 'E') + level = 3; + else /* not joliet */ + return (0); + + iso9660->seenJoliet = level; + + } else /* not joliet */ + return (0); + + iso9660->logical_block_size = toi(h + SVD_logical_block_size_offset, 2); + if (iso9660->logical_block_size <= 0) + return (0); + + iso9660->volume_block = + archive_le32dec(h + SVD_volume_space_size_offset); + if (iso9660->volume_block <= SYSTEM_AREA_BLOCK+4) + return (0); + iso9660->volume_size = iso9660->logical_block_size + * (uint64_t)iso9660->volume_block; + + /* Read Root Directory Record in Volume Descriptor. */ + p = h + SVD_root_directory_record_offset; + if (p[DR_length_offset] != 34) + return (0); + iso9660->joliet.sector_number = archive_le32dec(p + DR_extent_offset); + iso9660->joliet.block_size = archive_le32dec(p + DR_size_offset); + + return (48); +} + +static int +isPVD(struct iso9660 *iso9660, const unsigned char *h) +{ + const unsigned char *p; + int i; + + /* Type of the Primary Volume Descriptor must be 1. */ + if (h[PVD_type_offset] != 1) + return (0); + + /* ID must be "CD001" */ + if (memcmp(h + PVD_id_offset, "CD001", 5) != 0) + return (0); + + /* PVD version must be 1. */ + if (h[PVD_version_offset] != 1) + return (0); + + /* Reserved field must be 0. */ + if (h[PVD_reserved1_offset] != 0) + return (0); + + /* Reserved field must be 0. */ + for (i = 0; i < PVD_reserved2_size; ++i) + if (h[PVD_reserved2_offset + i] != 0) + return (0); + + /* Reserved field must be 0. */ + for (i = 0; i < PVD_reserved3_size; ++i) + if (h[PVD_reserved3_offset + i] != 0) + return (0); + + /* Logical block size must be > 0. */ + /* I've looked at Ecma 119 and can't find any stronger + * restriction on this field. */ + iso9660->logical_block_size = toi(h + PVD_logical_block_size_offset, 2); + if (iso9660->logical_block_size <= 0) + return (0); + + iso9660->volume_block = + archive_le32dec(h + PVD_volume_space_size_offset); + if (iso9660->volume_block <= SYSTEM_AREA_BLOCK+4) + return (0); + iso9660->volume_size = iso9660->logical_block_size + * (uint64_t)iso9660->volume_block; + + /* File structure version must be 1 for ISO9660/ECMA119. */ + if (h[PVD_file_structure_version_offset] != 1) + return (0); + + + /* Reserved field must be 0. */ + for (i = 0; i < PVD_reserved4_size; ++i) + if (h[PVD_reserved4_offset + i] != 0) + return (0); + + /* Reserved field must be 0. */ + for (i = 0; i < PVD_reserved5_size; ++i) + if (h[PVD_reserved5_offset + i] != 0) + return (0); + + /* XXX TODO: Check other values for sanity; reject more + * malformed PVDs. XXX */ + + /* Read Root Directory Record in Volume Descriptor. */ + p = h + PVD_root_directory_record_offset; + if (p[DR_length_offset] != 34) + return (0); + iso9660->primary.sector_number = archive_le32dec(p + DR_extent_offset); + iso9660->primary.block_size = archive_le32dec(p + DR_size_offset); + + return (48); +} + +static int +archive_read_format_iso9660_read_header(struct archive_read *a, + struct archive_entry *entry) +{ + struct iso9660 *iso9660; + struct file_info *file; + int r; + + iso9660 = (struct iso9660 *)(a->format->data); + + if (!a->archive.archive_format) { + a->archive.archive_format = ARCHIVE_FORMAT_ISO9660; + a->archive.archive_format_name = "ISO9660"; + } + + if (iso9660->current_position == 0) { + int64_t skipsize; + struct vd *vd; + const void *block; + char seenJoliet; + + vd = &(iso9660->primary); + if (iso9660->seenJoliet && + vd->sector_number > iso9660->joliet.sector_number) + /* This condition is unlikely; by way of caution. */ + vd = &(iso9660->joliet); + + skipsize = LOGICAL_BLOCK_SIZE * vd->sector_number; + skipsize = __archive_read_skip(a, skipsize); + if (skipsize < 0) + return ((int)skipsize); + iso9660->current_position = skipsize; + + block = __archive_read_ahead(a, vd->block_size, NULL); + if (block == NULL) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to read full block when scanning " + "ISO9660 directory list"); + return (ARCHIVE_FATAL); + } + + /* + * While reading Root Directory, flag seenJoliet + * must be zero to avoid converting special name + * 0x00(Current Directory) and next byte to UCS2. + */ + seenJoliet = iso9660->seenJoliet;/* Save flag. */ + iso9660->seenJoliet = 0; + file = parse_file_info(a, NULL, block); + if (file == NULL) + return (ARCHIVE_FATAL); + iso9660->seenJoliet = seenJoliet; + if (vd == &(iso9660->primary) && iso9660->seenRockridge + && iso9660->seenJoliet) + /* + * If iso image has RockRidge and Joliet, + * we use RockRidge Extensions. + */ + iso9660->seenJoliet = 0; + if (vd == &(iso9660->primary) && !iso9660->seenRockridge + && iso9660->seenJoliet) { + /* Switch reading data from primary to joliet. */ + release_file(iso9660, file); + vd = &(iso9660->joliet); + skipsize = LOGICAL_BLOCK_SIZE * vd->sector_number; + skipsize -= LOGICAL_BLOCK_SIZE * + iso9660->primary.sector_number; + skipsize = __archive_read_skip(a, skipsize); + if (skipsize < 0) + return ((int)skipsize); + iso9660->current_position += skipsize; + + block = __archive_read_ahead(a, vd->block_size, NULL); + if (block == NULL) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to read full block when scanning " + "ISO9660 directory list"); + return (ARCHIVE_FATAL); + } + seenJoliet = iso9660->seenJoliet;/* Save flag. */ + iso9660->seenJoliet = 0; + file = parse_file_info(a, NULL, block); + if (file == NULL) + return (ARCHIVE_FATAL); + iso9660->seenJoliet = seenJoliet; + } + /* Store the root directory in the pending list. */ + add_entry(iso9660, file); + if (iso9660->seenRockridge) { + a->archive.archive_format = + ARCHIVE_FORMAT_ISO9660_ROCKRIDGE; + a->archive.archive_format_name = + "ISO9660 with Rockridge extensions"; + } + } + + /* Get the next entry that appears after the current offset. */ + r = next_entry_seek(a, iso9660, &file); + if (r != ARCHIVE_OK) { + release_file(iso9660, file); + return (r); + } + + iso9660->entry_bytes_remaining = file->size; + iso9660->entry_sparse_offset = 0; /* Offset for sparse-file-aware clients. */ + + if (file->offset + file->size > iso9660->volume_size) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "File is beyond end-of-media: %s", file->name); + iso9660->entry_bytes_remaining = 0; + iso9660->entry_sparse_offset = 0; + release_file(iso9660, file); + return (ARCHIVE_WARN); + } + + /* Set up the entry structure with information about this entry. */ + archive_entry_set_mode(entry, file->mode); + archive_entry_set_uid(entry, file->uid); + archive_entry_set_gid(entry, file->gid); + archive_entry_set_nlink(entry, file->nlinks); + archive_entry_set_ino(entry, file->inode); + archive_entry_set_birthtime(entry, file->birthtime, 0); + archive_entry_set_mtime(entry, file->mtime, 0); + archive_entry_set_ctime(entry, file->ctime, 0); + archive_entry_set_atime(entry, file->atime, 0); + /* N.B.: Rock Ridge supports 64-bit device numbers. */ + archive_entry_set_rdev(entry, (dev_t)file->rdev); + archive_entry_set_size(entry, iso9660->entry_bytes_remaining); + archive_string_empty(&iso9660->pathname); + archive_entry_set_pathname(entry, + build_pathname(&iso9660->pathname, file)); + if (file->symlink.s != NULL) + archive_entry_copy_symlink(entry, file->symlink.s); + + /* Note: If the input isn't seekable, we can't rewind to + * return the same body again, so if the next entry refers to + * the same data, we have to return it as a hardlink to the + * original entry. */ + /* TODO: We have enough information here to compute an + * accurate value for nlinks. We should do so and ignore + * nlinks from the RR extensions. */ + if (file->offset == iso9660->previous_offset + && file->size == iso9660->previous_size + && file->size > 0) { + archive_entry_set_hardlink(entry, + iso9660->previous_pathname.s); + archive_entry_unset_size(entry); + iso9660->entry_bytes_remaining = 0; + iso9660->entry_sparse_offset = 0; + release_file(iso9660, file); + return (ARCHIVE_OK); + } + + /* Except for the hardlink case above, if the offset of the + * next entry is before our current position, we can't seek + * backwards to extract it, so issue a warning. Note that + * this can only happen if this entry was added to the heap + * after we passed this offset, that is, only if the directory + * mentioning this entry is later than the body of the entry. + * Such layouts are very unusual; most ISO9660 writers lay out + * and record all directory information first, then store + * all file bodies. */ + /* TODO: Someday, libarchive's I/O core will support optional + * seeking. When that day comes, this code should attempt to + * seek and only return the error if the seek fails. That + * will give us support for whacky ISO images that require + * seeking while retaining the ability to read almost all ISO + * images in a streaming fashion. */ + if (file->offset < iso9660->current_position) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Ignoring out-of-order file @%x (%s) %jd < %jd", + file, + iso9660->pathname.s, + file->offset, iso9660->current_position); + iso9660->entry_bytes_remaining = 0; + iso9660->entry_sparse_offset = 0; + release_file(iso9660, file); + return (ARCHIVE_WARN); + } + + /* Initialize zisofs variables. */ + iso9660->entry_zisofs.pz = file->pz; + if (file->pz) { +#ifdef HAVE_ZLIB_H + struct zisofs *zisofs; + + zisofs = &iso9660->entry_zisofs; + zisofs->initialized = 0; + zisofs->pz_log2_bs = file->pz_log2_bs; + zisofs->pz_uncompressed_size = file->pz_uncompressed_size; + zisofs->pz_offset = 0; + zisofs->header_avail = 0; + zisofs->header_passed = 0; + zisofs->block_pointers_avail = 0; +#endif + archive_entry_set_size(entry, file->pz_uncompressed_size); + } + + iso9660->previous_size = file->size; + iso9660->previous_offset = file->offset; + archive_strcpy(&iso9660->previous_pathname, iso9660->pathname.s); + + /* If this is a directory, read in all of the entries right now. */ + if (archive_entry_filetype(entry) == AE_IFDIR) { + while (iso9660->entry_bytes_remaining > 0) { + const void *block; + const unsigned char *p; + ssize_t step = iso9660->logical_block_size; + if (step > iso9660->entry_bytes_remaining) + step = iso9660->entry_bytes_remaining; + block = __archive_read_ahead(a, step, NULL); + if (block == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Failed to read full block when scanning ISO9660 directory list"); + release_file(iso9660, file); + return (ARCHIVE_FATAL); + } + __archive_read_consume(a, step); + iso9660->current_position += step; + iso9660->entry_bytes_remaining -= step; + for (p = (const unsigned char *)block; + *p != 0 && p < (const unsigned char *)block + step; + p += *p) { + struct file_info *child; + + /* N.B.: these special directory identifiers + * are 8 bit "values" even on a + * Joliet CD with UCS-2 (16bit) encoding. + */ + + /* Skip '.' entry. */ + if (*(p + DR_name_len_offset) == 1 + && *(p + DR_name_offset) == '\0') + continue; + /* Skip '..' entry. */ + if (*(p + DR_name_len_offset) == 1 + && *(p + DR_name_offset) == '\001') + continue; + child = parse_file_info(a, file, p); + if (child == NULL) { + release_file(iso9660, file); + return (ARCHIVE_FATAL); + } + add_entry(iso9660, child); + } + } + } + + release_file(iso9660, file); + return (ARCHIVE_OK); +} + +static int +archive_read_format_iso9660_read_data_skip(struct archive_read *a) +{ + /* Because read_next_header always does an explicit skip + * to the next entry, we don't need to do anything here. */ + (void)a; /* UNUSED */ + return (ARCHIVE_OK); +} + +#ifdef HAVE_ZLIB_H + +static int +zisofs_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + struct iso9660 *iso9660; + struct zisofs *zisofs; + const unsigned char *p; + size_t avail; + ssize_t bytes_read; + size_t uncompressed_size; + int r; + + iso9660 = (struct iso9660 *)(a->format->data); + zisofs = &iso9660->entry_zisofs; + + p = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read <= 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated zisofs file body"); + return (ARCHIVE_FATAL); + } + if (bytes_read > iso9660->entry_bytes_remaining) + bytes_read = iso9660->entry_bytes_remaining; + avail = bytes_read; + uncompressed_size = 0; + + if (!zisofs->initialized) { + size_t ceil, xsize; + + /* Allocate block pointers buffer. */ + ceil = (zisofs->pz_uncompressed_size + + (1UL << zisofs->pz_log2_bs) - 1) + >> zisofs->pz_log2_bs; + xsize = (ceil + 1) * 4; + if (zisofs->block_pointers_alloc < xsize) { + size_t alloc; + + if (zisofs->block_pointers != NULL) + free(zisofs->block_pointers); + alloc = ((xsize >> 10) + 1) << 10; + zisofs->block_pointers = malloc(alloc); + if (zisofs->block_pointers == NULL) { + archive_set_error(&a->archive, ENOMEM, + "No memory for zisofs decompression"); + return (ARCHIVE_FATAL); + } + zisofs->block_pointers_alloc = alloc; + } + zisofs->block_pointers_size = xsize; + + /* Allocate uncompressed data buffer. */ + xsize = 1UL << zisofs->pz_log2_bs; + if (zisofs->uncompressed_buffer_size < xsize) { + if (zisofs->uncompressed_buffer != NULL) + free(zisofs->uncompressed_buffer); + zisofs->uncompressed_buffer = malloc(xsize); + if (zisofs->uncompressed_buffer == NULL) { + archive_set_error(&a->archive, ENOMEM, + "No memory for zisofs decompression"); + return (ARCHIVE_FATAL); + } + } + zisofs->uncompressed_buffer_size = xsize; + + /* + * Read the file header, and check the magic code of zisofs. + */ + if (zisofs->header_avail < sizeof(zisofs->header)) { + xsize = sizeof(zisofs->header) - zisofs->header_avail; + if (avail < xsize) + xsize = avail; + memcpy(zisofs->header + zisofs->header_avail, p, xsize); + zisofs->header_avail += xsize; + avail -= xsize; + p += xsize; + } + if (!zisofs->header_passed && + zisofs->header_avail == sizeof(zisofs->header)) { + int err = 0; + + if (memcmp(zisofs->header, zisofs_magic, + sizeof(zisofs_magic)) != 0) + err = 1; + if (archive_le32dec(zisofs->header + 8) + != zisofs->pz_uncompressed_size) + err = 1; + if (zisofs->header[12] != 4) + err = 1; + if (zisofs->header[13] != zisofs->pz_log2_bs) + err = 1; + if (err) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Illegal zisofs file body"); + return (ARCHIVE_FATAL); + } + zisofs->header_passed = 1; + } + /* + * Read block pointers. + */ + if (zisofs->header_passed && + zisofs->block_pointers_avail < zisofs->block_pointers_size) { + xsize = zisofs->block_pointers_size + - zisofs->block_pointers_avail; + if (avail < xsize) + xsize = avail; + memcpy(zisofs->block_pointers + + zisofs->block_pointers_avail, p, xsize); + zisofs->block_pointers_avail += xsize; + avail -= xsize; + p += xsize; + if (zisofs->block_pointers_avail + == zisofs->block_pointers_size) { + /* We've got all block pointers and initialize + * related variables. */ + zisofs->block_off = 0; + zisofs->block_avail = 0; + /* Complete a initialization */ + zisofs->initialized = 1; + } + } + + if (!zisofs->initialized) + goto next_data; /* We need more datas. */ + } + + /* + * Get block offsets from block pointers. + */ + if (zisofs->block_avail == 0) { + uint32_t bst, bed; + + if (zisofs->block_off + 4 >= zisofs->block_pointers_size) { + /* There isn't a pair of offsets. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Illegal zisofs block pointers"); + return (ARCHIVE_FATAL); + } + bst = archive_le32dec(zisofs->block_pointers + zisofs->block_off); + if (bst != zisofs->pz_offset + (bytes_read - avail)) { + /* TODO: Should we seek offset of current file by bst ? */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Illegal zisofs block pointers(cannot seek)"); + return (ARCHIVE_FATAL); + } + bed = archive_le32dec( + zisofs->block_pointers + zisofs->block_off + 4); + if (bed < bst) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Illegal zisofs block pointers"); + return (ARCHIVE_FATAL); + } + zisofs->block_avail = bed - bst; + zisofs->block_off += 4; + + /* Initialize compression library for new block. */ + if (zisofs->stream_valid) + r = inflateReset(&zisofs->stream); + else + r = inflateInit(&zisofs->stream); + if (r != Z_OK) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Can't initialize zisofs decompression."); + return (ARCHIVE_FATAL); + } + zisofs->stream_valid = 1; + zisofs->stream.total_in = 0; + zisofs->stream.total_out = 0; + } + + /* + * Make uncompressed datas. + */ + if (zisofs->block_avail == 0) { + memset(zisofs->uncompressed_buffer, 0, + zisofs->uncompressed_buffer_size); + uncompressed_size = zisofs->uncompressed_buffer_size; + } else { + zisofs->stream.next_in = (Bytef *)(uintptr_t)(const void *)p; + if (avail > zisofs->block_avail) + zisofs->stream.avail_in = zisofs->block_avail; + else + zisofs->stream.avail_in = avail; + zisofs->stream.next_out = zisofs->uncompressed_buffer; + zisofs->stream.avail_out = zisofs->uncompressed_buffer_size; + + r = inflate(&zisofs->stream, 0); + switch (r) { + case Z_OK: /* Decompressor made some progress.*/ + case Z_STREAM_END: /* Found end of stream. */ + break; + default: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "zisofs decompression failed (%d)", r); + return (ARCHIVE_FATAL); + } + uncompressed_size = + zisofs->uncompressed_buffer_size - zisofs->stream.avail_out; + avail -= zisofs->stream.next_in - p; + zisofs->block_avail -= zisofs->stream.next_in - p; + } +next_data: + bytes_read -= avail; + *buff = zisofs->uncompressed_buffer; + *size = uncompressed_size; + *offset = iso9660->entry_sparse_offset; + iso9660->entry_sparse_offset += uncompressed_size; + iso9660->entry_bytes_remaining -= bytes_read; + iso9660->current_position += bytes_read; + zisofs->pz_offset += bytes_read; + __archive_read_consume(a, bytes_read); + + return (ARCHIVE_OK); +} + +#else /* HAVE_ZLIB_H */ + +static int +zisofs_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + + (void)buff;/* UNUSED */ + (void)size;/* UNUSED */ + (void)offset;/* UNUSED */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "zisofs is not supported on this platform."); + return (ARCHIVE_FATAL); +} + +#endif /* HAVE_ZLIB_H */ + +static int +archive_read_format_iso9660_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + ssize_t bytes_read; + struct iso9660 *iso9660; + + iso9660 = (struct iso9660 *)(a->format->data); + if (iso9660->entry_bytes_remaining <= 0) { + *buff = NULL; + *size = 0; + *offset = iso9660->entry_sparse_offset; + return (ARCHIVE_EOF); + } + if (iso9660->entry_zisofs.pz) + return (zisofs_read_data(a, buff, size, offset)); + + *buff = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read == 0) + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Truncated input file"); + if (*buff == NULL) + return (ARCHIVE_FATAL); + if (bytes_read > iso9660->entry_bytes_remaining) + bytes_read = iso9660->entry_bytes_remaining; + *size = bytes_read; + *offset = iso9660->entry_sparse_offset; + iso9660->entry_sparse_offset += bytes_read; + iso9660->entry_bytes_remaining -= bytes_read; + iso9660->current_position += bytes_read; + __archive_read_consume(a, bytes_read); + return (ARCHIVE_OK); +} + +static int +archive_read_format_iso9660_cleanup(struct archive_read *a) +{ + struct iso9660 *iso9660; + struct file_info *file; + int r = ARCHIVE_OK; + + iso9660 = (struct iso9660 *)(a->format->data); + while ((file = next_entry(iso9660)) != NULL) + release_file(iso9660, file); + archive_string_free(&iso9660->pathname); + archive_string_free(&iso9660->previous_pathname); + if (iso9660->pending_files) + free(iso9660->pending_files); +#ifdef HAVE_ZLIB_H + free(iso9660->entry_zisofs.uncompressed_buffer); + free(iso9660->entry_zisofs.block_pointers); + if (iso9660->entry_zisofs.stream_valid) { + if (inflateEnd(&iso9660->entry_zisofs.stream) != Z_OK) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Failed to clean up zlib decompressor"); + r = ARCHIVE_FATAL; + } + } +#endif + free(iso9660); + (a->format->data) = NULL; + return (r); +} + +/* + * This routine parses a single ISO directory record, makes sense + * of any extensions, and stores the result in memory. + */ +static struct file_info * +parse_file_info(struct archive_read *a, struct file_info *parent, + const unsigned char *isodirrec) +{ + struct iso9660 *iso9660; + struct file_info *file; + size_t name_len; + const unsigned char *rr_start, *rr_end; + const unsigned char *p; + size_t dr_len; + int32_t offset; + int flags; + + iso9660 = (struct iso9660 *)(a->format->data); + + dr_len = (size_t)isodirrec[DR_length_offset]; + name_len = (size_t)isodirrec[DR_name_len_offset]; + offset = archive_le32dec(isodirrec + DR_extent_offset); + /* Sanity check that dr_len needs at least 34. */ + if (dr_len < 34) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Invalid length of directory record"); + return (NULL); + } + /* Sanity check that name_len doesn't exceed dr_len. */ + if (dr_len - 33 < name_len) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Invalid length of file identifier"); + return (NULL); + } + /* Sanity check that offset doesn't exceed volume block. + * Don't check lower limit of offset; it's possibillty the offset + * has negative value when file type is symbolic link or + * file size is zero. As far as I know latest mkisofs do that. + */ + if (offset >= iso9660->volume_block) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Invalid location of extent of file"); + return (NULL); + } + + /* Create a new file entry and copy data from the ISO dir record. */ + file = (struct file_info *)malloc(sizeof(*file)); + if (file == NULL) { + archive_set_error(&a->archive, ENOMEM, + "No memory for file entry"); + return (NULL); + } + memset(file, 0, sizeof(*file)); + file->parent = parent; + if (parent != NULL) + parent->refcount++; + file->offset = iso9660->logical_block_size * (uint64_t)offset; + file->size = toi(isodirrec + DR_size_offset, DR_size_size); + file->mtime = isodate7(isodirrec + DR_date_offset); + file->ctime = file->atime = file->mtime; + + p = isodirrec + DR_name_offset; + /* Rockridge extensions (if any) follow name. Compute this + * before fidgeting the name_len below. */ + rr_start = p + name_len + (name_len & 1 ? 0 : 1) + iso9660->suspOffset; + rr_end = isodirrec + isodirrec[DR_length_offset]; + + if (iso9660->seenJoliet) { + /* Joliet names are max 64 chars (128 bytes) according to spec, + * but genisoimage/mkisofs allows recording longer Joliet + * names which are 103 UCS2 characters(206 bytes) by their + * option '-joliet-long'. + */ + wchar_t wbuff[103+1], *wp; + const unsigned char *c; + + if (name_len > 206) + name_len = 206; + /* convert BE UTF-16 to wchar_t */ + for (c = p, wp = wbuff; + c < (p + name_len) && + wp < (wbuff + sizeof(wbuff)/sizeof(*wbuff) - 1); + c += 2) { + *wp++ = (((255 & (int)c[0]) << 8) | (255 & (int)c[1])); + } + *wp = L'\0'; + +#if 0 /* untested code, is it at all useful on Joliet? */ + /* trim trailing first version and dot from filename. + * + * Remember we where in UTF-16BE land! + * SEPARATOR 1 (.) and SEPARATOR 2 (;) are both + * 16 bits big endian characters on Joliet. + * + * TODO: sanitize filename? + * Joliet allows any UCS-2 char except: + * *, /, :, ;, ? and \. + */ + /* Chop off trailing ';1' from files. */ + if (*(wp-2) == ';' && *(wp-1) == '1') { + wp-=2; + *wp = L'\0'; + } + + /* Chop off trailing '.' from filenames. */ + if (*(wp-1) == '.') + *(--wp) = L'\0'; +#endif + + /* store the result in the file name field. */ + archive_strappend_w_utf8(&file->name, wbuff); + } else { + /* Chop off trailing ';1' from files. */ + if (name_len > 2 && p[name_len - 2] == ';' && + p[name_len - 1] == '1') + name_len -= 2; + /* Chop off trailing '.' from filenames. */ + if (name_len > 1 && p[name_len - 1] == '.') + --name_len; + + archive_strncpy(&file->name, (const char *)p, name_len); + } + + flags = isodirrec[DR_flags_offset]; + if (flags & 0x02) + file->mode = AE_IFDIR | 0700; + else + file->mode = AE_IFREG | 0400; + + if (!iso9660->option_ignore_rockridge) + /* Rockridge extensions overwrite information from above. */ + parse_rockridge(iso9660, file, rr_start, rr_end); + +#if DEBUG + /* DEBUGGING: Warn about attributes I don't yet fully support. */ + if ((flags & ~0x02) != 0) { + fprintf(stderr, "\n ** Unrecognized flag: "); + dump_isodirrec(stderr, isodirrec); + fprintf(stderr, "\n"); + } else if (toi(isodirrec + DR_volume_sequence_number_offset, 2) != 1) { + fprintf(stderr, "\n ** Unrecognized sequence number: "); + dump_isodirrec(stderr, isodirrec); + fprintf(stderr, "\n"); + } else if (*(isodirrec + DR_file_unit_size_offset) != 0) { + fprintf(stderr, "\n ** Unexpected file unit size: "); + dump_isodirrec(stderr, isodirrec); + fprintf(stderr, "\n"); + } else if (*(isodirrec + DR_interleave_offset) != 0) { + fprintf(stderr, "\n ** Unexpected interleave: "); + dump_isodirrec(stderr, isodirrec); + fprintf(stderr, "\n"); + } else if (*(isodirrec + DR_ext_attr_length_offset) != 0) { + fprintf(stderr, "\n ** Unexpected extended attribute length: "); + dump_isodirrec(stderr, isodirrec); + fprintf(stderr, "\n"); + } +#endif + return (file); +} + +static void +add_entry(struct iso9660 *iso9660, struct file_info *file) +{ + uint64_t file_offset, parent_offset; + int hole, parent; + + /* Expand our pending files list as necessary. */ + if (iso9660->pending_files_used >= iso9660->pending_files_allocated) { + struct file_info **new_pending_files; + int new_size = iso9660->pending_files_allocated * 2; + + if (iso9660->pending_files_allocated < 1024) + new_size = 1024; + /* Overflow might keep us from growing the list. */ + if (new_size <= iso9660->pending_files_allocated) + __archive_errx(1, "Out of memory"); + new_pending_files = (struct file_info **)malloc(new_size * sizeof(new_pending_files[0])); + if (new_pending_files == NULL) + __archive_errx(1, "Out of memory"); + memcpy(new_pending_files, iso9660->pending_files, + iso9660->pending_files_allocated * sizeof(new_pending_files[0])); + if (iso9660->pending_files != NULL) + free(iso9660->pending_files); + iso9660->pending_files = new_pending_files; + iso9660->pending_files_allocated = new_size; + } + + file_offset = file->offset + file->size; + + /* + * Start with hole at end, walk it up tree to find insertion point. + */ + hole = iso9660->pending_files_used++; + while (hole > 0) { + parent = (hole - 1)/2; + parent_offset = iso9660->pending_files[parent]->offset + + iso9660->pending_files[parent]->size; + if (file_offset >= parent_offset) { + iso9660->pending_files[hole] = file; + return; + } + // Move parent into hole <==> move hole up tree. + iso9660->pending_files[hole] = iso9660->pending_files[parent]; + hole = parent; + } + iso9660->pending_files[0] = file; +} + +static void +parse_rockridge(struct iso9660 *iso9660, struct file_info *file, + const unsigned char *p, const unsigned char *end) +{ + (void)iso9660; /* UNUSED */ + file->name_continues = 0; + file->symlink_continues = 0; + + while (p + 4 < end /* Enough space for another entry. */ + && p[0] >= 'A' && p[0] <= 'Z' /* Sanity-check 1st char of name. */ + && p[1] >= 'A' && p[1] <= 'Z' /* Sanity-check 2nd char of name. */ + && p[2] >= 4 /* Sanity-check length. */ + && p + p[2] <= end) { /* Sanity-check length. */ + const unsigned char *data = p + 4; + int data_length = p[2] - 4; + int version = p[3]; + + /* + * Yes, each 'if' here does test p[0] again. + * Otherwise, the fall-through handling to catch + * unsupported extensions doesn't work. + */ + switch(p[0]) { + case 'C': + if (p[0] == 'C' && p[1] == 'E') { + if (version == 1 && data_length == 24) { + /* + * CE extension comprises: + * 8 byte sector containing extension + * 8 byte offset w/in above sector + * 8 byte length of continuation + */ + file->ce_offset = (uint64_t)toi(data, 4) + * iso9660->logical_block_size + + toi(data + 8, 4); + file->ce_size = toi(data + 16, 4); + /* If the result is rediculous, + * ignore it. */ + if (file->ce_offset + file->ce_size + > iso9660->volume_size) { + file->ce_offset = 0; + file->ce_size = 0; + } + } + break; + } + /* FALLTHROUGH */ + case 'N': + if (p[0] == 'N' && p[1] == 'M') { + if (version == 1) + parse_rockridge_NM1(file, + data, data_length); + break; + } + /* FALLTHROUGH */ + case 'P': + if (p[0] == 'P' && p[1] == 'D') { + /* + * PD extension is padding; + * contents are always ignored. + */ + break; + } + if (p[0] == 'P' && p[1] == 'N') { + if (version == 1 && data_length == 16) { + file->rdev = toi(data,4); + file->rdev <<= 32; + file->rdev |= toi(data + 8, 4); + } + break; + } + if (p[0] == 'P' && p[1] == 'X') { + /* + * PX extension comprises: + * 8 bytes for mode, + * 8 bytes for nlinks, + * 8 bytes for uid, + * 8 bytes for gid, + * 8 bytes for inode. + */ + if (version == 1) { + if (data_length >= 8) + file->mode + = toi(data, 4); + if (data_length >= 16) + file->nlinks + = toi(data + 8, 4); + if (data_length >= 24) + file->uid + = toi(data + 16, 4); + if (data_length >= 32) + file->gid + = toi(data + 24, 4); + if (data_length >= 40) + file->inode + = toi(data + 32, 4); + } + break; + } + /* FALLTHROUGH */ + case 'R': + if (p[0] == 'R' && p[1] == 'R' && version == 1) { + iso9660->seenRockridge = 1; + /* + * RR extension comprises: + * one byte flag value + */ + /* TODO: Handle RR extension. */ + break; + } + /* FALLTHROUGH */ + case 'S': + if (p[0] == 'S' && p[1] == 'L') { + if (version == 1) + parse_rockridge_SL1(file, + data, data_length); + break; + } + if (p[0] == 'S' && p[1] == 'P' + && version == 1 && data_length == 3 + && data[0] == (unsigned char)'\xbe' + && data[1] == (unsigned char)'\xef') { + /* + * SP extension stores the suspOffset + * (Number of bytes to skip between + * filename and SUSP records.) + * It is mandatory by the SUSP standard + * (IEEE 1281). + * + * It allows SUSP to coexist with + * non-SUSP uses of the System + * Use Area by placing non-SUSP data + * before SUSP data. + * + * TODO: Add a check for 'SP' in + * first directory entry, disable all SUSP + * processing if not found. + */ + iso9660->suspOffset = data[2]; + break; + } + if (p[0] == 'S' && p[1] == 'T' + && data_length == 0 && version == 1) { + /* + * ST extension marks end of this + * block of SUSP entries. + * + * It allows SUSP to coexist with + * non-SUSP uses of the System + * Use Area by placing non-SUSP data + * after SUSP data. + */ + return; + } + case 'T': + if (p[0] == 'T' && p[1] == 'F') { + if (version == 1) + parse_rockridge_TF1(file, + data, data_length); + break; + } + /* FALLTHROUGH */ + case 'Z': + if (p[0] == 'Z' && p[1] == 'F') { + if (version == 1) + parse_rockridge_ZF1(file, + data, data_length); + break; + } + /* FALLTHROUGH */ + default: + /* The FALLTHROUGHs above leave us here for + * any unsupported extension. */ +#if DEBUG + { + const unsigned char *t; + fprintf(stderr, "\nUnsupported RRIP extension for %s\n", file->name.s); + fprintf(stderr, " %c%c(%d):", p[0], p[1], data_length); + for (t = data; t < data + data_length && t < data + 16; t++) + fprintf(stderr, " %02x", *t); + fprintf(stderr, "\n"); + } +#endif + break; + } + + + + p += p[2]; + } +} + +static void +parse_rockridge_NM1(struct file_info *file, + const unsigned char *data, int data_length) +{ + if (!file->name_continues) + archive_string_empty(&file->name); + file->name_continues = 0; + if (data_length < 1) + return; + /* + * NM version 1 extension comprises: + * 1 byte flag, value is one of: + * = 0: remainder is name + * = 1: remainder is name, next NM entry continues name + * = 2: "." + * = 4: ".." + * = 32: Implementation specific + * All other values are reserved. + */ + switch(data[0]) { + case 0: + if (data_length < 2) + return; + archive_strncat(&file->name, (const char *)data + 1, data_length - 1); + break; + case 1: + if (data_length < 2) + return; + archive_strncat(&file->name, (const char *)data + 1, data_length - 1); + file->name_continues = 1; + break; + case 2: + archive_strcat(&file->name, "."); + break; + case 4: + archive_strcat(&file->name, ".."); + break; + default: + return; + } + +} + +static void +parse_rockridge_TF1(struct file_info *file, const unsigned char *data, + int data_length) +{ + char flag; + /* + * TF extension comprises: + * one byte flag + * create time (optional) + * modify time (optional) + * access time (optional) + * attribute time (optional) + * Time format and presence of fields + * is controlled by flag bits. + */ + if (data_length < 1) + return; + flag = data[0]; + ++data; + --data_length; + if (flag & 0x80) { + /* Use 17-byte time format. */ + if ((flag & 1) && data_length >= 17) { + /* Create time. */ + file->birthtime = isodate17(data); + data += 17; + data_length -= 17; + } + if ((flag & 2) && data_length >= 17) { + /* Modify time. */ + file->mtime = isodate17(data); + data += 17; + data_length -= 17; + } + if ((flag & 4) && data_length >= 17) { + /* Access time. */ + file->atime = isodate17(data); + data += 17; + data_length -= 17; + } + if ((flag & 8) && data_length >= 17) { + /* Attribute change time. */ + file->ctime = isodate17(data); + data += 17; + data_length -= 17; + } + } else { + /* Use 7-byte time format. */ + if ((flag & 1) && data_length >= 7) { + /* Create time. */ + file->birthtime = isodate17(data); + data += 7; + data_length -= 7; + } + if ((flag & 2) && data_length >= 7) { + /* Modify time. */ + file->mtime = isodate7(data); + data += 7; + data_length -= 7; + } + if ((flag & 4) && data_length >= 7) { + /* Access time. */ + file->atime = isodate7(data); + data += 7; + data_length -= 7; + } + if ((flag & 8) && data_length >= 7) { + /* Attribute change time. */ + file->ctime = isodate7(data); + data += 7; + data_length -= 7; + } + } +} + +static void +parse_rockridge_SL1(struct file_info *file, const unsigned char *data, + int data_length) +{ + const char *separator = ""; + + if (!file->symlink_continues || file->symlink.length < 1) + archive_string_empty(&file->symlink); + else if (file->symlink.s[file->symlink.length - 1] != '/') + separator = "/"; + file->symlink_continues = 0; + + /* + * Defined flag values: + * 0: This is the last SL record for this symbolic link + * 1: this symbolic link field continues in next SL entry + * All other values are reserved. + */ + if (data_length < 1) + return; + switch(*data) { + case 0: + break; + case 1: + file->symlink_continues = 1; + break; + default: + return; + } + ++data; /* Skip flag byte. */ + --data_length; + + /* + * SL extension body stores "components". + * Basically, this is a complicated way of storing + * a POSIX path. It also interferes with using + * symlinks for storing non-path data. + * + * Each component is 2 bytes (flag and length) + * possibly followed by name data. + */ + while (data_length >= 2) { + unsigned char flag = *data++; + unsigned char nlen = *data++; + data_length -= 2; + + archive_strcat(&file->symlink, separator); + separator = "/"; + + switch(flag) { + case 0: /* Usual case, this is text. */ + if (data_length < nlen) + return; + archive_strncat(&file->symlink, + (const char *)data, nlen); + break; + case 0x01: /* Text continues in next component. */ + if (data_length < nlen) + return; + archive_strncat(&file->symlink, + (const char *)data, nlen); + separator = ""; + break; + case 0x02: /* Current dir. */ + archive_strcat(&file->symlink, "."); + break; + case 0x04: /* Parent dir. */ + archive_strcat(&file->symlink, ".."); + break; + case 0x08: /* Root of filesystem. */ + archive_strcat(&file->symlink, "/"); + separator = ""; + break; + case 0x10: /* Undefined (historically "volume root" */ + archive_string_empty(&file->symlink); + archive_strcat(&file->symlink, "ROOT"); + break; + case 0x20: /* Undefined (historically "hostname") */ + archive_strcat(&file->symlink, "hostname"); + break; + default: + /* TODO: issue a warning ? */ + return; + } + data += nlen; + data_length -= nlen; + } +} + +static void +parse_rockridge_ZF1(struct file_info *file, const unsigned char *data, + int data_length) +{ + + if (data[0] == 0x70 && data[1] == 0x7a && data_length == 12) { + /* paged zlib */ + file->pz = 1; + file->pz_log2_bs = data[3]; + file->pz_uncompressed_size = archive_le32dec(&data[4]); + } +} + + +static void +release_file(struct iso9660 *iso9660, struct file_info *file) +{ + struct file_info *parent; + + if (file == NULL) + return; + + if (file->refcount == 0) { + parent = file->parent; + archive_string_free(&file->name); + archive_string_free(&file->symlink); + free(file); + if (parent != NULL) { + parent->refcount--; + release_file(iso9660, parent); + } + } +} + +static int +next_entry_seek(struct archive_read *a, struct iso9660 *iso9660, + struct file_info **pfile) +{ + struct file_info *file; + uint64_t offset; + + *pfile = NULL; + for (;;) { + *pfile = file = next_entry(iso9660); + if (file == NULL) + return (ARCHIVE_EOF); + + /* CE area precedes actual file data? Ignore it. */ + if (file->ce_offset > file->offset) { + /* fprintf(stderr, " *** Discarding CE data.\n"); */ + file->ce_offset = 0; + file->ce_size = 0; + } + + /* Don't waste time seeking for zero-length bodies. */ + if (file->size == 0) { + file->offset = iso9660->current_position; + } + + /* If CE exists, find and read it now. */ + if (file->ce_offset > 0) + offset = file->ce_offset; + else + offset = file->offset; + + /* Seek forward to the start of the entry. */ + if (iso9660->current_position < offset) { + off_t step = offset - iso9660->current_position; + off_t bytes_read; + bytes_read = __archive_read_skip(a, step); + if (bytes_read < 0) + return (bytes_read); + iso9660->current_position = offset; + } + + /* We found body of file; handle it now. */ + if (offset == file->offset) + return (ARCHIVE_OK); + + /* Found CE? Process it and push the file back onto list. */ + if (offset == file->ce_offset) { + const void *p; + ssize_t size = file->ce_size; + const unsigned char *rr_start; + + file->ce_offset = 0; + file->ce_size = 0; + p = __archive_read_ahead(a, size, NULL); + if (p == NULL) + return (ARCHIVE_FATAL); + rr_start = (const unsigned char *)p; + parse_rockridge(iso9660, file, rr_start, + rr_start + size); + __archive_read_consume(a, size); + iso9660->current_position += size; + add_entry(iso9660, file); + } + } +} + +static struct file_info * +next_entry(struct iso9660 *iso9660) +{ + uint64_t a_offset, b_offset, c_offset; + int a, b, c; + struct file_info *r, *tmp; + + if (iso9660->pending_files_used < 1) + return (NULL); + + /* + * The first file in the list is the earliest; we'll return this. + */ + r = iso9660->pending_files[0]; + + /* + * Move the last item in the heap to the root of the tree + */ + iso9660->pending_files[0] + = iso9660->pending_files[--iso9660->pending_files_used]; + + /* + * Rebalance the heap. + */ + a = 0; // Starting element and its offset + a_offset = iso9660->pending_files[a]->offset + + iso9660->pending_files[a]->size; + for (;;) { + b = a + a + 1; // First child + if (b >= iso9660->pending_files_used) + return (r); + b_offset = iso9660->pending_files[b]->offset + + iso9660->pending_files[b]->size; + c = b + 1; // Use second child if it is smaller. + if (c < iso9660->pending_files_used) { + c_offset = iso9660->pending_files[c]->offset + + iso9660->pending_files[c]->size; + if (c_offset < b_offset) { + b = c; + b_offset = c_offset; + } + } + if (a_offset <= b_offset) + return (r); + tmp = iso9660->pending_files[a]; + iso9660->pending_files[a] = iso9660->pending_files[b]; + iso9660->pending_files[b] = tmp; + a = b; + } +} + +static unsigned int +toi(const void *p, int n) +{ + const unsigned char *v = (const unsigned char *)p; + if (n > 1) + return v[0] + 256 * toi(v + 1, n - 1); + if (n == 1) + return v[0]; + return (0); +} + +static time_t +isodate7(const unsigned char *v) +{ + struct tm tm; + int offset; + memset(&tm, 0, sizeof(tm)); + tm.tm_year = v[0]; + tm.tm_mon = v[1] - 1; + tm.tm_mday = v[2]; + tm.tm_hour = v[3]; + tm.tm_min = v[4]; + tm.tm_sec = v[5]; + /* v[6] is the signed timezone offset, in 1/4-hour increments. */ + offset = ((const signed char *)v)[6]; + if (offset > -48 && offset < 52) { + tm.tm_hour -= offset / 4; + tm.tm_min -= (offset % 4) * 15; + } + return (time_from_tm(&tm)); +} + +static time_t +isodate17(const unsigned char *v) +{ + struct tm tm; + int offset; + memset(&tm, 0, sizeof(tm)); + tm.tm_year = (v[0] - '0') * 1000 + (v[1] - '0') * 100 + + (v[2] - '0') * 10 + (v[3] - '0') + - 1900; + tm.tm_mon = (v[4] - '0') * 10 + (v[5] - '0'); + tm.tm_mday = (v[6] - '0') * 10 + (v[7] - '0'); + tm.tm_hour = (v[8] - '0') * 10 + (v[9] - '0'); + tm.tm_min = (v[10] - '0') * 10 + (v[11] - '0'); + tm.tm_sec = (v[12] - '0') * 10 + (v[13] - '0'); + /* v[16] is the signed timezone offset, in 1/4-hour increments. */ + offset = ((const signed char *)v)[16]; + if (offset > -48 && offset < 52) { + tm.tm_hour -= offset / 4; + tm.tm_min -= (offset % 4) * 15; + } + return (time_from_tm(&tm)); +} + +static time_t +time_from_tm(struct tm *t) +{ +#if HAVE_TIMEGM + /* Use platform timegm() if available. */ + return (timegm(t)); +#else + /* Else use direct calculation using POSIX assumptions. */ + /* First, fix up tm_yday based on the year/month/day. */ + mktime(t); + /* Then we can compute timegm() from first principles. */ + return (t->tm_sec + t->tm_min * 60 + t->tm_hour * 3600 + + t->tm_yday * 86400 + (t->tm_year - 70) * 31536000 + + ((t->tm_year - 69) / 4) * 86400 - + ((t->tm_year - 1) / 100) * 86400 + + ((t->tm_year + 299) / 400) * 86400); +#endif +} + +static const char * +build_pathname(struct archive_string *as, struct file_info *file) +{ + if (file->parent != NULL && archive_strlen(&file->parent->name) > 0) { + build_pathname(as, file->parent); + archive_strcat(as, "/"); + } + if (archive_strlen(&file->name) == 0) + archive_strcat(as, "."); + else + archive_string_concat(as, &file->name); + return (as->s); +} + +#if DEBUG +static void +dump_isodirrec(FILE *out, const unsigned char *isodirrec) +{ + fprintf(out, " l %d,", + toi(isodirrec + DR_length_offset, DR_length_size)); + fprintf(out, " a %d,", + toi(isodirrec + DR_ext_attr_length_offset, DR_ext_attr_length_size)); + fprintf(out, " ext 0x%x,", + toi(isodirrec + DR_extent_offset, DR_extent_size)); + fprintf(out, " s %d,", + toi(isodirrec + DR_size_offset, DR_extent_size)); + fprintf(out, " f 0x%02x,", + toi(isodirrec + DR_flags_offset, DR_flags_size)); + fprintf(out, " u %d,", + toi(isodirrec + DR_file_unit_size_offset, DR_file_unit_size_size)); + fprintf(out, " ilv %d,", + toi(isodirrec + DR_interleave_offset, DR_interleave_size)); + fprintf(out, " seq %d,", + toi(isodirrec + DR_volume_sequence_number_offset, DR_volume_sequence_number_size)); + fprintf(out, " nl %d:", + toi(isodirrec + DR_name_len_offset, DR_name_len_size)); + fprintf(out, " `%.*s'", + toi(isodirrec + DR_name_len_offset, DR_name_len_size), isodirrec + DR_name_offset); +} +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_mtree.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_mtree.c new file mode 100644 index 000000000..3bcb1a84e --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_mtree.c @@ -0,0 +1,1309 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * Copyright (c) 2008 Joerg Sonnenberger + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_mtree.c,v 1.11 2008/12/06 06:45:15 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#include +/* #include */ /* See archive_platform.h */ +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" +#include "archive_string.h" + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#define MTREE_HAS_DEVICE 0x0001 +#define MTREE_HAS_FFLAGS 0x0002 +#define MTREE_HAS_GID 0x0004 +#define MTREE_HAS_GNAME 0x0008 +#define MTREE_HAS_MTIME 0x0010 +#define MTREE_HAS_NLINK 0x0020 +#define MTREE_HAS_PERM 0x0040 +#define MTREE_HAS_SIZE 0x0080 +#define MTREE_HAS_TYPE 0x0100 +#define MTREE_HAS_UID 0x0200 +#define MTREE_HAS_UNAME 0x0400 + +#define MTREE_HAS_OPTIONAL 0x0800 + +struct mtree_option { + struct mtree_option *next; + char *value; +}; + +struct mtree_entry { + struct mtree_entry *next; + struct mtree_option *options; + char *name; + char full; + char used; +}; + +struct mtree { + struct archive_string line; + size_t buffsize; + char *buff; + off_t offset; + int fd; + int filetype; + int archive_format; + const char *archive_format_name; + struct mtree_entry *entries; + struct mtree_entry *this_entry; + struct archive_string current_dir; + struct archive_string contents_name; + + struct archive_entry_linkresolver *resolver; + + off_t cur_size, cur_offset; +}; + +static int cleanup(struct archive_read *); +static int mtree_bid(struct archive_read *); +static int parse_file(struct archive_read *, struct archive_entry *, + struct mtree *, struct mtree_entry *, int *); +static void parse_escapes(char *, struct mtree_entry *); +static int parse_line(struct archive_read *, struct archive_entry *, + struct mtree *, struct mtree_entry *, int *); +static int parse_keyword(struct archive_read *, struct mtree *, + struct archive_entry *, struct mtree_option *, int *); +static int read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset); +static ssize_t readline(struct archive_read *, struct mtree *, char **, ssize_t); +static int skip(struct archive_read *a); +static int read_header(struct archive_read *, + struct archive_entry *); +static int64_t mtree_atol10(char **); +static int64_t mtree_atol8(char **); +static int64_t mtree_atol(char **); + +static void +free_options(struct mtree_option *head) +{ + struct mtree_option *next; + + for (; head != NULL; head = next) { + next = head->next; + free(head->value); + free(head); + } +} + +int +archive_read_support_format_mtree(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct mtree *mtree; + int r; + + mtree = (struct mtree *)malloc(sizeof(*mtree)); + if (mtree == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate mtree data"); + return (ARCHIVE_FATAL); + } + memset(mtree, 0, sizeof(*mtree)); + mtree->fd = -1; + + r = __archive_read_register_format(a, mtree, "mtree", + mtree_bid, NULL, read_header, read_data, skip, cleanup); + + if (r != ARCHIVE_OK) + free(mtree); + return (ARCHIVE_OK); +} + +static int +cleanup(struct archive_read *a) +{ + struct mtree *mtree; + struct mtree_entry *p, *q; + + mtree = (struct mtree *)(a->format->data); + + p = mtree->entries; + while (p != NULL) { + q = p->next; + free(p->name); + free_options(p->options); + free(p); + p = q; + } + archive_string_free(&mtree->line); + archive_string_free(&mtree->current_dir); + archive_string_free(&mtree->contents_name); + archive_entry_linkresolver_free(mtree->resolver); + + free(mtree->buff); + free(mtree); + (a->format->data) = NULL; + return (ARCHIVE_OK); +} + + +static int +mtree_bid(struct archive_read *a) +{ + const char *signature = "#mtree"; + const char *p; + + /* Now let's look at the actual header and see if it matches. */ + p = __archive_read_ahead(a, strlen(signature), NULL); + if (p == NULL) + return (-1); + + if (strncmp(p, signature, strlen(signature)) == 0) + return (8 * strlen(signature)); + return (0); +} + +/* + * The extended mtree format permits multiple lines specifying + * attributes for each file. For those entries, only the last line + * is actually used. Practically speaking, that means we have + * to read the entire mtree file into memory up front. + * + * The parsing is done in two steps. First, it is decided if a line + * changes the global defaults and if it is, processed accordingly. + * Otherwise, the options of the line are merged with the current + * global options. + */ +static int +add_option(struct archive_read *a, struct mtree_option **global, + const char *value, size_t len) +{ + struct mtree_option *option; + + if ((option = malloc(sizeof(*option))) == NULL) { + archive_set_error(&a->archive, errno, "Can't allocate memory"); + return (ARCHIVE_FATAL); + } + if ((option->value = malloc(len + 1)) == NULL) { + free(option); + archive_set_error(&a->archive, errno, "Can't allocate memory"); + return (ARCHIVE_FATAL); + } + memcpy(option->value, value, len); + option->value[len] = '\0'; + option->next = *global; + *global = option; + return (ARCHIVE_OK); +} + +static void +remove_option(struct mtree_option **global, const char *value, size_t len) +{ + struct mtree_option *iter, *last; + + last = NULL; + for (iter = *global; iter != NULL; last = iter, iter = iter->next) { + if (strncmp(iter->value, value, len) == 0 && + (iter->value[len] == '\0' || + iter->value[len] == '=')) + break; + } + if (iter == NULL) + return; + if (last == NULL) + *global = iter->next; + else + last->next = iter->next; + + free(iter->value); + free(iter); +} + +static int +process_global_set(struct archive_read *a, + struct mtree_option **global, const char *line) +{ + const char *next, *eq; + size_t len; + int r; + + line += 4; + for (;;) { + next = line + strspn(line, " \t\r\n"); + if (*next == '\0') + return (ARCHIVE_OK); + line = next; + next = line + strcspn(line, " \t\r\n"); + eq = strchr(line, '='); + if (eq > next) + len = next - line; + else + len = eq - line; + + remove_option(global, line, len); + r = add_option(a, global, line, next - line); + if (r != ARCHIVE_OK) + return (r); + line = next; + } +} + +static int +process_global_unset(struct archive_read *a, + struct mtree_option **global, const char *line) +{ + const char *next; + size_t len; + + line += 6; + if (strchr(line, '=') != NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "/unset shall not contain `='"); + return ARCHIVE_FATAL; + } + + for (;;) { + next = line + strspn(line, " \t\r\n"); + if (*next == '\0') + return (ARCHIVE_OK); + line = next; + len = strcspn(line, " \t\r\n"); + + if (len == 3 && strncmp(line, "all", 3) == 0) { + free_options(*global); + *global = NULL; + } else { + remove_option(global, line, len); + } + + line += len; + } +} + +static int +process_add_entry(struct archive_read *a, struct mtree *mtree, + struct mtree_option **global, const char *line, + struct mtree_entry **last_entry) +{ + struct mtree_entry *entry; + struct mtree_option *iter; + const char *next, *eq; + size_t len; + int r; + + if ((entry = malloc(sizeof(*entry))) == NULL) { + archive_set_error(&a->archive, errno, "Can't allocate memory"); + return (ARCHIVE_FATAL); + } + entry->next = NULL; + entry->options = NULL; + entry->name = NULL; + entry->used = 0; + entry->full = 0; + + /* Add this entry to list. */ + if (*last_entry == NULL) + mtree->entries = entry; + else + (*last_entry)->next = entry; + *last_entry = entry; + + len = strcspn(line, " \t\r\n"); + if ((entry->name = malloc(len + 1)) == NULL) { + archive_set_error(&a->archive, errno, "Can't allocate memory"); + return (ARCHIVE_FATAL); + } + + memcpy(entry->name, line, len); + entry->name[len] = '\0'; + parse_escapes(entry->name, entry); + + line += len; + for (iter = *global; iter != NULL; iter = iter->next) { + r = add_option(a, &entry->options, iter->value, + strlen(iter->value)); + if (r != ARCHIVE_OK) + return (r); + } + + for (;;) { + next = line + strspn(line, " \t\r\n"); + if (*next == '\0') + return (ARCHIVE_OK); + line = next; + next = line + strcspn(line, " \t\r\n"); + eq = strchr(line, '='); + if (eq > next) + len = next - line; + else + len = eq - line; + + remove_option(&entry->options, line, len); + r = add_option(a, &entry->options, line, next - line); + if (r != ARCHIVE_OK) + return (r); + line = next; + } +} + +static int +read_mtree(struct archive_read *a, struct mtree *mtree) +{ + ssize_t len; + uintmax_t counter; + char *p; + struct mtree_option *global; + struct mtree_entry *last_entry; + int r; + + mtree->archive_format = ARCHIVE_FORMAT_MTREE; + mtree->archive_format_name = "mtree"; + + global = NULL; + last_entry = NULL; + r = ARCHIVE_OK; + + for (counter = 1; ; ++counter) { + len = readline(a, mtree, &p, 256); + if (len == 0) { + mtree->this_entry = mtree->entries; + free_options(global); + return (ARCHIVE_OK); + } + if (len < 0) { + free_options(global); + return (len); + } + /* Leading whitespace is never significant, ignore it. */ + while (*p == ' ' || *p == '\t') { + ++p; + --len; + } + /* Skip content lines and blank lines. */ + if (*p == '#') + continue; + if (*p == '\r' || *p == '\n' || *p == '\0') + continue; + if (*p != '/') { + r = process_add_entry(a, mtree, &global, p, + &last_entry); + } else if (strncmp(p, "/set", 4) == 0) { + if (p[4] != ' ' && p[4] != '\t') + break; + r = process_global_set(a, &global, p); + } else if (strncmp(p, "/unset", 6) == 0) { + if (p[6] != ' ' && p[6] != '\t') + break; + r = process_global_unset(a, &global, p); + } else + break; + + if (r != ARCHIVE_OK) { + free_options(global); + return r; + } + } + + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Can't parse line %ju", counter); + free_options(global); + return (ARCHIVE_FATAL); +} + +/* + * Read in the entire mtree file into memory on the first request. + * Then use the next unused file to satisfy each header request. + */ +static int +read_header(struct archive_read *a, struct archive_entry *entry) +{ + struct mtree *mtree; + char *p; + int r, use_next; + + mtree = (struct mtree *)(a->format->data); + + if (mtree->fd >= 0) { + close(mtree->fd); + mtree->fd = -1; + } + + if (mtree->entries == NULL) { + mtree->resolver = archive_entry_linkresolver_new(); + if (mtree->resolver == NULL) + return ARCHIVE_FATAL; + archive_entry_linkresolver_set_strategy(mtree->resolver, + ARCHIVE_FORMAT_MTREE); + r = read_mtree(a, mtree); + if (r != ARCHIVE_OK) + return (r); + } + + a->archive.archive_format = mtree->archive_format; + a->archive.archive_format_name = mtree->archive_format_name; + + for (;;) { + if (mtree->this_entry == NULL) + return (ARCHIVE_EOF); + if (strcmp(mtree->this_entry->name, "..") == 0) { + mtree->this_entry->used = 1; + if (archive_strlen(&mtree->current_dir) > 0) { + /* Roll back current path. */ + p = mtree->current_dir.s + + mtree->current_dir.length - 1; + while (p >= mtree->current_dir.s && *p != '/') + --p; + if (p >= mtree->current_dir.s) + --p; + mtree->current_dir.length + = p - mtree->current_dir.s + 1; + } + } + if (!mtree->this_entry->used) { + use_next = 0; + r = parse_file(a, entry, mtree, mtree->this_entry, &use_next); + if (use_next == 0) + return (r); + } + mtree->this_entry = mtree->this_entry->next; + } +} + +/* + * A single file can have multiple lines contribute specifications. + * Parse as many lines as necessary, then pull additional information + * from a backing file on disk as necessary. + */ +static int +parse_file(struct archive_read *a, struct archive_entry *entry, + struct mtree *mtree, struct mtree_entry *mentry, int *use_next) +{ + const char *path; + struct stat st_storage, *st; + struct mtree_entry *mp; + struct archive_entry *sparse_entry; + int r = ARCHIVE_OK, r1, parsed_kws, mismatched_type; + + mentry->used = 1; + + /* Initialize reasonable defaults. */ + mtree->filetype = AE_IFREG; + archive_entry_set_size(entry, 0); + + /* Parse options from this line. */ + parsed_kws = 0; + r = parse_line(a, entry, mtree, mentry, &parsed_kws); + + if (mentry->full) { + archive_entry_copy_pathname(entry, mentry->name); + /* + * "Full" entries are allowed to have multiple lines + * and those lines aren't required to be adjacent. We + * don't support multiple lines for "relative" entries + * nor do we make any attempt to merge data from + * separate "relative" and "full" entries. (Merging + * "relative" and "full" entries would require dealing + * with pathname canonicalization, which is a very + * tricky subject.) + */ + for (mp = mentry->next; mp != NULL; mp = mp->next) { + if (mp->full && !mp->used + && strcmp(mentry->name, mp->name) == 0) { + /* Later lines override earlier ones. */ + mp->used = 1; + r1 = parse_line(a, entry, mtree, mp, + &parsed_kws); + if (r1 < r) + r = r1; + } + } + } else { + /* + * Relative entries require us to construct + * the full path and possibly update the + * current directory. + */ + size_t n = archive_strlen(&mtree->current_dir); + if (n > 0) + archive_strcat(&mtree->current_dir, "/"); + archive_strcat(&mtree->current_dir, mentry->name); + archive_entry_copy_pathname(entry, mtree->current_dir.s); + if (archive_entry_filetype(entry) != AE_IFDIR) + mtree->current_dir.length = n; + } + + /* + * Try to open and stat the file to get the real size + * and other file info. It would be nice to avoid + * this here so that getting a listing of an mtree + * wouldn't require opening every referenced contents + * file. But then we wouldn't know the actual + * contents size, so I don't see a really viable way + * around this. (Also, we may want to someday pull + * other unspecified info from the contents file on + * disk.) + */ + mtree->fd = -1; + if (archive_strlen(&mtree->contents_name) > 0) + path = mtree->contents_name.s; + else + path = archive_entry_pathname(entry); + + if (archive_entry_filetype(entry) == AE_IFREG || + archive_entry_filetype(entry) == AE_IFDIR) { + mtree->fd = open(path, O_RDONLY | O_BINARY); + if (mtree->fd == -1 && + (errno != ENOENT || + archive_strlen(&mtree->contents_name) > 0)) { + archive_set_error(&a->archive, errno, + "Can't open %s", path); + r = ARCHIVE_WARN; + } + } + + st = &st_storage; + if (mtree->fd >= 0) { + if (fstat(mtree->fd, st) == -1) { + archive_set_error(&a->archive, errno, + "Could not fstat %s", path); + r = ARCHIVE_WARN; + /* If we can't stat it, don't keep it open. */ + close(mtree->fd); + mtree->fd = -1; + st = NULL; + } + } else if (lstat(path, st) == -1) { + st = NULL; + } + + /* + * If there is a contents file on disk, use that size; + * otherwise leave it as-is (it might have been set from + * the mtree size= keyword). + */ + if (st != NULL) { + mismatched_type = 0; + if ((st->st_mode & S_IFMT) == S_IFREG && + archive_entry_filetype(entry) != AE_IFREG) + mismatched_type = 1; + if ((st->st_mode & S_IFMT) == S_IFLNK && + archive_entry_filetype(entry) != AE_IFLNK) + mismatched_type = 1; + if ((st->st_mode & S_IFSOCK) == S_IFSOCK && + archive_entry_filetype(entry) != AE_IFSOCK) + mismatched_type = 1; + if ((st->st_mode & S_IFMT) == S_IFCHR && + archive_entry_filetype(entry) != AE_IFCHR) + mismatched_type = 1; + if ((st->st_mode & S_IFMT) == S_IFBLK && + archive_entry_filetype(entry) != AE_IFBLK) + mismatched_type = 1; + if ((st->st_mode & S_IFMT) == S_IFDIR && + archive_entry_filetype(entry) != AE_IFDIR) + mismatched_type = 1; + if ((st->st_mode & S_IFMT) == S_IFIFO && + archive_entry_filetype(entry) != AE_IFIFO) + mismatched_type = 1; + + if (mismatched_type) { + if ((parsed_kws & MTREE_HAS_OPTIONAL) == 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "mtree specification has different type for %s", + archive_entry_pathname(entry)); + r = ARCHIVE_WARN; + } else { + *use_next = 1; + } + /* Don't hold a non-regular file open. */ + if (mtree->fd >= 0) + close(mtree->fd); + mtree->fd = -1; + st = NULL; + return r; + } + } + + if (st != NULL) { + if ((parsed_kws & MTREE_HAS_DEVICE) == 0 && + (archive_entry_filetype(entry) == AE_IFCHR || + archive_entry_filetype(entry) == AE_IFBLK)) + archive_entry_set_rdev(entry, st->st_rdev); + if ((parsed_kws & (MTREE_HAS_GID | MTREE_HAS_GNAME)) == 0) + archive_entry_set_gid(entry, st->st_gid); + if ((parsed_kws & (MTREE_HAS_UID | MTREE_HAS_UNAME)) == 0) + archive_entry_set_uid(entry, st->st_uid); + if ((parsed_kws & MTREE_HAS_MTIME) == 0) { +#if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC + archive_entry_set_mtime(entry, st->st_mtime, + st->st_mtimespec.tv_nsec); +#elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC + archive_entry_set_mtime(entry, st->st_mtime, + st->st_mtim.tv_nsec); +#elif HAVE_STRUCT_STAT_ST_MTIME_N + archive_entry_set_mtime(entry, st->st_mtime, + st->st_mtime_n); +#elif HAVE_STRUCT_STAT_ST_UMTIME + archive_entry_set_mtime(entry, st->st_mtime, + st->st_umtime*1000); +#elif HAVE_STRUCT_STAT_ST_MTIME_USEC + archive_entry_set_mtime(entry, st->st_mtime, + st->st_mtime_usec*1000); +#else + archive_entry_set_mtime(entry, st->st_mtime, 0); +#endif + } + if ((parsed_kws & MTREE_HAS_NLINK) == 0) + archive_entry_set_nlink(entry, st->st_nlink); + if ((parsed_kws & MTREE_HAS_PERM) == 0) + archive_entry_set_perm(entry, st->st_mode); + if ((parsed_kws & MTREE_HAS_SIZE) == 0) + archive_entry_set_size(entry, st->st_size); + archive_entry_set_ino(entry, st->st_ino); + archive_entry_set_dev(entry, st->st_dev); + + archive_entry_linkify(mtree->resolver, &entry, &sparse_entry); + } else if (parsed_kws & MTREE_HAS_OPTIONAL) { + /* + * Couldn't open the entry, stat it or the on-disk type + * didn't match. If this entry is optional, just ignore it + * and read the next header entry. + */ + *use_next = 1; + return ARCHIVE_OK; + } + + mtree->cur_size = archive_entry_size(entry); + mtree->offset = 0; + + return r; +} + +/* + * Each line contains a sequence of keywords. + */ +static int +parse_line(struct archive_read *a, struct archive_entry *entry, + struct mtree *mtree, struct mtree_entry *mp, int *parsed_kws) +{ + struct mtree_option *iter; + int r = ARCHIVE_OK, r1; + + for (iter = mp->options; iter != NULL; iter = iter->next) { + r1 = parse_keyword(a, mtree, entry, iter, parsed_kws); + if (r1 < r) + r = r1; + } + if ((*parsed_kws & MTREE_HAS_TYPE) == 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Missing type keyword in mtree specification"); + return (ARCHIVE_WARN); + } + return (r); +} + +/* + * Device entries have one of the following forms: + * raw dev_t + * format,major,minor[,subdevice] + * + * Just use major and minor, no translation etc is done + * between formats. + */ +static int +parse_device(struct archive *a, struct archive_entry *entry, char *val) +{ + char *comma1, *comma2; + + comma1 = strchr(val, ','); + if (comma1 == NULL) { + archive_entry_set_dev(entry, mtree_atol10(&val)); + return (ARCHIVE_OK); + } + ++comma1; + comma2 = strchr(comma1, ','); + if (comma2 == NULL) { + archive_set_error(a, ARCHIVE_ERRNO_FILE_FORMAT, + "Malformed device attribute"); + return (ARCHIVE_WARN); + } + ++comma2; + archive_entry_set_rdevmajor(entry, mtree_atol(&comma1)); + archive_entry_set_rdevminor(entry, mtree_atol(&comma2)); + return (ARCHIVE_OK); +} + +/* + * Parse a single keyword and its value. + */ +static int +parse_keyword(struct archive_read *a, struct mtree *mtree, + struct archive_entry *entry, struct mtree_option *option, int *parsed_kws) +{ + char *val, *key; + + key = option->value; + + if (*key == '\0') + return (ARCHIVE_OK); + + if (strcmp(key, "optional") == 0) { + *parsed_kws |= MTREE_HAS_OPTIONAL; + return (ARCHIVE_OK); + } + if (strcmp(key, "ignore") == 0) { + /* + * The mtree processing is not recursive, so + * recursion will only happen for explicitly listed + * entries. + */ + return (ARCHIVE_OK); + } + + val = strchr(key, '='); + if (val == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Malformed attribute \"%s\" (%d)", key, key[0]); + return (ARCHIVE_WARN); + } + + *val = '\0'; + ++val; + + switch (key[0]) { + case 'c': + if (strcmp(key, "content") == 0 + || strcmp(key, "contents") == 0) { + parse_escapes(val, NULL); + archive_strcpy(&mtree->contents_name, val); + break; + } + if (strcmp(key, "cksum") == 0) + break; + case 'd': + if (strcmp(key, "device") == 0) { + *parsed_kws |= MTREE_HAS_DEVICE; + return parse_device(&a->archive, entry, val); + } + case 'f': + if (strcmp(key, "flags") == 0) { + *parsed_kws |= MTREE_HAS_FFLAGS; + archive_entry_copy_fflags_text(entry, val); + break; + } + case 'g': + if (strcmp(key, "gid") == 0) { + *parsed_kws |= MTREE_HAS_GID; + archive_entry_set_gid(entry, mtree_atol10(&val)); + break; + } + if (strcmp(key, "gname") == 0) { + *parsed_kws |= MTREE_HAS_GNAME; + archive_entry_copy_gname(entry, val); + break; + } + case 'l': + if (strcmp(key, "link") == 0) { + archive_entry_copy_symlink(entry, val); + break; + } + case 'm': + if (strcmp(key, "md5") == 0 || strcmp(key, "md5digest") == 0) + break; + if (strcmp(key, "mode") == 0) { + if (val[0] >= '0' && val[0] <= '9') { + *parsed_kws |= MTREE_HAS_PERM; + archive_entry_set_perm(entry, + mtree_atol8(&val)); + } else { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Symbolic mode \"%s\" unsupported", val); + return ARCHIVE_WARN; + } + break; + } + case 'n': + if (strcmp(key, "nlink") == 0) { + *parsed_kws |= MTREE_HAS_NLINK; + archive_entry_set_nlink(entry, mtree_atol10(&val)); + break; + } + case 'r': + if (strcmp(key, "rmd160") == 0 || + strcmp(key, "rmd160digest") == 0) + break; + case 's': + if (strcmp(key, "sha1") == 0 || strcmp(key, "sha1digest") == 0) + break; + if (strcmp(key, "sha256") == 0 || + strcmp(key, "sha256digest") == 0) + break; + if (strcmp(key, "sha384") == 0 || + strcmp(key, "sha384digest") == 0) + break; + if (strcmp(key, "sha512") == 0 || + strcmp(key, "sha512digest") == 0) + break; + if (strcmp(key, "size") == 0) { + archive_entry_set_size(entry, mtree_atol10(&val)); + break; + } + case 't': + if (strcmp(key, "tags") == 0) { + /* + * Comma delimited list of tags. + * Ignore the tags for now, but the interface + * should be extended to allow inclusion/exclusion. + */ + break; + } + if (strcmp(key, "time") == 0) { + time_t m; + long ns; + + *parsed_kws |= MTREE_HAS_MTIME; + m = (time_t)mtree_atol10(&val); + if (*val == '.') { + ++val; + ns = (long)mtree_atol10(&val); + } else + ns = 0; + archive_entry_set_mtime(entry, m, ns); + break; + } + if (strcmp(key, "type") == 0) { + *parsed_kws |= MTREE_HAS_TYPE; + switch (val[0]) { + case 'b': + if (strcmp(val, "block") == 0) { + mtree->filetype = AE_IFBLK; + break; + } + case 'c': + if (strcmp(val, "char") == 0) { + mtree->filetype = AE_IFCHR; + break; + } + case 'd': + if (strcmp(val, "dir") == 0) { + mtree->filetype = AE_IFDIR; + break; + } + case 'f': + if (strcmp(val, "fifo") == 0) { + mtree->filetype = AE_IFIFO; + break; + } + if (strcmp(val, "file") == 0) { + mtree->filetype = AE_IFREG; + break; + } + case 'l': + if (strcmp(val, "link") == 0) { + mtree->filetype = AE_IFLNK; + break; + } + default: + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Unrecognized file type \"%s\"", val); + return (ARCHIVE_WARN); + } + archive_entry_set_filetype(entry, mtree->filetype); + break; + } + case 'u': + if (strcmp(key, "uid") == 0) { + *parsed_kws |= MTREE_HAS_UID; + archive_entry_set_uid(entry, mtree_atol10(&val)); + break; + } + if (strcmp(key, "uname") == 0) { + *parsed_kws |= MTREE_HAS_UNAME; + archive_entry_copy_uname(entry, val); + break; + } + default: + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unrecognized key %s=%s", key, val); + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); +} + +static int +read_data(struct archive_read *a, const void **buff, size_t *size, off_t *offset) +{ + size_t bytes_to_read; + ssize_t bytes_read; + struct mtree *mtree; + + mtree = (struct mtree *)(a->format->data); + if (mtree->fd < 0) { + *buff = NULL; + *offset = 0; + *size = 0; + return (ARCHIVE_EOF); + } + if (mtree->buff == NULL) { + mtree->buffsize = 64 * 1024; + mtree->buff = malloc(mtree->buffsize); + if (mtree->buff == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate memory"); + return (ARCHIVE_FATAL); + } + } + + *buff = mtree->buff; + *offset = mtree->offset; + if ((off_t)mtree->buffsize > mtree->cur_size - mtree->offset) + bytes_to_read = mtree->cur_size - mtree->offset; + else + bytes_to_read = mtree->buffsize; + bytes_read = read(mtree->fd, mtree->buff, bytes_to_read); + if (bytes_read < 0) { + archive_set_error(&a->archive, errno, "Can't read"); + return (ARCHIVE_WARN); + } + if (bytes_read == 0) { + *size = 0; + return (ARCHIVE_EOF); + } + mtree->offset += bytes_read; + *size = bytes_read; + return (ARCHIVE_OK); +} + +/* Skip does nothing except possibly close the contents file. */ +static int +skip(struct archive_read *a) +{ + struct mtree *mtree; + + mtree = (struct mtree *)(a->format->data); + if (mtree->fd >= 0) { + close(mtree->fd); + mtree->fd = -1; + } + return (ARCHIVE_OK); +} + +/* + * Since parsing backslash sequences always makes strings shorter, + * we can always do this conversion in-place. + */ +static void +parse_escapes(char *src, struct mtree_entry *mentry) +{ + char *dest = src; + char c; + + /* + * The current directory is somewhat special, it should be archived + * only once as it will confuse extraction otherwise. + */ + if (strcmp(src, ".") == 0) + mentry->full = 1; + + while (*src != '\0') { + c = *src++; + if (c == '/' && mentry != NULL) + mentry->full = 1; + if (c == '\\') { + switch (src[0]) { + case '0': + if (src[1] < '0' || src[1] > '7') { + c = 0; + ++src; + break; + } + /* FALLTHROUGH */ + case '1': + case '2': + case '3': + if (src[1] >= '0' && src[1] <= '7' && + src[2] >= '0' && src[2] <= '7') { + c = (src[0] - '0') << 6; + c |= (src[1] - '0') << 3; + c |= (src[2] - '0'); + src += 3; + } + break; + case 'a': + c = '\a'; + ++src; + break; + case 'b': + c = '\b'; + ++src; + break; + case 'f': + c = '\f'; + ++src; + break; + case 'n': + c = '\n'; + ++src; + break; + case 'r': + c = '\r'; + ++src; + break; + case 's': + c = ' '; + ++src; + break; + case 't': + c = '\t'; + ++src; + break; + case 'v': + c = '\v'; + ++src; + break; + } + } + *dest++ = c; + } + *dest = '\0'; +} + +/* + * Note that this implementation does not (and should not!) obey + * locale settings; you cannot simply substitute strtol here, since + * it does obey locale. + */ +static int64_t +mtree_atol8(char **p) +{ + int64_t l, limit, last_digit_limit; + int digit, base; + + base = 8; + limit = INT64_MAX / base; + last_digit_limit = INT64_MAX % base; + + l = 0; + digit = **p - '0'; + while (digit >= 0 && digit < base) { + if (l>limit || (l == limit && digit > last_digit_limit)) { + l = INT64_MAX; /* Truncate on overflow. */ + break; + } + l = (l * base) + digit; + digit = *++(*p) - '0'; + } + return (l); +} + +/* + * Note that this implementation does not (and should not!) obey + * locale settings; you cannot simply substitute strtol here, since + * it does obey locale. + */ +static int64_t +mtree_atol10(char **p) +{ + int64_t l, limit, last_digit_limit; + int base, digit, sign; + + base = 10; + limit = INT64_MAX / base; + last_digit_limit = INT64_MAX % base; + + if (**p == '-') { + sign = -1; + ++(*p); + } else + sign = 1; + + l = 0; + digit = **p - '0'; + while (digit >= 0 && digit < base) { + if (l > limit || (l == limit && digit > last_digit_limit)) { + l = UINT64_MAX; /* Truncate on overflow. */ + break; + } + l = (l * base) + digit; + digit = *++(*p) - '0'; + } + return (sign < 0) ? -l : l; +} + +/* + * Note that this implementation does not (and should not!) obey + * locale settings; you cannot simply substitute strtol here, since + * it does obey locale. + */ +static int64_t +mtree_atol16(char **p) +{ + int64_t l, limit, last_digit_limit; + int base, digit, sign; + + base = 16; + limit = INT64_MAX / base; + last_digit_limit = INT64_MAX % base; + + if (**p == '-') { + sign = -1; + ++(*p); + } else + sign = 1; + + l = 0; + if (**p >= '0' && **p <= '9') + digit = **p - '0'; + else if (**p >= 'a' && **p <= 'f') + digit = **p - 'a' + 10; + else if (**p >= 'A' && **p <= 'F') + digit = **p - 'A' + 10; + else + digit = -1; + while (digit >= 0 && digit < base) { + if (l > limit || (l == limit && digit > last_digit_limit)) { + l = UINT64_MAX; /* Truncate on overflow. */ + break; + } + l = (l * base) + digit; + if (**p >= '0' && **p <= '9') + digit = **p - '0'; + else if (**p >= 'a' && **p <= 'f') + digit = **p - 'a' + 10; + else if (**p >= 'A' && **p <= 'F') + digit = **p - 'A' + 10; + else + digit = -1; + } + return (sign < 0) ? -l : l; +} + +static int64_t +mtree_atol(char **p) +{ + if (**p != '0') + return mtree_atol10(p); + if ((*p)[1] == 'x' || (*p)[1] == 'X') { + *p += 2; + return mtree_atol16(p); + } + return mtree_atol8(p); +} + +/* + * Returns length of line (including trailing newline) + * or negative on error. 'start' argument is updated to + * point to first character of line. + */ +static ssize_t +readline(struct archive_read *a, struct mtree *mtree, char **start, ssize_t limit) +{ + ssize_t bytes_read; + ssize_t total_size = 0; + ssize_t find_off = 0; + const void *t; + const char *s; + void *p; + char *u; + + /* Accumulate line in a line buffer. */ + for (;;) { + /* Read some more. */ + t = __archive_read_ahead(a, 1, &bytes_read); + if (t == NULL) + return (0); + if (bytes_read < 0) + return (ARCHIVE_FATAL); + s = t; /* Start of line? */ + p = memchr(t, '\n', bytes_read); + /* If we found '\n', trim the read. */ + if (p != NULL) { + bytes_read = 1 + ((const char *)p) - s; + } + if (total_size + bytes_read + 1 > limit) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Line too long"); + return (ARCHIVE_FATAL); + } + if (archive_string_ensure(&mtree->line, + total_size + bytes_read + 1) == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate working buffer"); + return (ARCHIVE_FATAL); + } + memcpy(mtree->line.s + total_size, t, bytes_read); + __archive_read_consume(a, bytes_read); + total_size += bytes_read; + /* Null terminate. */ + mtree->line.s[total_size] = '\0'; + /* If we found an unescaped '\n', clean up and return. */ + for (u = mtree->line.s + find_off; *u; ++u) { + if (u[0] == '\n') { + *start = mtree->line.s; + return total_size; + } + if (u[0] == '#') { + if (p == NULL) + break; + *start = mtree->line.s; + return total_size; + } + if (u[0] != '\\') + continue; + if (u[1] == '\\') { + ++u; + continue; + } + if (u[1] == '\n') { + memmove(u, u + 1, + total_size - (u - mtree->line.s) + 1); + --total_size; + ++u; + break; + } + if (u[1] == '\0') + break; + } + find_off = u - mtree->line.s; + } +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_raw.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_raw.c new file mode 100644 index 000000000..c700f2287 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_raw.c @@ -0,0 +1,187 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" + +struct raw_info { + int64_t offset; /* Current position in the file. */ + int end_of_file; +}; + +static int archive_read_format_raw_bid(struct archive_read *); +static int archive_read_format_raw_cleanup(struct archive_read *); +static int archive_read_format_raw_read_data(struct archive_read *, + const void **, size_t *, off_t *); +static int archive_read_format_raw_read_data_skip(struct archive_read *); +static int archive_read_format_raw_read_header(struct archive_read *, + struct archive_entry *); + +int +archive_read_support_format_raw(struct archive *_a) +{ + struct raw_info *info; + struct archive_read *a = (struct archive_read *)_a; + int r; + + info = (struct raw_info *)calloc(1, sizeof(*info)); + if (info == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate raw_info data"); + return (ARCHIVE_FATAL); + } + + r = __archive_read_register_format(a, + info, + "raw", + archive_read_format_raw_bid, + NULL, + archive_read_format_raw_read_header, + archive_read_format_raw_read_data, + archive_read_format_raw_read_data_skip, + archive_read_format_raw_cleanup); + if (r != ARCHIVE_OK) + free(info); + return (r); +} + +/* + * Bid 1 if this is a non-empty file. Anyone who can really support + * this should outbid us, so it should generally be safe to use "raw" + * in conjunction with other formats. But, this could really confuse + * folks if there are bid errors or minor file damage, so we don't + * include "raw" as part of support_format_all(). + */ +static int +archive_read_format_raw_bid(struct archive_read *a) +{ + const char *p; + + if ((p = __archive_read_ahead(a, 1, NULL)) == NULL) + return (-1); + return (1); +} + +/* + * Mock up a fake header. + */ +static int +archive_read_format_raw_read_header(struct archive_read *a, + struct archive_entry *entry) +{ + struct raw_info *info; + + info = (struct raw_info *)(a->format->data); + if (info->end_of_file) + return (ARCHIVE_EOF); + + a->archive.archive_format = ARCHIVE_FORMAT_RAW; + a->archive.archive_format_name = "Raw data"; + archive_entry_set_pathname(entry, "data"); + /* XXX should we set mode to mimic a regular file? XXX */ + /* I'm deliberately leaving most fields unset here. */ + return (ARCHIVE_OK); +} + +static int +archive_read_format_raw_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + struct raw_info *info; + ssize_t avail; + + info = (struct raw_info *)(a->format->data); + if (info->end_of_file) + return (ARCHIVE_EOF); + + /* Get whatever bytes are immediately available. */ + *buff = __archive_read_ahead(a, 1, &avail); + if (avail > 0) { + /* Consume and return the bytes we just read */ + __archive_read_consume(a, avail); + *size = avail; + *offset = info->offset; + info->offset += *size; + return (ARCHIVE_OK); + } else if (0 == avail) { + /* Record and return end-of-file. */ + info->end_of_file = 1; + *size = 0; + *offset = info->offset; + return (ARCHIVE_EOF); + } else { + /* Record and return an error. */ + *size = 0; + *offset = info->offset; + return (avail); + } + return (ARCHIVE_OK); +} + +static int +archive_read_format_raw_read_data_skip(struct archive_read *a) +{ + struct raw_info *info; + off_t bytes_skipped; + int64_t request = 1024 * 1024 * 1024UL; /* Skip 1 GB at a time. */ + + info = (struct raw_info *)(a->format->data); + if (info->end_of_file) + return (ARCHIVE_EOF); + info->end_of_file = 1; + + for (;;) { + bytes_skipped = __archive_read_skip_lenient(a, request); + if (bytes_skipped < 0) + return (ARCHIVE_FATAL); + if (bytes_skipped < request) + return (ARCHIVE_OK); + /* We skipped all the bytes we asked for. There might + * be more, so try again. */ + } +} + +static int +archive_read_format_raw_cleanup(struct archive_read *a) +{ + struct raw_info *info; + + info = (struct raw_info *)(a->format->data); + free(info); + a->format->data = NULL; + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c new file mode 100644 index 000000000..5d79cbf69 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_tar.c @@ -0,0 +1,2418 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_tar.c,v 1.72 2008/12/06 06:45:15 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +/* #include */ /* See archive_platform.h */ +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +/* Obtain suitable wide-character manipulation functions. */ +#ifdef HAVE_WCHAR_H +#include +#else +/* Good enough for equality testing, which is all we need. */ +static int wcscmp(const wchar_t *s1, const wchar_t *s2) +{ + int diff = *s1 - *s2; + while (*s1 && diff == 0) + diff = (int)*++s1 - (int)*++s2; + return diff; +} +/* Good enough for equality testing, which is all we need. */ +static int wcsncmp(const wchar_t *s1, const wchar_t *s2, size_t n) +{ + int diff = *s1 - *s2; + while (*s1 && diff == 0 && n-- > 0) + diff = (int)*++s1 - (int)*++s2; + return diff; +} +static size_t wcslen(const wchar_t *s) +{ + const wchar_t *p = s; + while (*p) + p++; + return p - s; +} +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" + +#define tar_min(a,b) ((a) < (b) ? (a) : (b)) + +/* + * Layout of POSIX 'ustar' tar header. + */ +struct archive_entry_header_ustar { + char name[100]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char checksum[8]; + char typeflag[1]; + char linkname[100]; /* "old format" header ends here */ + char magic[6]; /* For POSIX: "ustar\0" */ + char version[2]; /* For POSIX: "00" */ + char uname[32]; + char gname[32]; + char rdevmajor[8]; + char rdevminor[8]; + char prefix[155]; +}; + +/* + * Structure of GNU tar header + */ +struct gnu_sparse { + char offset[12]; + char numbytes[12]; +}; + +struct archive_entry_header_gnutar { + char name[100]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char checksum[8]; + char typeflag[1]; + char linkname[100]; + char magic[8]; /* "ustar \0" (note blank/blank/null at end) */ + char uname[32]; + char gname[32]; + char rdevmajor[8]; + char rdevminor[8]; + char atime[12]; + char ctime[12]; + char offset[12]; + char longnames[4]; + char unused[1]; + struct gnu_sparse sparse[4]; + char isextended[1]; + char realsize[12]; + /* + * Old GNU format doesn't use POSIX 'prefix' field; they use + * the 'L' (longname) entry instead. + */ +}; + +/* + * Data specific to this format. + */ +struct sparse_block { + struct sparse_block *next; + off_t offset; + off_t remaining; +}; + +struct tar { + struct archive_string acl_text; + struct archive_string entry_pathname; + /* For "GNU.sparse.name" and other similar path extensions. */ + struct archive_string entry_pathname_override; + struct archive_string entry_linkpath; + struct archive_string entry_uname; + struct archive_string entry_gname; + struct archive_string longlink; + struct archive_string longname; + struct archive_string pax_header; + struct archive_string pax_global; + struct archive_string line; + int pax_hdrcharset_binary; + wchar_t *pax_entry; + size_t pax_entry_length; + int header_recursion_depth; + int64_t entry_bytes_remaining; + int64_t entry_offset; + int64_t entry_padding; + int64_t realsize; + struct sparse_block *sparse_list; + struct sparse_block *sparse_last; + int64_t sparse_offset; + int64_t sparse_numbytes; + int sparse_gnu_major; + int sparse_gnu_minor; + char sparse_gnu_pending; +}; + +static ssize_t UTF8_mbrtowc(wchar_t *pwc, const char *s, size_t n); +static int archive_block_is_null(const unsigned char *p); +static char *base64_decode(const char *, size_t, size_t *); +static void gnu_add_sparse_entry(struct tar *, + off_t offset, off_t remaining); +static void gnu_clear_sparse_list(struct tar *); +static int gnu_sparse_old_read(struct archive_read *, struct tar *, + const struct archive_entry_header_gnutar *header); +static void gnu_sparse_old_parse(struct tar *, + const struct gnu_sparse *sparse, int length); +static int gnu_sparse_01_parse(struct tar *, const char *); +static ssize_t gnu_sparse_10_read(struct archive_read *, struct tar *); +static int header_Solaris_ACL(struct archive_read *, struct tar *, + struct archive_entry *, const void *); +static int header_common(struct archive_read *, struct tar *, + struct archive_entry *, const void *); +static int header_old_tar(struct archive_read *, struct tar *, + struct archive_entry *, const void *); +static int header_pax_extensions(struct archive_read *, struct tar *, + struct archive_entry *, const void *); +static int header_pax_global(struct archive_read *, struct tar *, + struct archive_entry *, const void *h); +static int header_longlink(struct archive_read *, struct tar *, + struct archive_entry *, const void *h); +static int header_longname(struct archive_read *, struct tar *, + struct archive_entry *, const void *h); +static int header_volume(struct archive_read *, struct tar *, + struct archive_entry *, const void *h); +static int header_ustar(struct archive_read *, struct tar *, + struct archive_entry *, const void *h); +static int header_gnutar(struct archive_read *, struct tar *, + struct archive_entry *, const void *h); +static int archive_read_format_tar_bid(struct archive_read *); +static int archive_read_format_tar_cleanup(struct archive_read *); +static int archive_read_format_tar_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset); +static int archive_read_format_tar_skip(struct archive_read *a); +static int archive_read_format_tar_read_header(struct archive_read *, + struct archive_entry *); +static int checksum(struct archive_read *, const void *); +static int pax_attribute(struct tar *, struct archive_entry *, + char *key, char *value); +static int pax_header(struct archive_read *, struct tar *, + struct archive_entry *, char *attr); +static void pax_time(const char *, int64_t *sec, long *nanos); +static ssize_t readline(struct archive_read *, struct tar *, const char **, + ssize_t limit); +static int read_body_to_string(struct archive_read *, struct tar *, + struct archive_string *, const void *h); +static int64_t tar_atol(const char *, unsigned); +static int64_t tar_atol10(const char *, unsigned); +static int64_t tar_atol256(const char *, unsigned); +static int64_t tar_atol8(const char *, unsigned); +static int tar_read_header(struct archive_read *, struct tar *, + struct archive_entry *); +static int tohex(int c); +static char *url_decode(const char *); +static wchar_t *utf8_decode(struct tar *, const char *, size_t length); + +int +archive_read_support_format_gnutar(struct archive *a) +{ + return (archive_read_support_format_tar(a)); +} + + +int +archive_read_support_format_tar(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct tar *tar; + int r; + + tar = (struct tar *)malloc(sizeof(*tar)); + if (tar == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate tar data"); + return (ARCHIVE_FATAL); + } + memset(tar, 0, sizeof(*tar)); + + r = __archive_read_register_format(a, tar, "tar", + archive_read_format_tar_bid, + NULL, + archive_read_format_tar_read_header, + archive_read_format_tar_read_data, + archive_read_format_tar_skip, + archive_read_format_tar_cleanup); + + if (r != ARCHIVE_OK) + free(tar); + return (ARCHIVE_OK); +} + +static int +archive_read_format_tar_cleanup(struct archive_read *a) +{ + struct tar *tar; + + tar = (struct tar *)(a->format->data); + gnu_clear_sparse_list(tar); + archive_string_free(&tar->acl_text); + archive_string_free(&tar->entry_pathname); + archive_string_free(&tar->entry_pathname_override); + archive_string_free(&tar->entry_linkpath); + archive_string_free(&tar->entry_uname); + archive_string_free(&tar->entry_gname); + archive_string_free(&tar->line); + archive_string_free(&tar->pax_global); + archive_string_free(&tar->pax_header); + archive_string_free(&tar->longname); + archive_string_free(&tar->longlink); + free(tar->pax_entry); + free(tar); + (a->format->data) = NULL; + return (ARCHIVE_OK); +} + + +static int +archive_read_format_tar_bid(struct archive_read *a) +{ + int bid; + const void *h; + const struct archive_entry_header_ustar *header; + + bid = 0; + + /* Now let's look at the actual header and see if it matches. */ + h = __archive_read_ahead(a, 512, NULL); + if (h == NULL) + return (-1); + + /* If it's an end-of-archive mark, we can handle it. */ + if ((*(const char *)h) == 0 + && archive_block_is_null((const unsigned char *)h)) { + /* + * Usually, I bid the number of bits verified, but + * in this case, 4096 seems excessive so I picked 10 as + * an arbitrary but reasonable-seeming value. + */ + return (10); + } + + /* If it's not an end-of-archive mark, it must have a valid checksum.*/ + if (!checksum(a, h)) + return (0); + bid += 48; /* Checksum is usually 6 octal digits. */ + + header = (const struct archive_entry_header_ustar *)h; + + /* Recognize POSIX formats. */ + if ((memcmp(header->magic, "ustar\0", 6) == 0) + &&(memcmp(header->version, "00", 2)==0)) + bid += 56; + + /* Recognize GNU tar format. */ + if ((memcmp(header->magic, "ustar ", 6) == 0) + &&(memcmp(header->version, " \0", 2)==0)) + bid += 56; + + /* Type flag must be null, digit or A-Z, a-z. */ + if (header->typeflag[0] != 0 && + !( header->typeflag[0] >= '0' && header->typeflag[0] <= '9') && + !( header->typeflag[0] >= 'A' && header->typeflag[0] <= 'Z') && + !( header->typeflag[0] >= 'a' && header->typeflag[0] <= 'z') ) + return (0); + bid += 2; /* 6 bits of variation in an 8-bit field leaves 2 bits. */ + + /* Sanity check: Look at first byte of mode field. */ + switch (255 & (unsigned)header->mode[0]) { + case 0: case 255: + /* Base-256 value: No further verification possible! */ + break; + case ' ': /* Not recommended, but not illegal, either. */ + break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + /* Octal Value. */ + /* TODO: Check format of remainder of this field. */ + break; + default: + /* Not a valid mode; bail out here. */ + return (0); + } + /* TODO: Sanity test uid/gid/size/mtime/rdevmajor/rdevminor fields. */ + + return (bid); +} + +/* + * The function invoked by archive_read_header(). This + * just sets up a few things and then calls the internal + * tar_read_header() function below. + */ +static int +archive_read_format_tar_read_header(struct archive_read *a, + struct archive_entry *entry) +{ + /* + * When converting tar archives to cpio archives, it is + * essential that each distinct file have a distinct inode + * number. To simplify this, we keep a static count here to + * assign fake dev/inode numbers to each tar entry. Note that + * pax format archives may overwrite this with something more + * useful. + * + * Ideally, we would track every file read from the archive so + * that we could assign the same dev/ino pair to hardlinks, + * but the memory required to store a complete lookup table is + * probably not worthwhile just to support the relatively + * obscure tar->cpio conversion case. + */ + static int default_inode; + static int default_dev; + struct tar *tar; + struct sparse_block *sp; + const char *p; + int r; + size_t l; + + /* Assign default device/inode values. */ + archive_entry_set_dev(entry, 1 + default_dev); /* Don't use zero. */ + archive_entry_set_ino(entry, ++default_inode); /* Don't use zero. */ + /* Limit generated st_ino number to 16 bits. */ + if (default_inode >= 0xffff) { + ++default_dev; + default_inode = 0; + } + + tar = (struct tar *)(a->format->data); + tar->entry_offset = 0; + while (tar->sparse_list != NULL) { + sp = tar->sparse_list; + tar->sparse_list = sp->next; + free(sp); + } + tar->sparse_last = NULL; + tar->realsize = -1; /* Mark this as "unset" */ + + r = tar_read_header(a, tar, entry); + + /* + * "non-sparse" files are really just sparse files with + * a single block. + */ + if (tar->sparse_list == NULL) + gnu_add_sparse_entry(tar, 0, tar->entry_bytes_remaining); + + if (r == ARCHIVE_OK) { + /* + * "Regular" entry with trailing '/' is really + * directory: This is needed for certain old tar + * variants and even for some broken newer ones. + */ + p = archive_entry_pathname(entry); + l = strlen(p); + if (archive_entry_filetype(entry) == AE_IFREG + && p[l-1] == '/') + archive_entry_set_filetype(entry, AE_IFDIR); + } + return (r); +} + +static int +archive_read_format_tar_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + ssize_t bytes_read; + struct tar *tar; + struct sparse_block *p; + + tar = (struct tar *)(a->format->data); + + if (tar->sparse_gnu_pending) { + if (tar->sparse_gnu_major == 1 && tar->sparse_gnu_minor == 0) { + tar->sparse_gnu_pending = 0; + /* Read initial sparse map. */ + bytes_read = gnu_sparse_10_read(a, tar); + tar->entry_bytes_remaining -= bytes_read; + if (bytes_read < 0) + return (bytes_read); + } else { + *size = 0; + *offset = 0; + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Unrecognized GNU sparse file format"); + return (ARCHIVE_WARN); + } + tar->sparse_gnu_pending = 0; + } + + /* Remove exhausted entries from sparse list. */ + while (tar->sparse_list != NULL && + tar->sparse_list->remaining == 0) { + p = tar->sparse_list; + tar->sparse_list = p->next; + free(p); + } + + /* If we're at end of file, return EOF. */ + if (tar->sparse_list == NULL || tar->entry_bytes_remaining == 0) { + if (__archive_read_skip(a, tar->entry_padding) < 0) + return (ARCHIVE_FATAL); + tar->entry_padding = 0; + *buff = NULL; + *size = 0; + *offset = tar->realsize; + return (ARCHIVE_EOF); + } + + *buff = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read < 0) + return (ARCHIVE_FATAL); + if (*buff == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Truncated tar archive"); + return (ARCHIVE_FATAL); + } + if (bytes_read > tar->entry_bytes_remaining) + bytes_read = tar->entry_bytes_remaining; + /* Don't read more than is available in the + * current sparse block. */ + if (tar->sparse_list->remaining < bytes_read) + bytes_read = tar->sparse_list->remaining; + *size = bytes_read; + *offset = tar->sparse_list->offset; + tar->sparse_list->remaining -= bytes_read; + tar->sparse_list->offset += bytes_read; + tar->entry_bytes_remaining -= bytes_read; + __archive_read_consume(a, bytes_read); + return (ARCHIVE_OK); +} + +static int +archive_read_format_tar_skip(struct archive_read *a) +{ + int64_t bytes_skipped; + struct tar* tar; + + tar = (struct tar *)(a->format->data); + + /* + * Compression layer skip functions are required to either skip the + * length requested or fail, so we can rely upon the entire entry + * plus padding being skipped. + */ + bytes_skipped = __archive_read_skip(a, + tar->entry_bytes_remaining + tar->entry_padding); + if (bytes_skipped < 0) + return (ARCHIVE_FATAL); + + tar->entry_bytes_remaining = 0; + tar->entry_padding = 0; + + /* Free the sparse list. */ + gnu_clear_sparse_list(tar); + + return (ARCHIVE_OK); +} + +/* + * This function recursively interprets all of the headers associated + * with a single entry. + */ +static int +tar_read_header(struct archive_read *a, struct tar *tar, + struct archive_entry *entry) +{ + ssize_t bytes; + int err; + const void *h; + const struct archive_entry_header_ustar *header; + + /* Read 512-byte header record */ + h = __archive_read_ahead(a, 512, &bytes); + if (bytes < 0) + return (bytes); + if (bytes < 512) { /* Short read or EOF. */ + /* Try requesting just one byte and see what happens. */ + h = __archive_read_ahead(a, 1, &bytes); + if (bytes == 0) { + /* + * The archive ends at a 512-byte boundary but + * without a proper end-of-archive marker. + * Yes, there are tar writers that do this; + * hold our nose and accept it. + */ + return (ARCHIVE_EOF); + } + /* Archive ends with a partial block; this is bad. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated tar archive"); + return (ARCHIVE_FATAL); + } + __archive_read_consume(a, 512); + + + /* Check for end-of-archive mark. */ + if (((*(const char *)h)==0) && archive_block_is_null((const unsigned char *)h)) { + /* Try to consume a second all-null record, as well. */ + h = __archive_read_ahead(a, 512, NULL); + if (h != NULL) + __archive_read_consume(a, 512); + archive_set_error(&a->archive, 0, NULL); + if (a->archive.archive_format_name == NULL) { + a->archive.archive_format = ARCHIVE_FORMAT_TAR; + a->archive.archive_format_name = "tar"; + } + return (ARCHIVE_EOF); + } + + /* + * Note: If the checksum fails and we return ARCHIVE_RETRY, + * then the client is likely to just retry. This is a very + * crude way to search for the next valid header! + * + * TODO: Improve this by implementing a real header scan. + */ + if (!checksum(a, h)) { + archive_set_error(&a->archive, EINVAL, "Damaged tar archive"); + return (ARCHIVE_RETRY); /* Retryable: Invalid header */ + } + + if (++tar->header_recursion_depth > 32) { + archive_set_error(&a->archive, EINVAL, "Too many special headers"); + return (ARCHIVE_WARN); + } + + /* Determine the format variant. */ + header = (const struct archive_entry_header_ustar *)h; + switch(header->typeflag[0]) { + case 'A': /* Solaris tar ACL */ + a->archive.archive_format = ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE; + a->archive.archive_format_name = "Solaris tar"; + err = header_Solaris_ACL(a, tar, entry, h); + break; + case 'g': /* POSIX-standard 'g' header. */ + a->archive.archive_format = ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE; + a->archive.archive_format_name = "POSIX pax interchange format"; + err = header_pax_global(a, tar, entry, h); + break; + case 'K': /* Long link name (GNU tar, others) */ + err = header_longlink(a, tar, entry, h); + break; + case 'L': /* Long filename (GNU tar, others) */ + err = header_longname(a, tar, entry, h); + break; + case 'V': /* GNU volume header */ + err = header_volume(a, tar, entry, h); + break; + case 'X': /* Used by SUN tar; same as 'x'. */ + a->archive.archive_format = ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE; + a->archive.archive_format_name = + "POSIX pax interchange format (Sun variant)"; + err = header_pax_extensions(a, tar, entry, h); + break; + case 'x': /* POSIX-standard 'x' header. */ + a->archive.archive_format = ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE; + a->archive.archive_format_name = "POSIX pax interchange format"; + err = header_pax_extensions(a, tar, entry, h); + break; + default: + if (memcmp(header->magic, "ustar \0", 8) == 0) { + a->archive.archive_format = ARCHIVE_FORMAT_TAR_GNUTAR; + a->archive.archive_format_name = "GNU tar format"; + err = header_gnutar(a, tar, entry, h); + } else if (memcmp(header->magic, "ustar", 5) == 0) { + if (a->archive.archive_format != ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE) { + a->archive.archive_format = ARCHIVE_FORMAT_TAR_USTAR; + a->archive.archive_format_name = "POSIX ustar format"; + } + err = header_ustar(a, tar, entry, h); + } else { + a->archive.archive_format = ARCHIVE_FORMAT_TAR; + a->archive.archive_format_name = "tar (non-POSIX)"; + err = header_old_tar(a, tar, entry, h); + } + } + --tar->header_recursion_depth; + /* We return warnings or success as-is. Anything else is fatal. */ + if (err == ARCHIVE_WARN || err == ARCHIVE_OK) + return (err); + if (err == ARCHIVE_EOF) + /* EOF when recursively reading a header is bad. */ + archive_set_error(&a->archive, EINVAL, "Damaged tar archive"); + return (ARCHIVE_FATAL); +} + +/* + * Return true if block checksum is correct. + */ +static int +checksum(struct archive_read *a, const void *h) +{ + const unsigned char *bytes; + const struct archive_entry_header_ustar *header; + int check, i, sum; + + (void)a; /* UNUSED */ + bytes = (const unsigned char *)h; + header = (const struct archive_entry_header_ustar *)h; + + /* + * Test the checksum. Note that POSIX specifies _unsigned_ + * bytes for this calculation. + */ + sum = tar_atol(header->checksum, sizeof(header->checksum)); + check = 0; + for (i = 0; i < 148; i++) + check += (unsigned char)bytes[i]; + for (; i < 156; i++) + check += 32; + for (; i < 512; i++) + check += (unsigned char)bytes[i]; + if (sum == check) + return (1); + + /* + * Repeat test with _signed_ bytes, just in case this archive + * was created by an old BSD, Solaris, or HP-UX tar with a + * broken checksum calculation. + */ + check = 0; + for (i = 0; i < 148; i++) + check += (signed char)bytes[i]; + for (; i < 156; i++) + check += 32; + for (; i < 512; i++) + check += (signed char)bytes[i]; + if (sum == check) + return (1); + + return (0); +} + +/* + * Return true if this block contains only nulls. + */ +static int +archive_block_is_null(const unsigned char *p) +{ + unsigned i; + + for (i = 0; i < 512; i++) + if (*p++) + return (0); + return (1); +} + +/* + * Interpret 'A' Solaris ACL header + */ +static int +header_Solaris_ACL(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + const struct archive_entry_header_ustar *header; + size_t size; + int err; + int64_t type; + char *acl, *p; + wchar_t *wp; + + /* + * read_body_to_string adds a NUL terminator, but we need a little + * more to make sure that we don't overrun acl_text later. + */ + header = (const struct archive_entry_header_ustar *)h; + size = tar_atol(header->size, sizeof(header->size)); + err = read_body_to_string(a, tar, &(tar->acl_text), h); + if (err != ARCHIVE_OK) + return (err); + /* Recursively read next header */ + err = tar_read_header(a, tar, entry); + if ((err != ARCHIVE_OK) && (err != ARCHIVE_WARN)) + return (err); + + /* TODO: Examine the first characters to see if this + * is an AIX ACL descriptor. We'll likely never support + * them, but it would be polite to recognize and warn when + * we do see them. */ + + /* Leading octal number indicates ACL type and number of entries. */ + p = acl = tar->acl_text.s; + type = 0; + while (*p != '\0' && p < acl + size) { + if (*p < '0' || *p > '7') { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Malformed Solaris ACL attribute (invalid digit)"); + return(ARCHIVE_WARN); + } + type <<= 3; + type += *p - '0'; + if (type > 077777777) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Malformed Solaris ACL attribute (count too large)"); + return (ARCHIVE_WARN); + } + p++; + } + switch (type & ~0777777) { + case 01000000: + /* POSIX.1e ACL */ + break; + case 03000000: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Solaris NFSv4 ACLs not supported"); + return (ARCHIVE_WARN); + default: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Malformed Solaris ACL attribute (unsupported type %o)", + (int)type); + return (ARCHIVE_WARN); + } + p++; + + if (p >= acl + size) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Malformed Solaris ACL attribute (body overflow)"); + return(ARCHIVE_WARN); + } + + /* ACL text is null-terminated; find the end. */ + size -= (p - acl); + acl = p; + + while (*p != '\0' && p < acl + size) + p++; + + wp = utf8_decode(tar, acl, p - acl); + err = __archive_entry_acl_parse_w(entry, wp, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + if (err != ARCHIVE_OK) + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Malformed Solaris ACL attribute (unparsable)"); + return (err); +} + +/* + * Interpret 'K' long linkname header. + */ +static int +header_longlink(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + int err; + + err = read_body_to_string(a, tar, &(tar->longlink), h); + if (err != ARCHIVE_OK) + return (err); + err = tar_read_header(a, tar, entry); + if ((err != ARCHIVE_OK) && (err != ARCHIVE_WARN)) + return (err); + /* Set symlink if symlink already set, else hardlink. */ + archive_entry_copy_link(entry, tar->longlink.s); + return (ARCHIVE_OK); +} + +/* + * Interpret 'L' long filename header. + */ +static int +header_longname(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + int err; + + err = read_body_to_string(a, tar, &(tar->longname), h); + if (err != ARCHIVE_OK) + return (err); + /* Read and parse "real" header, then override name. */ + err = tar_read_header(a, tar, entry); + if ((err != ARCHIVE_OK) && (err != ARCHIVE_WARN)) + return (err); + archive_entry_copy_pathname(entry, tar->longname.s); + return (ARCHIVE_OK); +} + + +/* + * Interpret 'V' GNU tar volume header. + */ +static int +header_volume(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + (void)h; + + /* Just skip this and read the next header. */ + return (tar_read_header(a, tar, entry)); +} + +/* + * Read body of an archive entry into an archive_string object. + */ +static int +read_body_to_string(struct archive_read *a, struct tar *tar, + struct archive_string *as, const void *h) +{ + off_t size, padded_size; + const struct archive_entry_header_ustar *header; + const void *src; + + (void)tar; /* UNUSED */ + header = (const struct archive_entry_header_ustar *)h; + size = tar_atol(header->size, sizeof(header->size)); + if ((size > 1048576) || (size < 0)) { + archive_set_error(&a->archive, EINVAL, + "Special header too large"); + return (ARCHIVE_FATAL); + } + + /* Fail if we can't make our buffer big enough. */ + if (archive_string_ensure(as, size+1) == NULL) { + archive_set_error(&a->archive, ENOMEM, + "No memory"); + return (ARCHIVE_FATAL); + } + + /* Read the body into the string. */ + padded_size = (size + 511) & ~ 511; + src = __archive_read_ahead(a, padded_size, NULL); + if (src == NULL) + return (ARCHIVE_FATAL); + memcpy(as->s, src, size); + __archive_read_consume(a, padded_size); + as->s[size] = '\0'; + return (ARCHIVE_OK); +} + +/* + * Parse out common header elements. + * + * This would be the same as header_old_tar, except that the + * filename is handled slightly differently for old and POSIX + * entries (POSIX entries support a 'prefix'). This factoring + * allows header_old_tar and header_ustar + * to handle filenames differently, while still putting most of the + * common parsing into one place. + */ +static int +header_common(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + const struct archive_entry_header_ustar *header; + char tartype; + + (void)a; /* UNUSED */ + + header = (const struct archive_entry_header_ustar *)h; + if (header->linkname[0]) + archive_strncpy(&(tar->entry_linkpath), header->linkname, + sizeof(header->linkname)); + else + archive_string_empty(&(tar->entry_linkpath)); + + /* Parse out the numeric fields (all are octal) */ + archive_entry_set_mode(entry, tar_atol(header->mode, sizeof(header->mode))); + archive_entry_set_uid(entry, tar_atol(header->uid, sizeof(header->uid))); + archive_entry_set_gid(entry, tar_atol(header->gid, sizeof(header->gid))); + tar->entry_bytes_remaining = tar_atol(header->size, sizeof(header->size)); + tar->realsize = tar->entry_bytes_remaining; + archive_entry_set_size(entry, tar->entry_bytes_remaining); + archive_entry_set_mtime(entry, tar_atol(header->mtime, sizeof(header->mtime)), 0); + + /* Handle the tar type flag appropriately. */ + tartype = header->typeflag[0]; + + switch (tartype) { + case '1': /* Hard link */ + archive_entry_copy_hardlink(entry, tar->entry_linkpath.s); + /* + * The following may seem odd, but: Technically, tar + * does not store the file type for a "hard link" + * entry, only the fact that it is a hard link. So, I + * leave the type zero normally. But, pax interchange + * format allows hard links to have data, which + * implies that the underlying entry is a regular + * file. + */ + if (archive_entry_size(entry) > 0) + archive_entry_set_filetype(entry, AE_IFREG); + + /* + * A tricky point: Traditionally, tar readers have + * ignored the size field when reading hardlink + * entries, and some writers put non-zero sizes even + * though the body is empty. POSIX blessed this + * convention in the 1988 standard, but broke with + * this tradition in 2001 by permitting hardlink + * entries to store valid bodies in pax interchange + * format, but not in ustar format. Since there is no + * hard and fast way to distinguish pax interchange + * from earlier archives (the 'x' and 'g' entries are + * optional, after all), we need a heuristic. + */ + if (archive_entry_size(entry) == 0) { + /* If the size is already zero, we're done. */ + } else if (a->archive.archive_format + == ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE) { + /* Definitely pax extended; must obey hardlink size. */ + } else if (a->archive.archive_format == ARCHIVE_FORMAT_TAR + || a->archive.archive_format == ARCHIVE_FORMAT_TAR_GNUTAR) + { + /* Old-style or GNU tar: we must ignore the size. */ + archive_entry_set_size(entry, 0); + tar->entry_bytes_remaining = 0; + } else if (archive_read_format_tar_bid(a) > 50) { + /* + * We don't know if it's pax: If the bid + * function sees a valid ustar header + * immediately following, then let's ignore + * the hardlink size. + */ + archive_entry_set_size(entry, 0); + tar->entry_bytes_remaining = 0; + } + /* + * TODO: There are still two cases I'd like to handle: + * = a ustar non-pax archive with a hardlink entry at + * end-of-archive. (Look for block of nulls following?) + * = a pax archive that has not seen any pax headers + * and has an entry which is a hardlink entry storing + * a body containing an uncompressed tar archive. + * The first is worth addressing; I don't see any reliable + * way to deal with the second possibility. + */ + break; + case '2': /* Symlink */ + archive_entry_set_filetype(entry, AE_IFLNK); + archive_entry_set_size(entry, 0); + tar->entry_bytes_remaining = 0; + archive_entry_copy_symlink(entry, tar->entry_linkpath.s); + break; + case '3': /* Character device */ + archive_entry_set_filetype(entry, AE_IFCHR); + archive_entry_set_size(entry, 0); + tar->entry_bytes_remaining = 0; + break; + case '4': /* Block device */ + archive_entry_set_filetype(entry, AE_IFBLK); + archive_entry_set_size(entry, 0); + tar->entry_bytes_remaining = 0; + break; + case '5': /* Dir */ + archive_entry_set_filetype(entry, AE_IFDIR); + archive_entry_set_size(entry, 0); + tar->entry_bytes_remaining = 0; + break; + case '6': /* FIFO device */ + archive_entry_set_filetype(entry, AE_IFIFO); + archive_entry_set_size(entry, 0); + tar->entry_bytes_remaining = 0; + break; + case 'D': /* GNU incremental directory type */ + /* + * No special handling is actually required here. + * It might be nice someday to preprocess the file list and + * provide it to the client, though. + */ + archive_entry_set_filetype(entry, AE_IFDIR); + break; + case 'M': /* GNU "Multi-volume" (remainder of file from last archive)*/ + /* + * As far as I can tell, this is just like a regular file + * entry, except that the contents should be _appended_ to + * the indicated file at the indicated offset. This may + * require some API work to fully support. + */ + break; + case 'N': /* Old GNU "long filename" entry. */ + /* The body of this entry is a script for renaming + * previously-extracted entries. Ugh. It will never + * be supported by libarchive. */ + archive_entry_set_filetype(entry, AE_IFREG); + break; + case 'S': /* GNU sparse files */ + /* + * Sparse files are really just regular files with + * sparse information in the extended area. + */ + /* FALLTHROUGH */ + default: /* Regular file and non-standard types */ + /* + * Per POSIX: non-recognized types should always be + * treated as regular files. + */ + archive_entry_set_filetype(entry, AE_IFREG); + break; + } + return (0); +} + +/* + * Parse out header elements for "old-style" tar archives. + */ +static int +header_old_tar(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + const struct archive_entry_header_ustar *header; + + /* Copy filename over (to ensure null termination). */ + header = (const struct archive_entry_header_ustar *)h; + archive_strncpy(&(tar->entry_pathname), header->name, sizeof(header->name)); + archive_entry_copy_pathname(entry, tar->entry_pathname.s); + + /* Grab rest of common fields */ + header_common(a, tar, entry, h); + + tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining); + return (0); +} + +/* + * Parse a file header for a pax extended archive entry. + */ +static int +header_pax_global(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + int err; + + err = read_body_to_string(a, tar, &(tar->pax_global), h); + if (err != ARCHIVE_OK) + return (err); + err = tar_read_header(a, tar, entry); + return (err); +} + +static int +header_pax_extensions(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + int err, err2; + + err = read_body_to_string(a, tar, &(tar->pax_header), h); + if (err != ARCHIVE_OK) + return (err); + + /* Parse the next header. */ + err = tar_read_header(a, tar, entry); + if ((err != ARCHIVE_OK) && (err != ARCHIVE_WARN)) + return (err); + + /* + * TODO: Parse global/default options into 'entry' struct here + * before handling file-specific options. + * + * This design (parse standard header, then overwrite with pax + * extended attribute data) usually works well, but isn't ideal; + * it would be better to parse the pax extended attributes first + * and then skip any fields in the standard header that were + * defined in the pax header. + */ + err2 = pax_header(a, tar, entry, tar->pax_header.s); + err = err_combine(err, err2); + tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining); + return (err); +} + + +/* + * Parse a file header for a Posix "ustar" archive entry. This also + * handles "pax" or "extended ustar" entries. + */ +static int +header_ustar(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + const struct archive_entry_header_ustar *header; + struct archive_string *as; + + header = (const struct archive_entry_header_ustar *)h; + + /* Copy name into an internal buffer to ensure null-termination. */ + as = &(tar->entry_pathname); + if (header->prefix[0]) { + archive_strncpy(as, header->prefix, sizeof(header->prefix)); + if (as->s[archive_strlen(as) - 1] != '/') + archive_strappend_char(as, '/'); + archive_strncat(as, header->name, sizeof(header->name)); + } else + archive_strncpy(as, header->name, sizeof(header->name)); + + archive_entry_copy_pathname(entry, as->s); + + /* Handle rest of common fields. */ + header_common(a, tar, entry, h); + + /* Handle POSIX ustar fields. */ + archive_strncpy(&(tar->entry_uname), header->uname, + sizeof(header->uname)); + archive_entry_copy_uname(entry, tar->entry_uname.s); + + archive_strncpy(&(tar->entry_gname), header->gname, + sizeof(header->gname)); + archive_entry_copy_gname(entry, tar->entry_gname.s); + + /* Parse out device numbers only for char and block specials. */ + if (header->typeflag[0] == '3' || header->typeflag[0] == '4') { + archive_entry_set_rdevmajor(entry, + tar_atol(header->rdevmajor, sizeof(header->rdevmajor))); + archive_entry_set_rdevminor(entry, + tar_atol(header->rdevminor, sizeof(header->rdevminor))); + } + + tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining); + + return (0); +} + + +/* + * Parse the pax extended attributes record. + * + * Returns non-zero if there's an error in the data. + */ +static int +pax_header(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, char *attr) +{ + size_t attr_length, l, line_length; + char *line, *p; + char *key, *value; + int err, err2; + + attr_length = strlen(attr); + tar->pax_hdrcharset_binary = 0; + archive_string_empty(&(tar->entry_gname)); + archive_string_empty(&(tar->entry_linkpath)); + archive_string_empty(&(tar->entry_pathname)); + archive_string_empty(&(tar->entry_pathname_override)); + archive_string_empty(&(tar->entry_uname)); + err = ARCHIVE_OK; + while (attr_length > 0) { + /* Parse decimal length field at start of line. */ + line_length = 0; + l = attr_length; + line = p = attr; /* Record start of line. */ + while (l>0) { + if (*p == ' ') { + p++; + l--; + break; + } + if (*p < '0' || *p > '9') { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Ignoring malformed pax extended attributes"); + return (ARCHIVE_WARN); + } + line_length *= 10; + line_length += *p - '0'; + if (line_length > 999999) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Rejecting pax extended attribute > 1MB"); + return (ARCHIVE_WARN); + } + p++; + l--; + } + + /* + * Parsed length must be no bigger than available data, + * at least 1, and the last character of the line must + * be '\n'. + */ + if (line_length > attr_length + || line_length < 1 + || attr[line_length - 1] != '\n') + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Ignoring malformed pax extended attribute"); + return (ARCHIVE_WARN); + } + + /* Null-terminate the line. */ + attr[line_length - 1] = '\0'; + + /* Find end of key and null terminate it. */ + key = p; + if (key[0] == '=') + return (-1); + while (*p && *p != '=') + ++p; + if (*p == '\0') { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Invalid pax extended attributes"); + return (ARCHIVE_WARN); + } + *p = '\0'; + + /* Identify null-terminated 'value' portion. */ + value = p + 1; + + /* Identify this attribute and set it in the entry. */ + err2 = pax_attribute(tar, entry, key, value); + err = err_combine(err, err2); + + /* Skip to next line */ + attr += line_length; + attr_length -= line_length; + } + if (archive_strlen(&(tar->entry_gname)) > 0) { + value = tar->entry_gname.s; + if (tar->pax_hdrcharset_binary) + archive_entry_copy_gname(entry, value); + else { + if (!archive_entry_update_gname_utf8(entry, value)) { + err = ARCHIVE_WARN; + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Gname in pax header can't " + "be converted to current locale."); + } + } + } + if (archive_strlen(&(tar->entry_linkpath)) > 0) { + value = tar->entry_linkpath.s; + if (tar->pax_hdrcharset_binary) + archive_entry_copy_link(entry, value); + else { + if (!archive_entry_update_link_utf8(entry, value)) { + err = ARCHIVE_WARN; + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Linkname in pax header can't " + "be converted to current locale."); + } + } + } + /* + * Some extensions (such as the GNU sparse file extensions) + * deliberately store a synthetic name under the regular 'path' + * attribute and the real file name under a different attribute. + * Since we're supposed to not care about the order, we + * have no choice but to store all of the various filenames + * we find and figure it all out afterwards. This is the + * figuring out part. + */ + value = NULL; + if (archive_strlen(&(tar->entry_pathname_override)) > 0) + value = tar->entry_pathname_override.s; + else if (archive_strlen(&(tar->entry_pathname)) > 0) + value = tar->entry_pathname.s; + if (value != NULL) { + if (tar->pax_hdrcharset_binary) + archive_entry_copy_pathname(entry, value); + else { + if (!archive_entry_update_pathname_utf8(entry, value)) { + err = ARCHIVE_WARN; + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Pathname in pax header can't be " + "converted to current locale."); + } + } + } + if (archive_strlen(&(tar->entry_uname)) > 0) { + value = tar->entry_uname.s; + if (tar->pax_hdrcharset_binary) + archive_entry_copy_uname(entry, value); + else { + if (!archive_entry_update_uname_utf8(entry, value)) { + err = ARCHIVE_WARN; + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Uname in pax header can't " + "be converted to current locale."); + } + } + } + return (err); +} + +static int +pax_attribute_xattr(struct archive_entry *entry, + char *name, char *value) +{ + char *name_decoded; + void *value_decoded; + size_t value_len; + + if (strlen(name) < 18 || (strncmp(name, "LIBARCHIVE.xattr.", 17)) != 0) + return 3; + + name += 17; + + /* URL-decode name */ + name_decoded = url_decode(name); + if (name_decoded == NULL) + return 2; + + /* Base-64 decode value */ + value_decoded = base64_decode(value, strlen(value), &value_len); + if (value_decoded == NULL) { + free(name_decoded); + return 1; + } + + archive_entry_xattr_add_entry(entry, name_decoded, + value_decoded, value_len); + + free(name_decoded); + free(value_decoded); + return 0; +} + +/* + * Parse a single key=value attribute. key/value pointers are + * assumed to point into reasonably long-lived storage. + * + * Note that POSIX reserves all-lowercase keywords. Vendor-specific + * extensions should always have keywords of the form "VENDOR.attribute" + * In particular, it's quite feasible to support many different + * vendor extensions here. I'm using "LIBARCHIVE" for extensions + * unique to this library. + * + * Investigate other vendor-specific extensions and see if + * any of them look useful. + */ +static int +pax_attribute(struct tar *tar, struct archive_entry *entry, + char *key, char *value) +{ + int64_t s; + long n; + wchar_t *wp; + + switch (key[0]) { + case 'G': + /* GNU "0.0" sparse pax format. */ + if (strcmp(key, "GNU.sparse.numblocks") == 0) { + tar->sparse_offset = -1; + tar->sparse_numbytes = -1; + tar->sparse_gnu_major = 0; + tar->sparse_gnu_minor = 0; + } + if (strcmp(key, "GNU.sparse.offset") == 0) { + tar->sparse_offset = tar_atol10(value, strlen(value)); + if (tar->sparse_numbytes != -1) { + gnu_add_sparse_entry(tar, + tar->sparse_offset, tar->sparse_numbytes); + tar->sparse_offset = -1; + tar->sparse_numbytes = -1; + } + } + if (strcmp(key, "GNU.sparse.numbytes") == 0) { + tar->sparse_numbytes = tar_atol10(value, strlen(value)); + if (tar->sparse_numbytes != -1) { + gnu_add_sparse_entry(tar, + tar->sparse_offset, tar->sparse_numbytes); + tar->sparse_offset = -1; + tar->sparse_numbytes = -1; + } + } + if (strcmp(key, "GNU.sparse.size") == 0) { + tar->realsize = tar_atol10(value, strlen(value)); + archive_entry_set_size(entry, tar->realsize); + } + + /* GNU "0.1" sparse pax format. */ + if (strcmp(key, "GNU.sparse.map") == 0) { + tar->sparse_gnu_major = 0; + tar->sparse_gnu_minor = 1; + if (gnu_sparse_01_parse(tar, value) != ARCHIVE_OK) + return (ARCHIVE_WARN); + } + + /* GNU "1.0" sparse pax format */ + if (strcmp(key, "GNU.sparse.major") == 0) { + tar->sparse_gnu_major = tar_atol10(value, strlen(value)); + tar->sparse_gnu_pending = 1; + } + if (strcmp(key, "GNU.sparse.minor") == 0) { + tar->sparse_gnu_minor = tar_atol10(value, strlen(value)); + tar->sparse_gnu_pending = 1; + } + if (strcmp(key, "GNU.sparse.name") == 0) { + /* + * The real filename; when storing sparse + * files, GNU tar puts a synthesized name into + * the regular 'path' attribute in an attempt + * to limit confusion. ;-) + */ + archive_strcpy(&(tar->entry_pathname_override), value); + } + if (strcmp(key, "GNU.sparse.realsize") == 0) { + tar->realsize = tar_atol10(value, strlen(value)); + archive_entry_set_size(entry, tar->realsize); + } + break; + case 'L': + /* Our extensions */ +/* TODO: Handle arbitrary extended attributes... */ +/* + if (strcmp(key, "LIBARCHIVE.xxxxxxx")==0) + archive_entry_set_xxxxxx(entry, value); +*/ + if (strcmp(key, "LIBARCHIVE.creationtime")==0) { + pax_time(value, &s, &n); + archive_entry_set_birthtime(entry, s, n); + } + if (strncmp(key, "LIBARCHIVE.xattr.", 17)==0) + pax_attribute_xattr(entry, key, value); + break; + case 'S': + /* We support some keys used by the "star" archiver */ + if (strcmp(key, "SCHILY.acl.access")==0) { + wp = utf8_decode(tar, value, strlen(value)); + /* TODO: if (wp == NULL) */ + __archive_entry_acl_parse_w(entry, wp, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + } else if (strcmp(key, "SCHILY.acl.default")==0) { + wp = utf8_decode(tar, value, strlen(value)); + /* TODO: if (wp == NULL) */ + __archive_entry_acl_parse_w(entry, wp, + ARCHIVE_ENTRY_ACL_TYPE_DEFAULT); + } else if (strcmp(key, "SCHILY.devmajor")==0) { + archive_entry_set_rdevmajor(entry, + tar_atol10(value, strlen(value))); + } else if (strcmp(key, "SCHILY.devminor")==0) { + archive_entry_set_rdevminor(entry, + tar_atol10(value, strlen(value))); + } else if (strcmp(key, "SCHILY.fflags")==0) { + archive_entry_copy_fflags_text(entry, value); + } else if (strcmp(key, "SCHILY.dev")==0) { + archive_entry_set_dev(entry, + tar_atol10(value, strlen(value))); + } else if (strcmp(key, "SCHILY.ino")==0) { + archive_entry_set_ino(entry, + tar_atol10(value, strlen(value))); + } else if (strcmp(key, "SCHILY.nlink")==0) { + archive_entry_set_nlink(entry, + tar_atol10(value, strlen(value))); + } else if (strcmp(key, "SCHILY.realsize")==0) { + tar->realsize = tar_atol10(value, strlen(value)); + archive_entry_set_size(entry, tar->realsize); + } + break; + case 'a': + if (strcmp(key, "atime")==0) { + pax_time(value, &s, &n); + archive_entry_set_atime(entry, s, n); + } + break; + case 'c': + if (strcmp(key, "ctime")==0) { + pax_time(value, &s, &n); + archive_entry_set_ctime(entry, s, n); + } else if (strcmp(key, "charset")==0) { + /* TODO: Publish charset information in entry. */ + } else if (strcmp(key, "comment")==0) { + /* TODO: Publish comment in entry. */ + } + break; + case 'g': + if (strcmp(key, "gid")==0) { + archive_entry_set_gid(entry, + tar_atol10(value, strlen(value))); + } else if (strcmp(key, "gname")==0) { + archive_strcpy(&(tar->entry_gname), value); + } + break; + case 'h': + if (strcmp(key, "hdrcharset") == 0) { + if (strcmp(value, "BINARY") == 0) + tar->pax_hdrcharset_binary = 1; + else if (strcmp(value, "ISO-IR 10646 2000 UTF-8") == 0) + tar->pax_hdrcharset_binary = 0; + else { + /* TODO: Warn about unsupported hdrcharset */ + } + } + break; + case 'l': + /* pax interchange doesn't distinguish hardlink vs. symlink. */ + if (strcmp(key, "linkpath")==0) { + archive_strcpy(&(tar->entry_linkpath), value); + } + break; + case 'm': + if (strcmp(key, "mtime")==0) { + pax_time(value, &s, &n); + archive_entry_set_mtime(entry, s, n); + } + break; + case 'p': + if (strcmp(key, "path")==0) { + archive_strcpy(&(tar->entry_pathname), value); + } + break; + case 'r': + /* POSIX has reserved 'realtime.*' */ + break; + case 's': + /* POSIX has reserved 'security.*' */ + /* Someday: if (strcmp(key, "security.acl")==0) { ... } */ + if (strcmp(key, "size")==0) { + /* "size" is the size of the data in the entry. */ + tar->entry_bytes_remaining + = tar_atol10(value, strlen(value)); + /* + * But, "size" is not necessarily the size of + * the file on disk; if this is a sparse file, + * the disk size may have already been set from + * GNU.sparse.realsize or GNU.sparse.size or + * an old GNU header field or SCHILY.realsize + * or .... + */ + if (tar->realsize < 0) { + archive_entry_set_size(entry, + tar->entry_bytes_remaining); + tar->realsize + = tar->entry_bytes_remaining; + } + } + break; + case 'u': + if (strcmp(key, "uid")==0) { + archive_entry_set_uid(entry, + tar_atol10(value, strlen(value))); + } else if (strcmp(key, "uname")==0) { + archive_strcpy(&(tar->entry_uname), value); + } + break; + } + return (0); +} + + + +/* + * parse a decimal time value, which may include a fractional portion + */ +static void +pax_time(const char *p, int64_t *ps, long *pn) +{ + char digit; + int64_t s; + unsigned long l; + int sign; + int64_t limit, last_digit_limit; + + limit = INT64_MAX / 10; + last_digit_limit = INT64_MAX % 10; + + s = 0; + sign = 1; + if (*p == '-') { + sign = -1; + p++; + } + while (*p >= '0' && *p <= '9') { + digit = *p - '0'; + if (s > limit || + (s == limit && digit > last_digit_limit)) { + s = UINT64_MAX; + break; + } + s = (s * 10) + digit; + ++p; + } + + *ps = s * sign; + + /* Calculate nanoseconds. */ + *pn = 0; + + if (*p != '.') + return; + + l = 100000000UL; + do { + ++p; + if (*p >= '0' && *p <= '9') + *pn += (*p - '0') * l; + else + break; + } while (l /= 10); +} + +/* + * Parse GNU tar header + */ +static int +header_gnutar(struct archive_read *a, struct tar *tar, + struct archive_entry *entry, const void *h) +{ + const struct archive_entry_header_gnutar *header; + + (void)a; + + /* + * GNU header is like POSIX ustar, except 'prefix' is + * replaced with some other fields. This also means the + * filename is stored as in old-style archives. + */ + + /* Grab fields common to all tar variants. */ + header_common(a, tar, entry, h); + + /* Copy filename over (to ensure null termination). */ + header = (const struct archive_entry_header_gnutar *)h; + archive_strncpy(&(tar->entry_pathname), header->name, + sizeof(header->name)); + archive_entry_copy_pathname(entry, tar->entry_pathname.s); + + /* Fields common to ustar and GNU */ + /* XXX Can the following be factored out since it's common + * to ustar and gnu tar? Is it okay to move it down into + * header_common, perhaps? */ + archive_strncpy(&(tar->entry_uname), + header->uname, sizeof(header->uname)); + archive_entry_copy_uname(entry, tar->entry_uname.s); + + archive_strncpy(&(tar->entry_gname), + header->gname, sizeof(header->gname)); + archive_entry_copy_gname(entry, tar->entry_gname.s); + + /* Parse out device numbers only for char and block specials */ + if (header->typeflag[0] == '3' || header->typeflag[0] == '4') { + archive_entry_set_rdevmajor(entry, + tar_atol(header->rdevmajor, sizeof(header->rdevmajor))); + archive_entry_set_rdevminor(entry, + tar_atol(header->rdevminor, sizeof(header->rdevminor))); + } else + archive_entry_set_rdev(entry, 0); + + tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining); + + /* Grab GNU-specific fields. */ + archive_entry_set_atime(entry, + tar_atol(header->atime, sizeof(header->atime)), 0); + archive_entry_set_ctime(entry, + tar_atol(header->ctime, sizeof(header->ctime)), 0); + if (header->realsize[0] != 0) { + tar->realsize + = tar_atol(header->realsize, sizeof(header->realsize)); + archive_entry_set_size(entry, tar->realsize); + } + + if (header->sparse[0].offset[0] != 0) { + gnu_sparse_old_read(a, tar, header); + } else { + if (header->isextended[0] != 0) { + /* XXX WTF? XXX */ + } + } + + return (0); +} + +static void +gnu_add_sparse_entry(struct tar *tar, off_t offset, off_t remaining) +{ + struct sparse_block *p; + + p = (struct sparse_block *)malloc(sizeof(*p)); + if (p == NULL) + __archive_errx(1, "Out of memory"); + memset(p, 0, sizeof(*p)); + if (tar->sparse_last != NULL) + tar->sparse_last->next = p; + else + tar->sparse_list = p; + tar->sparse_last = p; + p->offset = offset; + p->remaining = remaining; +} + +static void +gnu_clear_sparse_list(struct tar *tar) +{ + struct sparse_block *p; + + while (tar->sparse_list != NULL) { + p = tar->sparse_list; + tar->sparse_list = p->next; + free(p); + } + tar->sparse_last = NULL; +} + +/* + * GNU tar old-format sparse data. + * + * GNU old-format sparse data is stored in a fixed-field + * format. Offset/size values are 11-byte octal fields (same + * format as 'size' field in ustart header). These are + * stored in the header, allocating subsequent header blocks + * as needed. Extending the header in this way is a pretty + * severe POSIX violation; this design has earned GNU tar a + * lot of criticism. + */ + +static int +gnu_sparse_old_read(struct archive_read *a, struct tar *tar, + const struct archive_entry_header_gnutar *header) +{ + ssize_t bytes_read; + const void *data; + struct extended { + struct gnu_sparse sparse[21]; + char isextended[1]; + char padding[7]; + }; + const struct extended *ext; + + gnu_sparse_old_parse(tar, header->sparse, 4); + if (header->isextended[0] == 0) + return (ARCHIVE_OK); + + do { + data = __archive_read_ahead(a, 512, &bytes_read); + if (bytes_read < 0) + return (ARCHIVE_FATAL); + if (bytes_read < 512) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated tar archive " + "detected while reading sparse file data"); + return (ARCHIVE_FATAL); + } + __archive_read_consume(a, 512); + ext = (const struct extended *)data; + gnu_sparse_old_parse(tar, ext->sparse, 21); + } while (ext->isextended[0] != 0); + if (tar->sparse_list != NULL) + tar->entry_offset = tar->sparse_list->offset; + return (ARCHIVE_OK); +} + +static void +gnu_sparse_old_parse(struct tar *tar, + const struct gnu_sparse *sparse, int length) +{ + while (length > 0 && sparse->offset[0] != 0) { + gnu_add_sparse_entry(tar, + tar_atol(sparse->offset, sizeof(sparse->offset)), + tar_atol(sparse->numbytes, sizeof(sparse->numbytes))); + sparse++; + length--; + } +} + +/* + * GNU tar sparse format 0.0 + * + * Beginning with GNU tar 1.15, sparse files are stored using + * information in the pax extended header. The GNU tar maintainers + * have gone through a number of variations in the process of working + * out this scheme; furtunately, they're all numbered. + * + * Sparse format 0.0 uses attribute GNU.sparse.numblocks to store the + * number of blocks, and GNU.sparse.offset/GNU.sparse.numbytes to + * store offset/size for each block. The repeated instances of these + * latter fields violate the pax specification (which frowns on + * duplicate keys), so this format was quickly replaced. + */ + +/* + * GNU tar sparse format 0.1 + * + * This version replaced the offset/numbytes attributes with + * a single "map" attribute that stored a list of integers. This + * format had two problems: First, the "map" attribute could be very + * long, which caused problems for some implementations. More + * importantly, the sparse data was lost when extracted by archivers + * that didn't recognize this extension. + */ + +static int +gnu_sparse_01_parse(struct tar *tar, const char *p) +{ + const char *e; + off_t offset = -1, size = -1; + + for (;;) { + e = p; + while (*e != '\0' && *e != ',') { + if (*e < '0' || *e > '9') + return (ARCHIVE_WARN); + e++; + } + if (offset < 0) { + offset = tar_atol10(p, e - p); + if (offset < 0) + return (ARCHIVE_WARN); + } else { + size = tar_atol10(p, e - p); + if (size < 0) + return (ARCHIVE_WARN); + gnu_add_sparse_entry(tar, offset, size); + offset = -1; + } + if (*e == '\0') + return (ARCHIVE_OK); + p = e + 1; + } +} + +/* + * GNU tar sparse format 1.0 + * + * The idea: The offset/size data is stored as a series of base-10 + * ASCII numbers prepended to the file data, so that dearchivers that + * don't support this format will extract the block map along with the + * data and a separate post-process can restore the sparseness. + * + * Unfortunately, GNU tar 1.16 had a bug that added unnecessary + * padding to the body of the file when using this format. GNU tar + * 1.17 corrected this bug without bumping the version number, so + * it's not possible to support both variants. This code supports + * the later variant at the expense of not supporting the former. + * + * This variant also replaced GNU.sparse.size with GNU.sparse.realsize + * and introduced the GNU.sparse.major/GNU.sparse.minor attributes. + */ + +/* + * Read the next line from the input, and parse it as a decimal + * integer followed by '\n'. Returns positive integer value or + * negative on error. + */ +static int64_t +gnu_sparse_10_atol(struct archive_read *a, struct tar *tar, + ssize_t *remaining) +{ + int64_t l, limit, last_digit_limit; + const char *p; + ssize_t bytes_read; + int base, digit; + + base = 10; + limit = INT64_MAX / base; + last_digit_limit = INT64_MAX % base; + + /* + * Skip any lines starting with '#'; GNU tar specs + * don't require this, but they should. + */ + do { + bytes_read = readline(a, tar, &p, tar_min(*remaining, 100)); + if (bytes_read <= 0) + return (ARCHIVE_FATAL); + *remaining -= bytes_read; + } while (p[0] == '#'); + + l = 0; + while (bytes_read > 0) { + if (*p == '\n') + return (l); + if (*p < '0' || *p >= '0' + base) + return (ARCHIVE_WARN); + digit = *p - '0'; + if (l > limit || (l == limit && digit > last_digit_limit)) + l = UINT64_MAX; /* Truncate on overflow. */ + else + l = (l * base) + digit; + p++; + bytes_read--; + } + /* TODO: Error message. */ + return (ARCHIVE_WARN); +} + +/* + * Returns length (in bytes) of the sparse data description + * that was read. + */ +static ssize_t +gnu_sparse_10_read(struct archive_read *a, struct tar *tar) +{ + ssize_t remaining, bytes_read; + int entries; + off_t offset, size, to_skip; + + /* Clear out the existing sparse list. */ + gnu_clear_sparse_list(tar); + + remaining = tar->entry_bytes_remaining; + + /* Parse entries. */ + entries = gnu_sparse_10_atol(a, tar, &remaining); + if (entries < 0) + return (ARCHIVE_FATAL); + /* Parse the individual entries. */ + while (entries-- > 0) { + /* Parse offset/size */ + offset = gnu_sparse_10_atol(a, tar, &remaining); + if (offset < 0) + return (ARCHIVE_FATAL); + size = gnu_sparse_10_atol(a, tar, &remaining); + if (size < 0) + return (ARCHIVE_FATAL); + /* Add a new sparse entry. */ + gnu_add_sparse_entry(tar, offset, size); + } + /* Skip rest of block... */ + bytes_read = tar->entry_bytes_remaining - remaining; + to_skip = 0x1ff & -bytes_read; + if (to_skip != __archive_read_skip(a, to_skip)) + return (ARCHIVE_FATAL); + return (bytes_read + to_skip); +} + +/*- + * Convert text->integer. + * + * Traditional tar formats (including POSIX) specify base-8 for + * all of the standard numeric fields. This is a significant limitation + * in practice: + * = file size is limited to 8GB + * = rdevmajor and rdevminor are limited to 21 bits + * = uid/gid are limited to 21 bits + * + * There are two workarounds for this: + * = pax extended headers, which use variable-length string fields + * = GNU tar and STAR both allow either base-8 or base-256 in + * most fields. The high bit is set to indicate base-256. + * + * On read, this implementation supports both extensions. + */ +static int64_t +tar_atol(const char *p, unsigned char_cnt) +{ + /* + * Technically, GNU tar considers a field to be in base-256 + * only if the first byte is 0xff or 0x80. + */ + if (*p & 0x80) + return (tar_atol256(p, char_cnt)); + return (tar_atol8(p, char_cnt)); +} + +/* + * Note that this implementation does not (and should not!) obey + * locale settings; you cannot simply substitute strtol here, since + * it does obey locale. + */ +static int64_t +tar_atol8(const char *p, unsigned char_cnt) +{ + int64_t l, limit, last_digit_limit; + int digit, sign, base; + + base = 8; + limit = INT64_MAX / base; + last_digit_limit = INT64_MAX % base; + + while (*p == ' ' || *p == '\t') + p++; + if (*p == '-') { + sign = -1; + p++; + } else + sign = 1; + + l = 0; + digit = *p - '0'; + while (digit >= 0 && digit < base && char_cnt-- > 0) { + if (l>limit || (l == limit && digit > last_digit_limit)) { + l = UINT64_MAX; /* Truncate on overflow. */ + break; + } + l = (l * base) + digit; + digit = *++p - '0'; + } + return (sign < 0) ? -l : l; +} + +/* + * Note that this implementation does not (and should not!) obey + * locale settings; you cannot simply substitute strtol here, since + * it does obey locale. + */ +static int64_t +tar_atol10(const char *p, unsigned char_cnt) +{ + int64_t l, limit, last_digit_limit; + int base, digit, sign; + + base = 10; + limit = INT64_MAX / base; + last_digit_limit = INT64_MAX % base; + + while (*p == ' ' || *p == '\t') + p++; + if (*p == '-') { + sign = -1; + p++; + } else + sign = 1; + + l = 0; + digit = *p - '0'; + while (digit >= 0 && digit < base && char_cnt-- > 0) { + if (l > limit || (l == limit && digit > last_digit_limit)) { + l = UINT64_MAX; /* Truncate on overflow. */ + break; + } + l = (l * base) + digit; + digit = *++p - '0'; + } + return (sign < 0) ? -l : l; +} + +/* + * Parse a base-256 integer. This is just a straight signed binary + * value in big-endian order, except that the high-order bit is + * ignored. + */ +static int64_t +tar_atol256(const char *_p, unsigned char_cnt) +{ + int64_t l, upper_limit, lower_limit; + const unsigned char *p = (const unsigned char *)_p; + + upper_limit = INT64_MAX / 256; + lower_limit = INT64_MIN / 256; + + /* Pad with 1 or 0 bits, depending on sign. */ + if ((0x40 & *p) == 0x40) + l = (int64_t)-1; + else + l = 0; + l = (l << 6) | (0x3f & *p++); + while (--char_cnt > 0) { + if (l > upper_limit) { + l = INT64_MAX; /* Truncate on overflow */ + break; + } else if (l < lower_limit) { + l = INT64_MIN; + break; + } + l = (l << 8) | (0xff & (int64_t)*p++); + } + return (l); +} + +/* + * Returns length of line (including trailing newline) + * or negative on error. 'start' argument is updated to + * point to first character of line. This avoids copying + * when possible. + */ +static ssize_t +readline(struct archive_read *a, struct tar *tar, const char **start, + ssize_t limit) +{ + ssize_t bytes_read; + ssize_t total_size = 0; + const void *t; + const char *s; + void *p; + + t = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read <= 0) + return (ARCHIVE_FATAL); + s = t; /* Start of line? */ + p = memchr(t, '\n', bytes_read); + /* If we found '\n' in the read buffer, return pointer to that. */ + if (p != NULL) { + bytes_read = 1 + ((const char *)p) - s; + if (bytes_read > limit) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Line too long"); + return (ARCHIVE_FATAL); + } + __archive_read_consume(a, bytes_read); + *start = s; + return (bytes_read); + } + /* Otherwise, we need to accumulate in a line buffer. */ + for (;;) { + if (total_size + bytes_read > limit) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Line too long"); + return (ARCHIVE_FATAL); + } + if (archive_string_ensure(&tar->line, total_size + bytes_read) == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate working buffer"); + return (ARCHIVE_FATAL); + } + memcpy(tar->line.s + total_size, t, bytes_read); + __archive_read_consume(a, bytes_read); + total_size += bytes_read; + /* If we found '\n', clean up and return. */ + if (p != NULL) { + *start = tar->line.s; + return (total_size); + } + /* Read some more. */ + t = __archive_read_ahead(a, 1, &bytes_read); + if (bytes_read <= 0) + return (ARCHIVE_FATAL); + s = t; /* Start of line? */ + p = memchr(t, '\n', bytes_read); + /* If we found '\n', trim the read. */ + if (p != NULL) { + bytes_read = 1 + ((const char *)p) - s; + } + } +} + +static wchar_t * +utf8_decode(struct tar *tar, const char *src, size_t length) +{ + wchar_t *dest; + ssize_t n; + + /* Ensure pax_entry buffer is big enough. */ + if (tar->pax_entry_length <= length) { + wchar_t *old_entry = tar->pax_entry; + + if (tar->pax_entry_length <= 0) + tar->pax_entry_length = 1024; + while (tar->pax_entry_length <= length + 1) + tar->pax_entry_length *= 2; + + old_entry = tar->pax_entry; + tar->pax_entry = (wchar_t *)realloc(tar->pax_entry, + tar->pax_entry_length * sizeof(wchar_t)); + if (tar->pax_entry == NULL) { + free(old_entry); + /* TODO: Handle this error. */ + return (NULL); + } + } + + dest = tar->pax_entry; + while (length > 0) { + n = UTF8_mbrtowc(dest, src, length); + if (n < 0) + return (NULL); + if (n == 0) + break; + dest++; + src += n; + length -= n; + } + *dest++ = L'\0'; + return (tar->pax_entry); +} + +/* + * Copied and simplified from FreeBSD libc/locale. + */ +static ssize_t +UTF8_mbrtowc(wchar_t *pwc, const char *s, size_t n) +{ + int ch, i, len, mask; + unsigned long wch; + + if (s == NULL || n == 0 || pwc == NULL) + return (0); + + /* + * Determine the number of octets that make up this character from + * the first octet, and a mask that extracts the interesting bits of + * the first octet. + */ + ch = (unsigned char)*s; + if ((ch & 0x80) == 0) { + mask = 0x7f; + len = 1; + } else if ((ch & 0xe0) == 0xc0) { + mask = 0x1f; + len = 2; + } else if ((ch & 0xf0) == 0xe0) { + mask = 0x0f; + len = 3; + } else if ((ch & 0xf8) == 0xf0) { + mask = 0x07; + len = 4; + } else { + /* Invalid first byte. */ + return (-1); + } + + if (n < (size_t)len) { + /* Valid first byte but truncated. */ + return (-2); + } + + /* + * Decode the octet sequence representing the character in chunks + * of 6 bits, most significant first. + */ + wch = (unsigned char)*s++ & mask; + i = len; + while (--i != 0) { + if ((*s & 0xc0) != 0x80) { + /* Invalid intermediate byte; consume one byte and + * emit '?' */ + *pwc = '?'; + return (1); + } + wch <<= 6; + wch |= *s++ & 0x3f; + } + + /* Assign the value to the output; out-of-range values + * just get truncated. */ + *pwc = (wchar_t)wch; +#ifdef WCHAR_MAX + /* + * If platform has WCHAR_MAX, we can do something + * more sensible with out-of-range values. + */ + if (wch >= WCHAR_MAX) + *pwc = '?'; +#endif + /* Return number of bytes input consumed: 0 for end-of-string. */ + return (wch == L'\0' ? 0 : len); +} + + +/* + * base64_decode - Base64 decode + * + * This accepts most variations of base-64 encoding, including: + * * with or without line breaks + * * with or without the final group padded with '=' or '_' characters + * (The most economical Base-64 variant does not pad the last group and + * omits line breaks; RFC1341 used for MIME requires both.) + */ +static char * +base64_decode(const char *s, size_t len, size_t *out_len) +{ + static const unsigned char digits[64] = { + 'A','B','C','D','E','F','G','H','I','J','K','L','M','N', + 'O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b', + 'c','d','e','f','g','h','i','j','k','l','m','n','o','p', + 'q','r','s','t','u','v','w','x','y','z','0','1','2','3', + '4','5','6','7','8','9','+','/' }; + static unsigned char decode_table[128]; + char *out, *d; + const unsigned char *src = (const unsigned char *)s; + + /* If the decode table is not yet initialized, prepare it. */ + if (decode_table[digits[1]] != 1) { + size_t i; + memset(decode_table, 0xff, sizeof(decode_table)); + for (i = 0; i < sizeof(digits); i++) + decode_table[digits[i]] = i; + } + + /* Allocate enough space to hold the entire output. */ + /* Note that we may not use all of this... */ + out = (char *)malloc(len - len / 4 + 1); + if (out == NULL) { + *out_len = 0; + return (NULL); + } + d = out; + + while (len > 0) { + /* Collect the next group of (up to) four characters. */ + int v = 0; + int group_size = 0; + while (group_size < 4 && len > 0) { + /* '=' or '_' padding indicates final group. */ + if (*src == '=' || *src == '_') { + len = 0; + break; + } + /* Skip illegal characters (including line breaks) */ + if (*src > 127 || *src < 32 + || decode_table[*src] == 0xff) { + len--; + src++; + continue; + } + v <<= 6; + v |= decode_table[*src++]; + len --; + group_size++; + } + /* Align a short group properly. */ + v <<= 6 * (4 - group_size); + /* Unpack the group we just collected. */ + switch (group_size) { + case 4: d[2] = v & 0xff; + /* FALLTHROUGH */ + case 3: d[1] = (v >> 8) & 0xff; + /* FALLTHROUGH */ + case 2: d[0] = (v >> 16) & 0xff; + break; + case 1: /* this is invalid! */ + break; + } + d += group_size * 3 / 4; + } + + *out_len = d - out; + return (out); +} + +static char * +url_decode(const char *in) +{ + char *out, *d; + const char *s; + + out = (char *)malloc(strlen(in) + 1); + if (out == NULL) + return (NULL); + for (s = in, d = out; *s != '\0'; ) { + if (s[0] == '%' && s[1] != '\0' && s[2] != '\0') { + /* Try to convert % escape */ + int digit1 = tohex(s[1]); + int digit2 = tohex(s[2]); + if (digit1 >= 0 && digit2 >= 0) { + /* Looks good, consume three chars */ + s += 3; + /* Convert output */ + *d++ = ((digit1 << 4) | digit2); + continue; + } + /* Else fall through and treat '%' as normal char */ + } + *d++ = *s++; + } + *d = '\0'; + return (out); +} + +static int +tohex(int c) +{ + if (c >= '0' && c <= '9') + return (c - '0'); + else if (c >= 'A' && c <= 'F') + return (c - 'A' + 10); + else if (c >= 'a' && c <= 'f') + return (c - 'a' + 10); + else + return (-1); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c new file mode 100644 index 000000000..31b68c6db --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c @@ -0,0 +1,903 @@ +/*- + * Copyright (c) 2004 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_zip.c,v 1.28 2008/12/06 06:45:15 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#ifdef HAVE_ZLIB_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_read_private.h" +#include "archive_endian.h" + +#ifndef HAVE_ZLIB_H +#include "archive_crc32.h" +#endif + +struct zip { + /* entry_bytes_remaining is the number of bytes we expect. */ + int64_t entry_bytes_remaining; + int64_t entry_offset; + + /* These count the number of bytes actually read for the entry. */ + int64_t entry_compressed_bytes_read; + int64_t entry_uncompressed_bytes_read; + + /* Running CRC32 of the decompressed data */ + unsigned long entry_crc32; + + unsigned version; + unsigned system; + unsigned flags; + unsigned compression; + const char * compression_name; + time_t mtime; + time_t ctime; + time_t atime; + mode_t mode; + uid_t uid; + gid_t gid; + + /* Flags to mark progress of decompression. */ + char decompress_init; + char end_of_entry; + + unsigned long crc32; + ssize_t filename_length; + ssize_t extra_length; + int64_t uncompressed_size; + int64_t compressed_size; + + unsigned char *uncompressed_buffer; + size_t uncompressed_buffer_size; +#ifdef HAVE_ZLIB_H + z_stream stream; + char stream_valid; +#endif + + struct archive_string pathname; + struct archive_string extra; + char format_name[64]; +}; + +#define ZIP_LENGTH_AT_END 8 + +struct zip_file_header { + char signature[4]; + char version[2]; + char flags[2]; + char compression[2]; + char timedate[4]; + char crc32[4]; + char compressed_size[4]; + char uncompressed_size[4]; + char filename_length[2]; + char extra_length[2]; +}; + +static const char *compression_names[] = { + "uncompressed", + "shrinking", + "reduced-1", + "reduced-2", + "reduced-3", + "reduced-4", + "imploded", + "reserved", + "deflation" +}; + +static int archive_read_format_zip_bid(struct archive_read *); +static int archive_read_format_zip_cleanup(struct archive_read *); +static int archive_read_format_zip_read_data(struct archive_read *, + const void **, size_t *, off_t *); +static int archive_read_format_zip_read_data_skip(struct archive_read *a); +static int archive_read_format_zip_read_header(struct archive_read *, + struct archive_entry *); +static int zip_read_data_deflate(struct archive_read *a, const void **buff, + size_t *size, off_t *offset); +static int zip_read_data_none(struct archive_read *a, const void **buff, + size_t *size, off_t *offset); +static int zip_read_file_header(struct archive_read *a, + struct archive_entry *entry, struct zip *zip); +static time_t zip_time(const char *); +static void process_extra(const void* extra, struct zip* zip); + +int +archive_read_support_format_zip(struct archive *_a) +{ + struct archive_read *a = (struct archive_read *)_a; + struct zip *zip; + int r; + + zip = (struct zip *)malloc(sizeof(*zip)); + if (zip == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate zip data"); + return (ARCHIVE_FATAL); + } + memset(zip, 0, sizeof(*zip)); + + r = __archive_read_register_format(a, + zip, + "zip", + archive_read_format_zip_bid, + NULL, + archive_read_format_zip_read_header, + archive_read_format_zip_read_data, + archive_read_format_zip_read_data_skip, + archive_read_format_zip_cleanup); + + if (r != ARCHIVE_OK) + free(zip); + return (ARCHIVE_OK); +} + + +static int +archive_read_format_zip_bid(struct archive_read *a) +{ + const char *p; + const void *buff; + ssize_t bytes_avail, offset; + + if ((p = __archive_read_ahead(a, 4, NULL)) == NULL) + return (-1); + + /* + * Bid of 30 here is: 16 bits for "PK", + * next 16-bit field has four options (-2 bits). + * 16 + 16-2 = 30. + */ + if (p[0] == 'P' && p[1] == 'K') { + if ((p[2] == '\001' && p[3] == '\002') + || (p[2] == '\003' && p[3] == '\004') + || (p[2] == '\005' && p[3] == '\006') + || (p[2] == '\007' && p[3] == '\010') + || (p[2] == '0' && p[3] == '0')) + return (30); + } + + /* + * Attempt to handle self-extracting archives + * by noting a PE header and searching forward + * up to 128k for a 'PK\003\004' marker. + */ + if (p[0] == 'M' && p[1] == 'Z') { + /* + * TODO: Optimize by initializing 'offset' to an + * estimate of the likely start of the archive data + * based on values in the PE header. Note that we + * don't need to be exact, but we mustn't skip too + * far. The search below will compensate if we + * undershoot. + */ + offset = 0; + while (offset < 124000) { + /* Get 4k of data beyond where we stopped. */ + buff = __archive_read_ahead(a, offset + 4096, + &bytes_avail); + if (bytes_avail < offset + 1) + break; + p = (const char *)buff + offset; + while (p + 9 < (const char *)buff + bytes_avail) { + if (p[0] == 'P' && p[1] == 'K' /* signature */ + && p[2] == 3 && p[3] == 4 /* File entry */ + && p[8] == 8 /* compression == deflate */ + && p[9] == 0 /* High byte of compression */ + ) + { + return (30); + } + ++p; + } + offset = p - (const char *)buff; + } + } + + return (0); +} + +/* + * Search forward for a "PK\003\004" file header. This handles the + * case of self-extracting archives, where there is an executable + * prepended to the ZIP archive. + */ +static int +skip_sfx(struct archive_read *a) +{ + const void *h; + const char *p, *q; + size_t skip; + ssize_t bytes; + + /* + * TODO: We should be able to skip forward by a bunch + * by lifting some values from the PE header. We don't + * need to be exact (we're still going to search forward + * to find the header), but it will speed things up and + * reduce the chance of a false positive. + */ + for (;;) { + h = __archive_read_ahead(a, 4, &bytes); + if (bytes < 4) + return (ARCHIVE_FATAL); + p = h; + q = p + bytes; + + /* + * Scan ahead until we find something that looks + * like the zip header. + */ + while (p + 4 < q) { + switch (p[3]) { + case '\004': + /* TODO: Additional verification here. */ + if (memcmp("PK\003\004", p, 4) == 0) { + skip = p - (const char *)h; + __archive_read_consume(a, skip); + return (ARCHIVE_OK); + } + p += 4; + break; + case '\003': p += 1; break; + case 'K': p += 2; break; + case 'P': p += 3; break; + default: p += 4; break; + } + } + skip = p - (const char *)h; + __archive_read_consume(a, skip); + } +} + +static int +archive_read_format_zip_read_header(struct archive_read *a, + struct archive_entry *entry) +{ + const void *h; + const char *signature; + struct zip *zip; + int r = ARCHIVE_OK, r1; + + a->archive.archive_format = ARCHIVE_FORMAT_ZIP; + if (a->archive.archive_format_name == NULL) + a->archive.archive_format_name = "ZIP"; + + zip = (struct zip *)(a->format->data); + zip->decompress_init = 0; + zip->end_of_entry = 0; + zip->entry_uncompressed_bytes_read = 0; + zip->entry_compressed_bytes_read = 0; + zip->entry_crc32 = crc32(0, NULL, 0); + if ((h = __archive_read_ahead(a, 4, NULL)) == NULL) + return (ARCHIVE_FATAL); + + signature = (const char *)h; + if (signature[0] == 'M' && signature[1] == 'Z') { + /* This is an executable? Must be self-extracting... */ + r = skip_sfx(a); + if (r < ARCHIVE_WARN) + return (r); + if ((h = __archive_read_ahead(a, 4, NULL)) == NULL) + return (ARCHIVE_FATAL); + signature = (const char *)h; + } + + if (signature[0] != 'P' || signature[1] != 'K') { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Bad ZIP file"); + return (ARCHIVE_FATAL); + } + + /* + * "PK00" signature is used for "split" archives that + * only have a single segment. This means we can just + * skip the PK00; the first real file header should follow. + */ + if (signature[2] == '0' && signature[3] == '0') { + __archive_read_consume(a, 4); + if ((h = __archive_read_ahead(a, 4, NULL)) == NULL) + return (ARCHIVE_FATAL); + signature = (const char *)h; + if (signature[0] != 'P' || signature[1] != 'K') { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Bad ZIP file"); + return (ARCHIVE_FATAL); + } + } + + if (signature[2] == '\001' && signature[3] == '\002') { + /* Beginning of central directory. */ + return (ARCHIVE_EOF); + } + + if (signature[2] == '\003' && signature[3] == '\004') { + /* Regular file entry. */ + r1 = zip_read_file_header(a, entry, zip); + if (r1 != ARCHIVE_OK) + return (r1); + return (r); + } + + if (signature[2] == '\005' && signature[3] == '\006') { + /* End-of-archive record. */ + return (ARCHIVE_EOF); + } + + if (signature[2] == '\007' && signature[3] == '\010') { + /* + * We should never encounter this record here; + * see ZIP_LENGTH_AT_END handling below for details. + */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Bad ZIP file: Unexpected end-of-entry record"); + return (ARCHIVE_FATAL); + } + + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Damaged ZIP file or unsupported format variant (%d,%d)", + signature[2], signature[3]); + return (ARCHIVE_FATAL); +} + +static int +zip_read_file_header(struct archive_read *a, struct archive_entry *entry, + struct zip *zip) +{ + const struct zip_file_header *p; + const void *h; + + if ((p = __archive_read_ahead(a, sizeof *p, NULL)) == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated ZIP file header"); + return (ARCHIVE_FATAL); + } + + zip->version = p->version[0]; + zip->system = p->version[1]; + zip->flags = archive_le16dec(p->flags); + zip->compression = archive_le16dec(p->compression); + if (zip->compression < + sizeof(compression_names)/sizeof(compression_names[0])) + zip->compression_name = compression_names[zip->compression]; + else + zip->compression_name = "??"; + zip->mtime = zip_time(p->timedate); + zip->ctime = 0; + zip->atime = 0; + zip->mode = 0; + zip->uid = 0; + zip->gid = 0; + zip->crc32 = archive_le32dec(p->crc32); + zip->filename_length = archive_le16dec(p->filename_length); + zip->extra_length = archive_le16dec(p->extra_length); + zip->uncompressed_size = archive_le32dec(p->uncompressed_size); + zip->compressed_size = archive_le32dec(p->compressed_size); + + __archive_read_consume(a, sizeof(struct zip_file_header)); + + + /* Read the filename. */ + if ((h = __archive_read_ahead(a, zip->filename_length, NULL)) == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated ZIP file header"); + return (ARCHIVE_FATAL); + } + if (archive_string_ensure(&zip->pathname, zip->filename_length) == NULL) + __archive_errx(1, "Out of memory"); + archive_strncpy(&zip->pathname, h, zip->filename_length); + __archive_read_consume(a, zip->filename_length); + archive_entry_set_pathname(entry, zip->pathname.s); + + if (zip->pathname.s[archive_strlen(&zip->pathname) - 1] == '/') + zip->mode = AE_IFDIR | 0777; + else + zip->mode = AE_IFREG | 0777; + + /* Read the extra data. */ + if ((h = __archive_read_ahead(a, zip->extra_length, NULL)) == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated ZIP file header"); + return (ARCHIVE_FATAL); + } + process_extra(h, zip); + __archive_read_consume(a, zip->extra_length); + + /* Populate some additional entry fields: */ + archive_entry_set_mode(entry, zip->mode); + archive_entry_set_uid(entry, zip->uid); + archive_entry_set_gid(entry, zip->gid); + archive_entry_set_mtime(entry, zip->mtime, 0); + archive_entry_set_ctime(entry, zip->ctime, 0); + archive_entry_set_atime(entry, zip->atime, 0); + /* Set the size only if it's meaningful. */ + if (0 == (zip->flags & ZIP_LENGTH_AT_END)) + archive_entry_set_size(entry, zip->uncompressed_size); + + zip->entry_bytes_remaining = zip->compressed_size; + zip->entry_offset = 0; + + /* If there's no body, force read_data() to return EOF immediately. */ + if (0 == (zip->flags & ZIP_LENGTH_AT_END) + && zip->entry_bytes_remaining < 1) + zip->end_of_entry = 1; + + /* Set up a more descriptive format name. */ + sprintf(zip->format_name, "ZIP %d.%d (%s)", + zip->version / 10, zip->version % 10, + zip->compression_name); + a->archive.archive_format_name = zip->format_name; + + return (ARCHIVE_OK); +} + +/* Convert an MSDOS-style date/time into Unix-style time. */ +static time_t +zip_time(const char *p) +{ + int msTime, msDate; + struct tm ts; + + msTime = (0xff & (unsigned)p[0]) + 256 * (0xff & (unsigned)p[1]); + msDate = (0xff & (unsigned)p[2]) + 256 * (0xff & (unsigned)p[3]); + + memset(&ts, 0, sizeof(ts)); + ts.tm_year = ((msDate >> 9) & 0x7f) + 80; /* Years since 1900. */ + ts.tm_mon = ((msDate >> 5) & 0x0f) - 1; /* Month number. */ + ts.tm_mday = msDate & 0x1f; /* Day of month. */ + ts.tm_hour = (msTime >> 11) & 0x1f; + ts.tm_min = (msTime >> 5) & 0x3f; + ts.tm_sec = (msTime << 1) & 0x3e; + ts.tm_isdst = -1; + return mktime(&ts); +} + +static int +archive_read_format_zip_read_data(struct archive_read *a, + const void **buff, size_t *size, off_t *offset) +{ + int r; + struct zip *zip; + + zip = (struct zip *)(a->format->data); + + /* + * If we hit end-of-entry last time, clean up and return + * ARCHIVE_EOF this time. + */ + if (zip->end_of_entry) { + *offset = zip->entry_uncompressed_bytes_read; + *size = 0; + *buff = NULL; + return (ARCHIVE_EOF); + } + + switch(zip->compression) { + case 0: /* No compression. */ + r = zip_read_data_none(a, buff, size, offset); + break; + case 8: /* Deflate compression. */ + r = zip_read_data_deflate(a, buff, size, offset); + break; + default: /* Unsupported compression. */ + *buff = NULL; + *size = 0; + *offset = 0; + /* Return a warning. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unsupported ZIP compression method (%s)", + zip->compression_name); + if (zip->flags & ZIP_LENGTH_AT_END) { + /* + * ZIP_LENGTH_AT_END requires us to + * decompress the entry in order to + * skip it, but we don't know this + * compression method, so we give up. + */ + r = ARCHIVE_FATAL; + } else { + /* We can't decompress this entry, but we will + * be able to skip() it and try the next entry. */ + r = ARCHIVE_WARN; + } + break; + } + if (r != ARCHIVE_OK) + return (r); + /* Update checksum */ + if (*size) + zip->entry_crc32 = crc32(zip->entry_crc32, *buff, *size); + /* If we hit the end, swallow any end-of-data marker. */ + if (zip->end_of_entry) { + if (zip->flags & ZIP_LENGTH_AT_END) { + const char *p; + + if ((p = __archive_read_ahead(a, 16, NULL)) == NULL) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated ZIP end-of-file record"); + return (ARCHIVE_FATAL); + } + zip->crc32 = archive_le32dec(p + 4); + zip->compressed_size = archive_le32dec(p + 8); + zip->uncompressed_size = archive_le32dec(p + 12); + __archive_read_consume(a, 16); + } + /* Check file size, CRC against these values. */ + if (zip->compressed_size != zip->entry_compressed_bytes_read) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "ZIP compressed data is wrong size"); + return (ARCHIVE_WARN); + } + /* Size field only stores the lower 32 bits of the actual size. */ + if ((zip->uncompressed_size & UINT32_MAX) + != (zip->entry_uncompressed_bytes_read & UINT32_MAX)) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "ZIP uncompressed data is wrong size"); + return (ARCHIVE_WARN); + } + /* Check computed CRC against header */ + if (zip->crc32 != zip->entry_crc32) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "ZIP bad CRC: 0x%lx should be 0x%lx", + zip->entry_crc32, zip->crc32); + return (ARCHIVE_WARN); + } + } + + /* Return EOF immediately if this is a non-regular file. */ + if (AE_IFREG != (zip->mode & AE_IFMT)) + return (ARCHIVE_EOF); + return (ARCHIVE_OK); +} + +/* + * Read "uncompressed" data. According to the current specification, + * if ZIP_LENGTH_AT_END is specified, then the size fields in the + * initial file header are supposed to be set to zero. This would, of + * course, make it impossible for us to read the archive, since we + * couldn't determine the end of the file data. Info-ZIP seems to + * include the real size fields both before and after the data in this + * case (the CRC only appears afterwards), so this works as you would + * expect. + * + * Returns ARCHIVE_OK if successful, ARCHIVE_FATAL otherwise, sets + * zip->end_of_entry if it consumes all of the data. + */ +static int +zip_read_data_none(struct archive_read *a, const void **buff, + size_t *size, off_t *offset) +{ + struct zip *zip; + ssize_t bytes_avail; + + zip = (struct zip *)(a->format->data); + + if (zip->entry_bytes_remaining == 0) { + *buff = NULL; + *size = 0; + *offset = zip->entry_offset; + zip->end_of_entry = 1; + return (ARCHIVE_OK); + } + /* + * Note: '1' here is a performance optimization. + * Recall that the decompression layer returns a count of + * available bytes; asking for more than that forces the + * decompressor to combine reads by copying data. + */ + *buff = __archive_read_ahead(a, 1, &bytes_avail); + if (bytes_avail <= 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated ZIP file data"); + return (ARCHIVE_FATAL); + } + if (bytes_avail > zip->entry_bytes_remaining) + bytes_avail = zip->entry_bytes_remaining; + __archive_read_consume(a, bytes_avail); + *size = bytes_avail; + *offset = zip->entry_offset; + zip->entry_offset += *size; + zip->entry_bytes_remaining -= *size; + zip->entry_uncompressed_bytes_read += *size; + zip->entry_compressed_bytes_read += *size; + return (ARCHIVE_OK); +} + +#ifdef HAVE_ZLIB_H +static int +zip_read_data_deflate(struct archive_read *a, const void **buff, + size_t *size, off_t *offset) +{ + struct zip *zip; + ssize_t bytes_avail; + const void *compressed_buff; + int r; + + zip = (struct zip *)(a->format->data); + + /* If the buffer hasn't been allocated, allocate it now. */ + if (zip->uncompressed_buffer == NULL) { + zip->uncompressed_buffer_size = 32 * 1024; + zip->uncompressed_buffer + = (unsigned char *)malloc(zip->uncompressed_buffer_size); + if (zip->uncompressed_buffer == NULL) { + archive_set_error(&a->archive, ENOMEM, + "No memory for ZIP decompression"); + return (ARCHIVE_FATAL); + } + } + + /* If we haven't yet read any data, initialize the decompressor. */ + if (!zip->decompress_init) { + if (zip->stream_valid) + r = inflateReset(&zip->stream); + else + r = inflateInit2(&zip->stream, + -15 /* Don't check for zlib header */); + if (r != Z_OK) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Can't initialize ZIP decompression."); + return (ARCHIVE_FATAL); + } + /* Stream structure has been set up. */ + zip->stream_valid = 1; + /* We've initialized decompression for this stream. */ + zip->decompress_init = 1; + } + + /* + * Note: '1' here is a performance optimization. + * Recall that the decompression layer returns a count of + * available bytes; asking for more than that forces the + * decompressor to combine reads by copying data. + */ + compressed_buff = __archive_read_ahead(a, 1, &bytes_avail); + if (bytes_avail <= 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Truncated ZIP file body"); + return (ARCHIVE_FATAL); + } + + /* + * A bug in zlib.h: stream.next_in should be marked 'const' + * but isn't (the library never alters data through the + * next_in pointer, only reads it). The result: this ugly + * cast to remove 'const'. + */ + zip->stream.next_in = (Bytef *)(uintptr_t)(const void *)compressed_buff; + zip->stream.avail_in = bytes_avail; + zip->stream.total_in = 0; + zip->stream.next_out = zip->uncompressed_buffer; + zip->stream.avail_out = zip->uncompressed_buffer_size; + zip->stream.total_out = 0; + + r = inflate(&zip->stream, 0); + switch (r) { + case Z_OK: + break; + case Z_STREAM_END: + zip->end_of_entry = 1; + break; + case Z_MEM_ERROR: + archive_set_error(&a->archive, ENOMEM, + "Out of memory for ZIP decompression"); + return (ARCHIVE_FATAL); + default: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "ZIP decompression failed (%d)", r); + return (ARCHIVE_FATAL); + } + + /* Consume as much as the compressor actually used. */ + bytes_avail = zip->stream.total_in; + __archive_read_consume(a, bytes_avail); + zip->entry_bytes_remaining -= bytes_avail; + zip->entry_compressed_bytes_read += bytes_avail; + + *offset = zip->entry_offset; + *size = zip->stream.total_out; + zip->entry_uncompressed_bytes_read += *size; + *buff = zip->uncompressed_buffer; + zip->entry_offset += *size; + return (ARCHIVE_OK); +} +#else +static int +zip_read_data_deflate(struct archive_read *a, const void **buff, + size_t *size, off_t *offset) +{ + *buff = NULL; + *size = 0; + *offset = 0; + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "libarchive compiled without deflate support (no libz)"); + return (ARCHIVE_FATAL); +} +#endif + +static int +archive_read_format_zip_read_data_skip(struct archive_read *a) +{ + struct zip *zip; + const void *buff = NULL; + off_t bytes_skipped; + + zip = (struct zip *)(a->format->data); + + /* If we've already read to end of data, we're done. */ + if (zip->end_of_entry) + return (ARCHIVE_OK); + + /* + * If the length is at the end, we have no choice but + * to decompress all the data to find the end marker. + */ + if (zip->flags & ZIP_LENGTH_AT_END) { + size_t size; + off_t offset; + int r; + do { + r = archive_read_format_zip_read_data(a, &buff, + &size, &offset); + } while (r == ARCHIVE_OK); + return (r); + } + + /* + * If the length is at the beginning, we can skip the + * compressed data much more quickly. + */ + bytes_skipped = __archive_read_skip(a, zip->entry_bytes_remaining); + if (bytes_skipped < 0) + return (ARCHIVE_FATAL); + + /* This entry is finished and done. */ + zip->end_of_entry = 1; + return (ARCHIVE_OK); +} + +static int +archive_read_format_zip_cleanup(struct archive_read *a) +{ + struct zip *zip; + + zip = (struct zip *)(a->format->data); +#ifdef HAVE_ZLIB_H + if (zip->stream_valid) + inflateEnd(&zip->stream); +#endif + free(zip->uncompressed_buffer); + archive_string_free(&(zip->pathname)); + archive_string_free(&(zip->extra)); + free(zip); + (a->format->data) = NULL; + return (ARCHIVE_OK); +} + +/* + * The extra data is stored as a list of + * id1+size1+data1 + id2+size2+data2 ... + * triplets. id and size are 2 bytes each. + */ +static void +process_extra(const void* extra, struct zip* zip) +{ + int offset = 0; + const char *p = (const char *)extra; + while (offset < zip->extra_length - 4) + { + unsigned short headerid = archive_le16dec(p + offset); + unsigned short datasize = archive_le16dec(p + offset + 2); + offset += 4; + if (offset + datasize > zip->extra_length) + break; +#ifdef DEBUG + fprintf(stderr, "Header id 0x%04x, length %d\n", + headerid, datasize); +#endif + switch (headerid) { + case 0x0001: + /* Zip64 extended information extra field. */ + if (datasize >= 8) + zip->uncompressed_size = archive_le64dec(p + offset); + if (datasize >= 16) + zip->compressed_size = archive_le64dec(p + offset + 8); + break; + case 0x5455: + { + /* Extended time field "UT". */ + int flags = p[offset]; + offset++; + datasize--; + /* Flag bits indicate which dates are present. */ + if (flags & 0x01) + { +#ifdef DEBUG + fprintf(stderr, "mtime: %lld -> %d\n", + (long long)zip->mtime, + archive_le32dec(p + offset)); +#endif + if (datasize < 4) + break; + zip->mtime = archive_le32dec(p + offset); + offset += 4; + datasize -= 4; + } + if (flags & 0x02) + { + if (datasize < 4) + break; + zip->atime = archive_le32dec(p + offset); + offset += 4; + datasize -= 4; + } + if (flags & 0x04) + { + if (datasize < 4) + break; + zip->ctime = archive_le32dec(p + offset); + offset += 4; + datasize -= 4; + } + break; + } + case 0x7855: + /* Info-ZIP Unix Extra Field (type 2) "Ux". */ +#ifdef DEBUG + fprintf(stderr, "uid %d gid %d\n", + archive_le16dec(p + offset), + archive_le16dec(p + offset + 2)); +#endif + if (datasize >= 2) + zip->uid = archive_le16dec(p + offset); + if (datasize >= 4) + zip->gid = archive_le16dec(p + offset + 2); + break; + default: + break; + } + offset += datasize; + } +#ifdef DEBUG + if (offset != zip->extra_length) + { + fprintf(stderr, + "Extra data field contents do not match reported size!"); + } +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/archive_string.c b/Utilities/cmlibarchive/libarchive/archive_string.c new file mode 100644 index 000000000..8a93e31b1 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_string.c @@ -0,0 +1,455 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_string.c,v 1.17 2008/12/06 05:56:43 kientzle Exp $"); + +/* + * Basic resizable string support, to simplify manipulating arbitrary-sized + * strings while minimizing heap activity. + */ + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_WCHAR_H +#include +#endif +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#endif + +#include "archive_private.h" +#include "archive_string.h" + +struct archive_string * +__archive_string_append(struct archive_string *as, const char *p, size_t s) +{ + if (__archive_string_ensure(as, as->length + s + 1) == NULL) + __archive_errx(1, "Out of memory"); + memcpy(as->s + as->length, p, s); + as->s[as->length + s] = 0; + as->length += s; + return (as); +} + +void +__archive_string_copy(struct archive_string *dest, struct archive_string *src) +{ + if (src->length == 0) + dest->length = 0; + else { + if (__archive_string_ensure(dest, src->length + 1) == NULL) + __archive_errx(1, "Out of memory"); + memcpy(dest->s, src->s, src->length); + dest->length = src->length; + dest->s[dest->length] = 0; + } +} + +void +__archive_string_concat(struct archive_string *dest, struct archive_string *src) +{ + if (src->length > 0) { + if (__archive_string_ensure(dest, dest->length + src->length + 1) == NULL) + __archive_errx(1, "Out of memory"); + memcpy(dest->s + dest->length, src->s, src->length); + dest->length += src->length; + dest->s[dest->length] = 0; + } +} + +void +__archive_string_free(struct archive_string *as) +{ + as->length = 0; + as->buffer_length = 0; + if (as->s != NULL) { + free(as->s); + as->s = NULL; + } +} + +/* Returns NULL on any allocation failure. */ +struct archive_string * +__archive_string_ensure(struct archive_string *as, size_t s) +{ + /* If buffer is already big enough, don't reallocate. */ + if (as->s && (s <= as->buffer_length)) + return (as); + + /* + * Growing the buffer at least exponentially ensures that + * append operations are always linear in the number of + * characters appended. Using a smaller growth rate for + * larger buffers reduces memory waste somewhat at the cost of + * a larger constant factor. + */ + if (as->buffer_length < 32) + /* Start with a minimum 32-character buffer. */ + as->buffer_length = 32; + else if (as->buffer_length < 8192) + /* Buffers under 8k are doubled for speed. */ + as->buffer_length += as->buffer_length; + else { + /* Buffers 8k and over grow by at least 25% each time. */ + size_t old_length = as->buffer_length; + as->buffer_length += as->buffer_length / 4; + /* Be safe: If size wraps, release buffer and return NULL. */ + if (as->buffer_length < old_length) { + free(as->s); + as->s = NULL; + return (NULL); + } + } + /* + * The computation above is a lower limit to how much we'll + * grow the buffer. In any case, we have to grow it enough to + * hold the request. + */ + if (as->buffer_length < s) + as->buffer_length = s; + /* Now we can reallocate the buffer. */ + as->s = (char *)realloc(as->s, as->buffer_length); + if (as->s == NULL) + return (NULL); + return (as); +} + +struct archive_string * +__archive_strncat(struct archive_string *as, const void *_p, size_t n) +{ + size_t s; + const char *p, *pp; + + p = (const char *)_p; + + /* Like strlen(p), except won't examine positions beyond p[n]. */ + s = 0; + pp = p; + while (*pp && s < n) { + pp++; + s++; + } + return (__archive_string_append(as, p, s)); +} + +struct archive_string * +__archive_strappend_char(struct archive_string *as, char c) +{ + return (__archive_string_append(as, &c, 1)); +} + +/* + * Translates a wide character string into UTF-8 and appends + * to the archive_string. Note: returns NULL if conversion fails, + * but still leaves a best-effort conversion in the argument as. + */ +struct archive_string * +__archive_strappend_w_utf8(struct archive_string *as, const wchar_t *w) +{ + char *p; + unsigned wc; + char buff[256]; + struct archive_string *return_val = as; + + /* + * Convert one wide char at a time into 'buff', whenever that + * fills, append it to the string. + */ + p = buff; + while (*w != L'\0') { + /* Flush the buffer when we have <=16 bytes free. */ + /* (No encoding has a single character >16 bytes.) */ + if ((size_t)(p - buff) >= (size_t)(sizeof(buff) - 16)) { + *p = '\0'; + archive_strcat(as, buff); + p = buff; + } + wc = *w++; + /* If this is a surrogate pair, assemble the full code point.*/ + /* Note: wc must not be wchar_t here, because the full code + * point can be more than 16 bits! */ + if (wc >= 0xD800 && wc <= 0xDBff + && *w >= 0xDC00 && *w <= 0xDFFF) { + wc -= 0xD800; + wc *= 0x400; + wc += (*w - 0xDC00); + wc += 0x10000; + ++w; + } + /* Translate code point to UTF8 */ + if (wc <= 0x7f) { + *p++ = (char)wc; + } else if (wc <= 0x7ff) { + *p++ = 0xc0 | ((wc >> 6) & 0x1f); + *p++ = 0x80 | (wc & 0x3f); + } else if (wc <= 0xffff) { + *p++ = 0xe0 | ((wc >> 12) & 0x0f); + *p++ = 0x80 | ((wc >> 6) & 0x3f); + *p++ = 0x80 | (wc & 0x3f); + } else if (wc <= 0x1fffff) { + *p++ = 0xf0 | ((wc >> 18) & 0x07); + *p++ = 0x80 | ((wc >> 12) & 0x3f); + *p++ = 0x80 | ((wc >> 6) & 0x3f); + *p++ = 0x80 | (wc & 0x3f); + } else { + /* Unicode has no codes larger than 0x1fffff. */ + /* TODO: use \uXXXX escape here instead of ? */ + *p++ = '?'; + return_val = NULL; + } + } + *p = '\0'; + archive_strcat(as, buff); + return (return_val); +} + +static int +utf8_to_unicode(int *pwc, const char *s, size_t n) +{ + int ch; + + /* + * Decode 1-4 bytes depending on the value of the first byte. + */ + ch = (unsigned char)*s; + if (ch == 0) { + return (0); /* Standard: return 0 for end-of-string. */ + } + if ((ch & 0x80) == 0) { + *pwc = ch & 0x7f; + return (1); + } + if ((ch & 0xe0) == 0xc0) { + if (n < 2) + return (-1); + if ((s[1] & 0xc0) != 0x80) return (-1); + *pwc = ((ch & 0x1f) << 6) | (s[1] & 0x3f); + return (2); + } + if ((ch & 0xf0) == 0xe0) { + if (n < 3) + return (-1); + if ((s[1] & 0xc0) != 0x80) return (-1); + if ((s[2] & 0xc0) != 0x80) return (-1); + *pwc = ((ch & 0x0f) << 12) + | ((s[1] & 0x3f) << 6) + | (s[2] & 0x3f); + return (3); + } + if ((ch & 0xf8) == 0xf0) { + if (n < 4) + return (-1); + if ((s[1] & 0xc0) != 0x80) return (-1); + if ((s[2] & 0xc0) != 0x80) return (-1); + if ((s[3] & 0xc0) != 0x80) return (-1); + *pwc = ((ch & 0x07) << 18) + | ((s[1] & 0x3f) << 12) + | ((s[2] & 0x3f) << 6) + | (s[3] & 0x3f); + return (4); + } + /* Invalid first byte. */ + return (-1); +} + +/* + * Return a wide-character Unicode string by converting this archive_string + * from UTF-8. We assume that systems with 16-bit wchar_t always use + * UTF16 and systems with 32-bit wchar_t can accept UCS4. + */ +wchar_t * +__archive_string_utf8_w(struct archive_string *as) +{ + wchar_t *ws, *dest; + int wc, wc2;/* Must be large enough for a 21-bit Unicode code point. */ + const char *src; + int n; + int err; + + ws = (wchar_t *)malloc((as->length + 1) * sizeof(wchar_t)); + if (ws == NULL) + __archive_errx(1, "Out of memory"); + err = 0; + dest = ws; + src = as->s; + while (*src != '\0') { + n = utf8_to_unicode(&wc, src, 8); + if (n == 0) + break; + if (n < 0) { + free(ws); + return (NULL); + } + src += n; + if (wc >= 0xDC00 && wc <= 0xDBFF) { + /* This is a leading surrogate; some idiot + * has translated UTF16 to UTF8 without combining + * surrogates; rebuild the full code point before + * continuing. */ + n = utf8_to_unicode(&wc2, src, 8); + if (n < 0) { + free(ws); + return (NULL); + } + if (n == 0) /* Ignore the leading surrogate */ + break; + if (wc2 < 0xDC00 || wc2 > 0xDFFF) { + /* If the second character isn't a + * trailing surrogate, then someone + * has really screwed up and this is + * invalid. */ + free(ws); + return (NULL); + } else { + src += n; + wc -= 0xD800; + wc *= 0x400; + wc += wc2 - 0xDC00; + wc += 0x10000; + } + } + if ((sizeof(wchar_t) < 4) && (wc > 0xffff)) { + /* We have a code point that won't fit into a + * wchar_t; convert it to a surrogate pair. */ + wc -= 0x10000; + *dest++ = ((wc >> 10) & 0x3ff) + 0xD800; + *dest++ = (wc & 0x3ff) + 0xDC00; + } else + *dest++ = wc; + } + *dest++ = L'\0'; + return (ws); +} + +#if defined(_WIN32) && !defined(__CYGWIN__) + +/* + * Translates a wide character string into current locale character set + * and appends to the archive_string. Note: returns NULL if conversion + * fails. + * + * Win32 builds use WideCharToMultiByte from the Windows API. + * (Maybe Cygwin should too? WideCharToMultiByte will know a + * lot more about local character encodings than the wcrtomb() + * wrapper is going to know.) + */ +struct archive_string * +__archive_strappend_w_mbs(struct archive_string *as, const wchar_t *w) +{ + char *p; + int l, wl; + BOOL useDefaultChar = FALSE; + + wl = (int)wcslen(w); + l = wl * 4 + 4; + p = malloc(l); + if (p == NULL) + __archive_errx(1, "Out of memory"); + /* To check a useDefaultChar is to simulate error handling of + * the my_wcstombs() which is running on non Windows system with + * wctomb(). + * And to set NULL for last argument is necessary when a codepage + * is not CP_ACP(current locale). + */ + l = WideCharToMultiByte(CP_ACP, 0, w, wl, p, l, NULL, &useDefaultChar); + if (l == 0) { + free(p); + return (NULL); + } + __archive_string_append(as, p, l); + free(p); + return (as); +} + +#else + +/* + * Translates a wide character string into current locale character set + * and appends to the archive_string. Note: returns NULL if conversion + * fails. + * + * Non-Windows uses ISO C wcrtomb() or wctomb() to perform the conversion + * one character at a time. If a non-Windows platform doesn't have + * either of these, fall back to the built-in UTF8 conversion. + */ +struct archive_string * +__archive_strappend_w_mbs(struct archive_string *as, const wchar_t *w) +{ +#if !defined(HAVE_WCTOMB) && !defined(HAVE_WCRTOMB) + /* If there's no built-in locale support, fall back to UTF8 always. */ + return __archive_strappend_w_utf8(as, w); +#else + /* We cannot use the standard wcstombs() here because it + * cannot tell us how big the output buffer should be. So + * I've built a loop around wcrtomb() or wctomb() that + * converts a character at a time and resizes the string as + * needed. We prefer wcrtomb() when it's available because + * it's thread-safe. */ + int n; + char *p; + char buff[256]; +#if HAVE_WCRTOMB + mbstate_t shift_state; + + memset(&shift_state, 0, sizeof(shift_state)); +#else + /* Clear the shift state before starting. */ + wctomb(NULL, L'\0'); +#endif + + /* + * Convert one wide char at a time into 'buff', whenever that + * fills, append it to the string. + */ + p = buff; + while (*w != L'\0') { + /* Flush the buffer when we have <=16 bytes free. */ + /* (No encoding has a single character >16 bytes.) */ + if ((size_t)(p - buff) >= (size_t)(sizeof(buff) - MB_CUR_MAX)) { + *p = '\0'; + archive_strcat(as, buff); + p = buff; + } +#if HAVE_WCRTOMB + n = wcrtomb(p, *w++, &shift_state); +#else + n = wctomb(p, *w++); +#endif + if (n == -1) + return (NULL); + p += n; + } + *p = '\0'; + archive_strcat(as, buff); + return (as); +#endif +} + +#endif /* _WIN32 && ! __CYGWIN__ */ diff --git a/Utilities/cmlibarchive/libarchive/archive_string.h b/Utilities/cmlibarchive/libarchive/archive_string.h new file mode 100644 index 000000000..debfa5ef3 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_string.h @@ -0,0 +1,148 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive_string.h,v 1.13 2008/12/06 05:56:43 kientzle Exp $ + * + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef ARCHIVE_STRING_H_INCLUDED +#define ARCHIVE_STRING_H_INCLUDED + +#include +#ifdef HAVE_STDLIB_H +#include /* required for wchar_t on some systems */ +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_WCHAR_H +#include +#endif + +/* + * Basic resizable/reusable string support a la Java's "StringBuffer." + * + * Unlike sbuf(9), the buffers here are fully reusable and track the + * length throughout. + * + * Note that all visible symbols here begin with "__archive" as they + * are internal symbols not intended for anyone outside of this library + * to see or use. + */ + +struct archive_string { + char *s; /* Pointer to the storage */ + size_t length; /* Length of 's' */ + size_t buffer_length; /* Length of malloc-ed storage */ +}; + +/* Initialize an archive_string object on the stack or elsewhere. */ +#define archive_string_init(a) \ + do { (a)->s = NULL; (a)->length = 0; (a)->buffer_length = 0; } while(0) + +/* Append a C char to an archive_string, resizing as necessary. */ +struct archive_string * +__archive_strappend_char(struct archive_string *, char); +#define archive_strappend_char __archive_strappend_char + +/* Convert a wide-char string to UTF-8 and append the result. */ +struct archive_string * +__archive_strappend_w_utf8(struct archive_string *, const wchar_t *); +#define archive_strappend_w_utf8 __archive_strappend_w_utf8 + +/* Convert a wide-char string to current locale and append the result. */ +/* Returns NULL if conversion fails. */ +struct archive_string * +__archive_strappend_w_mbs(struct archive_string *, const wchar_t *); +#define archive_strappend_w_mbs __archive_strappend_w_mbs + +/* Basic append operation. */ +struct archive_string * +__archive_string_append(struct archive_string *as, const char *p, size_t s); + +/* Copy one archive_string to another */ +void +__archive_string_copy(struct archive_string *dest, struct archive_string *src); +#define archive_string_copy(dest, src) \ + __archive_string_copy(dest, src) + +/* Concatenate one archive_string to another */ +void +__archive_string_concat(struct archive_string *dest, struct archive_string *src); +#define archive_string_concat(dest, src) \ + __archive_string_concat(dest, src) + +/* Ensure that the underlying buffer is at least as large as the request. */ +struct archive_string * +__archive_string_ensure(struct archive_string *, size_t); +#define archive_string_ensure __archive_string_ensure + +/* Append C string, which may lack trailing \0. */ +/* The source is declared void * here because this gets used with + * "signed char *", "unsigned char *" and "char *" arguments. + * Declaring it "char *" as with some of the other functions just + * leads to a lot of extra casts. */ +struct archive_string * +__archive_strncat(struct archive_string *, const void *, size_t); +#define archive_strncat __archive_strncat + +/* Append a C string to an archive_string, resizing as necessary. */ +#define archive_strcat(as,p) __archive_string_append((as),(p),strlen(p)) + +/* Copy a C string to an archive_string, resizing as necessary. */ +#define archive_strcpy(as,p) \ + ((as)->length = 0, __archive_string_append((as), (p), p == NULL ? 0 : strlen(p))) + +/* Copy a C string to an archive_string with limit, resizing as necessary. */ +#define archive_strncpy(as,p,l) \ + ((as)->length=0, archive_strncat((as), (p), (l))) + +/* Return length of string. */ +#define archive_strlen(a) ((a)->length) + +/* Set string length to zero. */ +#define archive_string_empty(a) ((a)->length = 0) + +/* Release any allocated storage resources. */ +void __archive_string_free(struct archive_string *); +#define archive_string_free __archive_string_free + +/* Like 'vsprintf', but resizes the underlying string as necessary. */ +void __archive_string_vsprintf(struct archive_string *, const char *, + va_list); +#define archive_string_vsprintf __archive_string_vsprintf + +void __archive_string_sprintf(struct archive_string *, const char *, ...); +#define archive_string_sprintf __archive_string_sprintf + +/* Allocates a fresh buffer and converts as (assumed to be UTF-8) into it. + * Returns NULL if conversion failed in any way. */ +wchar_t *__archive_string_utf8_w(struct archive_string *as); + + +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_string_sprintf.c b/Utilities/cmlibarchive/libarchive/archive_string_sprintf.c new file mode 100644 index 000000000..cd5017b28 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_string_sprintf.c @@ -0,0 +1,164 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_string_sprintf.c,v 1.10 2008/03/14 22:00:09 kientzle Exp $"); + +/* + * The use of printf()-family functions can be troublesome + * for space-constrained applications. In addition, correctly + * implementing this function in terms of vsnprintf() requires + * two calls (one to determine the size, another to format the + * result), which in turn requires duplicating the argument list + * using va_copy, which isn't yet universally available. + * + * So, I've implemented a bare minimum of printf()-like capability + * here. This is only used to format error messages, so doesn't + * require any floating-point support or field-width handling. + */ + +#include + +#include "archive_string.h" +#include "archive_private.h" + +/* + * Utility functions to format signed/unsigned integers and append + * them to an archive_string. + */ +static void +append_uint(struct archive_string *as, uintmax_t d, unsigned base) +{ + static const char *digits = "0123456789abcdef"; + if (d >= base) + append_uint(as, d/base, base); + archive_strappend_char(as, digits[d % base]); +} + +static void +append_int(struct archive_string *as, intmax_t d, unsigned base) +{ + if (d < 0) { + archive_strappend_char(as, '-'); + d = -d; + } + append_uint(as, d, base); +} + + +void +__archive_string_sprintf(struct archive_string *as, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + archive_string_vsprintf(as, fmt, ap); + va_end(ap); +} + +/* + * Like 'vsprintf', but ensures the target is big enough, resizing if + * necessary. + */ +void +__archive_string_vsprintf(struct archive_string *as, const char *fmt, + va_list ap) +{ + char long_flag; + intmax_t s; /* Signed integer temp. */ + uintmax_t u; /* Unsigned integer temp. */ + const char *p, *p2; + + if (__archive_string_ensure(as, 64) == NULL) + __archive_errx(1, "Out of memory"); + + if (fmt == NULL) { + as->s[0] = 0; + return; + } + + for (p = fmt; *p != '\0'; p++) { + const char *saved_p = p; + + if (*p != '%') { + archive_strappend_char(as, *p); + continue; + } + + p++; + + long_flag = '\0'; + switch(*p) { + case 'j': + long_flag = 'j'; + p++; + break; + case 'l': + long_flag = 'l'; + p++; + break; + } + + switch (*p) { + case '%': + __archive_strappend_char(as, '%'); + break; + case 'c': + s = va_arg(ap, int); + __archive_strappend_char(as, s); + break; + case 'd': + switch(long_flag) { + case 'j': s = va_arg(ap, intmax_t); break; + case 'l': s = va_arg(ap, long); break; + default: s = va_arg(ap, int); break; + } + append_int(as, s, 10); + break; + case 's': + p2 = va_arg(ap, char *); + archive_strcat(as, p2); + break; + case 'o': case 'u': case 'x': case 'X': + /* Common handling for unsigned integer formats. */ + switch(long_flag) { + case 'j': u = va_arg(ap, uintmax_t); break; + case 'l': u = va_arg(ap, unsigned long); break; + default: u = va_arg(ap, unsigned int); break; + } + /* Format it in the correct base. */ + switch (*p) { + case 'o': append_uint(as, u, 8); break; + case 'u': append_uint(as, u, 10); break; + default: append_uint(as, u, 16); break; + } + break; + default: + /* Rewind and print the initial '%' literally. */ + p = saved_p; + archive_strappend_char(as, *p); + } + } +} diff --git a/Utilities/cmlibarchive/libarchive/archive_util.3 b/Utilities/cmlibarchive/libarchive/archive_util.3 new file mode 100644 index 000000000..635e34b32 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_util.3 @@ -0,0 +1,160 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/archive_util.3,v 1.8 2008/03/10 14:44:40 jkoshy Exp $ +.\" +.Dd January 8, 2005 +.Dt archive_util 3 +.Os +.Sh NAME +.Nm archive_clear_error , +.Nm archive_compression , +.Nm archive_compression_name , +.Nm archive_copy_error , +.Nm archive_errno , +.Nm archive_error_string , +.Nm archive_file_count , +.Nm archive_format , +.Nm archive_format_name , +.Nm archive_set_error +.Nd libarchive utility functions +.Sh SYNOPSIS +.In archive.h +.Ft void +.Fn archive_clear_error "struct archive *" +.Ft int +.Fn archive_compression "struct archive *" +.Ft const char * +.Fn archive_compression_name "struct archive *" +.Ft void +.Fn archive_copy_error "struct archive *" "struct archive *" +.Ft int +.Fn archive_errno "struct archive *" +.Ft const char * +.Fn archive_error_string "struct archive *" +.Ft int +.Fn archive_file_count "struct archive *" +.Ft int +.Fn archive_format "struct archive *" +.Ft const char * +.Fn archive_format_name "struct archive *" +.Ft void +.Fo archive_set_error +.Fa "struct archive *" +.Fa "int error_code" +.Fa "const char *fmt" +.Fa "..." +.Fc +.Sh DESCRIPTION +These functions provide access to various information about the +.Tn struct archive +object used in the +.Xr libarchive 3 +library. +.Bl -tag -compact -width indent +.It Fn archive_clear_error +Clears any error information left over from a previous call. +Not generally used in client code. +.It Fn archive_compression +Returns a numeric code indicating the current compression. +This value is set by +.Fn archive_read_open . +.It Fn archive_compression_name +Returns a text description of the current compression suitable for display. +.It Fn archive_copy_error +Copies error information from one archive to another. +.It Fn archive_errno +Returns a numeric error code (see +.Xr errno 2 ) +indicating the reason for the most recent error return. +.It Fn archive_error_string +Returns a textual error message suitable for display. +The error message here is usually more specific than that +obtained from passing the result of +.Fn archive_errno +to +.Xr strerror 3 . +.It Fn archive_file_count +Returns a count of the number of files processed by this archive object. +The count is incremented by calls to +.Xr archive_write_header +or +.Xr archive_read_next_header . +.It Fn archive_format +Returns a numeric code indicating the format of the current +archive entry. +This value is set by a successful call to +.Fn archive_read_next_header . +Note that it is common for this value to change from +entry to entry. +For example, a tar archive might have several entries that +utilize GNU tar extensions and several entries that do not. +These entries will have different format codes. +.It Fn archive_format_name +A textual description of the format of the current entry. +.It Fn archive_set_error +Sets the numeric error code and error description that will be returned +by +.Fn archive_errno +and +.Fn archive_error_string . +This function should be used within I/O callbacks to set system-specific +error codes and error descriptions. +This function accepts a printf-like format string and arguments. +However, you should be careful to use only the following printf +format specifiers: +.Dq %c , +.Dq %d , +.Dq %jd , +.Dq %jo , +.Dq %ju , +.Dq %jx , +.Dq %ld , +.Dq %lo , +.Dq %lu , +.Dq %lx , +.Dq %o , +.Dq %u , +.Dq %s , +.Dq %x , +.Dq %% . +Field-width specifiers and other printf features are +not uniformly supported and should not be used. +.El +.Sh SEE ALSO +.Xr archive_read 3 , +.Xr archive_write 3 , +.Xr libarchive 3 , +.Xr printf 3 +.Sh HISTORY +The +.Nm libarchive +library first appeared in +.Fx 5.3 . +.Sh AUTHORS +.An -nosplit +The +.Nm libarchive +library was written by +.An Tim Kientzle Aq kientzle@acm.org . diff --git a/Utilities/cmlibarchive/libarchive/archive_util.c b/Utilities/cmlibarchive/libarchive/archive_util.c new file mode 100644 index 000000000..142df01c8 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_util.c @@ -0,0 +1,389 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_util.c,v 1.19 2008/10/21 12:10:30 des Exp $"); + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_string.h" + +#if ARCHIVE_VERSION_NUMBER < 3000000 +/* These disappear in libarchive 3.0 */ +/* Deprecated. */ +int +archive_api_feature(void) +{ + return (ARCHIVE_API_FEATURE); +} + +/* Deprecated. */ +int +archive_api_version(void) +{ + return (ARCHIVE_API_VERSION); +} + +/* Deprecated synonym for archive_version_number() */ +int +archive_version_stamp(void) +{ + return (archive_version_number()); +} + +/* Deprecated synonym for archive_version_string() */ +const char * +archive_version(void) +{ + return (archive_version_string()); +} +#endif + +int +archive_version_number(void) +{ + return (ARCHIVE_VERSION_NUMBER); +} + +const char * +archive_version_string(void) +{ + return (ARCHIVE_VERSION_STRING); +} + +int +archive_errno(struct archive *a) +{ + return (a->archive_error_number); +} + +const char * +archive_error_string(struct archive *a) +{ + + if (a->error != NULL && *a->error != '\0') + return (a->error); + else + return ("(Empty error message)"); +} + +int +archive_file_count(struct archive *a) +{ + return (a->file_count); +} + +int +archive_format(struct archive *a) +{ + return (a->archive_format); +} + +const char * +archive_format_name(struct archive *a) +{ + return (a->archive_format_name); +} + + +int +archive_compression(struct archive *a) +{ + return (a->compression_code); +} + +const char * +archive_compression_name(struct archive *a) +{ + return (a->compression_name); +} + + +/* + * Return a count of the number of compressed bytes processed. + */ +int64_t +archive_position_compressed(struct archive *a) +{ + return (a->raw_position); +} + +/* + * Return a count of the number of uncompressed bytes processed. + */ +int64_t +archive_position_uncompressed(struct archive *a) +{ + return (a->file_position); +} + +void +archive_clear_error(struct archive *a) +{ + archive_string_empty(&a->error_string); + a->error = NULL; +} + +void +archive_set_error(struct archive *a, int error_number, const char *fmt, ...) +{ + va_list ap; + + a->archive_error_number = error_number; + if (fmt == NULL) { + a->error = NULL; + return; + } + + va_start(ap, fmt); + archive_string_vsprintf(&(a->error_string), fmt, ap); + va_end(ap); + a->error = a->error_string.s; +} + +void +archive_copy_error(struct archive *dest, struct archive *src) +{ + dest->archive_error_number = src->archive_error_number; + + archive_string_copy(&dest->error_string, &src->error_string); + dest->error = dest->error_string.s; +} + +void +__archive_errx(int retvalue, const char *msg) +{ + static const char *msg1 = "Fatal Internal Error in libarchive: "; + size_t s; + + s = write(2, msg1, strlen(msg1)); + s = write(2, msg, strlen(msg)); + s = write(2, "\n", 1); + (void)s; /* UNUSED */ + exit(retvalue); +} + +/* + * Parse option strings + * Detail of option format. + * - The option can accept: + * "opt-name", "!opt-name", "opt-name=value". + * + * - The option entries are separated by comma. + * e.g "compression=9,opt=XXX,opt-b=ZZZ" + * + * - The name of option string consist of '-' and alphabet + * but character '-' cannot be used for the first character. + * (Regular expression is [a-z][-a-z]+) + * + * - For a specfic format/filter, using the format name with ':'. + * e.g "zip:compression=9" + * (This "compression=9" option entry is for "zip" format only) + * + * If another entries follow it, those are not for + * the specfic format/filter. + * e.g handle "zip:compression=9,opt=XXX,opt-b=ZZZ" + * "zip" format/filter handler will get "compression=9" + * all format/filter handler will get "opt=XXX" + * all format/filter handler will get "opt-b=ZZZ" + * + * - Whitespace and tab are bypassed. + * + */ +int +__archive_parse_options(const char *p, const char *fn, int keysize, char *key, + int valsize, char *val) +{ + const char *p_org; + int apply; + int kidx, vidx; + int negative; + enum { + /* Requested for initialization. */ + INIT, + /* Finding format/filter-name and option-name. */ + F_BOTH, + /* Finding option-name only. + * (already detected format/filter-name) */ + F_NAME, + /* Getting option-value. */ + G_VALUE, + } state; + + p_org = p; + state = INIT; + kidx = vidx = negative = 0; + apply = 1; + while (*p) { + switch (state) { + case INIT: + kidx = vidx = 0; + negative = 0; + apply = 1; + state = F_BOTH; + break; + case F_BOTH: + case F_NAME: + if ((*p >= 'a' && *p <= 'z') || + (*p >= '0' && *p <= '9') || *p == '-') { + if (kidx == 0 && !(*p >= 'a' && *p <= 'z')) + /* Illegal sequence. */ + return (-1); + if (kidx >= keysize -1) + /* Too many characters. */ + return (-1); + key[kidx++] = *p++; + } else if (*p == '!') { + if (kidx != 0) + /* Illegal sequence. */ + return (-1); + negative = 1; + ++p; + } else if (*p == ',') { + if (kidx == 0) + /* Illegal sequence. */ + return (-1); + if (!negative) + val[vidx++] = '1'; + /* We have got boolean option data. */ + ++p; + if (apply) + goto complete; + else + /* This option does not apply to the + * format which the fn variable + * indicate. */ + state = INIT; + } else if (*p == ':') { + /* obuf data is format name */ + if (state == F_NAME) + /* We already found it. */ + return (-1); + if (kidx == 0) + /* Illegal sequence. */ + return (-1); + if (negative) + /* We cannot accept "!format-name:". */ + return (-1); + key[kidx] = '\0'; + if (strcmp(fn, key) != 0) + /* This option does not apply to the + * format which the fn variable + * indicate. */ + apply = 0; + kidx = 0; + ++p; + state = F_NAME; + } else if (*p == '=') { + if (kidx == 0) + /* Illegal sequence. */ + return (-1); + if (negative) + /* We cannot accept "!opt-name=value". */ + return (-1); + ++p; + state = G_VALUE; + } else if (*p == ' ') { + /* Pass the space character */ + ++p; + } else { + /* Illegal character. */ + return (-1); + } + break; + case G_VALUE: + if (*p == ',') { + if (vidx == 0) + /* Illegal sequence. */ + return (-1); + /* We have got option data. */ + ++p; + if (apply) + goto complete; + else + /* This option does not apply to the + * format which the fn variable + * indicate. */ + state = INIT; + } else if (*p == ' ') { + /* Pass the space character */ + ++p; + } else { + if (vidx >= valsize -1) + /* Too many characters. */ + return (-1); + val[vidx++] = *p++; + } + break; + } + } + + switch (state) { + case F_BOTH: + case F_NAME: + if (kidx != 0) { + if (!negative) + val[vidx++] = '1'; + /* We have got boolean option. */ + if (apply) + /* This option apply to the format which the + * fn variable indicate. */ + goto complete; + } + break; + case G_VALUE: + if (vidx == 0) + /* Illegal sequence. */ + return (-1); + /* We have got option value. */ + if (apply) + /* This option apply to the format which the fn + * variable indicate. */ + goto complete; + break; + case INIT:/* nothing */ + break; + } + + /* End of Option string. */ + return (0); + +complete: + key[kidx] = '\0'; + val[vidx] = '\0'; + /* Return a size which we've consumed for detecting option */ + return ((int)(p - p_org)); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_virtual.c b/Utilities/cmlibarchive/libarchive/archive_virtual.c new file mode 100644 index 000000000..c59213689 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_virtual.c @@ -0,0 +1,94 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_virtual.c,v 1.1 2007/03/03 07:37:36 kientzle Exp $"); + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" + +int +archive_write_close(struct archive *a) +{ + return ((a->vtable->archive_close)(a)); +} + +int +archive_read_close(struct archive *a) +{ + return ((a->vtable->archive_close)(a)); +} + +#if ARCHIVE_API_VERSION > 1 +int +archive_write_finish(struct archive *a) +{ + return ((a->vtable->archive_finish)(a)); +} +#else +/* Temporarily allow library to compile with either 1.x or 2.0 API. */ +void +archive_write_finish(struct archive *a) +{ + (void)(a->vtable->archive_finish)(a); +} +#endif + +int +archive_read_finish(struct archive *a) +{ + return ((a->vtable->archive_finish)(a)); +} + +int +archive_write_header(struct archive *a, struct archive_entry *entry) +{ + ++a->file_count; + return ((a->vtable->archive_write_header)(a, entry)); +} + +int +archive_write_finish_entry(struct archive *a) +{ + return ((a->vtable->archive_write_finish_entry)(a)); +} + +#if ARCHIVE_API_VERSION > 1 +ssize_t +#else +/* Temporarily allow library to compile with either 1.x or 2.0 API. */ +int +#endif +archive_write_data(struct archive *a, const void *buff, size_t s) +{ + return ((a->vtable->archive_write_data)(a, buff, s)); +} + +ssize_t +archive_write_data_block(struct archive *a, const void *buff, size_t s, off_t o) +{ + return ((a->vtable->archive_write_data_block)(a, buff, s, o)); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_windows.c b/Utilities/cmlibarchive/libarchive/archive_windows.c new file mode 100644 index 000000000..0a39ab121 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_windows.c @@ -0,0 +1,1229 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2007 Kees Zeelenberg + * 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. + * + * $FreeBSD$ + */ + +/* + * A set of compatibility glue for building libarchive on Windows platforms. + * + * Originally created as "libarchive-nonposix.c" by Kees Zeelenberg + * for the GnuWin32 project, trimmed significantly by Tim Kientzle. + * + * Much of the original file was unnecessary for libarchive, because + * many of the features it emulated were not strictly necessary for + * libarchive. I hope for this to shrink further as libarchive + * internals are gradually reworked to sit more naturally on both + * POSIX and Windows. Any ideas for this are greatly appreciated. + * + * The biggest remaining issue is the dev/ino emulation; libarchive + * has a couple of public APIs that rely on dev/ino uniquely + * identifying a file. This doesn't match well with Windows. I'm + * considering alternative APIs. + */ + +#if defined(_WIN32) && !defined(__CYGWIN__) + +#include "archive_platform.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EPOC_TIME (116444736000000000ULL) + +struct ustat { + int64_t st_atime; + uint32_t st_atime_nsec; + int64_t st_ctime; + uint32_t st_ctime_nsec; + int64_t st_mtime; + uint32_t st_mtime_nsec; + gid_t st_gid; + /* 64bits ino */ + int64_t st_ino; + mode_t st_mode; + uint32_t st_nlink; + uint64_t st_size; + uid_t st_uid; + dev_t st_dev; + dev_t st_rdev; +}; + +/* Local replacement for undocumented Windows CRT function. */ +static void la_dosmaperr(unsigned long e); + +/* Transform 64-bits ino into 32-bits by hashing. + * You do not forget that really unique number size is 64-bits. + */ +#define INOSIZE (8*sizeof(ino_t)) /* 32 */ +static __inline ino_t +getino(struct ustat *ub) +{ + ULARGE_INTEGER ino64; + ino64.QuadPart = ub->st_ino; + /* I don't know this hashing is correct way */ + return (ino64.LowPart ^ (ino64.LowPart >> INOSIZE)); +} + +/* + * Prepend "\\?\" to the path name and convert it to unicode to permit + * an extended-length path for a maximum total path length of 32767 + * characters. + * see also http://msdn.microsoft.com/en-us/library/aa365247.aspx + */ +static wchar_t * +permissive_name(const char *name) +{ + wchar_t *wn, *wnp; + wchar_t *ws, *wsp; + size_t l, len, slen; + int unc; + + len = strlen(name); + wn = malloc((len + 1) * sizeof(wchar_t)); + if (wn == NULL) + return (NULL); + l = MultiByteToWideChar(CP_ACP, 0, name, len, wn, len); + if (l == 0) { + free(wn); + return (NULL); + } + wn[l] = L'\0'; + + /* Get a full path names */ + l = GetFullPathNameW(wn, 0, NULL, NULL); + if (l == 0) { + free(wn); + return (NULL); + } + wnp = malloc(l * sizeof(wchar_t)); + if (wnp == NULL) { + free(wn); + return (NULL); + } + len = GetFullPathNameW(wn, l, wnp, NULL); + free(wn); + wn = wnp; + + if (wnp[0] == L'\\' && wnp[1] == L'\\' && + wnp[2] == L'?' && wnp[3] == L'\\') + /* We have already permissive names. */ + return (wn); + + if (wnp[0] == L'\\' && wnp[1] == L'\\' && + wnp[2] == L'.' && wnp[3] == L'\\') { + /* Device names */ + if (((wnp[4] >= L'a' && wnp[4] <= L'z') || + (wnp[4] >= L'A' && wnp[4] <= L'Z')) && + wnp[5] == L':' && wnp[6] == L'\\') + wnp[2] = L'?';/* Not device names. */ + return (wn); + } + + unc = 0; + if (wnp[0] == L'\\' && wnp[1] == L'\\' && wnp[2] != L'\\') { + wchar_t *p = &wnp[2]; + + /* Skip server-name letters. */ + while (*p != L'\\' && *p != L'\0') + ++p; + if (*p == L'\\') { + wchar_t *rp = ++p; + /* Skip share-name letters. */ + while (*p != L'\\' && *p != L'\0') + ++p; + if (*p == L'\\' && p != rp) { + /* Now, match patterns such as + * "\\server-name\share-name\" */ + wnp += 2; + len -= 2; + unc = 1; + } + } + } + + slen = 4 + (unc * 4) + len + 1; + ws = wsp = malloc(slen * sizeof(wchar_t)); + if (ws == NULL) { + free(wn); + return (NULL); + } + /* prepend "\\?\" */ + wcsncpy(wsp, L"\\\\?\\", 4); + wsp += 4; + slen -= 4; + if (unc) { + /* append "UNC\" ---> "\\?\UNC\" */ + wcsncpy(wsp, L"UNC\\", 4); + wsp += 4; + slen -= 4; + } + wcsncpy(wsp, wnp, slen); + wsp[slen - 1] = L'\0'; /* Ensure null termination. */ + free(wn); + return (ws); +} + +static HANDLE +la_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) +{ + wchar_t *wpath; + HANDLE handle; + + handle = CreateFileA(path, dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, + hTemplateFile); + if (handle != INVALID_HANDLE_VALUE) + return (handle); + if (GetLastError() != ERROR_PATH_NOT_FOUND) + return (handle); + wpath = permissive_name(path); + if (wpath == NULL) + return (handle); + handle = CreateFileW(wpath, dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, + hTemplateFile); + free(wpath); + return (handle); +} + +static void * +la_GetFunctionKernel32(const char *name) +{ + static HINSTANCE lib; + static int set; + if (!set) { + set = 1; + lib = LoadLibrary("kernel32.dll"); + } + if (lib == NULL) { + fprintf(stderr, "Can't load kernel32.dll?!\n"); + exit(1); + } + return (void *)GetProcAddress(lib, name); +} + +static int +la_CreateHardLinkW(wchar_t *linkname, wchar_t *target) +{ + static BOOLEAN (WINAPI *f)(LPWSTR, LPWSTR, LPSECURITY_ATTRIBUTES); + static int set; + if (!set) { + set = 1; + f = la_GetFunctionKernel32("CreateHardLinkW"); + } + return f == NULL ? 0 : (*f)(linkname, target, NULL); +} + + +/* Make a link to src called dst. */ +static int +__link(const char *src, const char *dst, int sym) +{ + wchar_t *wsrc, *wdst; + int res, retval; + DWORD attr; + + if (src == NULL || dst == NULL) { + set_errno (EINVAL); + return -1; + } + + wsrc = permissive_name(src); + wdst = permissive_name(dst); + if (wsrc == NULL || wdst == NULL) { + free(wsrc); + free(wdst); + set_errno (EINVAL); + return -1; + } + + if ((attr = GetFileAttributesW(wsrc)) != -1) { + res = la_CreateHardLinkW(wdst, wsrc); + } else { + /* wsrc does not exist; try src prepend it with the dirname of wdst */ + wchar_t *wnewsrc, *slash; + int i, n, slen, wlen; + + if (strlen(src) >= 3 && isalpha((unsigned char)src[0]) && + src[1] == ':' && src[2] == '\\') { + /* Original src name is already full-path */ + retval = -1; + goto exit; + } + if (src[0] == '\\') { + /* Original src name is almost full-path + * (maybe src name is without drive) */ + retval = -1; + goto exit; + } + + wnewsrc = malloc ((wcslen(wsrc) + wcslen(wdst) + 1) * sizeof(wchar_t)); + if (wnewsrc == NULL) { + errno = ENOMEM; + retval = -1; + goto exit; + } + /* Copying a dirname of wdst */ + wcscpy(wnewsrc, wdst); + slash = wcsrchr(wnewsrc, L'\\'); + if (slash != NULL) + *++slash = L'\0'; + else + wcscat(wnewsrc, L"\\"); + /* Converting multi-byte src to wide-char src */ + wlen = wcslen(wsrc); + slen = strlen(src); + n = MultiByteToWideChar(CP_ACP, 0, src, slen, wsrc, slen); + if (n == 0) { + free (wnewsrc); + retval = -1; + goto exit; + } + for (i = 0; i < n; i++) + if (wsrc[i] == L'/') + wsrc[i] = L'\\'; + wcsncat(wnewsrc, wsrc, n); + /* Check again */ + attr = GetFileAttributesW(wnewsrc); + if (attr == -1 || (attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { + if (attr == -1) + la_dosmaperr(GetLastError()); + else + errno = EPERM; + free (wnewsrc); + retval = -1; + goto exit; + } + res = la_CreateHardLinkW(wdst, wnewsrc); + free (wnewsrc); + } + if (res == 0) { + la_dosmaperr(GetLastError()); + retval = -1; + } else + retval = 0; +exit: + free(wsrc); + free(wdst); + return (retval); +} + +/* Make a hard link to src called dst. */ +int +__la_link(const char *src, const char *dst) +{ + return __link (src, dst, 0); +} + +int +__la_ftruncate(int fd, off_t length) +{ + LARGE_INTEGER distance; + HANDLE handle; + + if (fd < 0) { + errno = EBADF; + return (-1); + } + handle = (HANDLE)_get_osfhandle(fd); + if (GetFileType(handle) != FILE_TYPE_DISK) { + errno = EBADF; + return (-1); + } + distance.QuadPart = length; + if (!SetFilePointerEx(handle, distance, NULL, FILE_BEGIN)) { + la_dosmaperr(GetLastError()); + return (-1); + } + if (!SetEndOfFile(handle)) { + la_dosmaperr(GetLastError()); + return (-1); + } + return (0); +} + +#define WINTIME(sec, usec) ((Int32x32To64(sec, 10000000) + EPOC_TIME) + (usec * 10)) +static int +__hutimes(HANDLE handle, const struct __timeval *times) +{ + ULARGE_INTEGER wintm; + FILETIME fatime, fmtime; + + wintm.QuadPart = WINTIME(times[0].tv_sec, times[0].tv_usec); + fatime.dwLowDateTime = wintm.LowPart; + fatime.dwHighDateTime = wintm.HighPart; + wintm.QuadPart = WINTIME(times[1].tv_sec, times[1].tv_usec); + fmtime.dwLowDateTime = wintm.LowPart; + fmtime.dwHighDateTime = wintm.HighPart; + if (SetFileTime(handle, NULL, &fatime, &fmtime) == 0) { + errno = EINVAL; + return (-1); + } + return (0); +} + +int +__la_futimes(int fd, const struct __timeval *times) +{ + + return (__hutimes((HANDLE)_get_osfhandle(fd), times)); +} + +int +__la_utimes(const char *name, const struct __timeval *times) +{ + int ret; + HANDLE handle; + + handle = la_CreateFile(name, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL); + if (handle == INVALID_HANDLE_VALUE) { + la_dosmaperr(GetLastError()); + return (-1); + } + ret = __hutimes(handle, times); + CloseHandle(handle); + return (ret); +} + +int +__la_chdir(const char *path) +{ + wchar_t *ws; + int r; + + r = SetCurrentDirectoryA(path); + if (r == 0) { + if (GetLastError() != ERROR_FILE_NOT_FOUND) { + la_dosmaperr(GetLastError()); + return (-1); + } + } else + return (0); + ws = permissive_name(path); + if (ws == NULL) { + errno = EINVAL; + return (-1); + } + r = SetCurrentDirectoryW(ws); + free(ws); + if (r == 0) { + la_dosmaperr(GetLastError()); + return (-1); + } + return (0); +} + +int +__la_chmod(const char *path, mode_t mode) +{ + wchar_t *ws; + int r; + + r = _chmod(path, mode); + if (r >= 0 || errno != ENOENT) + return (r); + ws = permissive_name(path); + if (ws == NULL) { + errno = EINVAL; + return (-1); + } + r = _wchmod(ws, mode); + free(ws); + return (r); +} + +/* + * This fcntl is limited implemention. + */ +int +__la_fcntl(int fd, int cmd, int val) +{ + HANDLE handle; + + handle = (HANDLE)_get_osfhandle(fd); + if (GetFileType(handle) == FILE_TYPE_PIPE) { + if (cmd == F_SETFL && val == 0) { + DWORD mode = PIPE_WAIT; + if (SetNamedPipeHandleState( + handle, &mode, NULL, NULL) != 0) + return (0); + } + } + errno = EINVAL; + return (-1); +} + +__int64 +__la_lseek(int fd, __int64 offset, int whence) +{ + LARGE_INTEGER distance; + LARGE_INTEGER newpointer; + HANDLE handle; + + if (fd < 0) { + errno = EBADF; + return (-1); + } + handle = (HANDLE)_get_osfhandle(fd); + if (GetFileType(handle) != FILE_TYPE_DISK) { + errno = EBADF; + return (-1); + } + distance.QuadPart = offset; + if (!SetFilePointerEx(handle, distance, &newpointer, whence)) { + DWORD lasterr; + + lasterr = GetLastError(); + if (lasterr == ERROR_BROKEN_PIPE) + return (0); + if (lasterr == ERROR_ACCESS_DENIED) + errno = EBADF; + else + la_dosmaperr(lasterr); + return (-1); + } + return (newpointer.QuadPart); +} + +int +__la_mkdir(const char *path, mode_t mode) +{ + wchar_t *ws; + int r; + + (void)mode;/* UNUSED */ + r = CreateDirectoryA(path, NULL); + if (r == 0) { + DWORD lasterr = GetLastError(); + if (lasterr != ERROR_FILENAME_EXCED_RANGE && + lasterr != ERROR_PATH_NOT_FOUND) { + la_dosmaperr(GetLastError()); + return (-1); + } + } else + return (0); + ws = permissive_name(path); + if (ws == NULL) { + errno = EINVAL; + return (-1); + } + r = CreateDirectoryW(ws, NULL); + free(ws); + if (r == 0) { + la_dosmaperr(GetLastError()); + return (-1); + } + return (0); +} + +/* Windows' mbstowcs is differrent error handling from other unix mbstowcs. + * That one is using MultiByteToWideChar function with MB_PRECOMPOSED and + * MB_ERR_INVALID_CHARS flags. + * This implements for only to pass libarchive_test. + */ +size_t +__la_mbstowcs(wchar_t *wcstr, const char *mbstr, size_t nwchars) +{ + + return (MultiByteToWideChar(CP_THREAD_ACP, MB_ERR_INVALID_CHARS, + mbstr, (int)strlen(mbstr), wcstr, + (int)nwchars)); +} + +int +__la_open(const char *path, int flags, ...) +{ + va_list ap; + wchar_t *ws; + int r, pmode; + DWORD attr; + + va_start(ap, flags); + pmode = va_arg(ap, int); + va_end(ap); + ws = NULL; + if ((flags & ~O_BINARY) == O_RDONLY) { + /* + * When we open a directory, _open function returns + * "Permission denied" error. + */ + attr = GetFileAttributesA(path); + if (attr == -1 && GetLastError() == ERROR_PATH_NOT_FOUND) { + ws = permissive_name(path); + if (ws == NULL) { + errno = EINVAL; + return (-1); + } + attr = GetFileAttributesW(ws); + } + if (attr == -1) { + la_dosmaperr(GetLastError()); + free(ws); + return (-1); + } + if (attr & FILE_ATTRIBUTE_DIRECTORY) { + HANDLE handle; + + if (ws != NULL) + handle = CreateFileW(ws, 0, 0, NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | + FILE_ATTRIBUTE_READONLY, + NULL); + else + handle = CreateFileA(path, 0, 0, NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | + FILE_ATTRIBUTE_READONLY, + NULL); + free(ws); + if (handle == INVALID_HANDLE_VALUE) { + la_dosmaperr(GetLastError()); + return (-1); + } + r = _open_osfhandle((intptr_t)handle, _O_RDONLY); + return (r); + } + } + if (ws == NULL) { + r = _open(path, flags, pmode); + if (r < 0 && errno == EACCES && (flags & O_CREAT) != 0) { + /* simular other POSIX system action to pass a test */ + attr = GetFileAttributesA(path); + if (attr == -1) + la_dosmaperr(GetLastError()); + else if (attr & FILE_ATTRIBUTE_DIRECTORY) + errno = EISDIR; + else + errno = EACCES; + return (-1); + } + if (r >= 0 || errno != ENOENT) + return (r); + ws = permissive_name(path); + if (ws == NULL) { + errno = EINVAL; + return (-1); + } + } + r = _wopen(ws, flags, pmode); + if (r < 0 && errno == EACCES && (flags & O_CREAT) != 0) { + /* simular other POSIX system action to pass a test */ + attr = GetFileAttributesW(ws); + if (attr == -1) + la_dosmaperr(GetLastError()); + else if (attr & FILE_ATTRIBUTE_DIRECTORY) + errno = EISDIR; + else + errno = EACCES; + } + free(ws); + return (r); +} + +ssize_t +__la_read(int fd, void *buf, size_t nbytes) +{ + HANDLE handle; + DWORD bytes_read, lasterr; + int r; + +#ifdef _WIN64 + if (nbytes > UINT32_MAX) + nbytes = UINT32_MAX; +#endif + if (fd < 0) { + errno = EBADF; + return (-1); + } + handle = (HANDLE)_get_osfhandle(fd); + if (GetFileType(handle) == FILE_TYPE_PIPE) { + DWORD sta; + if (GetNamedPipeHandleState( + handle, &sta, NULL, NULL, NULL, NULL, 0) != 0 && + (sta & PIPE_NOWAIT) == 0) { + DWORD avail = -1; + int cnt = 3; + + while (PeekNamedPipe( + handle, NULL, 0, NULL, &avail, NULL) != 0 && + avail == 0 && --cnt) + Sleep(100); + if (avail == 0) + return (0); + } + } + r = ReadFile(handle, buf, (uint32_t)nbytes, + &bytes_read, NULL); + if (r == 0) { + lasterr = GetLastError(); + if (lasterr == ERROR_NO_DATA) { + errno = EAGAIN; + return (-1); + } + if (lasterr == ERROR_BROKEN_PIPE) + return (0); + if (lasterr == ERROR_ACCESS_DENIED) + errno = EBADF; + else + la_dosmaperr(lasterr); + return (-1); + } + return ((ssize_t)bytes_read); +} + +/* Remove directory */ +int +__la_rmdir(const char *path) +{ + wchar_t *ws; + int r; + + r = _rmdir(path); + if (r >= 0 || errno != ENOENT) + return (r); + ws = permissive_name(path); + if (ws == NULL) { + errno = EINVAL; + return (-1); + } + r = _wrmdir(ws); + free(ws); + return (r); +} + +/* Convert Windows FILETIME to UTC */ +__inline static void +fileTimeToUTC(const FILETIME *filetime, time_t *time, long *ns) +{ + ULARGE_INTEGER utc; + + utc.HighPart = filetime->dwHighDateTime; + utc.LowPart = filetime->dwLowDateTime; + if (utc.QuadPart >= EPOC_TIME) { + utc.QuadPart -= EPOC_TIME; + *time = (time_t)(utc.QuadPart / 10000000); /* milli seconds base */ + *ns = (long)(utc.QuadPart % 10000000) * 100;/* nano seconds base */ + } else { + *time = 0; + *ns = 0; + } +} + +/* Stat by handle + * Windows' stat() does not accept path which is added "\\?\" especially "?" + * character. + * It means we cannot access a long name path(which is longer than MAX_PATH). + * So I've implemented simular Windows' stat() to access the long name path. + * And I've added some feature. + * 1. set st_ino by nFileIndexHigh and nFileIndexLow of + * BY_HANDLE_FILE_INFORMATION. + * 2. set st_nlink by nNumberOfLinks of BY_HANDLE_FILE_INFORMATION. + * 3. set st_dev by dwVolumeSerialNumber by BY_HANDLE_FILE_INFORMATION. + */ +static int +__hstat(HANDLE handle, struct ustat *st) +{ + BY_HANDLE_FILE_INFORMATION info; + ULARGE_INTEGER ino64; + DWORD ftype; + mode_t mode; + time_t time; + long ns; + + switch (ftype = GetFileType(handle)) { + case FILE_TYPE_UNKNOWN: + errno = EBADF; + return (-1); + case FILE_TYPE_CHAR: + case FILE_TYPE_PIPE: + if (ftype == FILE_TYPE_CHAR) { + st->st_mode = S_IFCHR; + st->st_size = 0; + } else { + DWORD avail; + + st->st_mode = S_IFIFO; + if (PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL)) + st->st_size = avail; + else + st->st_size = 0; + } + st->st_atime = 0; + st->st_atime_nsec = 0; + st->st_mtime = 0; + st->st_mtime_nsec = 0; + st->st_ctime = 0; + st->st_ctime_nsec = 0; + st->st_ino = 0; + st->st_nlink = 1; + st->st_uid = 0; + st->st_gid = 0; + st->st_rdev = 0; + st->st_dev = 0; + return (0); + case FILE_TYPE_DISK: + break; + default: + /* This ftype is undocumented type. */ + la_dosmaperr(GetLastError()); + return (-1); + } + + ZeroMemory(&info, sizeof(info)); + if (!GetFileInformationByHandle (handle, &info)) { + la_dosmaperr(GetLastError()); + return (-1); + } + + mode = S_IRUSR | S_IRGRP | S_IROTH; + if ((info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) == 0) + mode |= S_IWUSR | S_IWGRP | S_IWOTH; + if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; + else + mode |= S_IFREG; + st->st_mode = mode; + + fileTimeToUTC(&info.ftLastAccessTime, &time, &ns); + st->st_atime = time; + st->st_atime_nsec = ns; + fileTimeToUTC(&info.ftLastWriteTime, &time, &ns); + st->st_mtime = time; + st->st_mtime_nsec = ns; + fileTimeToUTC(&info.ftCreationTime, &time, &ns); + st->st_ctime = time; + st->st_ctime_nsec = ns; + st->st_size = + ((int64_t)(info.nFileSizeHigh) * ((int64_t)MAXDWORD + 1)) + + (int64_t)(info.nFileSizeLow); +#ifdef SIMULATE_WIN_STAT + st->st_ino = 0; + st->st_nlink = 1; + st->st_dev = 0; +#else + /* Getting FileIndex as i-node. We have to remove a sequence which + * is high-16-bits of nFileIndexHigh. */ + ino64.HighPart = info.nFileIndexHigh & 0x0000FFFFUL; + ino64.LowPart = info.nFileIndexLow; + st->st_ino = ino64.QuadPart; + st->st_nlink = info.nNumberOfLinks; + if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + ++st->st_nlink;/* Add parent directory. */ + st->st_dev = info.dwVolumeSerialNumber; +#endif + st->st_uid = 0; + st->st_gid = 0; + st->st_rdev = 0; + return (0); +} + +static void +copy_stat(struct stat *st, struct ustat *us) +{ + st->st_atime = us->st_atime; + st->st_ctime = us->st_ctime; + st->st_mtime = us->st_mtime; + st->st_gid = us->st_gid; + st->st_ino = getino(us); + st->st_mode = us->st_mode; + st->st_nlink = us->st_nlink; + st->st_size = us->st_size; + st->st_uid = us->st_uid; + st->st_dev = us->st_dev; + st->st_rdev = us->st_rdev; +} + +int +__la_fstat(int fd, struct stat *st) +{ + struct ustat u; + int ret; + + if (fd < 0) { + errno = EBADF; + return (-1); + } + ret = __hstat((HANDLE)_get_osfhandle(fd), &u); + if (ret >= 0) { + copy_stat(st, &u); + if (u.st_mode & (S_IFCHR | S_IFIFO)) { + st->st_dev = fd; + st->st_rdev = fd; + } + } + return (ret); +} + +int +__la_stat(const char *path, struct stat *st) +{ + HANDLE handle; + struct ustat u; + int ret; + + handle = la_CreateFile(path, 0, 0, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_READONLY, + NULL); + if (handle == INVALID_HANDLE_VALUE) { + la_dosmaperr(GetLastError()); + return (-1); + } + ret = __hstat(handle, &u); + CloseHandle(handle); + if (ret >= 0) { + char *p; + + copy_stat(st, &u); + p = strrchr(path, '.'); + if (p != NULL && strlen(p) == 4) { + char exttype[4]; + + ++ p; + exttype[0] = toupper(*p++); + exttype[1] = toupper(*p++); + exttype[2] = toupper(*p++); + exttype[3] = '\0'; + if (!strcmp(exttype, "EXE") || !strcmp(exttype, "CMD") || + !strcmp(exttype, "BAT") || !strcmp(exttype, "COM")) + st->st_mode |= S_IXUSR | S_IXGRP | S_IXOTH; + } + } + return (ret); +} + +int +__la_unlink(const char *path) +{ + wchar_t *ws; + int r; + + r = _unlink(path); + if (r >= 0 || errno != ENOENT) + return (r); + ws = permissive_name(path); + if (ws == NULL) { + errno = EINVAL; + return (-1); + } + r = _wunlink(ws); + free(ws); + return (r); +} + +/* + * This waitpid is limited implemention. + */ +pid_t +__la_waitpid(pid_t wpid, int *status, int option) +{ + HANDLE child; + DWORD cs, ret; + + (void)option;/* UNUSED */ + child = OpenProcess(PROCESS_ALL_ACCESS, FALSE, wpid); + if (child == NULL) { + la_dosmaperr(GetLastError()); + return (-1); + } + ret = WaitForSingleObject(child, INFINITE); + if (ret == WAIT_FAILED) { + CloseHandle(child); + la_dosmaperr(GetLastError()); + return (-1); + } + if (GetExitCodeProcess(child, &cs) == 0) { + CloseHandle(child); + la_dosmaperr(GetLastError()); + return (-1); + } + if (cs == STILL_ACTIVE) + *status = 0x100; + else + *status = (int)(cs & 0xff); + CloseHandle(child); + return (wpid); +} + +ssize_t +__la_write(int fd, const void *buf, size_t nbytes) +{ + DWORD bytes_written; + +#ifdef _WIN64 + if (nbytes > UINT32_MAX) + nbytes = UINT32_MAX; +#endif + if (fd < 0) { + errno = EBADF; + return (-1); + } + if (!WriteFile((HANDLE)_get_osfhandle(fd), buf, (uint32_t)nbytes, + &bytes_written, NULL)) { + DWORD lasterr; + + lasterr = GetLastError(); + if (lasterr == ERROR_ACCESS_DENIED) + errno = EBADF; + else + la_dosmaperr(lasterr); + return (-1); + } + return (bytes_written); +} + +/* + * The following function was modified from PostgreSQL sources and is + * subject to the copyright below. + */ +/*------------------------------------------------------------------------- + * + * win32error.c + * Map win32 error codes to errno values + * + * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + * + * IDENTIFICATION + * $PostgreSQL: pgsql/src/port/win32error.c,v 1.4 2008/01/01 19:46:00 momjian Exp $ + * + *------------------------------------------------------------------------- + */ +/* +PostgreSQL Database Management System +(formerly known as Postgres, then as Postgres95) + +Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +*/ + +static const struct { + DWORD winerr; + int doserr; +} doserrors[] = +{ + { ERROR_INVALID_FUNCTION, EINVAL }, + { ERROR_FILE_NOT_FOUND, ENOENT }, + { ERROR_PATH_NOT_FOUND, ENOENT }, + { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, + { ERROR_ACCESS_DENIED, EACCES }, + { ERROR_INVALID_HANDLE, EBADF }, + { ERROR_ARENA_TRASHED, ENOMEM }, + { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, + { ERROR_INVALID_BLOCK, ENOMEM }, + { ERROR_BAD_ENVIRONMENT, E2BIG }, + { ERROR_BAD_FORMAT, ENOEXEC }, + { ERROR_INVALID_ACCESS, EINVAL }, + { ERROR_INVALID_DATA, EINVAL }, + { ERROR_INVALID_DRIVE, ENOENT }, + { ERROR_CURRENT_DIRECTORY, EACCES }, + { ERROR_NOT_SAME_DEVICE, EXDEV }, + { ERROR_NO_MORE_FILES, ENOENT }, + { ERROR_LOCK_VIOLATION, EACCES }, + { ERROR_SHARING_VIOLATION, EACCES }, + { ERROR_BAD_NETPATH, ENOENT }, + { ERROR_NETWORK_ACCESS_DENIED, EACCES }, + { ERROR_BAD_NET_NAME, ENOENT }, + { ERROR_FILE_EXISTS, EEXIST }, + { ERROR_CANNOT_MAKE, EACCES }, + { ERROR_FAIL_I24, EACCES }, + { ERROR_INVALID_PARAMETER, EINVAL }, + { ERROR_NO_PROC_SLOTS, EAGAIN }, + { ERROR_DRIVE_LOCKED, EACCES }, + { ERROR_BROKEN_PIPE, EPIPE }, + { ERROR_DISK_FULL, ENOSPC }, + { ERROR_INVALID_TARGET_HANDLE, EBADF }, + { ERROR_INVALID_HANDLE, EINVAL }, + { ERROR_WAIT_NO_CHILDREN, ECHILD }, + { ERROR_CHILD_NOT_COMPLETE, ECHILD }, + { ERROR_DIRECT_ACCESS_HANDLE, EBADF }, + { ERROR_NEGATIVE_SEEK, EINVAL }, + { ERROR_SEEK_ON_DEVICE, EACCES }, + { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, + { ERROR_NOT_LOCKED, EACCES }, + { ERROR_BAD_PATHNAME, ENOENT }, + { ERROR_MAX_THRDS_REACHED, EAGAIN }, + { ERROR_LOCK_FAILED, EACCES }, + { ERROR_ALREADY_EXISTS, EEXIST }, + { ERROR_FILENAME_EXCED_RANGE, ENOENT }, + { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, + { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } +}; + +static void +la_dosmaperr(unsigned long e) +{ + int i; + + if (e == 0) + { + errno = 0; + return; + } + + for (i = 0; i < sizeof(doserrors); i++) + { + if (doserrors[i].winerr == e) + { + errno = doserrors[i].doserr; + return; + } + } + + /* fprintf(stderr, "unrecognized win32 error code: %lu", e); */ + errno = EINVAL; + return; +} + +#if !defined(HAVE_OPENSSL_MD5_H) && !defined(HAVE_OPENSSL_SHA_H) +/* + * Message digest functions. + */ +static void +Digest_Init(Digest_CTX *ctx, ALG_ID algId) +{ + + ctx->valid = 0; + if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL, + PROV_RSA_FULL, 0)) { + if (GetLastError() != NTE_BAD_KEYSET) + return; + if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_NEWKEYSET)) + return; + } + + if (!CryptCreateHash(ctx->cryptProv, algId, 0, 0, &ctx->hash)) { + CryptReleaseContext(ctx->cryptProv, 0); + return; + } + + ctx->valid = 1; +} + +static void +Digest_Update(Digest_CTX *ctx, const unsigned char *buf, size_t len) +{ + + if (!ctx->valid) + return; + + CryptHashData(ctx->hash, + (unsigned char *)(uintptr_t)buf, + (DWORD)len, 0); +} + +static void +Digest_Final(unsigned char *buf, int bufsize, Digest_CTX *ctx) +{ + DWORD siglen = bufsize; + + if (!ctx->valid) + return; + + CryptGetHashParam(ctx->hash, HP_HASHVAL, buf, &siglen, 0); + CryptDestroyHash(ctx->hash); + CryptReleaseContext(ctx->cryptProv, 0); + ctx->valid = 0; +} + +#define DIGEST_INIT(name, algid) \ +void name ## _Init(Digest_CTX *ctx)\ +{\ + Digest_Init(ctx, algid);\ +} + +#define DIGEST_UPDATE(name) \ +void name ## _Update(Digest_CTX *ctx, const unsigned char *buf, size_t len)\ +{\ + Digest_Update(ctx, buf, len);\ +} + +#define DIGEST_FINAL(name, size) \ +void name ## _Final(unsigned char buf[size], Digest_CTX *ctx)\ +{\ + Digest_Final(buf, size, ctx);\ +} + +DIGEST_INIT(MD5, CALG_MD5) +DIGEST_UPDATE(MD5) +DIGEST_FINAL(MD5, MD5_DIGEST_LENGTH) + +DIGEST_INIT(SHA1, CALG_SHA1) +DIGEST_UPDATE(SHA1) +DIGEST_FINAL(SHA1, SHA1_DIGEST_LENGTH) + +/* + * SHA256 nor SHA384 nor SHA512 are not supported on Windows XP and Windows 2000. + */ +#ifdef CALG_SHA256 +DIGEST_INIT(SHA256, CALG_SHA256) +DIGEST_UPDATE(SHA256) +DIGEST_FINAL(SHA256, SHA256_DIGEST_LENGTH) +#endif + +#ifdef CALG_SHA384 +DIGEST_INIT(SHA384, CALG_SHA384) +DIGEST_UPDATE(SHA384) +DIGEST_FINAL(SHA384, SHA384_DIGEST_LENGTH) +#endif + +#ifdef CALG_SHA512 +DIGEST_INIT(SHA512, CALG_SHA512) +DIGEST_UPDATE(SHA512) +DIGEST_FINAL(SHA512, SHA384_DIGEST_LENGTH) +#endif + +#endif /* !HAVE_OPENSSL_MD5_H && !HAVE_OPENSSL_SHA_H */ + +#endif /* _WIN32 && !__CYGWIN__ */ diff --git a/Utilities/cmlibarchive/libarchive/archive_windows.h b/Utilities/cmlibarchive/libarchive/archive_windows.h new file mode 100644 index 000000000..70cad09e4 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_windows.h @@ -0,0 +1,404 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2006 Tim Kientzle + * 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. + * + * $FreeBSD$ + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +/* + * TODO: A lot of stuff in here isn't actually used by libarchive and + * can be trimmed out. Note that this file is used by libarchive and + * libarchive_test but nowhere else. (But note that it gets compiled + * with many different Windows environments, including MinGW, Visual + * Studio, and Cygwin. Significant changes should be tested in all three.) + */ + +/* + * TODO: Don't use off_t in here. Use __int64 instead. Note that + * Visual Studio and the Windows SDK define off_t as 32 bits; Win32's + * more modern file handling APIs all use __int64 instead of off_t. + */ + +#ifndef LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED +#define LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED + +/* Start of configuration for native Win32 */ + +#include +#define set_errno(val) ((errno)=val) +#include +#include //brings in NULL +#include +#include +#include +#include +#include +#include +//#define EFTYPE 7 + +#if !defined(STDIN_FILENO) +#define STDIN_FILENO 0 +#endif + +#if !defined(STDOUT_FILENO) +#define STDOUT_FILENO 1 +#endif + +#if !defined(STDERR_FILENO) +#define STDERR_FILENO 2 +#endif + + +#if defined(_MSC_VER) +/* TODO: Fix the code, don't suppress the warnings. */ +#pragma warning(disable:4244) /* 'conversion' conversion from 'type1' to 'type2', possible loss of data */ +#pragma warning(default: 4365) /* 'action':conversion from 'type_1' to 'type_2', signed/unsigned mismatch */ +#endif + +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif + +/* Replacement for major/minor/makedev. */ +#define major(x) ((int)(0x00ff & ((x) >> 8))) +#define minor(x) ((int)(0xffff00ff & (x))) +#define makedev(maj,min) ((0xff00 & ((maj)<<8))|(0xffff00ff & (min))) + +/* Alias the Windows _function to the POSIX equivalent. */ +#define access _access +#define chdir __la_chdir +#define chmod __la_chmod +#define close _close +#define fcntl __la_fcntl +#ifndef fileno +#define fileno _fileno +#endif +#define fstat __la_fstat +#define ftruncate __la_ftruncate +#define futimes __la_futimes +#define getcwd _getcwd +#define link __la_link +#define lseek __la_lseek +#define lstat __la_stat +#define mbstowcs __la_mbstowcs +#define mkdir(d,m) __la_mkdir(d, m) +#define mktemp _mktemp +#define open __la_open +#define read __la_read +#define rmdir __la_rmdir +#define stat(path,stref) __la_stat(path,stref) +#define strdup _strdup +#define tzset _tzset +#define umask _umask +#define unlink __la_unlink +#define utimes __la_utimes +#define waitpid __la_waitpid +#define write __la_write + +#define O_RDONLY _O_RDONLY +#define O_WRONLY _O_WRONLY +#define O_TRUNC _O_TRUNC +#define O_CREAT _O_CREAT +#define O_EXCL _O_EXCL + +#ifndef _S_IFIFO + #define _S_IFIFO 0010000 /* pipe */ +#endif +#ifndef _S_IFCHR + #define _S_IFCHR 0020000 /* character special */ +#endif +#ifndef _S_IFDIR + #define _S_IFDIR 0040000 /* directory */ +#endif +#ifndef _S_IFBLK + #define _S_IFBLK 0060000 /* block special */ +#endif +#ifndef _S_IFLNK + #define _S_IFLNK 0120000 /* symbolic link */ +#endif +#ifndef _S_IFSOCK + #define _S_IFSOCK 0140000 /* socket */ +#endif +#ifndef _S_IFREG + #define _S_IFREG 0100000 /* regular */ +#endif +#ifndef _S_IFMT + #define _S_IFMT 0170000 /* file type mask */ +#endif + +#define S_IFIFO _S_IFIFO +//#define S_IFCHR _S_IFCHR +//#define S_IFDIR _S_IFDIR +#define S_IFBLK _S_IFBLK +#define S_IFLNK _S_IFLNK +#define S_IFSOCK _S_IFSOCK +//#define S_IFREG _S_IFREG +//#define S_IFMT _S_IFMT + +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) /* block special */ +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) /* fifo or socket */ +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) /* char special */ +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) /* directory */ +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) /* regular file */ +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) /* Symbolic link */ +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) /* Socket */ + +#define _S_ISUID 0004000 /* set user id on execution */ +#define _S_ISGID 0002000 /* set group id on execution */ +#define _S_ISVTX 0001000 /* save swapped text even after use */ + +#define S_ISUID _S_ISUID +#define S_ISGID _S_ISGID +#define S_ISVTX _S_ISVTX + +#define _S_IRWXU (_S_IREAD | _S_IWRITE | _S_IEXEC) +#define _S_IXUSR _S_IEXEC /* read permission, user */ +#define _S_IWUSR _S_IWRITE /* write permission, user */ +#define _S_IRUSR _S_IREAD /* execute/search permission, user */ +#define _S_IRWXG (_S_IRWXU >> 3) +#define _S_IXGRP (_S_IXUSR >> 3) /* read permission, group */ +#define _S_IWGRP (_S_IWUSR >> 3) /* write permission, group */ +#define _S_IRGRP (_S_IRUSR >> 3) /* execute/search permission, group */ +#define _S_IRWXO (_S_IRWXG >> 3) +#define _S_IXOTH (_S_IXGRP >> 3) /* read permission, other */ +#define _S_IWOTH (_S_IWGRP >> 3) /* write permission, other */ +#define _S_IROTH (_S_IRGRP >> 3) /* execute/search permission, other */ + +#define S_IRWXU _S_IRWXU +#define S_IXUSR _S_IXUSR +#define S_IWUSR _S_IWUSR +#define S_IRUSR _S_IRUSR +#define S_IRWXG _S_IRWXG +#define S_IXGRP _S_IXGRP +#define S_IWGRP _S_IWGRP +#define S_IRGRP _S_IRGRP +#define S_IRWXO _S_IRWXO +#define S_IXOTH _S_IXOTH +#define S_IWOTH _S_IWOTH +#define S_IROTH _S_IROTH + +#define F_DUPFD 0 /* Duplicate file descriptor. */ +#define F_GETFD 1 /* Get file descriptor flags. */ +#define F_SETFD 2 /* Set file descriptor flags. */ +#define F_GETFL 3 /* Get file status flags. */ +#define F_SETFL 4 /* Set file status flags. */ +#define F_GETOWN 5 /* Get owner (receiver of SIGIO). */ +#define F_SETOWN 6 /* Set owner (receiver of SIGIO). */ +#define F_GETLK 7 /* Get record locking info. */ +#define F_SETLK 8 /* Set record locking info (non-blocking). */ +#define F_SETLKW 9 /* Set record locking info (blocking). */ + +/* XXX missing */ +#define F_GETLK64 7 /* Get record locking info. */ +#define F_SETLK64 8 /* Set record locking info (non-blocking). */ +#define F_SETLKW64 9 /* Set record locking info (blocking). */ + +/* File descriptor flags used with F_GETFD and F_SETFD. */ +#define FD_CLOEXEC 1 /* Close on exec. */ + +//NOT SURE IF O_NONBLOCK is OK here but at least the 0x0004 flag is not used by anything else... +#define O_NONBLOCK 0x0004 /* Non-blocking I/O. */ +//#define O_NDELAY O_NONBLOCK + +/* Symbolic constants for the access() function */ +#if !defined(F_OK) + #define R_OK 4 /* Test for read permission */ + #define W_OK 2 /* Test for write permission */ + #define X_OK 1 /* Test for execute permission */ + #define F_OK 0 /* Test for existence of file */ +#endif + + +#ifdef _LARGEFILE_SOURCE +# define __USE_LARGEFILE 1 /* declare fseeko and ftello */ +#endif + +#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64 +# define __USE_FILE_OFFSET64 1 /* replace 32-bit functions by 64-bit ones */ +#endif + +#if __USE_LARGEFILE && __USE_FILE_OFFSET64 +/* replace stat and seek by their large-file equivalents */ +#undef stat +#define stat _stati64 + +#undef lseek +#define lseek _lseeki64 +#define lseek64 _lseeki64 +#define tell _telli64 +#define tell64 _telli64 + +#ifdef __MINGW32__ +# define fseek fseeko64 +# define fseeko fseeko64 +# define ftell ftello64 +# define ftello ftello64 +# define ftell64 ftello64 +#endif /* __MINGW32__ */ +#endif /* LARGE_FILES */ + +#ifdef USE_WINSOCK_TIMEVAL +/* Winsock timeval has long size tv_sec. */ +#define __timeval timeval +#else +struct _timeval64i32 { + time_t tv_sec; + long tv_usec; +}; +#define __timeval _timeval64i32 +#endif + +typedef int pid_t; + +/* Message digest define */ +#if !defined(HAVE_OPENSSL_MD5_H) && !defined(HAVE_OPENSSL_SHA_H) +#include +typedef struct { + int valid; + HCRYPTPROV cryptProv; + HCRYPTHASH hash; +} Digest_CTX; +#endif + +#if !defined(HAVE_OPENSSL_MD5_H) && defined(CALG_MD5) +#define MD5_DIGEST_LENGTH 16 +#define HAVE_MD5 1 +#define MD5_CTX Digest_CTX +#endif +#ifndef HAVE_OPENSSL_SHA_H +#ifdef CALG_SHA1 +#define SHA1_DIGEST_LENGTH 20 +#define HAVE_SHA1 1 +#define SHA1_CTX Digest_CTX +#endif +#ifdef CALG_SHA256 +#define SHA256_DIGEST_LENGTH 32 +#define HAVE_SHA256 1 +#define SHA256_CTX Digest_CTX +#endif +#ifdef CALG_SHA384 +#define SHA384_DIGEST_LENGTH 48 +#define HAVE_SHA384 1 +#define SHA384_CTX Digest_CTX +#endif +#ifdef CALG_SHA512 +#define SHA512_DIGEST_LENGTH 64 +#define HAVE_SHA512 1 +#define SHA512_CTX Digest_CTX +#endif +#endif /* HAVE_OPENSSL_SHA_H */ + +/* End of Win32 definitions. */ + +/* Tell libarchive code that we have simulations for these. */ +#ifndef HAVE_FTRUNCATE +#define HAVE_FTRUNCATE 1 +#endif +#ifndef HAVE_FUTIMES +#define HAVE_FUTIMES 1 +#endif +#ifndef HAVE_UTIMES +#define HAVE_UTIMES 1 +#endif +#ifndef HAVE_LINK +#define HAVE_LINK 1 +#endif + +/* Replacement POSIX function */ +extern int __la_chdir(const char *path); +extern int __la_chmod(const char *path, mode_t mode); +extern int __la_fcntl(int fd, int cmd, int val); +extern int __la_fstat(int fd, struct stat *st); +extern int __la_ftruncate(int fd, off_t length); +extern int __la_futimes(int fd, const struct __timeval *times); +extern int __la_link(const char *src, const char *dst); +extern __int64 __la_lseek(int fd, __int64 offset, int whence); +extern size_t __la_mbstowcs(wchar_t *wcstr, const char *mbstr, size_t nwchars); +extern int __la_mkdir(const char *path, mode_t mode); +extern int __la_open(const char *path, int flags, ...); +extern ssize_t __la_read(int fd, void *buf, size_t nbytes); +extern int __la_rmdir(const char *path); +extern int __la_stat(const char *path, struct stat *st); +extern int __la_unlink(const char *path); +extern int __la_utimes(const char *name, const struct __timeval *times); +extern pid_t __la_waitpid(pid_t wpid, int *status, int option); +extern ssize_t __la_write(int fd, const void *buf, size_t nbytes); + +#define _stat64i32(path, st) __la_stat(path, st) +#define _stat64(path, st) __la_stat(path, st) +/* for status returned by la_waitpid */ +#define WIFSIGNALED(sts) 0 +#define WTERMSIG(sts) 0 +#define WIFEXITED(sts) ((sts & 0x100) == 0) +#define WEXITSTATUS(sts) (sts & 0x0FF) + +/* Message digest function */ +#if !defined(HAVE_OPENSSL_MD5_H) && !defined(HAVE_OPENSSL_SHA_H) +#ifdef MD5_DIGEST_LENGTH +extern void MD5_Init(Digest_CTX *ctx); +extern void MD5_Update(Digest_CTX *ctx, const unsigned char *buf, + size_t len); +extern void MD5_Final(unsigned char buf[MD5_DIGEST_LENGTH], + Digest_CTX *ctx); +#endif +#ifdef SHA1_DIGEST_LENGTH +extern void SHA1_Init(Digest_CTX *ctx); +extern void SHA1_Update(Digest_CTX *ctx, const unsigned char *buf, + size_t len); +extern void SHA1_Final(unsigned char buf[SHA1_DIGEST_LENGTH], + Digest_CTX *ctx); +#endif +#ifdef SHA256_DIGEST_LENGTH +extern void SHA256_Init(Digest_CTX *ctx); +extern void SHA256_Update(Digest_CTX *ctx, const unsigned char *buf, + size_t len); +extern void SHA256_Final(unsigned char buf[SHA256_DIGEST_LENGTH], + Digest_CTX *ctx); +#endif +#ifdef SHA384_DIGEST_LENGTH +extern void SHA384_Init(Digest_CTX *ctx); +extern void SHA384_Update(Digest_CTX *ctx, const unsigned char *buf, + size_t len); +extern void SHA384_Final(unsigned char buf[SHA384_DIGEST_LENGTH], + Digest_CTX *ctx); +#endif +#ifdef SHA512_DIGEST_LENGTH +extern void SHA512_Init(Digest_CTX *ctx); +extern void SHA512_Update(Digest_CTX *ctx, const unsigned char *buf, + size_t len); +extern void SHA512_Final(unsigned char buf[SHA512_DIGEST_LENGTH], + Digest_CTX *ctx); +#endif +#endif + +#endif /* LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/libarchive/archive_write.3 b/Utilities/cmlibarchive/libarchive/archive_write.3 new file mode 100644 index 000000000..cb8c46ba5 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write.3 @@ -0,0 +1,626 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/archive_write.3,v 1.25 2008/11/01 19:11:21 kientzle Exp $ +.\" +.Dd May 11, 2008 +.Dt archive_write 3 +.Os +.Sh NAME +.Nm archive_write_new , +.Nm archive_write_set_format_cpio , +.Nm archive_write_set_format_pax , +.Nm archive_write_set_format_pax_restricted , +.Nm archive_write_set_format_shar , +.Nm archive_write_set_format_shar_binary , +.Nm archive_write_set_format_ustar , +.Nm archive_write_get_bytes_per_block , +.Nm archive_write_set_bytes_per_block , +.Nm archive_write_set_bytes_in_last_block , +.Nm archive_write_set_compression_bzip2 , +.Nm archive_write_set_compression_compress , +.Nm archive_write_set_compression_gzip , +.Nm archive_write_set_compression_none , +.Nm archive_write_set_compression_program , +.Nm archive_write_set_compressor_options , +.Nm archive_write_set_format_options , +.Nm archive_write_set_options , +.Nm archive_write_open , +.Nm archive_write_open_fd , +.Nm archive_write_open_FILE , +.Nm archive_write_open_filename , +.Nm archive_write_open_memory , +.Nm archive_write_header , +.Nm archive_write_data , +.Nm archive_write_finish_entry , +.Nm archive_write_close , +.Nm archive_write_finish +.Nd functions for creating archives +.Sh SYNOPSIS +.In archive.h +.Ft struct archive * +.Fn archive_write_new "void" +.Ft int +.Fn archive_write_get_bytes_per_block "struct archive *" +.Ft int +.Fn archive_write_set_bytes_per_block "struct archive *" "int bytes_per_block" +.Ft int +.Fn archive_write_set_bytes_in_last_block "struct archive *" "int" +.Ft int +.Fn archive_write_set_compression_bzip2 "struct archive *" +.Ft int +.Fn archive_write_set_compression_compress "struct archive *" +.Ft int +.Fn archive_write_set_compression_gzip "struct archive *" +.Ft int +.Fn archive_write_set_compression_none "struct archive *" +.Ft int +.Fn archive_write_set_compression_program "struct archive *" "const char * cmd" +.Ft int +.Fn archive_write_set_format_cpio "struct archive *" +.Ft int +.Fn archive_write_set_format_pax "struct archive *" +.Ft int +.Fn archive_write_set_format_pax_restricted "struct archive *" +.Ft int +.Fn archive_write_set_format_shar "struct archive *" +.Ft int +.Fn archive_write_set_format_shar_binary "struct archive *" +.Ft int +.Fn archive_write_set_format_ustar "struct archive *" +.Ft int +.Fn archive_write_set_format_options "struct archive *" "const char *" +.Ft int +.Fn archive_write_set_compressor_options "struct archive *" "const char *" +.Ft int +.Fn archive_write_set_options "struct archive *" "const char *" +.Ft int +.Fo archive_write_open +.Fa "struct archive *" +.Fa "void *client_data" +.Fa "archive_open_callback *" +.Fa "archive_write_callback *" +.Fa "archive_close_callback *" +.Fc +.Ft int +.Fn archive_write_open_fd "struct archive *" "int fd" +.Ft int +.Fn archive_write_open_FILE "struct archive *" "FILE *file" +.Ft int +.Fn archive_write_open_filename "struct archive *" "const char *filename" +.Ft int +.Fo archive_write_open_memory +.Fa "struct archive *" +.Fa "void *buffer" +.Fa "size_t bufferSize" +.Fa "size_t *outUsed" +.Fc +.Ft int +.Fn archive_write_header "struct archive *" "struct archive_entry *" +.Ft ssize_t +.Fn archive_write_data "struct archive *" "const void *" "size_t" +.Ft int +.Fn archive_write_finish_entry "struct archive *" +.Ft int +.Fn archive_write_close "struct archive *" +.Ft int +.Fn archive_write_finish "struct archive *" +.Sh DESCRIPTION +These functions provide a complete API for creating streaming +archive files. +The general process is to first create the +.Tn struct archive +object, set any desired options, initialize the archive, append entries, then +close the archive and release all resources. +The following summary describes the functions in approximately +the order they are ordinarily used: +.Bl -tag -width indent +.It Fn archive_write_new +Allocates and initializes a +.Tn struct archive +object suitable for writing a tar archive. +.It Fn archive_write_set_bytes_per_block +Sets the block size used for writing the archive data. +Every call to the write callback function, except possibly the last one, will +use this value for the length. +The third parameter is a boolean that specifies whether or not the final block +written will be padded to the full block size. +If it is zero, the last block will not be padded. +If it is non-zero, padding will be added both before and after compression. +The default is to use a block size of 10240 bytes and to pad the last block. +Note that a block size of zero will suppress internal blocking +and cause writes to be sent directly to the write callback as they occur. +.It Fn archive_write_get_bytes_per_block +Retrieve the block size to be used for writing. +A value of -1 here indicates that the library should use default values. +A value of zero indicates that internal blocking is suppressed. +.It Fn archive_write_set_bytes_in_last_block +Sets the block size used for writing the last block. +If this value is zero, the last block will be padded to the same size +as the other blocks. +Otherwise, the final block will be padded to a multiple of this size. +In particular, setting it to 1 will cause the final block to not be padded. +For compressed output, any padding generated by this option +is applied only after the compression. +The uncompressed data is always unpadded. +The default is to pad the last block to the full block size (note that +.Fn archive_write_open_filename +will set this based on the file type). +Unlike the other +.Dq set +functions, this function can be called after the archive is opened. +.It Fn archive_write_get_bytes_in_last_block +Retrieve the currently-set value for last block size. +A value of -1 here indicates that the library should use default values. +.It Xo +.Fn archive_write_set_format_cpio , +.Fn archive_write_set_format_pax , +.Fn archive_write_set_format_pax_restricted , +.Fn archive_write_set_format_shar , +.Fn archive_write_set_format_shar_binary , +.Fn archive_write_set_format_ustar +.Xc +Sets the format that will be used for the archive. +The library can write +POSIX octet-oriented cpio format archives, +POSIX-standard +.Dq pax interchange +format archives, +traditional +.Dq shar +archives, +enhanced +.Dq binary +shar archives that store a variety of file attributes and handle binary files, +and +POSIX-standard +.Dq ustar +archives. +The pax interchange format is a backwards-compatible tar format that +adds key/value attributes to each entry and supports arbitrary +filenames, linknames, uids, sizes, etc. +.Dq Restricted pax interchange format +is the library default; this is the same as pax format, but suppresses +the pax extended header for most normal files. +In most cases, this will result in ordinary ustar archives. +.It Xo +.Fn archive_write_set_compression_bzip2 , +.Fn archive_write_set_compression_compress , +.Fn archive_write_set_compression_gzip , +.Fn archive_write_set_compression_none +.Xc +The resulting archive will be compressed as specified. +Note that the compressed output is always properly blocked. +.It Fn archive_write_set_compression_program +The archive will be fed into the specified compression program. +The output of that program is blocked and written to the client +write callbacks. +.It Xo +.Fn archive_write_set_compressor_options , +.Fn archive_write_set_format_options , +.Fn archive_write_set_options +.Xc +Specifies options that will be passed to the currently-enabled +compressor and/or format writer. +The argument is a comma-separated list of individual options. +Individual options have one of the following forms: +.Bl -tag -compact -width indent +.It Ar option=value +The option/value pair will be provided to every module. +Modules that do not accept an option with this name will ignore it. +.It Ar option +The option will be provided to every module with a value of +.Dq 1 . +.It Ar !option +The option will be provided to every module with a NULL value. +.It Ar module:option=value , Ar module:option , Ar module:!option +As above, but the corresponding option and value will be provided +only to modules whose name matches +.Ar module . +.El +The return value will be +.Cm ARCHIVE_OK +if any module accepts the option, or +.Cm ARCHIVE_WARN +if no module accepted the option, or +.Cm ARCHIVE_FATAL +if there was a fatal error while attempting to process the option. +.Pp +The currently supported options are: +.Bl -tag -compact -width indent +.It Compressor gzip +.Bl -tag -compact -width indent +.It Cm compression-level +The value is interpreted as a decimal integer specifying the +gzip compression level. +.El +.It Compressor xz +.Bl -tag -compact -width indent +.It Cm compression-level +The value is interpreted as a decimal integer specifying the +compression level. +.El +.It Format mtree +.Bl -tag -compact -width indent +.It Cm cksum , Cm device , Cm flags , Cm gid , Cm gname , Cm indent , Cm link , Cm md5 , Cm mode , Cm nlink , Cm rmd160 , Cm sha1 , Cm sha256 , Cm sha384 , Cm sha512 , Cm size , Cm time , Cm uid , Cm uname +Enable a particular keyword in the mtree output. +Prefix with an exclamation mark to disable the corresponding keyword. +The default is equivalent to +.Dq device, flags, gid, gname, link, mode, nlink, size, time, type, uid, uname . +.It Cm all +Enables all of the above keywords. +.It Cm use-set +Enables generation of +.Cm /set +lines that specify default values for the following files and/or directories. +.It Cm indent +XXX needs explanation XXX +.El +.El +.It Fn archive_write_open +Freeze the settings, open the archive, and prepare for writing entries. +This is the most generic form of this function, which accepts +pointers to three callback functions which will be invoked by +the compression layer to write the constructed archive. +.It Fn archive_write_open_fd +A convenience form of +.Fn archive_write_open +that accepts a file descriptor. +The +.Fn archive_write_open_fd +function is safe for use with tape drives or other +block-oriented devices. +.It Fn archive_write_open_FILE +A convenience form of +.Fn archive_write_open +that accepts a +.Ft "FILE *" +pointer. +Note that +.Fn archive_write_open_FILE +is not safe for writing to tape drives or other devices +that require correct blocking. +.It Fn archive_write_open_file +A deprecated synonym for +.Fn archive_write_open_filename . +.It Fn archive_write_open_filename +A convenience form of +.Fn archive_write_open +that accepts a filename. +A NULL argument indicates that the output should be written to standard output; +an argument of +.Dq - +will open a file with that name. +If you have not invoked +.Fn archive_write_set_bytes_in_last_block , +then +.Fn archive_write_open_filename +will adjust the last-block padding depending on the file: +it will enable padding when writing to standard output or +to a character or block device node, it will disable padding otherwise. +You can override this by manually invoking +.Fn archive_write_set_bytes_in_last_block +before calling +.Fn archive_write_open . +The +.Fn archive_write_open_filename +function is safe for use with tape drives or other +block-oriented devices. +.It Fn archive_write_open_memory +A convenience form of +.Fn archive_write_open +that accepts a pointer to a block of memory that will receive +the archive. +The final +.Ft "size_t *" +argument points to a variable that will be updated +after each write to reflect how much of the buffer +is currently in use. +You should be careful to ensure that this variable +remains allocated until after the archive is +closed. +.It Fn archive_write_header +Build and write a header using the data in the provided +.Tn struct archive_entry +structure. +See +.Xr archive_entry 3 +for information on creating and populating +.Tn struct archive_entry +objects. +.It Fn archive_write_data +Write data corresponding to the header just written. +Returns number of bytes written or -1 on error. +.It Fn archive_write_finish_entry +Close out the entry just written. +In particular, this writes out the final padding required by some formats. +Ordinarily, clients never need to call this, as it +is called automatically by +.Fn archive_write_next_header +and +.Fn archive_write_close +as needed. +.It Fn archive_write_close +Complete the archive and invoke the close callback. +.It Fn archive_write_finish +Invokes +.Fn archive_write_close +if it was not invoked manually, then releases all resources. +Note that this function was declared to return +.Ft void +in libarchive 1.x, which made it impossible to detect errors when +.Fn archive_write_close +was invoked implicitly from this function. +This is corrected beginning with libarchive 2.0. +.El +More information about the +.Va struct archive +object and the overall design of the library can be found in the +.Xr libarchive 3 +overview. +.Sh IMPLEMENTATION +Compression support is built-in to libarchive, which uses zlib and bzlib +to handle gzip and bzip2 compression, respectively. +.Sh CLIENT CALLBACKS +To use this library, you will need to define and register +callback functions that will be invoked to write data to the +resulting archive. +These functions are registered by calling +.Fn archive_write_open : +.Bl -item -offset indent +.It +.Ft typedef int +.Fn archive_open_callback "struct archive *" "void *client_data" +.El +.Pp +The open callback is invoked by +.Fn archive_write_open . +It should return +.Cm ARCHIVE_OK +if the underlying file or data source is successfully +opened. +If the open fails, it should call +.Fn archive_set_error +to register an error code and message and return +.Cm ARCHIVE_FATAL . +.Bl -item -offset indent +.It +.Ft typedef ssize_t +.Fo archive_write_callback +.Fa "struct archive *" +.Fa "void *client_data" +.Fa "const void *buffer" +.Fa "size_t length" +.Fc +.El +.Pp +The write callback is invoked whenever the library +needs to write raw bytes to the archive. +For correct blocking, each call to the write callback function +should translate into a single +.Xr write 2 +system call. +This is especially critical when writing archives to tape drives. +On success, the write callback should return the +number of bytes actually written. +On error, the callback should invoke +.Fn archive_set_error +to register an error code and message and return -1. +.Bl -item -offset indent +.It +.Ft typedef int +.Fn archive_close_callback "struct archive *" "void *client_data" +.El +.Pp +The close callback is invoked by archive_close when +the archive processing is complete. +The callback should return +.Cm ARCHIVE_OK +on success. +On failure, the callback should invoke +.Fn archive_set_error +to register an error code and message and +return +.Cm ARCHIVE_FATAL. +.Sh EXAMPLE +The following sketch illustrates basic usage of the library. +In this example, +the callback functions are simply wrappers around the standard +.Xr open 2 , +.Xr write 2 , +and +.Xr close 2 +system calls. +.Bd -literal -offset indent +#include +#include +#include +#include +#include +#include + +struct mydata { + const char *name; + int fd; +}; + +int +myopen(struct archive *a, void *client_data) +{ + struct mydata *mydata = client_data; + + mydata->fd = open(mydata->name, O_WRONLY | O_CREAT, 0644); + if (mydata->fd >= 0) + return (ARCHIVE_OK); + else + return (ARCHIVE_FATAL); +} + +ssize_t +mywrite(struct archive *a, void *client_data, const void *buff, size_t n) +{ + struct mydata *mydata = client_data; + + return (write(mydata->fd, buff, n)); +} + +int +myclose(struct archive *a, void *client_data) +{ + struct mydata *mydata = client_data; + + if (mydata->fd > 0) + close(mydata->fd); + return (0); +} + +void +write_archive(const char *outname, const char **filename) +{ + struct mydata *mydata = malloc(sizeof(struct mydata)); + struct archive *a; + struct archive_entry *entry; + struct stat st; + char buff[8192]; + int len; + int fd; + + a = archive_write_new(); + mydata->name = outname; + archive_write_set_compression_gzip(a); + archive_write_set_format_ustar(a); + archive_write_open(a, mydata, myopen, mywrite, myclose); + while (*filename) { + stat(*filename, &st); + entry = archive_entry_new(); + archive_entry_copy_stat(entry, &st); + archive_entry_set_pathname(entry, *filename); + archive_write_header(a, entry); + fd = open(*filename, O_RDONLY); + len = read(fd, buff, sizeof(buff)); + while ( len > 0 ) { + archive_write_data(a, buff, len); + len = read(fd, buff, sizeof(buff)); + } + archive_entry_free(entry); + filename++; + } + archive_write_finish(a); +} + +int main(int argc, const char **argv) +{ + const char *outname; + argv++; + outname = argv++; + write_archive(outname, argv); + return 0; +} +.Ed +.Sh RETURN VALUES +Most functions return +.Cm ARCHIVE_OK +(zero) on success, or one of several non-zero +error codes for errors. +Specific error codes include: +.Cm ARCHIVE_RETRY +for operations that might succeed if retried, +.Cm ARCHIVE_WARN +for unusual conditions that do not prevent further operations, and +.Cm ARCHIVE_FATAL +for serious errors that make remaining operations impossible. +The +.Fn archive_errno +and +.Fn archive_error_string +functions can be used to retrieve an appropriate error code and a +textual error message. +.Pp +.Fn archive_write_new +returns a pointer to a newly-allocated +.Tn struct archive +object. +.Pp +.Fn archive_write_data +returns a count of the number of bytes actually written. +On error, -1 is returned and the +.Fn archive_errno +and +.Fn archive_error_string +functions will return appropriate values. +Note that if the client-provided write callback function +returns a non-zero value, that error will be propagated back to the caller +through whatever API function resulted in that call, which +may include +.Fn archive_write_header , +.Fn archive_write_data , +.Fn archive_write_close , +or +.Fn archive_write_finish . +The client callback can call +.Fn archive_set_error +to provide values that can then be retrieved by +.Fn archive_errno +and +.Fn archive_error_string . +.Sh SEE ALSO +.Xr tar 1 , +.Xr libarchive 3 , +.Xr tar 5 +.Sh HISTORY +The +.Nm libarchive +library first appeared in +.Fx 5.3 . +.Sh AUTHORS +.An -nosplit +The +.Nm libarchive +library was written by +.An Tim Kientzle Aq kientzle@acm.org . +.Sh BUGS +There are many peculiar bugs in historic tar implementations that may cause +certain programs to reject archives written by this library. +For example, several historic implementations calculated header checksums +incorrectly and will thus reject valid archives; GNU tar does not fully support +pax interchange format; some old tar implementations required specific +field terminations. +.Pp +The default pax interchange format eliminates most of the historic +tar limitations and provides a generic key/value attribute facility +for vendor-defined extensions. +One oversight in POSIX is the failure to provide a standard attribute +for large device numbers. +This library uses +.Dq SCHILY.devminor +and +.Dq SCHILY.devmajor +for device numbers that exceed the range supported by the backwards-compatible +ustar header. +These keys are compatible with Joerg Schilling's +.Nm star +archiver. +Other implementations may not recognize these keys and will thus be unable +to correctly restore device nodes with large device numbers from archives +created by this library. diff --git a/Utilities/cmlibarchive/libarchive/archive_write.c b/Utilities/cmlibarchive/libarchive/archive_write.c new file mode 100644 index 000000000..f9cc3f9d4 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write.c @@ -0,0 +1,467 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write.c,v 1.27 2008/03/14 23:09:02 kientzle Exp $"); + +/* + * This file contains the "essential" portions of the write API, that + * is, stuff that will essentially always be used by any client that + * actually needs to write a archive. Optional pieces have been, as + * far as possible, separated out into separate files to reduce + * needlessly bloating statically-linked clients. + */ + +#ifdef HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +static struct archive_vtable *archive_write_vtable(void); + +static int _archive_write_close(struct archive *); +static int _archive_write_finish(struct archive *); +static int _archive_write_header(struct archive *, struct archive_entry *); +static int _archive_write_finish_entry(struct archive *); +static ssize_t _archive_write_data(struct archive *, const void *, size_t); + +static struct archive_vtable * +archive_write_vtable(void) +{ + static struct archive_vtable av; + static int inited = 0; + + if (!inited) { + av.archive_close = _archive_write_close; + av.archive_finish = _archive_write_finish; + av.archive_write_header = _archive_write_header; + av.archive_write_finish_entry = _archive_write_finish_entry; + av.archive_write_data = _archive_write_data; + } + return (&av); +} + +/* + * Allocate, initialize and return an archive object. + */ +struct archive * +archive_write_new(void) +{ + struct archive_write *a; + unsigned char *nulls; + + a = (struct archive_write *)malloc(sizeof(*a)); + if (a == NULL) + return (NULL); + memset(a, 0, sizeof(*a)); + a->archive.magic = ARCHIVE_WRITE_MAGIC; + a->archive.state = ARCHIVE_STATE_NEW; + a->archive.vtable = archive_write_vtable(); + /* + * The value 10240 here matches the traditional tar default, + * but is otherwise arbitrary. + * TODO: Set the default block size from the format selected. + */ + a->bytes_per_block = 10240; + a->bytes_in_last_block = -1; /* Default */ + + /* Initialize a block of nulls for padding purposes. */ + a->null_length = 1024; + nulls = (unsigned char *)malloc(a->null_length); + if (nulls == NULL) { + free(a); + return (NULL); + } + memset(nulls, 0, a->null_length); + a->nulls = nulls; + /* + * Set default compression, but don't set a default format. + * Were we to set a default format here, we would force every + * client to link in support for that format, even if they didn't + * ever use it. + */ + archive_write_set_compression_none(&a->archive); + return (&a->archive); +} + +/* + * Set write options for the format. Returns 0 if successful. + */ +int +archive_write_set_format_options(struct archive *_a, const char *s) +{ + struct archive_write *a = (struct archive_write *)_a; + char key[64], val[64]; + int len, r, ret = ARCHIVE_OK; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_format_options"); + archive_clear_error(&a->archive); + + if (s == NULL || *s == '\0') + return (ARCHIVE_OK); + if (a->format_options == NULL) + /* This format does not support option. */ + return (ARCHIVE_OK); + + while ((len = __archive_parse_options(s, a->format_name, + sizeof(key), key, sizeof(val), val)) > 0) { + if (val[0] == '\0') + r = a->format_options(a, key, NULL); + else + r = a->format_options(a, key, val); + if (r == ARCHIVE_FATAL) + return (r); + if (r < ARCHIVE_OK) { /* This key was not handled. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Unsupported option ``%s''", key); + ret = ARCHIVE_WARN; + } + s += len; + } + if (len < 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Malformed options string."); + return (ARCHIVE_WARN); + } + return (ret); +} + +/* + * Set write options for the compressor. Returns 0 if successful. + */ +int +archive_write_set_compressor_options(struct archive *_a, const char *s) +{ + struct archive_write *a = (struct archive_write *)_a; + char key[64], val[64]; + int len, r; + int ret = ARCHIVE_OK; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_compressor_options"); + archive_clear_error(&a->archive); + + if (s == NULL || *s == '\0') + return (ARCHIVE_OK); + if (a->compressor.options == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Unsupported option ``%s''", s); + /* This compressor does not support option. */ + return (ARCHIVE_WARN); + } + + while ((len = __archive_parse_options(s, a->archive.compression_name, + sizeof(key), key, sizeof(val), val)) > 0) { + if (val[0] == '\0') + r = a->compressor.options(a, key, NULL); + else + r = a->compressor.options(a, key, val); + if (r == ARCHIVE_FATAL) + return (r); + if (r < ARCHIVE_OK) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Unsupported option ``%s''", key); + ret = ARCHIVE_WARN; + } + s += len; + } + if (len < 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Illegal format options."); + return (ARCHIVE_WARN); + } + return (ret); +} + +/* + * Set write options for the format and the compressor. Returns 0 if successful. + */ +int +archive_write_set_options(struct archive *_a, const char *s) +{ + int r1, r2; + + r1 = archive_write_set_format_options(_a, s); + if (r1 < ARCHIVE_WARN) + return (r1); + r2 = archive_write_set_compressor_options(_a, s); + if (r2 < ARCHIVE_WARN) + return (r2); + if (r1 == ARCHIVE_WARN && r2 == ARCHIVE_WARN) + return (ARCHIVE_WARN); + return (ARCHIVE_OK); +} + +/* + * Set the block size. Returns 0 if successful. + */ +int +archive_write_set_bytes_per_block(struct archive *_a, int bytes_per_block) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_bytes_per_block"); + a->bytes_per_block = bytes_per_block; + return (ARCHIVE_OK); +} + +/* + * Get the current block size. -1 if it has never been set. + */ +int +archive_write_get_bytes_per_block(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_get_bytes_per_block"); + return (a->bytes_per_block); +} + +/* + * Set the size for the last block. + * Returns 0 if successful. + */ +int +archive_write_set_bytes_in_last_block(struct archive *_a, int bytes) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_set_bytes_in_last_block"); + a->bytes_in_last_block = bytes; + return (ARCHIVE_OK); +} + +/* + * Return the value set above. -1 indicates it has not been set. + */ +int +archive_write_get_bytes_in_last_block(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_get_bytes_in_last_block"); + return (a->bytes_in_last_block); +} + + +/* + * dev/ino of a file to be rejected. Used to prevent adding + * an archive to itself recursively. + */ +int +archive_write_set_skip_file(struct archive *_a, dev_t d, ino_t i) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_set_skip_file"); + a->skip_file_dev = d; + a->skip_file_ino = i; + return (ARCHIVE_OK); +} + + +/* + * Open the archive using the current settings. + */ +int +archive_write_open(struct archive *_a, void *client_data, + archive_open_callback *opener, archive_write_callback *writer, + archive_close_callback *closer) +{ + struct archive_write *a = (struct archive_write *)_a; + int ret; + + ret = ARCHIVE_OK; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_open"); + archive_clear_error(&a->archive); + a->archive.state = ARCHIVE_STATE_HEADER; + a->client_data = client_data; + a->client_writer = writer; + a->client_opener = opener; + a->client_closer = closer; + ret = (a->compressor.init)(a); + if (a->format_init && ret == ARCHIVE_OK) + ret = (a->format_init)(a); + return (ret); +} + + +/* + * Close out the archive. + * + * Be careful: user might just call write_new and then write_finish. + * Don't assume we actually wrote anything or performed any non-trivial + * initialization. + */ +static int +_archive_write_close(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int r = ARCHIVE_OK, r1 = ARCHIVE_OK; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_close"); + + /* Finish the last entry. */ + if (a->archive.state & ARCHIVE_STATE_DATA) + r = ((a->format_finish_entry)(a)); + + /* Finish off the archive. */ + if (a->format_finish != NULL) { + r1 = (a->format_finish)(a); + if (r1 < r) + r = r1; + } + + /* Release format resources. */ + if (a->format_destroy != NULL) { + r1 = (a->format_destroy)(a); + if (r1 < r) + r = r1; + } + + /* Finish the compression and close the stream. */ + if (a->compressor.finish != NULL) { + r1 = (a->compressor.finish)(a); + if (r1 < r) + r = r1; + } + + /* Close out the client stream. */ + if (a->client_closer != NULL) { + r1 = (a->client_closer)(&a->archive, a->client_data); + if (r1 < r) + r = r1; + } + + a->archive.state = ARCHIVE_STATE_CLOSED; + return (r); +} + +/* + * Destroy the archive structure. + */ +static int +_archive_write_finish(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int r = ARCHIVE_OK; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_finish"); + if (a->archive.state != ARCHIVE_STATE_CLOSED) + r = archive_write_close(&a->archive); + + /* Release various dynamic buffers. */ + free((void *)(uintptr_t)(const void *)a->nulls); + archive_string_free(&a->archive.error_string); + a->archive.magic = 0; + free(a); + return (r); +} + +/* + * Write the appropriate header. + */ +static int +_archive_write_header(struct archive *_a, struct archive_entry *entry) +{ + struct archive_write *a = (struct archive_write *)_a; + int ret, r2; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_DATA | ARCHIVE_STATE_HEADER, "archive_write_header"); + archive_clear_error(&a->archive); + + /* In particular, "retry" and "fatal" get returned immediately. */ + ret = archive_write_finish_entry(&a->archive); + if (ret < ARCHIVE_OK && ret != ARCHIVE_WARN) + return (ret); + + if (a->skip_file_dev != 0 && + archive_entry_dev(entry) == a->skip_file_dev && + a->skip_file_ino != 0 && + archive_entry_ino64(entry) == a->skip_file_ino) { + archive_set_error(&a->archive, 0, + "Can't add archive to itself"); + return (ARCHIVE_FAILED); + } + + /* Format and write header. */ + r2 = ((a->format_write_header)(a, entry)); + if (r2 < ret) + ret = r2; + + a->archive.state = ARCHIVE_STATE_DATA; + return (ret); +} + +static int +_archive_write_finish_entry(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int ret = ARCHIVE_OK; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_write_finish_entry"); + if (a->archive.state & ARCHIVE_STATE_DATA) + ret = (a->format_finish_entry)(a); + a->archive.state = ARCHIVE_STATE_HEADER; + return (ret); +} + +/* + * Note that the compressor is responsible for blocking. + */ +static ssize_t +_archive_write_data(struct archive *_a, const void *buff, size_t s) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_DATA, "archive_write_data"); + archive_clear_error(&a->archive); + return ((a->format_write_data)(a, buff, s)); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_disk.3 b/Utilities/cmlibarchive/libarchive/archive_write_disk.3 new file mode 100644 index 000000000..5ed4a5038 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_disk.3 @@ -0,0 +1,375 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/archive_write_disk.3,v 1.4 2008/09/04 05:22:00 kientzle Exp $ +.\" +.Dd August 5, 2008 +.Dt archive_write_disk 3 +.Os +.Sh NAME +.Nm archive_write_disk_new , +.Nm archive_write_disk_set_options , +.Nm archive_write_disk_set_skip_file , +.Nm archive_write_disk_set_group_lookup , +.Nm archive_write_disk_set_standard_lookup , +.Nm archive_write_disk_set_user_lookup , +.Nm archive_write_header , +.Nm archive_write_data , +.Nm archive_write_finish_entry , +.Nm archive_write_close , +.Nm archive_write_finish +.Nd functions for creating objects on disk +.Sh SYNOPSIS +.In archive.h +.Ft struct archive * +.Fn archive_write_disk_new "void" +.Ft int +.Fn archive_write_disk_set_options "struct archive *" "int flags" +.Ft int +.Fn archive_write_disk_set_skip_file "struct archive *" "dev_t" "ino_t" +.Ft int +.Fo archive_write_disk_set_group_lookup +.Fa "struct archive *" +.Fa "void *" +.Fa "gid_t (*)(void *, const char *gname, gid_t gid)" +.Fa "void (*cleanup)(void *)" +.Fc +.Ft int +.Fn archive_write_disk_set_standard_lookup "struct archive *" +.Ft int +.Fo archive_write_disk_set_user_lookup +.Fa "struct archive *" +.Fa "void *" +.Fa "uid_t (*)(void *, const char *uname, uid_t uid)" +.Fa "void (*cleanup)(void *)" +.Fc +.Ft int +.Fn archive_write_header "struct archive *" "struct archive_entry *" +.Ft ssize_t +.Fn archive_write_data "struct archive *" "const void *" "size_t" +.Ft int +.Fn archive_write_finish_entry "struct archive *" +.Ft int +.Fn archive_write_close "struct archive *" +.Ft int +.Fn archive_write_finish "struct archive *" +.Sh DESCRIPTION +These functions provide a complete API for creating objects on +disk from +.Tn struct archive_entry +descriptions. +They are most naturally used when extracting objects from an archive +using the +.Fn archive_read +interface. +The general process is to read +.Tn struct archive_entry +objects from an archive, then write those objects to a +.Tn struct archive +object created using the +.Fn archive_write_disk +family functions. +This interface is deliberately very similar to the +.Fn archive_write +interface used to write objects to a streaming archive. +.Bl -tag -width indent +.It Fn archive_write_disk_new +Allocates and initializes a +.Tn struct archive +object suitable for writing objects to disk. +.It Fn archive_write_disk_set_skip_file +Records the device and inode numbers of a file that should not be +overwritten. +This is typically used to ensure that an extraction process does not +overwrite the archive from which objects are being read. +This capability is technically unnecessary but can be a significant +performance optimization in practice. +.It Fn archive_write_disk_set_options +The options field consists of a bitwise OR of one or more of the +following values: +.Bl -tag -compact -width "indent" +.It Cm ARCHIVE_EXTRACT_OWNER +The user and group IDs should be set on the restored file. +By default, the user and group IDs are not restored. +.It Cm ARCHIVE_EXTRACT_PERM +Full permissions (including SGID, SUID, and sticky bits) should +be restored exactly as specified, without obeying the +current umask. +Note that SUID and SGID bits can only be restored if the +user and group ID of the object on disk are correct. +If +.Cm ARCHIVE_EXTRACT_OWNER +is not specified, then SUID and SGID bits will only be restored +if the default user and group IDs of newly-created objects on disk +happen to match those specified in the archive entry. +By default, only basic permissions are restored, and umask is obeyed. +.It Cm ARCHIVE_EXTRACT_TIME +The timestamps (mtime, ctime, and atime) should be restored. +By default, they are ignored. +Note that restoring of atime is not currently supported. +.It Cm ARCHIVE_EXTRACT_NO_OVERWRITE +Existing files on disk will not be overwritten. +By default, existing regular files are truncated and overwritten; +existing directories will have their permissions updated; +other pre-existing objects are unlinked and recreated from scratch. +.It Cm ARCHIVE_EXTRACT_UNLINK +Existing files on disk will be unlinked before any attempt to +create them. +In some cases, this can prove to be a significant performance improvement. +By default, existing files are truncated and rewritten, but +the file is not recreated. +In particular, the default behavior does not break existing hard links. +.It Cm ARCHIVE_EXTRACT_ACL +Attempt to restore ACLs. +By default, extended ACLs are ignored. +.It Cm ARCHIVE_EXTRACT_FFLAGS +Attempt to restore extended file flags. +By default, file flags are ignored. +.It Cm ARCHIVE_EXTRACT_XATTR +Attempt to restore POSIX.1e extended attributes. +By default, they are ignored. +.It Cm ARCHIVE_EXTRACT_SECURE_SYMLINKS +Refuse to extract any object whose final location would be altered +by a symlink on disk. +This is intended to help guard against a variety of mischief +caused by archives that (deliberately or otherwise) extract +files outside of the current directory. +The default is not to perform this check. +If +.Cm ARCHIVE_EXTRACT_UNLINK +is specified together with this option, the library will +remove any intermediate symlinks it finds and return an +error only if such symlink could not be removed. +.It Cm ARCHIVE_EXTRACT_SECURE_NODOTDOT +Refuse to extract a path that contains a +.Pa .. +element anywhere within it. +The default is to not refuse such paths. +Note that paths ending in +.Pa .. +always cause an error, regardless of this flag. +.It Cm ARCHIVE_EXTRACT_SPARSE +Scan data for blocks of NUL bytes and try to recreate them with holes. +This results in sparse files, independent of whether the archive format +supports or uses them. +.El +.It Xo +.Fn archive_write_disk_set_group_lookup , +.Fn archive_write_disk_set_user_lookup +.Xc +The +.Tn struct archive_entry +objects contain both names and ids that can be used to identify users +and groups. +These names and ids describe the ownership of the file itself and +also appear in ACL lists. +By default, the library uses the ids and ignores the names, but +this can be overridden by registering user and group lookup functions. +To register, you must provide a lookup function which +accepts both a name and id and returns a suitable id. +You may also provide a +.Tn void * +pointer to a private data structure and a cleanup function for +that data. +The cleanup function will be invoked when the +.Tn struct archive +object is destroyed. +.It Fn archive_write_disk_set_standard_lookup +This convenience function installs a standard set of user +and group lookup functions. +These functions use +.Xr getpwnam 3 +and +.Xr getgrnam 3 +to convert names to ids, defaulting to the ids if the names cannot +be looked up. +These functions also implement a simple memory cache to reduce +the number of calls to +.Xr getpwnam 3 +and +.Xr getgrnam 3 . +.It Fn archive_write_header +Build and write a header using the data in the provided +.Tn struct archive_entry +structure. +See +.Xr archive_entry 3 +for information on creating and populating +.Tn struct archive_entry +objects. +.It Fn archive_write_data +Write data corresponding to the header just written. +Returns number of bytes written or -1 on error. +.It Fn archive_write_finish_entry +Close out the entry just written. +Ordinarily, clients never need to call this, as it +is called automatically by +.Fn archive_write_next_header +and +.Fn archive_write_close +as needed. +.It Fn archive_write_close +Set any attributes that could not be set during the initial restore. +For example, directory timestamps are not restored initially because +restoring a subsequent file would alter that timestamp. +Similarly, non-writable directories are initially created with +write permissions (so that their contents can be restored). +The +.Nm +library maintains a list of all such deferred attributes and +sets them when this function is invoked. +.It Fn archive_write_finish +Invokes +.Fn archive_write_close +if it was not invoked manually, then releases all resources. +.El +More information about the +.Va struct archive +object and the overall design of the library can be found in the +.Xr libarchive 3 +overview. +Many of these functions are also documented under +.Xr archive_write 3 . +.Sh RETURN VALUES +Most functions return +.Cm ARCHIVE_OK +(zero) on success, or one of several non-zero +error codes for errors. +Specific error codes include: +.Cm ARCHIVE_RETRY +for operations that might succeed if retried, +.Cm ARCHIVE_WARN +for unusual conditions that do not prevent further operations, and +.Cm ARCHIVE_FATAL +for serious errors that make remaining operations impossible. +The +.Fn archive_errno +and +.Fn archive_error_string +functions can be used to retrieve an appropriate error code and a +textual error message. +.Pp +.Fn archive_write_disk_new +returns a pointer to a newly-allocated +.Tn struct archive +object. +.Pp +.Fn archive_write_data +returns a count of the number of bytes actually written. +On error, -1 is returned and the +.Fn archive_errno +and +.Fn archive_error_string +functions will return appropriate values. +.Sh SEE ALSO +.Xr archive_read 3 , +.Xr archive_write 3 , +.Xr tar 1 , +.Xr libarchive 3 +.Sh HISTORY +The +.Nm libarchive +library first appeared in +.Fx 5.3 . +The +.Nm archive_write_disk +interface was added to +.Nm libarchive 2.0 +and first appeared in +.Fx 6.3 . +.Sh AUTHORS +.An -nosplit +The +.Nm libarchive +library was written by +.An Tim Kientzle Aq kientzle@acm.org . +.Sh BUGS +Directories are actually extracted in two distinct phases. +Directories are created during +.Fn archive_write_header , +but final permissions are not set until +.Fn archive_write_close . +This separation is necessary to correctly handle borderline +cases such as a non-writable directory containing +files, but can cause unexpected results. +In particular, directory permissions are not fully +restored until the archive is closed. +If you use +.Xr chdir 2 +to change the current directory between calls to +.Fn archive_read_extract +or before calling +.Fn archive_read_close , +you may confuse the permission-setting logic with +the result that directory permissions are restored +incorrectly. +.Pp +The library attempts to create objects with filenames longer than +.Cm PATH_MAX +by creating prefixes of the full path and changing the current directory. +Currently, this logic is limited in scope; the fixup pass does +not work correctly for such objects and the symlink security check +option disables the support for very long pathnames. +.Pp +Restoring the path +.Pa aa/../bb +does create each intermediate directory. +In particular, the directory +.Pa aa +is created as well as the final object +.Pa bb . +In theory, this can be exploited to create an entire directory heirarchy +with a single request. +Of course, this does not work if the +.Cm ARCHIVE_EXTRACT_NODOTDOT +option is specified. +.Pp +Implicit directories are always created obeying the current umask. +Explicit objects are created obeying the current umask unless +.Cm ARCHIVE_EXTRACT_PERM +is specified, in which case they current umask is ignored. +.Pp +SGID and SUID bits are restored only if the correct user and +group could be set. +If +.Cm ARCHIVE_EXTRACT_OWNER +is not specified, then no attempt is made to set the ownership. +In this case, SGID and SUID bits are restored only if the +user and group of the final object happen to match those specified +in the entry. +.Pp +The +.Dq standard +user-id and group-id lookup functions are not the defaults because +.Xr getgrnam 3 +and +.Xr getpwnam 3 +are sometimes too large for particular applications. +The current design allows the application author to use a more +compact implementation when appropriate. +.Pp +There should be a corresponding +.Nm archive_read_disk +interface that walks a directory heirarchy and returns archive +entry objects. \ No newline at end of file diff --git a/Utilities/cmlibarchive/libarchive/archive_write_disk.c b/Utilities/cmlibarchive/libarchive/archive_write_disk.c new file mode 100644 index 000000000..fb018b4c4 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_disk.c @@ -0,0 +1,2600 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_disk.c,v 1.42 2008/12/06 05:55:46 kientzle Exp $"); + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_ACL_H +#include +#endif +#ifdef HAVE_SYS_EXTATTR_H +#include +#endif +#ifdef HAVE_SYS_XATTR_H +#include +#endif +#ifdef HAVE_ATTR_XATTR_H +#include +#endif +#ifdef HAVE_SYS_IOCTL_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_UTIME_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_LINUX_FS_H +#include /* for Linux file flags */ +#endif +/* + * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h. + * As the include guards don't agree, the order of include is important. + */ +#ifdef HAVE_LINUX_EXT2_FS_H +#include /* for Linux file flags */ +#endif +#if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__) +#include /* Linux file flags, broken on Cygwin */ +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_UTIME_H +#include +#endif + +#include "archive.h" +#include "archive_string.h" +#include "archive_entry.h" +#include "archive_private.h" + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +struct fixup_entry { + struct fixup_entry *next; + mode_t mode; + int64_t atime; + int64_t birthtime; + int64_t mtime; + unsigned long atime_nanos; + unsigned long birthtime_nanos; + unsigned long mtime_nanos; + unsigned long fflags_set; + int fixup; /* bitmask of what needs fixing */ + char *name; +}; + +/* + * We use a bitmask to track which operations remain to be done for + * this file. In particular, this helps us avoid unnecessary + * operations when it's possible to take care of one step as a + * side-effect of another. For example, mkdir() can specify the mode + * for the newly-created object but symlink() cannot. This means we + * can skip chmod() if mkdir() succeeded, but we must explicitly + * chmod() if we're trying to create a directory that already exists + * (mkdir() failed) or if we're restoring a symlink. Similarly, we + * need to verify UID/GID before trying to restore SUID/SGID bits; + * that verification can occur explicitly through a stat() call or + * implicitly because of a successful chown() call. + */ +#define TODO_MODE_FORCE 0x40000000 +#define TODO_MODE_BASE 0x20000000 +#define TODO_SUID 0x10000000 +#define TODO_SUID_CHECK 0x08000000 +#define TODO_SGID 0x04000000 +#define TODO_SGID_CHECK 0x02000000 +#define TODO_MODE (TODO_MODE_BASE|TODO_SUID|TODO_SGID) +#define TODO_TIMES ARCHIVE_EXTRACT_TIME +#define TODO_OWNER ARCHIVE_EXTRACT_OWNER +#define TODO_FFLAGS ARCHIVE_EXTRACT_FFLAGS +#define TODO_ACLS ARCHIVE_EXTRACT_ACL +#define TODO_XATTR ARCHIVE_EXTRACT_XATTR + +struct archive_write_disk { + struct archive archive; + + mode_t user_umask; + struct fixup_entry *fixup_list; + struct fixup_entry *current_fixup; + uid_t user_uid; + dev_t skip_file_dev; + ino_t skip_file_ino; + time_t start_time; + + gid_t (*lookup_gid)(void *private, const char *gname, gid_t gid); + void (*cleanup_gid)(void *private); + void *lookup_gid_data; + uid_t (*lookup_uid)(void *private, const char *gname, gid_t gid); + void (*cleanup_uid)(void *private); + void *lookup_uid_data; + + /* + * Full path of last file to satisfy symlink checks. + */ + struct archive_string path_safe; + + /* + * Cached stat data from disk for the current entry. + * If this is valid, pst points to st. Otherwise, + * pst is null. + */ + struct stat st; + struct stat *pst; + + /* Information about the object being restored right now. */ + struct archive_entry *entry; /* Entry being extracted. */ + char *name; /* Name of entry, possibly edited. */ + struct archive_string _name_data; /* backing store for 'name' */ + /* Tasks remaining for this object. */ + int todo; + /* Tasks deferred until end-of-archive. */ + int deferred; + /* Options requested by the client. */ + int flags; + /* Handle for the file we're restoring. */ + int fd; + /* Current offset for writing data to the file. */ + off_t offset; + /* Last offset actually written to disk. */ + off_t fd_offset; + /* Maximum size of file, -1 if unknown. */ + off_t filesize; + /* Dir we were in before this restore; only for deep paths. */ + int restore_pwd; + /* Mode we should use for this entry; affected by _PERM and umask. */ + mode_t mode; + /* UID/GID to use in restoring this entry. */ + uid_t uid; + gid_t gid; +}; + +/* + * Default mode for dirs created automatically (will be modified by umask). + * Note that POSIX specifies 0777 for implicity-created dirs, "modified + * by the process' file creation mask." + */ +#define DEFAULT_DIR_MODE 0777 +/* + * Dir modes are restored in two steps: During the extraction, the permissions + * in the archive are modified to match the following limits. During + * the post-extract fixup pass, the permissions from the archive are + * applied. + */ +#define MINIMUM_DIR_MODE 0700 +#define MAXIMUM_DIR_MODE 0775 + +static int check_symlinks(struct archive_write_disk *); +static int create_filesystem_object(struct archive_write_disk *); +static struct fixup_entry *current_fixup(struct archive_write_disk *, const char *pathname); +#ifdef HAVE_FCHDIR +static void edit_deep_directories(struct archive_write_disk *ad); +#endif +static int cleanup_pathname(struct archive_write_disk *); +static int create_dir(struct archive_write_disk *, char *); +static int create_parent_dir(struct archive_write_disk *, char *); +static int older(struct stat *, struct archive_entry *); +static int restore_entry(struct archive_write_disk *); +#ifdef HAVE_POSIX_ACL +static int set_acl(struct archive_write_disk *, int fd, struct archive_entry *, + acl_type_t, int archive_entry_acl_type, const char *tn); +#endif +static int set_acls(struct archive_write_disk *); +static int set_xattrs(struct archive_write_disk *); +static int set_fflags(struct archive_write_disk *); +static int set_fflags_platform(struct archive_write_disk *, int fd, + const char *name, mode_t mode, + unsigned long fflags_set, unsigned long fflags_clear); +static int set_ownership(struct archive_write_disk *); +static int set_mode(struct archive_write_disk *, int mode); +static int set_time(int, int, const char *, time_t, long, time_t, long); +static int set_times(struct archive_write_disk *); +static struct fixup_entry *sort_dir_list(struct fixup_entry *p); +static gid_t trivial_lookup_gid(void *, const char *, gid_t); +static uid_t trivial_lookup_uid(void *, const char *, uid_t); +static ssize_t write_data_block(struct archive_write_disk *, + const char *, size_t); + +static struct archive_vtable *archive_write_disk_vtable(void); + +static int _archive_write_close(struct archive *); +static int _archive_write_finish(struct archive *); +static int _archive_write_header(struct archive *, struct archive_entry *); +static int _archive_write_finish_entry(struct archive *); +static ssize_t _archive_write_data(struct archive *, const void *, size_t); +static ssize_t _archive_write_data_block(struct archive *, const void *, size_t, off_t); + +static int +_archive_write_disk_lazy_stat(struct archive_write_disk *a) +{ + if (a->pst != NULL) { + /* Already have stat() data available. */ + return (ARCHIVE_OK); + } +#ifdef HAVE_FSTAT + if (a->fd >= 0 && fstat(a->fd, &a->st) == 0) { + a->pst = &a->st; + return (ARCHIVE_OK); + } +#endif + /* + * XXX At this point, symlinks should not be hit, otherwise + * XXX a race occured. Do we want to check explicitly for that? + */ + if (lstat(a->name, &a->st) == 0) { + a->pst = &a->st; + return (ARCHIVE_OK); + } + archive_set_error(&a->archive, errno, "Couldn't stat file"); + return (ARCHIVE_WARN); +} + +static struct archive_vtable * +archive_write_disk_vtable(void) +{ + static struct archive_vtable av; + static int inited = 0; + + if (!inited) { + av.archive_close = _archive_write_close; + av.archive_finish = _archive_write_finish; + av.archive_write_header = _archive_write_header; + av.archive_write_finish_entry = _archive_write_finish_entry; + av.archive_write_data = _archive_write_data; + av.archive_write_data_block = _archive_write_data_block; + } + return (&av); +} + + +int +archive_write_disk_set_options(struct archive *_a, int flags) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + + a->flags = flags; + return (ARCHIVE_OK); +} + + +/* + * Extract this entry to disk. + * + * TODO: Validate hardlinks. According to the standards, we're + * supposed to check each extracted hardlink and squawk if it refers + * to a file that we didn't restore. I'm not entirely convinced this + * is a good idea, but more importantly: Is there any way to validate + * hardlinks without keeping a complete list of filenames from the + * entire archive?? Ugh. + * + */ +static int +_archive_write_header(struct archive *_a, struct archive_entry *entry) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + struct fixup_entry *fe; + int ret, r; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_write_disk_header"); + archive_clear_error(&a->archive); + if (a->archive.state & ARCHIVE_STATE_DATA) { + r = _archive_write_finish_entry(&a->archive); + if (r == ARCHIVE_FATAL) + return (r); + } + + /* Set up for this particular entry. */ + a->pst = NULL; + a->current_fixup = NULL; + a->deferred = 0; + if (a->entry) { + archive_entry_free(a->entry); + a->entry = NULL; + } + a->entry = archive_entry_clone(entry); + a->fd = -1; + a->fd_offset = 0; + a->offset = 0; + a->uid = a->user_uid; + a->mode = archive_entry_mode(a->entry); + if (archive_entry_size_is_set(a->entry)) + a->filesize = archive_entry_size(a->entry); + else + a->filesize = -1; + archive_strcpy(&(a->_name_data), archive_entry_pathname(a->entry)); + a->name = a->_name_data.s; + archive_clear_error(&a->archive); + + /* + * Clean up the requested path. This is necessary for correct + * dir restores; the dir restore logic otherwise gets messed + * up by nonsense like "dir/.". + */ + ret = cleanup_pathname(a); + if (ret != ARCHIVE_OK) + return (ret); + + /* + * Set the umask to zero so we get predictable mode settings. + * This gets done on every call to _write_header in case the + * user edits their umask during the extraction for some + * reason. This will be reset before we return. Note that we + * don't need to do this in _finish_entry, as the chmod(), etc, + * system calls don't obey umask. + */ + a->user_umask = umask(0); + /* From here on, early exit requires "goto done" to clean up. */ + + /* Figure out what we need to do for this entry. */ + a->todo = TODO_MODE_BASE; + if (a->flags & ARCHIVE_EXTRACT_PERM) { + a->todo |= TODO_MODE_FORCE; /* Be pushy about permissions. */ + /* + * SGID requires an extra "check" step because we + * cannot easily predict the GID that the system will + * assign. (Different systems assign GIDs to files + * based on a variety of criteria, including process + * credentials and the gid of the enclosing + * directory.) We can only restore the SGID bit if + * the file has the right GID, and we only know the + * GID if we either set it (see set_ownership) or if + * we've actually called stat() on the file after it + * was restored. Since there are several places at + * which we might verify the GID, we need a TODO bit + * to keep track. + */ + if (a->mode & S_ISGID) + a->todo |= TODO_SGID | TODO_SGID_CHECK; + /* + * Verifying the SUID is simpler, but can still be + * done in multiple ways, hence the separate "check" bit. + */ + if (a->mode & S_ISUID) + a->todo |= TODO_SUID | TODO_SUID_CHECK; + } else { + /* + * User didn't request full permissions, so don't + * restore SUID, SGID bits and obey umask. + */ + a->mode &= ~S_ISUID; + a->mode &= ~S_ISGID; + a->mode &= ~S_ISVTX; + a->mode &= ~a->user_umask; + } +#if !defined(_WIN32) || defined(__CYGWIN__) + if (a->flags & ARCHIVE_EXTRACT_OWNER) + a->todo |= TODO_OWNER; +#endif + if (a->flags & ARCHIVE_EXTRACT_TIME) + a->todo |= TODO_TIMES; + if (a->flags & ARCHIVE_EXTRACT_ACL) + a->todo |= TODO_ACLS; + if (a->flags & ARCHIVE_EXTRACT_XATTR) + a->todo |= TODO_XATTR; + if (a->flags & ARCHIVE_EXTRACT_FFLAGS) + a->todo |= TODO_FFLAGS; + if (a->flags & ARCHIVE_EXTRACT_SECURE_SYMLINKS) { + ret = check_symlinks(a); + if (ret != ARCHIVE_OK) + goto done; + } +#ifdef HAVE_FCHDIR + /* If path exceeds PATH_MAX, shorten the path. */ + edit_deep_directories(a); +#endif + + ret = restore_entry(a); + + /* + * On the GNU tar mailing list, some people working with new + * Linux filesystems observed that system xattrs used as + * layout hints need to be restored before the file contents + * are written, so this can't be done at file close. + */ + if (a->todo & TODO_XATTR) { + int r2 = set_xattrs(a); + if (r2 < ret) ret = r2; + } + +#ifdef HAVE_FCHDIR + /* If we changed directory above, restore it here. */ + if (a->restore_pwd >= 0) { + r = fchdir(a->restore_pwd); + if (r != 0) { + archive_set_error(&a->archive, errno, "chdir() failure"); + ret = ARCHIVE_FATAL; + } + close(a->restore_pwd); + a->restore_pwd = -1; + } +#endif + + /* + * Fixup uses the unedited pathname from archive_entry_pathname(), + * because it is relative to the base dir and the edited path + * might be relative to some intermediate dir as a result of the + * deep restore logic. + */ + if (a->deferred & TODO_MODE) { + fe = current_fixup(a, archive_entry_pathname(entry)); + fe->fixup |= TODO_MODE_BASE; + fe->mode = a->mode; + } + + if ((a->deferred & TODO_TIMES) + && (archive_entry_mtime_is_set(entry) + || archive_entry_atime_is_set(entry))) { + fe = current_fixup(a, archive_entry_pathname(entry)); + fe->fixup |= TODO_TIMES; + if (archive_entry_atime_is_set(entry)) { + fe->atime = archive_entry_atime(entry); + fe->atime_nanos = archive_entry_atime_nsec(entry); + } else { + /* If atime is unset, use start time. */ + fe->atime = a->start_time; + fe->atime_nanos = 0; + } + if (archive_entry_mtime_is_set(entry)) { + fe->mtime = archive_entry_mtime(entry); + fe->mtime_nanos = archive_entry_mtime_nsec(entry); + } else { + /* If mtime is unset, use start time. */ + fe->mtime = a->start_time; + fe->mtime_nanos = 0; + } + if (archive_entry_birthtime_is_set(entry)) { + fe->birthtime = archive_entry_birthtime(entry); + fe->birthtime_nanos = archive_entry_birthtime_nsec(entry); + } else { + /* If birthtime is unset, use mtime. */ + fe->birthtime = fe->mtime; + fe->birthtime_nanos = fe->mtime_nanos; + } + } + + if (a->deferred & TODO_FFLAGS) { + fe = current_fixup(a, archive_entry_pathname(entry)); + fe->fixup |= TODO_FFLAGS; + /* TODO: Complete this.. defer fflags from below. */ + } + + /* We've created the object and are ready to pour data into it. */ + if (ret >= ARCHIVE_WARN) + a->archive.state = ARCHIVE_STATE_DATA; + /* + * If it's not open, tell our client not to try writing. + * In particular, dirs, links, etc, don't get written to. + */ + if (a->fd < 0) { + archive_entry_set_size(entry, 0); + a->filesize = 0; + } +done: + /* Restore the user's umask before returning. */ + umask(a->user_umask); + + return (ret); +} + +int +archive_write_disk_set_skip_file(struct archive *_a, dev_t d, ino_t i) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_disk_set_skip_file"); + a->skip_file_dev = d; + a->skip_file_ino = i; + return (ARCHIVE_OK); +} + +static ssize_t +write_data_block(struct archive_write_disk *a, const char *buff, size_t size) +{ + uint64_t start_size = size; + ssize_t bytes_written = 0; + ssize_t block_size = 0, bytes_to_write; + + if (size == 0) + return (ARCHIVE_OK); + + if (a->filesize == 0 || a->fd < 0) { + archive_set_error(&a->archive, 0, + "Attempt to write to an empty file"); + return (ARCHIVE_WARN); + } + + if (a->flags & ARCHIVE_EXTRACT_SPARSE) { +#if HAVE_STRUCT_STAT_ST_BLKSIZE + int r; + if ((r = _archive_write_disk_lazy_stat(a)) != ARCHIVE_OK) + return (r); + block_size = a->pst->st_blksize; +#else + /* XXX TODO XXX Is there a more appropriate choice here ? */ + /* This needn't match the filesystem allocation size. */ + block_size = 16*1024; +#endif + } + + /* If this write would run beyond the file size, truncate it. */ + if (a->filesize >= 0 && (off_t)(a->offset + size) > a->filesize) + start_size = size = (size_t)(a->filesize - a->offset); + + /* Write the data. */ + while (size > 0) { + if (block_size == 0) { + bytes_to_write = size; + } else { + /* We're sparsifying the file. */ + const char *p, *end; + off_t block_end; + + /* Skip leading zero bytes. */ + for (p = buff, end = buff + size; p < end; ++p) { + if (*p != '\0') + break; + } + a->offset += p - buff; + size -= p - buff; + buff = p; + if (size == 0) + break; + + /* Calculate next block boundary after offset. */ + block_end + = (a->offset / block_size + 1) * block_size; + + /* If the adjusted write would cross block boundary, + * truncate it to the block boundary. */ + bytes_to_write = size; + if (a->offset + bytes_to_write > block_end) + bytes_to_write = block_end - a->offset; + } + /* Seek if necessary to the specified offset. */ + if (a->offset != a->fd_offset) { + if (lseek(a->fd, a->offset, SEEK_SET) < 0) { + archive_set_error(&a->archive, errno, + "Seek failed"); + return (ARCHIVE_FATAL); + } + a->fd_offset = a->offset; + a->archive.file_position = a->offset; + a->archive.raw_position = a->offset; + } + bytes_written = write(a->fd, buff, bytes_to_write); + if (bytes_written < 0) { + archive_set_error(&a->archive, errno, "Write failed"); + return (ARCHIVE_WARN); + } + buff += bytes_written; + size -= bytes_written; + a->offset += bytes_written; + a->archive.file_position += bytes_written; + a->archive.raw_position += bytes_written; + a->fd_offset = a->offset; + } + return (start_size - size); +} + +static ssize_t +_archive_write_data_block(struct archive *_a, + const void *buff, size_t size, off_t offset) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + ssize_t r; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_DATA, "archive_write_disk_block"); + + a->offset = offset; + r = write_data_block(a, buff, size); + if (r < ARCHIVE_OK) + return (r); + if ((size_t)r < size) { + archive_set_error(&a->archive, 0, + "Write request too large"); + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); +} + +static ssize_t +_archive_write_data(struct archive *_a, const void *buff, size_t size) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_DATA, "archive_write_data"); + + return (write_data_block(a, buff, size)); +} + +static int +_archive_write_finish_entry(struct archive *_a) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + int ret = ARCHIVE_OK; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_write_finish_entry"); + if (a->archive.state & ARCHIVE_STATE_HEADER) + return (ARCHIVE_OK); + archive_clear_error(&a->archive); + + /* Pad or truncate file to the right size. */ + if (a->fd < 0) { + /* There's no file. */ + } else if (a->filesize < 0) { + /* File size is unknown, so we can't set the size. */ + } else if (a->fd_offset == a->filesize) { + /* Last write ended at exactly the filesize; we're done. */ + /* Hopefully, this is the common case. */ + } else { +#if HAVE_FTRUNCATE + if (ftruncate(a->fd, a->filesize) == -1 && + a->filesize == 0) { + archive_set_error(&a->archive, errno, + "File size could not be restored"); + return (ARCHIVE_FAILED); + } +#endif + /* + * Not all platforms implement the XSI option to + * extend files via ftruncate. Stat() the file again + * to see what happened. + */ + a->pst = NULL; + if ((ret = _archive_write_disk_lazy_stat(a)) != ARCHIVE_OK) + return (ret); + /* We can use lseek()/write() to extend the file if + * ftruncate didn't work or isn't available. */ + if (a->st.st_size < a->filesize) { + const char nul = '\0'; + if (lseek(a->fd, a->filesize - 1, SEEK_SET) < 0) { + archive_set_error(&a->archive, errno, + "Seek failed"); + return (ARCHIVE_FATAL); + } + if (write(a->fd, &nul, 1) < 0) { + archive_set_error(&a->archive, errno, + "Write to restore size failed"); + return (ARCHIVE_FATAL); + } + a->pst = NULL; + } + } + + /* Restore metadata. */ + + /* + * Look up the "real" UID only if we're going to need it. + * TODO: the TODO_SGID condition can be dropped here, can't it? + */ + if (a->todo & (TODO_OWNER | TODO_SUID | TODO_SGID)) { + a->uid = a->lookup_uid(a->lookup_uid_data, + archive_entry_uname(a->entry), + archive_entry_uid(a->entry)); + } + /* Look up the "real" GID only if we're going to need it. */ + /* TODO: the TODO_SUID condition can be dropped here, can't it? */ + if (a->todo & (TODO_OWNER | TODO_SGID | TODO_SUID)) { + a->gid = a->lookup_gid(a->lookup_gid_data, + archive_entry_gname(a->entry), + archive_entry_gid(a->entry)); + } + /* + * If restoring ownership, do it before trying to restore suid/sgid + * bits. If we set the owner, we know what it is and can skip + * a stat() call to examine the ownership of the file on disk. + */ + if (a->todo & TODO_OWNER) + ret = set_ownership(a); + if (a->todo & TODO_MODE) { + int r2 = set_mode(a, a->mode); + if (r2 < ret) ret = r2; + } + if (a->todo & TODO_ACLS) { + int r2 = set_acls(a); + if (r2 < ret) ret = r2; + } + /* + * Some flags prevent file modification; they must be restored after + * file contents are written. + */ + if (a->todo & TODO_FFLAGS) { + int r2 = set_fflags(a); + if (r2 < ret) ret = r2; + } + /* + * Time has to be restored after all other metadata; + * otherwise atime will get changed. + */ + if (a->todo & TODO_TIMES) { + int r2 = set_times(a); + if (r2 < ret) ret = r2; + } + + /* If there's an fd, we can close it now. */ + if (a->fd >= 0) { + close(a->fd); + a->fd = -1; + } + /* If there's an entry, we can release it now. */ + if (a->entry) { + archive_entry_free(a->entry); + a->entry = NULL; + } + a->archive.state = ARCHIVE_STATE_HEADER; + return (ret); +} + +int +archive_write_disk_set_group_lookup(struct archive *_a, + void *private_data, + gid_t (*lookup_gid)(void *private, const char *gname, gid_t gid), + void (*cleanup_gid)(void *private)) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_disk_set_group_lookup"); + + a->lookup_gid = lookup_gid; + a->cleanup_gid = cleanup_gid; + a->lookup_gid_data = private_data; + return (ARCHIVE_OK); +} + +int +archive_write_disk_set_user_lookup(struct archive *_a, + void *private_data, + uid_t (*lookup_uid)(void *private, const char *uname, uid_t uid), + void (*cleanup_uid)(void *private)) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_ANY, "archive_write_disk_set_user_lookup"); + + a->lookup_uid = lookup_uid; + a->cleanup_uid = cleanup_uid; + a->lookup_uid_data = private_data; + return (ARCHIVE_OK); +} + + +/* + * Create a new archive_write_disk object and initialize it with global state. + */ +struct archive * +archive_write_disk_new(void) +{ + struct archive_write_disk *a; + + a = (struct archive_write_disk *)malloc(sizeof(*a)); + if (a == NULL) + return (NULL); + memset(a, 0, sizeof(*a)); + a->archive.magic = ARCHIVE_WRITE_DISK_MAGIC; + /* We're ready to write a header immediately. */ + a->archive.state = ARCHIVE_STATE_HEADER; + a->archive.vtable = archive_write_disk_vtable(); + a->lookup_uid = trivial_lookup_uid; + a->lookup_gid = trivial_lookup_gid; + a->start_time = time(NULL); +#ifdef HAVE_GETEUID + a->user_uid = geteuid(); +#endif /* HAVE_GETEUID */ + if (archive_string_ensure(&a->path_safe, 512) == NULL) { + free(a); + return (NULL); + } + return (&a->archive); +} + + +/* + * If pathname is longer than PATH_MAX, chdir to a suitable + * intermediate dir and edit the path down to a shorter suffix. Note + * that this routine never returns an error; if the chdir() attempt + * fails for any reason, we just go ahead with the long pathname. The + * object creation is likely to fail, but any error will get handled + * at that time. + */ +#ifdef HAVE_FCHDIR +static void +edit_deep_directories(struct archive_write_disk *a) +{ + int ret; + char *tail = a->name; + + a->restore_pwd = -1; + + /* If path is short, avoid the open() below. */ + if (strlen(tail) <= PATH_MAX) + return; + + /* Try to record our starting dir. */ + a->restore_pwd = open(".", O_RDONLY | O_BINARY); + if (a->restore_pwd < 0) + return; + + /* As long as the path is too long... */ + while (strlen(tail) > PATH_MAX) { + /* Locate a dir prefix shorter than PATH_MAX. */ + tail += PATH_MAX - 8; + while (tail > a->name && *tail != '/') + tail--; + /* Exit if we find a too-long path component. */ + if (tail <= a->name) + return; + /* Create the intermediate dir and chdir to it. */ + *tail = '\0'; /* Terminate dir portion */ + ret = create_dir(a, a->name); + if (ret == ARCHIVE_OK && chdir(a->name) != 0) + ret = ARCHIVE_FAILED; + *tail = '/'; /* Restore the / we removed. */ + if (ret != ARCHIVE_OK) + return; + tail++; + /* The chdir() succeeded; we've now shortened the path. */ + a->name = tail; + } + return; +} +#endif + +/* + * The main restore function. + */ +static int +restore_entry(struct archive_write_disk *a) +{ + int ret = ARCHIVE_OK, en; + + if (a->flags & ARCHIVE_EXTRACT_UNLINK && !S_ISDIR(a->mode)) { + /* + * TODO: Fix this. Apparently, there are platforms + * that still allow root to hose the entire filesystem + * by unlinking a dir. The S_ISDIR() test above + * prevents us from using unlink() here if the new + * object is a dir, but that doesn't mean the old + * object isn't a dir. + */ + if (unlink(a->name) == 0) { + /* We removed it, reset cached stat. */ + a->pst = NULL; + } else if (errno == ENOENT) { + /* File didn't exist, that's just as good. */ + } else if (rmdir(a->name) == 0) { + /* It was a dir, but now it's gone. */ + a->pst = NULL; + } else { + /* We tried, but couldn't get rid of it. */ + archive_set_error(&a->archive, errno, + "Could not unlink"); + return(ARCHIVE_FAILED); + } + } + + /* Try creating it first; if this fails, we'll try to recover. */ + en = create_filesystem_object(a); + + if ((en == ENOTDIR || en == ENOENT) + && !(a->flags & ARCHIVE_EXTRACT_NO_AUTODIR)) { + /* If the parent dir doesn't exist, try creating it. */ + create_parent_dir(a, a->name); + /* Now try to create the object again. */ + en = create_filesystem_object(a); + } + + if ((en == EISDIR || en == EEXIST) + && (a->flags & ARCHIVE_EXTRACT_NO_OVERWRITE)) { + /* If we're not overwriting, we're done. */ + archive_set_error(&a->archive, en, "Already exists"); + return (ARCHIVE_FAILED); + } + + /* + * Some platforms return EISDIR if you call + * open(O_WRONLY | O_EXCL | O_CREAT) on a directory, some + * return EEXIST. POSIX is ambiguous, requiring EISDIR + * for open(O_WRONLY) on a dir and EEXIST for open(O_EXCL | O_CREAT) + * on an existing item. + */ + if (en == EISDIR) { + /* A dir is in the way of a non-dir, rmdir it. */ + if (rmdir(a->name) != 0) { + archive_set_error(&a->archive, errno, + "Can't remove already-existing dir"); + return (ARCHIVE_FAILED); + } + a->pst = NULL; + /* Try again. */ + en = create_filesystem_object(a); + } else if (en == EEXIST) { + /* + * We know something is in the way, but we don't know what; + * we need to find out before we go any further. + */ + int r = 0; + /* + * The SECURE_SYMLINK logic has already removed a + * symlink to a dir if the client wants that. So + * follow the symlink if we're creating a dir. + */ + if (S_ISDIR(a->mode)) + r = stat(a->name, &a->st); + /* + * If it's not a dir (or it's a broken symlink), + * then don't follow it. + */ + if (r != 0 || !S_ISDIR(a->mode)) + r = lstat(a->name, &a->st); + if (r != 0) { + archive_set_error(&a->archive, errno, + "Can't stat existing object"); + return (ARCHIVE_FAILED); + } + + /* + * NO_OVERWRITE_NEWER doesn't apply to directories. + */ + if ((a->flags & ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER) + && !S_ISDIR(a->st.st_mode)) { + if (!older(&(a->st), a->entry)) { + archive_set_error(&a->archive, 0, + "File on disk is not older; skipping."); + return (ARCHIVE_FAILED); + } + } + + /* If it's our archive, we're done. */ + if (a->skip_file_dev > 0 && + a->skip_file_ino > 0 && + a->st.st_dev == a->skip_file_dev && + a->st.st_ino == a->skip_file_ino) { + archive_set_error(&a->archive, 0, "Refusing to overwrite archive"); + return (ARCHIVE_FAILED); + } + + if (!S_ISDIR(a->st.st_mode)) { + /* A non-dir is in the way, unlink it. */ + if (unlink(a->name) != 0) { + archive_set_error(&a->archive, errno, + "Can't unlink already-existing object"); + return (ARCHIVE_FAILED); + } + a->pst = NULL; + /* Try again. */ + en = create_filesystem_object(a); + } else if (!S_ISDIR(a->mode)) { + /* A dir is in the way of a non-dir, rmdir it. */ + if (rmdir(a->name) != 0) { + archive_set_error(&a->archive, errno, + "Can't remove already-existing dir"); + return (ARCHIVE_FAILED); + } + /* Try again. */ + en = create_filesystem_object(a); + } else { + /* + * There's a dir in the way of a dir. Don't + * waste time with rmdir()/mkdir(), just fix + * up the permissions on the existing dir. + * Note that we don't change perms on existing + * dirs unless _EXTRACT_PERM is specified. + */ + if ((a->mode != a->st.st_mode) + && (a->todo & TODO_MODE_FORCE)) + a->deferred |= (a->todo & TODO_MODE); + /* Ownership doesn't need deferred fixup. */ + en = 0; /* Forget the EEXIST. */ + } + } + + if (en) { + /* Everything failed; give up here. */ + archive_set_error(&a->archive, en, "Can't create '%s'", + a->name); + return (ARCHIVE_FAILED); + } + + a->pst = NULL; /* Cached stat data no longer valid. */ + return (ret); +} + +/* + * Returns 0 if creation succeeds, or else returns errno value from + * the failed system call. Note: This function should only ever perform + * a single system call. + */ +int +create_filesystem_object(struct archive_write_disk *a) +{ + /* Create the entry. */ + const char *linkname; + mode_t final_mode, mode; + int r; + + /* We identify hard/symlinks according to the link names. */ + /* Since link(2) and symlink(2) don't handle modes, we're done here. */ + linkname = archive_entry_hardlink(a->entry); + if (linkname != NULL) { +#if !HAVE_LINK + return (EPERM); +#else + r = link(linkname, a->name) ? errno : 0; + /* + * New cpio and pax formats allow hardlink entries + * to carry data, so we may have to open the file + * for hardlink entries. + * + * If the hardlink was successfully created and + * the archive doesn't have carry data for it, + * consider it to be non-authoritive for meta data. + * This is consistent with GNU tar and BSD pax. + * If the hardlink does carry data, let the last + * archive entry decide ownership. + */ + if (r == 0 && a->filesize <= 0) { + a->todo = 0; + a->deferred = 0; + } if (r == 0 && a->filesize > 0) { + a->fd = open(a->name, O_WRONLY | O_TRUNC | O_BINARY); + if (a->fd < 0) + r = errno; + } + return (r); +#endif + } + linkname = archive_entry_symlink(a->entry); + if (linkname != NULL) { +#if HAVE_SYMLINK + return symlink(linkname, a->name) ? errno : 0; +#else + return (EPERM); +#endif + } + + /* + * The remaining system calls all set permissions, so let's + * try to take advantage of that to avoid an extra chmod() + * call. (Recall that umask is set to zero right now!) + */ + + /* Mode we want for the final restored object (w/o file type bits). */ + final_mode = a->mode & 07777; + /* + * The mode that will actually be restored in this step. Note + * that SUID, SGID, etc, require additional work to ensure + * security, so we never restore them at this point. + */ + mode = final_mode & 0777; + + switch (a->mode & AE_IFMT) { + default: + /* POSIX requires that we fall through here. */ + /* FALLTHROUGH */ + case AE_IFREG: + a->fd = open(a->name, + O_WRONLY | O_CREAT | O_EXCL | O_BINARY, mode); + r = (a->fd < 0); + break; + case AE_IFCHR: +#ifdef HAVE_MKNOD + /* Note: we use AE_IFCHR for the case label, and + * S_IFCHR for the mknod() call. This is correct. */ + r = mknod(a->name, mode | S_IFCHR, + archive_entry_rdev(a->entry)); +#else + /* TODO: Find a better way to warn about our inability + * to restore a char device node. */ + return (EINVAL); +#endif /* HAVE_MKNOD */ + break; + case AE_IFBLK: +#ifdef HAVE_MKNOD + r = mknod(a->name, mode | S_IFBLK, + archive_entry_rdev(a->entry)); +#else + /* TODO: Find a better way to warn about our inability + * to restore a block device node. */ + return (EINVAL); +#endif /* HAVE_MKNOD */ + break; + case AE_IFDIR: + mode = (mode | MINIMUM_DIR_MODE) & MAXIMUM_DIR_MODE; + r = mkdir(a->name, mode); + if (r == 0) { + /* Defer setting dir times. */ + a->deferred |= (a->todo & TODO_TIMES); + a->todo &= ~TODO_TIMES; + /* Never use an immediate chmod(). */ + /* We can't avoid the chmod() entirely if EXTRACT_PERM + * because of SysV SGID inheritance. */ + if ((mode != final_mode) + || (a->flags & ARCHIVE_EXTRACT_PERM)) + a->deferred |= (a->todo & TODO_MODE); + a->todo &= ~TODO_MODE; + } + break; + case AE_IFIFO: +#ifdef HAVE_MKFIFO + r = mkfifo(a->name, mode); +#else + /* TODO: Find a better way to warn about our inability + * to restore a fifo. */ + return (EINVAL); +#endif /* HAVE_MKFIFO */ + break; + } + + /* All the system calls above set errno on failure. */ + if (r) + return (errno); + + /* If we managed to set the final mode, we've avoided a chmod(). */ + if (mode == final_mode) + a->todo &= ~TODO_MODE; + return (0); +} + +/* + * Cleanup function for archive_extract. Mostly, this involves processing + * the fixup list, which is used to address a number of problems: + * * Dir permissions might prevent us from restoring a file in that + * dir, so we restore the dir with minimum 0700 permissions first, + * then correct the mode at the end. + * * Similarly, the act of restoring a file touches the directory + * and changes the timestamp on the dir, so we have to touch-up dir + * timestamps at the end as well. + * * Some file flags can interfere with the restore by, for example, + * preventing the creation of hardlinks to those files. + * + * Note that tar/cpio do not require that archives be in a particular + * order; there is no way to know when the last file has been restored + * within a directory, so there's no way to optimize the memory usage + * here by fixing up the directory any earlier than the + * end-of-archive. + * + * XXX TODO: Directory ACLs should be restored here, for the same + * reason we set directory perms here. XXX + */ +static int +_archive_write_close(struct archive *_a) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + struct fixup_entry *next, *p; + int ret; + + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, + ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_write_disk_close"); + ret = _archive_write_finish_entry(&a->archive); + + /* Sort dir list so directories are fixed up in depth-first order. */ + p = sort_dir_list(a->fixup_list); + + while (p != NULL) { + a->pst = NULL; /* Mark stat cache as out-of-date. */ + if (p->fixup & TODO_TIMES) { +#ifdef HAVE_UTIMES + /* {f,l,}utimes() are preferred, when available. */ +#if defined(_WIN32) && !defined(__CYGWIN__) + struct __timeval times[2]; +#else + struct timeval times[2]; +#endif + times[0].tv_sec = p->atime; + times[0].tv_usec = p->atime_nanos / 1000; +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME + /* if it's valid and not mtime, push the birthtime first */ + if (((times[1].tv_sec = p->birthtime) < p->mtime) && + (p->birthtime > 0)) + { + times[1].tv_usec = p->birthtime_nanos / 1000; + utimes(p->name, times); + } +#endif + times[1].tv_sec = p->mtime; + times[1].tv_usec = p->mtime_nanos / 1000; +#ifdef HAVE_LUTIMES + lutimes(p->name, times); +#else + utimes(p->name, times); +#endif +#else + /* utime() is more portable, but less precise. */ + struct utimbuf times; + times.modtime = p->mtime; + times.actime = p->atime; + + utime(p->name, ×); +#endif + } + if (p->fixup & TODO_MODE_BASE) + chmod(p->name, p->mode); + + if (p->fixup & TODO_FFLAGS) + set_fflags_platform(a, -1, p->name, + p->mode, p->fflags_set, 0); + + next = p->next; + free(p->name); + free(p); + p = next; + } + a->fixup_list = NULL; + return (ret); +} + +static int +_archive_write_finish(struct archive *_a) +{ + struct archive_write_disk *a = (struct archive_write_disk *)_a; + int ret; + ret = _archive_write_close(&a->archive); + if (a->cleanup_gid != NULL && a->lookup_gid_data != NULL) + (a->cleanup_gid)(a->lookup_gid_data); + if (a->cleanup_uid != NULL && a->lookup_uid_data != NULL) + (a->cleanup_uid)(a->lookup_uid_data); + if (a->entry) + archive_entry_free(a->entry); + archive_string_free(&a->_name_data); + archive_string_free(&a->archive.error_string); + archive_string_free(&a->path_safe); + free(a); + return (ret); +} + +/* + * Simple O(n log n) merge sort to order the fixup list. In + * particular, we want to restore dir timestamps depth-first. + */ +static struct fixup_entry * +sort_dir_list(struct fixup_entry *p) +{ + struct fixup_entry *a, *b, *t; + + if (p == NULL) + return (NULL); + /* A one-item list is already sorted. */ + if (p->next == NULL) + return (p); + + /* Step 1: split the list. */ + t = p; + a = p->next->next; + while (a != NULL) { + /* Step a twice, t once. */ + a = a->next; + if (a != NULL) + a = a->next; + t = t->next; + } + /* Now, t is at the mid-point, so break the list here. */ + b = t->next; + t->next = NULL; + a = p; + + /* Step 2: Recursively sort the two sub-lists. */ + a = sort_dir_list(a); + b = sort_dir_list(b); + + /* Step 3: Merge the returned lists. */ + /* Pick the first element for the merged list. */ + if (strcmp(a->name, b->name) > 0) { + t = p = a; + a = a->next; + } else { + t = p = b; + b = b->next; + } + + /* Always put the later element on the list first. */ + while (a != NULL && b != NULL) { + if (strcmp(a->name, b->name) > 0) { + t->next = a; + a = a->next; + } else { + t->next = b; + b = b->next; + } + t = t->next; + } + + /* Only one list is non-empty, so just splice it on. */ + if (a != NULL) + t->next = a; + if (b != NULL) + t->next = b; + + return (p); +} + +/* + * Returns a new, initialized fixup entry. + * + * TODO: Reduce the memory requirements for this list by using a tree + * structure rather than a simple list of names. + */ +static struct fixup_entry * +new_fixup(struct archive_write_disk *a, const char *pathname) +{ + struct fixup_entry *fe; + + fe = (struct fixup_entry *)malloc(sizeof(struct fixup_entry)); + if (fe == NULL) + return (NULL); + fe->next = a->fixup_list; + a->fixup_list = fe; + fe->fixup = 0; + fe->name = strdup(pathname); + return (fe); +} + +/* + * Returns a fixup structure for the current entry. + */ +static struct fixup_entry * +current_fixup(struct archive_write_disk *a, const char *pathname) +{ + if (a->current_fixup == NULL) + a->current_fixup = new_fixup(a, pathname); + return (a->current_fixup); +} + +/* TODO: Make this work. */ +/* + * TODO: The deep-directory support bypasses this; disable deep directory + * support if we're doing symlink checks. + */ +/* + * TODO: Someday, integrate this with the deep dir support; they both + * scan the path and both can be optimized by comparing against other + * recent paths. + */ +/* TODO: Extend this to support symlinks on Windows Vista and later. */ +static int +check_symlinks(struct archive_write_disk *a) +{ +#if !defined(HAVE_LSTAT) + /* Platform doesn't have lstat, so we can't look for symlinks. */ + (void)a; /* UNUSED */ + return (ARCHIVE_OK); +#else + char *pn, *p; + char c; + int r; + struct stat st; + + /* + * Guard against symlink tricks. Reject any archive entry whose + * destination would be altered by a symlink. + */ + /* Whatever we checked last time doesn't need to be re-checked. */ + pn = a->name; + p = a->path_safe.s; + while ((*pn != '\0') && (*p == *pn)) + ++p, ++pn; + c = pn[0]; + /* Keep going until we've checked the entire name. */ + while (pn[0] != '\0' && (pn[0] != '/' || pn[1] != '\0')) { + /* Skip the next path element. */ + while (*pn != '\0' && *pn != '/') + ++pn; + c = pn[0]; + pn[0] = '\0'; + /* Check that we haven't hit a symlink. */ + r = lstat(a->name, &st); + if (r != 0) { + /* We've hit a dir that doesn't exist; stop now. */ + if (errno == ENOENT) + break; + } else if (S_ISLNK(st.st_mode)) { + if (c == '\0') { + /* + * Last element is symlink; remove it + * so we can overwrite it with the + * item being extracted. + */ + if (unlink(a->name)) { + archive_set_error(&a->archive, errno, + "Could not remove symlink %s", + a->name); + pn[0] = c; + return (ARCHIVE_FAILED); + } + a->pst = NULL; + /* + * Even if we did remove it, a warning + * is in order. The warning is silly, + * though, if we're just replacing one + * symlink with another symlink. + */ + if (!S_ISLNK(a->mode)) { + archive_set_error(&a->archive, 0, + "Removing symlink %s", + a->name); + } + /* Symlink gone. No more problem! */ + pn[0] = c; + return (0); + } else if (a->flags & ARCHIVE_EXTRACT_UNLINK) { + /* User asked us to remove problems. */ + if (unlink(a->name) != 0) { + archive_set_error(&a->archive, 0, + "Cannot remove intervening symlink %s", + a->name); + pn[0] = c; + return (ARCHIVE_FAILED); + } + a->pst = NULL; + } else { + archive_set_error(&a->archive, 0, + "Cannot extract through symlink %s", + a->name); + pn[0] = c; + return (ARCHIVE_FAILED); + } + } + } + pn[0] = c; + /* We've checked and/or cleaned the whole path, so remember it. */ + archive_strcpy(&a->path_safe, a->name); + return (ARCHIVE_OK); +#endif +} + +#if defined(_WIN32) || defined(__CYGWIN__) +/* + * 1. Convert a path separator from '\' to '/' . + * We shouldn't check multi-byte character directly because some + * character-set have been using the '\' character for a part of + * its multibyte character code. + * 2. Replace unusable characters in Windows with underscore('_'). + * See also : http://msdn.microsoft.com/en-us/library/aa365247.aspx + */ +static void +cleanup_pathname_win(struct archive_write_disk *a) +{ + wchar_t wc; + char *p; + size_t alen, l; + + alen = 0; + l = 0; + for (p = a->name; *p != '\0'; p++) { + ++alen; + if (*p == '\\') + l = 1; + /* Rewrite the path name if its character is a unusable. */ + if (*p == ':' || *p == '*' || *p == '?' || *p == '"' || + *p == '<' || *p == '>' || *p == '|') + *p = '_'; + } + if (alen == 0 || l == 0) + return; + /* + * Convert path separator. + */ + p = a->name; + while (*p != '\0' && alen) { + l = mbtowc(&wc, p, alen); + if (l == -1) { + while (*p != '\0') { + if (*p == '\\') + *p = '/'; + ++p; + } + break; + } + if (l == 1 && wc == L'\\') + *p = '/'; + p += l; + alen -= l; + } +} +#endif + +/* + * Canonicalize the pathname. In particular, this strips duplicate + * '/' characters, '.' elements, and trailing '/'. It also raises an + * error for an empty path, a trailing '..' or (if _SECURE_NODOTDOT is + * set) any '..' in the path. + */ +static int +cleanup_pathname(struct archive_write_disk *a) +{ + char *dest, *src; + char separator = '\0'; + + dest = src = a->name; + if (*src == '\0') { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Invalid empty pathname"); + return (ARCHIVE_FAILED); + } + +#if defined(_WIN32) || defined(__CYGWIN__) + cleanup_pathname_win(a); +#endif + /* Skip leading '/'. */ + if (*src == '/') + separator = *src++; + + /* Scan the pathname one element at a time. */ + for (;;) { + /* src points to first char after '/' */ + if (src[0] == '\0') { + break; + } else if (src[0] == '/') { + /* Found '//', ignore second one. */ + src++; + continue; + } else if (src[0] == '.') { + if (src[1] == '\0') { + /* Ignore trailing '.' */ + break; + } else if (src[1] == '/') { + /* Skip './'. */ + src += 2; + continue; + } else if (src[1] == '.') { + if (src[2] == '/' || src[2] == '\0') { + /* Conditionally warn about '..' */ + if (a->flags & ARCHIVE_EXTRACT_SECURE_NODOTDOT) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Path contains '..'"); + return (ARCHIVE_FAILED); + } + } + /* + * Note: Under no circumstances do we + * remove '..' elements. In + * particular, restoring + * '/foo/../bar/' should create the + * 'foo' dir as a side-effect. + */ + } + } + + /* Copy current element, including leading '/'. */ + if (separator) + *dest++ = '/'; + while (*src != '\0' && *src != '/') { + *dest++ = *src++; + } + + if (*src == '\0') + break; + + /* Skip '/' separator. */ + separator = *src++; + } + /* + * We've just copied zero or more path elements, not including the + * final '/'. + */ + if (dest == a->name) { + /* + * Nothing got copied. The path must have been something + * like '.' or '/' or './' or '/././././/./'. + */ + if (separator) + *dest++ = '/'; + else + *dest++ = '.'; + } + /* Terminate the result. */ + *dest = '\0'; + return (ARCHIVE_OK); +} + +/* + * Create the parent directory of the specified path, assuming path + * is already in mutable storage. + */ +static int +create_parent_dir(struct archive_write_disk *a, char *path) +{ + char *slash; + int r; + + /* Remove tail element to obtain parent name. */ + slash = strrchr(path, '/'); + if (slash == NULL) + return (ARCHIVE_OK); + *slash = '\0'; + r = create_dir(a, path); + *slash = '/'; + return (r); +} + +/* + * Create the specified dir, recursing to create parents as necessary. + * + * Returns ARCHIVE_OK if the path exists when we're done here. + * Otherwise, returns ARCHIVE_FAILED. + * Assumes path is in mutable storage; path is unchanged on exit. + */ +static int +create_dir(struct archive_write_disk *a, char *path) +{ + struct stat st; + struct fixup_entry *le; + char *slash, *base; + mode_t mode_final, mode; + int r; + + r = ARCHIVE_OK; + + /* Check for special names and just skip them. */ + slash = strrchr(path, '/'); + if (slash == NULL) + base = path; + else + base = slash + 1; + + if (base[0] == '\0' || + (base[0] == '.' && base[1] == '\0') || + (base[0] == '.' && base[1] == '.' && base[2] == '\0')) { + /* Don't bother trying to create null path, '.', or '..'. */ + if (slash != NULL) { + *slash = '\0'; + r = create_dir(a, path); + *slash = '/'; + return (r); + } + return (ARCHIVE_OK); + } + + /* + * Yes, this should be stat() and not lstat(). Using lstat() + * here loses the ability to extract through symlinks. Also note + * that this should not use the a->st cache. + */ + if (stat(path, &st) == 0) { + if (S_ISDIR(st.st_mode)) + return (ARCHIVE_OK); + if ((a->flags & ARCHIVE_EXTRACT_NO_OVERWRITE)) { + archive_set_error(&a->archive, EEXIST, + "Can't create directory '%s'", path); + return (ARCHIVE_FAILED); + } + if (unlink(path) != 0) { + archive_set_error(&a->archive, errno, + "Can't create directory '%s': " + "Conflicting file cannot be removed"); + return (ARCHIVE_FAILED); + } + } else if (errno != ENOENT && errno != ENOTDIR) { + /* Stat failed? */ + archive_set_error(&a->archive, errno, "Can't test directory '%s'", path); + return (ARCHIVE_FAILED); + } else if (slash != NULL) { + *slash = '\0'; + r = create_dir(a, path); + *slash = '/'; + if (r != ARCHIVE_OK) + return (r); + } + + /* + * Mode we want for the final restored directory. Per POSIX, + * implicitly-created dirs must be created obeying the umask. + * There's no mention whether this is different for privileged + * restores (which the rest of this code handles by pretending + * umask=0). I've chosen here to always obey the user's umask for + * implicit dirs, even if _EXTRACT_PERM was specified. + */ + mode_final = DEFAULT_DIR_MODE & ~a->user_umask; + /* Mode we want on disk during the restore process. */ + mode = mode_final; + mode |= MINIMUM_DIR_MODE; + mode &= MAXIMUM_DIR_MODE; + if (mkdir(path, mode) == 0) { + if (mode != mode_final) { + le = new_fixup(a, path); + le->fixup |=TODO_MODE_BASE; + le->mode = mode_final; + } + return (ARCHIVE_OK); + } + + /* + * Without the following check, a/b/../b/c/d fails at the + * second visit to 'b', so 'd' can't be created. Note that we + * don't add it to the fixup list here, as it's already been + * added. + */ + if (stat(path, &st) == 0 && S_ISDIR(st.st_mode)) + return (ARCHIVE_OK); + + archive_set_error(&a->archive, errno, "Failed to create dir '%s'", + path); + return (ARCHIVE_FAILED); +} + +/* + * Note: Although we can skip setting the user id if the desired user + * id matches the current user, we cannot skip setting the group, as + * many systems set the gid based on the containing directory. So + * we have to perform a chown syscall if we want to set the SGID + * bit. (The alternative is to stat() and then possibly chown(); it's + * more efficient to skip the stat() and just always chown().) Note + * that a successful chown() here clears the TODO_SGID_CHECK bit, which + * allows set_mode to skip the stat() check for the GID. + */ +static int +set_ownership(struct archive_write_disk *a) +{ +#ifndef __CYGWIN__ +/* unfortunately, on win32 there is no 'root' user with uid 0, + so we just have to try the chown and see if it works */ + + /* If we know we can't change it, don't bother trying. */ + if (a->user_uid != 0 && a->user_uid != a->uid) { + archive_set_error(&a->archive, errno, + "Can't set UID=%d", a->uid); + return (ARCHIVE_WARN); + } +#endif + +#ifdef HAVE_FCHOWN + /* If we have an fd, we can avoid a race. */ + if (a->fd >= 0 && fchown(a->fd, a->uid, a->gid) == 0) { + /* We've set owner and know uid/gid are correct. */ + a->todo &= ~(TODO_OWNER | TODO_SGID_CHECK | TODO_SUID_CHECK); + return (ARCHIVE_OK); + } +#endif + + /* We prefer lchown() but will use chown() if that's all we have. */ + /* Of course, if we have neither, this will always fail. */ +#ifdef HAVE_LCHOWN + if (lchown(a->name, a->uid, a->gid) == 0) { + /* We've set owner and know uid/gid are correct. */ + a->todo &= ~(TODO_OWNER | TODO_SGID_CHECK | TODO_SUID_CHECK); + return (ARCHIVE_OK); + } +#elif HAVE_CHOWN + if (!S_ISLNK(a->mode) && chown(a->name, a->uid, a->gid) == 0) { + /* We've set owner and know uid/gid are correct. */ + a->todo &= ~(TODO_OWNER | TODO_SGID_CHECK | TODO_SUID_CHECK); + return (ARCHIVE_OK); + } +#endif + + archive_set_error(&a->archive, errno, + "Can't set user=%d/group=%d for %s", a->uid, a->gid, + a->name); + return (ARCHIVE_WARN); +} + +#ifdef HAVE_UTIMES +/* + * The utimes()-family functions provide high resolution and + * a way to set time on an fd or a symlink. We prefer them + * when they're available. + */ +static int +set_time(int fd, int mode, const char *name, + time_t atime, long atime_nsec, + time_t mtime, long mtime_nsec) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + struct __timeval times[2]; +#else + struct timeval times[2]; +#endif + + times[0].tv_sec = atime; + times[0].tv_usec = atime_nsec / 1000; + times[1].tv_sec = mtime; + times[1].tv_usec = mtime_nsec / 1000; + +#ifdef HAVE_FUTIMES + if (fd >= 0) + return (futimes(fd, times)); +#else + (void)fd; /* UNUSED */ +#endif +#ifdef HAVE_LUTIMES + (void)mode; /* UNUSED */ + return (lutimes(name, times)); +#else + if (S_ISLNK(mode)) + return (0); + return (utimes(name, times)); +#endif +} +#elif defined(HAVE_UTIME) +/* + * utime() is an older, more standard interface that we'll use + * if utimes() isn't available. + */ +static int +set_time(int fd, int mode, const char *name, + time_t atime, long atime_nsec, + time_t mtime, long mtime_nsec) +{ + struct utimbuf times; + (void)fd; /* UNUSED */ + (void)name; /* UNUSED */ + (void)atime_nsec; /* UNUSED */ + (void)mtime_nsec; /* UNUSED */ + times.actime = atime; + times.modtime = mtime; + if (S_ISLNK(mode)) + return (ARCHIVE_OK); + return (utime(name, ×)); +} +#else +static int +set_time(int fd, int mode, const char *name, + time_t atime, long atime_nsec, + time_t mtime, long mtime_nsec) +{ + return (ARCHIVE_WARN); +} +#endif + +static int +set_times(struct archive_write_disk *a) +{ + time_t atime = a->start_time, mtime = a->start_time; + long atime_nsec = 0, mtime_nsec = 0; + + /* If no time was provided, we're done. */ + if (!archive_entry_atime_is_set(a->entry) +#if HAVE_STRUCT_STAT_ST_BIRTHTIME + && !archive_entry_birthtime_is_set(a->entry) +#endif + && !archive_entry_mtime_is_set(a->entry)) + return (ARCHIVE_OK); + + /* If no atime was specified, use start time instead. */ + /* In theory, it would be marginally more correct to use + * time(NULL) here, but that would cost us an extra syscall + * for little gain. */ + if (archive_entry_atime_is_set(a->entry)) { + atime = archive_entry_atime(a->entry); + atime_nsec = archive_entry_atime_nsec(a->entry); + } + + /* + * If you have struct stat.st_birthtime, we assume BSD birthtime + * semantics, in which {f,l,}utimes() updates birthtime to earliest + * mtime. So we set the time twice, first using the birthtime, + * then using the mtime. + */ +#if HAVE_STRUCT_STAT_ST_BIRTHTIME + /* If birthtime is set, flush that through to disk first. */ + if (archive_entry_birthtime_is_set(a->entry)) + if (set_time(a->fd, a->mode, a->name, atime, atime_nsec, + archive_entry_birthtime(a->entry), + archive_entry_birthtime_nsec(a->entry))) { + archive_set_error(&a->archive, errno, + "Can't update time for %s", + a->name); + return (ARCHIVE_WARN); + } +#endif + + if (archive_entry_mtime_is_set(a->entry)) { + mtime = archive_entry_mtime(a->entry); + mtime_nsec = archive_entry_mtime_nsec(a->entry); + } + if (set_time(a->fd, a->mode, a->name, + atime, atime_nsec, mtime, mtime_nsec)) { + archive_set_error(&a->archive, errno, + "Can't update time for %s", + a->name); + return (ARCHIVE_WARN); + } + + /* + * Note: POSIX does not provide a portable way to restore ctime. + * (Apart from resetting the system clock, which is distasteful.) + * So, any restoration of ctime will necessarily be OS-specific. + */ + + return (ARCHIVE_OK); +} + +static int +set_mode(struct archive_write_disk *a, int mode) +{ + int r = ARCHIVE_OK; + mode &= 07777; /* Strip off file type bits. */ + + if (a->todo & TODO_SGID_CHECK) { + /* + * If we don't know the GID is right, we must stat() + * to verify it. We can't just check the GID of this + * process, since systems sometimes set GID from + * the enclosing dir or based on ACLs. + */ + if ((r = _archive_write_disk_lazy_stat(a)) != ARCHIVE_OK) + return (r); + if (a->pst->st_gid != a->gid) { + mode &= ~ S_ISGID; +#if !defined(_WIN32) || defined(__CYGWIN__) + if (a->flags & ARCHIVE_EXTRACT_OWNER) { + /* + * This is only an error if you + * requested owner restore. If you + * didn't, we'll try to restore + * sgid/suid, but won't consider it a + * problem if we can't. + */ + archive_set_error(&a->archive, -1, + "Can't restore SGID bit"); + r = ARCHIVE_WARN; + } +#endif + } + /* While we're here, double-check the UID. */ + if (a->pst->st_uid != a->uid + && (a->todo & TODO_SUID)) { + mode &= ~ S_ISUID; +#if !defined(_WIN32) || defined(__CYGWIN__) + if (a->flags & ARCHIVE_EXTRACT_OWNER) { + archive_set_error(&a->archive, -1, + "Can't restore SUID bit"); + r = ARCHIVE_WARN; + } +#endif + } + a->todo &= ~TODO_SGID_CHECK; + a->todo &= ~TODO_SUID_CHECK; + } else if (a->todo & TODO_SUID_CHECK) { + /* + * If we don't know the UID is right, we can just check + * the user, since all systems set the file UID from + * the process UID. + */ + if (a->user_uid != a->uid) { + mode &= ~ S_ISUID; +#if !defined(_WIN32) || defined(__CYGWIN__) + if (a->flags & ARCHIVE_EXTRACT_OWNER) { + archive_set_error(&a->archive, -1, + "Can't make file SUID"); + r = ARCHIVE_WARN; + } +#endif + } + a->todo &= ~TODO_SUID_CHECK; + } + + if (S_ISLNK(a->mode)) { +#ifdef HAVE_LCHMOD + /* + * If this is a symlink, use lchmod(). If the + * platform doesn't support lchmod(), just skip it. A + * platform that doesn't provide a way to set + * permissions on symlinks probably ignores + * permissions on symlinks, so a failure here has no + * impact. + */ + if (lchmod(a->name, mode) != 0) { + archive_set_error(&a->archive, errno, + "Can't set permissions to 0%o", (int)mode); + r = ARCHIVE_WARN; + } +#endif + } else if (!S_ISDIR(a->mode)) { + /* + * If it's not a symlink and not a dir, then use + * fchmod() or chmod(), depending on whether we have + * an fd. Dirs get their perms set during the + * post-extract fixup, which is handled elsewhere. + */ +#ifdef HAVE_FCHMOD + if (a->fd >= 0) { + if (fchmod(a->fd, mode) != 0) { + archive_set_error(&a->archive, errno, + "Can't set permissions to 0%o", (int)mode); + r = ARCHIVE_WARN; + } + } else +#endif + /* If this platform lacks fchmod(), then + * we'll just use chmod(). */ + if (chmod(a->name, mode) != 0) { + archive_set_error(&a->archive, errno, + "Can't set permissions to 0%o", (int)mode); + r = ARCHIVE_WARN; + } + } + return (r); +} + +static int +set_fflags(struct archive_write_disk *a) +{ + struct fixup_entry *le; + unsigned long set, clear; + int r; + int critical_flags; + mode_t mode = archive_entry_mode(a->entry); + + /* + * Make 'critical_flags' hold all file flags that can't be + * immediately restored. For example, on BSD systems, + * SF_IMMUTABLE prevents hardlinks from being created, so + * should not be set until after any hardlinks are created. To + * preserve some semblance of portability, this uses #ifdef + * extensively. Ugly, but it works. + * + * Yes, Virginia, this does create a security race. It's mitigated + * somewhat by the practice of creating dirs 0700 until the extract + * is done, but it would be nice if we could do more than that. + * People restoring critical file systems should be wary of + * other programs that might try to muck with files as they're + * being restored. + */ + /* Hopefully, the compiler will optimize this mess into a constant. */ + critical_flags = 0; +#ifdef SF_IMMUTABLE + critical_flags |= SF_IMMUTABLE; +#endif +#ifdef UF_IMMUTABLE + critical_flags |= UF_IMMUTABLE; +#endif +#ifdef SF_APPEND + critical_flags |= SF_APPEND; +#endif +#ifdef UF_APPEND + critical_flags |= UF_APPEND; +#endif +#ifdef EXT2_APPEND_FL + critical_flags |= EXT2_APPEND_FL; +#endif +#ifdef EXT2_IMMUTABLE_FL + critical_flags |= EXT2_IMMUTABLE_FL; +#endif + + if (a->todo & TODO_FFLAGS) { + archive_entry_fflags(a->entry, &set, &clear); + + /* + * The first test encourages the compiler to eliminate + * all of this if it's not necessary. + */ + if ((critical_flags != 0) && (set & critical_flags)) { + le = current_fixup(a, a->name); + le->fixup |= TODO_FFLAGS; + le->fflags_set = set; + /* Store the mode if it's not already there. */ + if ((le->fixup & TODO_MODE) == 0) + le->mode = mode; + } else { + r = set_fflags_platform(a, a->fd, + a->name, mode, set, clear); + if (r != ARCHIVE_OK) + return (r); + } + } + return (ARCHIVE_OK); +} + + +#if ( defined(HAVE_LCHFLAGS) || defined(HAVE_CHFLAGS) || defined(HAVE_FCHFLAGS) ) && defined(HAVE_STRUCT_STAT_ST_FLAGS) +/* + * BSD reads flags using stat() and sets them with one of {f,l,}chflags() + */ +static int +set_fflags_platform(struct archive_write_disk *a, int fd, const char *name, + mode_t mode, unsigned long set, unsigned long clear) +{ + int r; + + (void)mode; /* UNUSED */ + if (set == 0 && clear == 0) + return (ARCHIVE_OK); + + /* + * XXX Is the stat here really necessary? Or can I just use + * the 'set' flags directly? In particular, I'm not sure + * about the correct approach if we're overwriting an existing + * file that already has flags on it. XXX + */ + if ((r = _archive_write_disk_lazy_stat(a)) != ARCHIVE_OK) + return (r); + + a->st.st_flags &= ~clear; + a->st.st_flags |= set; +#ifdef HAVE_FCHFLAGS + /* If platform has fchflags() and we were given an fd, use it. */ + if (fd >= 0 && fchflags(fd, a->st.st_flags) == 0) + return (ARCHIVE_OK); +#endif + /* + * If we can't use the fd to set the flags, we'll use the + * pathname to set flags. We prefer lchflags() but will use + * chflags() if we must. + */ +#ifdef HAVE_LCHFLAGS + if (lchflags(name, a->st.st_flags) == 0) + return (ARCHIVE_OK); +#elif defined(HAVE_CHFLAGS) + if (S_ISLNK(a->st.st_mode)) { + archive_set_error(&a->archive, errno, + "Can't set file flags on symlink."); + return (ARCHIVE_WARN); + } + if (chflags(name, a->st.st_flags) == 0) + return (ARCHIVE_OK); +#endif + archive_set_error(&a->archive, errno, + "Failed to set file flags"); + return (ARCHIVE_WARN); +} + +#elif defined(EXT2_IOC_GETFLAGS) && defined(EXT2_IOC_SETFLAGS) +/* + * Linux uses ioctl() to read and write file flags. + */ +static int +set_fflags_platform(struct archive_write_disk *a, int fd, const char *name, + mode_t mode, unsigned long set, unsigned long clear) +{ + int ret; + int myfd = fd; + unsigned long newflags, oldflags; + unsigned long sf_mask = 0; + + if (set == 0 && clear == 0) + return (ARCHIVE_OK); + /* Only regular files and dirs can have flags. */ + if (!S_ISREG(mode) && !S_ISDIR(mode)) + return (ARCHIVE_OK); + + /* If we weren't given an fd, open it ourselves. */ + if (myfd < 0) + myfd = open(name, O_RDONLY | O_NONBLOCK | O_BINARY); + if (myfd < 0) + return (ARCHIVE_OK); + + /* + * Linux has no define for the flags that are only settable by + * the root user. This code may seem a little complex, but + * there seem to be some Linux systems that lack these + * defines. (?) The code below degrades reasonably gracefully + * if sf_mask is incomplete. + */ +#ifdef EXT2_IMMUTABLE_FL + sf_mask |= EXT2_IMMUTABLE_FL; +#endif +#ifdef EXT2_APPEND_FL + sf_mask |= EXT2_APPEND_FL; +#endif + /* + * XXX As above, this would be way simpler if we didn't have + * to read the current flags from disk. XXX + */ + ret = ARCHIVE_OK; + /* Try setting the flags as given. */ + if (ioctl(myfd, EXT2_IOC_GETFLAGS, &oldflags) >= 0) { + newflags = (oldflags & ~clear) | set; + if (ioctl(myfd, EXT2_IOC_SETFLAGS, &newflags) >= 0) + goto cleanup; + if (errno != EPERM) + goto fail; + } + /* If we couldn't set all the flags, try again with a subset. */ + if (ioctl(myfd, EXT2_IOC_GETFLAGS, &oldflags) >= 0) { + newflags &= ~sf_mask; + oldflags &= sf_mask; + newflags |= oldflags; + if (ioctl(myfd, EXT2_IOC_SETFLAGS, &newflags) >= 0) + goto cleanup; + } + /* We couldn't set the flags, so report the failure. */ +fail: + archive_set_error(&a->archive, errno, + "Failed to set file flags"); + ret = ARCHIVE_WARN; +cleanup: + if (fd < 0) + close(myfd); + return (ret); +} + +#else + +/* + * Of course, some systems have neither BSD chflags() nor Linux' flags + * support through ioctl(). + */ +static int +set_fflags_platform(struct archive_write_disk *a, int fd, const char *name, + mode_t mode, unsigned long set, unsigned long clear) +{ + (void)a; /* UNUSED */ + (void)fd; /* UNUSED */ + (void)name; /* UNUSED */ + (void)mode; /* UNUSED */ + (void)set; /* UNUSED */ + (void)clear; /* UNUSED */ + return (ARCHIVE_OK); +} + +#endif /* __linux */ + +#ifndef HAVE_POSIX_ACL +/* Default empty function body to satisfy mainline code. */ +static int +set_acls(struct archive_write_disk *a) +{ + (void)a; /* UNUSED */ + return (ARCHIVE_OK); +} + +#else + +/* + * XXX TODO: What about ACL types other than ACCESS and DEFAULT? + */ +static int +set_acls(struct archive_write_disk *a) +{ + int ret; + + ret = set_acl(a, a->fd, a->entry, ACL_TYPE_ACCESS, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, "access"); + if (ret != ARCHIVE_OK) + return (ret); + ret = set_acl(a, a->fd, a->entry, ACL_TYPE_DEFAULT, + ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, "default"); + return (ret); +} + + +static int +set_acl(struct archive_write_disk *a, int fd, struct archive_entry *entry, + acl_type_t acl_type, int ae_requested_type, const char *tname) +{ + acl_t acl; + acl_entry_t acl_entry; + acl_permset_t acl_permset; + int ret; + int ae_type, ae_permset, ae_tag, ae_id; + uid_t ae_uid; + gid_t ae_gid; + const char *ae_name; + int entries; + const char *name; + + ret = ARCHIVE_OK; + entries = archive_entry_acl_reset(entry, ae_requested_type); + if (entries == 0) + return (ARCHIVE_OK); + acl = acl_init(entries); + while (archive_entry_acl_next(entry, ae_requested_type, &ae_type, + &ae_permset, &ae_tag, &ae_id, &ae_name) == ARCHIVE_OK) { + acl_create_entry(&acl, &acl_entry); + + switch (ae_tag) { + case ARCHIVE_ENTRY_ACL_USER: + acl_set_tag_type(acl_entry, ACL_USER); + ae_uid = a->lookup_uid(a->lookup_uid_data, + ae_name, ae_id); + acl_set_qualifier(acl_entry, &ae_uid); + break; + case ARCHIVE_ENTRY_ACL_GROUP: + acl_set_tag_type(acl_entry, ACL_GROUP); + ae_gid = a->lookup_gid(a->lookup_gid_data, + ae_name, ae_id); + acl_set_qualifier(acl_entry, &ae_gid); + break; + case ARCHIVE_ENTRY_ACL_USER_OBJ: + acl_set_tag_type(acl_entry, ACL_USER_OBJ); + break; + case ARCHIVE_ENTRY_ACL_GROUP_OBJ: + acl_set_tag_type(acl_entry, ACL_GROUP_OBJ); + break; + case ARCHIVE_ENTRY_ACL_MASK: + acl_set_tag_type(acl_entry, ACL_MASK); + break; + case ARCHIVE_ENTRY_ACL_OTHER: + acl_set_tag_type(acl_entry, ACL_OTHER); + break; + default: + /* XXX */ + break; + } + + acl_get_permset(acl_entry, &acl_permset); + acl_clear_perms(acl_permset); + if (ae_permset & ARCHIVE_ENTRY_ACL_EXECUTE) + acl_add_perm(acl_permset, ACL_EXECUTE); + if (ae_permset & ARCHIVE_ENTRY_ACL_WRITE) + acl_add_perm(acl_permset, ACL_WRITE); + if (ae_permset & ARCHIVE_ENTRY_ACL_READ) + acl_add_perm(acl_permset, ACL_READ); + } + + name = archive_entry_pathname(entry); + + /* Try restoring the ACL through 'fd' if we can. */ +#if HAVE_ACL_SET_FD + if (fd >= 0 && acl_type == ACL_TYPE_ACCESS && acl_set_fd(fd, acl) == 0) + ret = ARCHIVE_OK; + else +#else +#if HAVE_ACL_SET_FD_NP + if (fd >= 0 && acl_set_fd_np(fd, acl, acl_type) == 0) + ret = ARCHIVE_OK; + else +#endif +#endif + if (acl_set_file(name, acl_type, acl) != 0) { + archive_set_error(&a->archive, errno, "Failed to set %s acl", tname); + ret = ARCHIVE_WARN; + } + acl_free(acl); + return (ret); +} +#endif + +#if HAVE_LSETXATTR +/* + * Restore extended attributes - Linux implementation + */ +static int +set_xattrs(struct archive_write_disk *a) +{ + struct archive_entry *entry = a->entry; + static int warning_done = 0; + int ret = ARCHIVE_OK; + int i = archive_entry_xattr_reset(entry); + + while (i--) { + const char *name; + const void *value; + size_t size; + archive_entry_xattr_next(entry, &name, &value, &size); + if (name != NULL && + strncmp(name, "xfsroot.", 8) != 0 && + strncmp(name, "system.", 7) != 0) { + int e; +#if HAVE_FSETXATTR + if (a->fd >= 0) + e = fsetxattr(a->fd, name, value, size, 0); + else +#endif + { + e = lsetxattr(archive_entry_pathname(entry), + name, value, size, 0); + } + if (e == -1) { + if (errno == ENOTSUP) { + if (!warning_done) { + warning_done = 1; + archive_set_error(&a->archive, errno, + "Cannot restore extended " + "attributes on this file " + "system"); + } + } else + archive_set_error(&a->archive, errno, + "Failed to set extended attribute"); + ret = ARCHIVE_WARN; + } + } else { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Invalid extended attribute encountered"); + ret = ARCHIVE_WARN; + } + } + return (ret); +} +#elif HAVE_EXTATTR_SET_FILE +/* + * Restore extended attributes - FreeBSD implementation + */ +static int +set_xattrs(struct archive_write_disk *a) +{ + struct archive_entry *entry = a->entry; + static int warning_done = 0; + int ret = ARCHIVE_OK; + int i = archive_entry_xattr_reset(entry); + + while (i--) { + const char *name; + const void *value; + size_t size; + archive_entry_xattr_next(entry, &name, &value, &size); + if (name != NULL) { + int e; + int namespace; + + if (strncmp(name, "user.", 5) == 0) { + /* "user." attributes go to user namespace */ + name += 5; + namespace = EXTATTR_NAMESPACE_USER; + } else { + /* Warn about other extended attributes. */ + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "Can't restore extended attribute ``%s''", + name); + ret = ARCHIVE_WARN; + continue; + } + errno = 0; +#if HAVE_EXTATTR_SET_FD + if (a->fd >= 0) + e = extattr_set_fd(a->fd, namespace, name, value, size); + else +#endif + /* TODO: should we use extattr_set_link() instead? */ + { + e = extattr_set_file(archive_entry_pathname(entry), + namespace, name, value, size); + } + if (e != (int)size) { + if (errno == ENOTSUP) { + if (!warning_done) { + warning_done = 1; + archive_set_error(&a->archive, errno, + "Cannot restore extended " + "attributes on this file " + "system"); + } + } else { + archive_set_error(&a->archive, errno, + "Failed to set extended attribute"); + } + + ret = ARCHIVE_WARN; + } + } + } + return (ret); +} +#else +/* + * Restore extended attributes - stub implementation for unsupported systems + */ +static int +set_xattrs(struct archive_write_disk *a) +{ + static int warning_done = 0; + + /* If there aren't any extended attributes, then it's okay not + * to extract them, otherwise, issue a single warning. */ + if (archive_entry_xattr_count(a->entry) != 0 && !warning_done) { + warning_done = 1; + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Cannot restore extended attributes on this system"); + return (ARCHIVE_WARN); + } + /* Warning was already emitted; suppress further warnings. */ + return (ARCHIVE_OK); +} +#endif + + +/* + * Trivial implementations of gid/uid lookup functions. + * These are normally overridden by the client, but these stub + * versions ensure that we always have something that works. + */ +static gid_t +trivial_lookup_gid(void *private_data, const char *gname, gid_t gid) +{ + (void)private_data; /* UNUSED */ + (void)gname; /* UNUSED */ + return (gid); +} + +static uid_t +trivial_lookup_uid(void *private_data, const char *uname, uid_t uid) +{ + (void)private_data; /* UNUSED */ + (void)uname; /* UNUSED */ + return (uid); +} + +/* + * Test if file on disk is older than entry. + */ +static int +older(struct stat *st, struct archive_entry *entry) +{ + /* First, test the seconds and return if we have a definite answer. */ + /* Definitely older. */ + if (st->st_mtime < archive_entry_mtime(entry)) + return (1); + /* Definitely younger. */ + if (st->st_mtime > archive_entry_mtime(entry)) + return (0); + /* If this platform supports fractional seconds, try those. */ +#if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC + /* Definitely older. */ + if (st->st_mtimespec.tv_nsec < archive_entry_mtime_nsec(entry)) + return (1); +#elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC + /* Definitely older. */ + if (st->st_mtim.tv_nsec < archive_entry_mtime_nsec(entry)) + return (1); +#elif HAVE_STRUCT_STAT_ST_MTIME_N + /* older. */ + if (st->st_mtime_n < archive_entry_mtime_nsec(entry)) + return (1); +#elif HAVE_STRUCT_STAT_ST_UMTIME + /* older. */ + if (st->st_umtime * 1000 < archive_entry_mtime_nsec(entry)) + return (1); +#elif HAVE_STRUCT_STAT_ST_MTIME_USEC + /* older. */ + if (st->st_mtime_usec * 1000 < archive_entry_mtime_nsec(entry)) + return (1); +#else + /* This system doesn't have high-res timestamps. */ +#endif + /* Same age or newer, so not older. */ + return (0); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_disk_private.h b/Utilities/cmlibarchive/libarchive/archive_write_disk_private.h new file mode 100644 index 000000000..3722c19b4 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_disk_private.h @@ -0,0 +1,38 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive_write_disk_private.h,v 1.1 2007/03/03 07:37:36 kientzle Exp $ + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef ARCHIVE_WRITE_DISK_PRIVATE_H_INCLUDED +#define ARCHIVE_WRITE_DISK_PRIVATE_H_INCLUDED + +struct archive_write_disk; + +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_write_disk_set_standard_lookup.c b/Utilities/cmlibarchive/libarchive/archive_write_disk_set_standard_lookup.c new file mode 100644 index 000000000..61124e8dc --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_disk_set_standard_lookup.c @@ -0,0 +1,240 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_disk_set_standard_lookup.c,v 1.4 2007/05/29 01:00:19 kientzle Exp $"); + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_read_private.h" +#include "archive_write_disk_private.h" + +struct bucket { + char *name; + int hash; + id_t id; +}; + +static const size_t cache_size = 127; +static unsigned int hash(const char *); +static gid_t lookup_gid(void *, const char *uname, gid_t); +static uid_t lookup_uid(void *, const char *uname, uid_t); +static void cleanup(void *); + +/* + * Installs functions that use getpwnam()/getgrnam()---along with + * a simple cache to accelerate such lookups---into the archive_write_disk + * object. This is in a separate file because getpwnam()/getgrnam() + * can pull in a LOT of library code (including NIS/LDAP functions, which + * pull in DNS resolveers, etc). This can easily top 500kB, which makes + * it inappropriate for some space-constrained applications. + * + * Applications that are size-sensitive may want to just use the + * real default functions (defined in archive_write_disk.c) that just + * use the uid/gid without the lookup. Or define your own custom functions + * if you prefer. + * + * TODO: Replace these hash tables with simpler move-to-front LRU + * lists with a bounded size (128 items?). The hash is a bit faster, + * but has a bad pathology in which it thrashes a single bucket. Even + * walking a list of 128 items is a lot faster than calling + * getpwnam()! + */ +int +archive_write_disk_set_standard_lookup(struct archive *a) +{ + struct bucket *ucache = malloc(cache_size * sizeof(struct bucket)); + struct bucket *gcache = malloc(cache_size * sizeof(struct bucket)); + memset(ucache, 0, cache_size * sizeof(struct bucket)); + memset(gcache, 0, cache_size * sizeof(struct bucket)); + archive_write_disk_set_group_lookup(a, gcache, lookup_gid, cleanup); + archive_write_disk_set_user_lookup(a, ucache, lookup_uid, cleanup); + return (ARCHIVE_OK); +} + +static gid_t +lookup_gid(void *private_data, const char *gname, gid_t gid) +{ + int h; + struct bucket *b; + struct bucket *gcache = (struct bucket *)private_data; + + /* If no gname, just use the gid provided. */ + if (gname == NULL || *gname == '\0') + return (gid); + + /* Try to find gname in the cache. */ + h = hash(gname); + b = &gcache[h % cache_size ]; + if (b->name != NULL && b->hash == h && strcmp(gname, b->name) == 0) + return ((gid_t)b->id); + + /* Free the cache slot for a new entry. */ + if (b->name != NULL) + free(b->name); + b->name = strdup(gname); + /* Note: If strdup fails, that's okay; we just won't cache. */ + b->hash = h; +#if HAVE_GRP_H + { + char _buffer[128]; + size_t bufsize = 128; + char *buffer = _buffer; + struct group grent, *result; + int r; + + for (;;) { + r = getgrnam_r(gname, &grent, buffer, bufsize, &result); + if (r == 0) + break; + if (r != ERANGE) + break; + bufsize *= 2; + if (buffer != _buffer) + free(buffer); + buffer = malloc(bufsize); + if (buffer == NULL) + break; + } + if (result != NULL) + gid = result->gr_gid; + if (buffer != _buffer) + free(buffer); + } +#elif defined(_WIN32) && !defined(__CYGWIN__) + /* TODO: do a gname->gid lookup for Windows. */ +#else + #error No way to perform gid lookups on this platform +#endif + b->id = gid; + + return (gid); +} + +static uid_t +lookup_uid(void *private_data, const char *uname, uid_t uid) +{ + int h; + struct bucket *b; + struct bucket *ucache = (struct bucket *)private_data; + + /* If no uname, just use the uid provided. */ + if (uname == NULL || *uname == '\0') + return (uid); + + /* Try to find uname in the cache. */ + h = hash(uname); + b = &ucache[h % cache_size ]; + if (b->name != NULL && b->hash == h && strcmp(uname, b->name) == 0) + return ((uid_t)b->id); + + /* Free the cache slot for a new entry. */ + if (b->name != NULL) + free(b->name); + b->name = strdup(uname); + /* Note: If strdup fails, that's okay; we just won't cache. */ + b->hash = h; +#if HAVE_PWD_H + { + char _buffer[128]; + size_t bufsize = 128; + char *buffer = _buffer; + struct passwd pwent, *result; + int r; + + for (;;) { + r = getpwnam_r(uname, &pwent, buffer, bufsize, &result); + if (r == 0) + break; + if (r != ERANGE) + break; + bufsize *= 2; + if (buffer != _buffer) + free(buffer); + buffer = malloc(bufsize); + if (buffer == NULL) + break; + } + if (result != NULL) + uid = result->pw_uid; + if (buffer != _buffer) + free(buffer); + } +#elif defined(_WIN32) && !defined(__CYGWIN__) + /* TODO: do a uname->uid lookup for Windows. */ +#else + #error No way to look up uids on this platform +#endif + b->id = uid; + + return (uid); +} + +static void +cleanup(void *private) +{ + size_t i; + struct bucket *cache = (struct bucket *)private; + + for (i = 0; i < cache_size; i++) + free(cache[i].name); + free(cache); +} + + +static unsigned int +hash(const char *p) +{ + /* A 32-bit version of Peter Weinberger's (PJW) hash algorithm, + as used by ELF for hashing function names. */ + unsigned g, h = 0; + while (*p != '\0') { + h = ( h << 4 ) + *p++; + if (( g = h & 0xF0000000 )) { + h ^= g >> 24; + h &= 0x0FFFFFFF; + } + } + return h; +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_open_fd.c b/Utilities/cmlibarchive/libarchive/archive_write_open_fd.c new file mode 100644 index 000000000..5e117d473 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_open_fd.c @@ -0,0 +1,143 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_fd.c,v 1.9 2007/01/09 08:05:56 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" + +struct write_fd_data { + off_t offset; + int fd; +}; + +static int file_close(struct archive *, void *); +static int file_open(struct archive *, void *); +static ssize_t file_write(struct archive *, void *, const void *buff, size_t); + +int +archive_write_open_fd(struct archive *a, int fd) +{ + struct write_fd_data *mine; + + mine = (struct write_fd_data *)malloc(sizeof(*mine)); + if (mine == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); + } + mine->fd = fd; +#if defined(__CYGWIN__) + setmode(mine->fd, O_BINARY); +#elif defined(_WIN32) + _setmode(mine->fd, _O_BINARY); +#endif + return (archive_write_open(a, mine, + file_open, file_write, file_close)); +} + +static int +file_open(struct archive *a, void *client_data) +{ + struct write_fd_data *mine; + struct stat st; + + mine = (struct write_fd_data *)client_data; + + if (fstat(mine->fd, &st) != 0) { + archive_set_error(a, errno, "Couldn't stat fd %d", mine->fd); + return (ARCHIVE_FATAL); + } + + /* + * If this is a regular file, don't add it to itself. + */ + if (S_ISREG(st.st_mode)) + archive_write_set_skip_file(a, st.st_dev, st.st_ino); + + /* + * If client hasn't explicitly set the last block handling, + * then set it here. + */ + if (archive_write_get_bytes_in_last_block(a) < 0) { + /* If the output is a block or character device, fifo, + * or stdout, pad the last block, otherwise leave it + * unpadded. */ + if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode) || + S_ISFIFO(st.st_mode) || (mine->fd == 1)) + /* Last block will be fully padded. */ + archive_write_set_bytes_in_last_block(a, 0); + else + archive_write_set_bytes_in_last_block(a, 1); + } + + return (ARCHIVE_OK); +} + +static ssize_t +file_write(struct archive *a, void *client_data, const void *buff, size_t length) +{ + struct write_fd_data *mine; + ssize_t bytesWritten; + + mine = (struct write_fd_data *)client_data; + bytesWritten = write(mine->fd, buff, length); + if (bytesWritten <= 0) { + archive_set_error(a, errno, "Write error"); + return (-1); + } + return (bytesWritten); +} + +static int +file_close(struct archive *a, void *client_data) +{ + struct write_fd_data *mine = (struct write_fd_data *)client_data; + + (void)a; /* UNUSED */ + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_open_file.c b/Utilities/cmlibarchive/libarchive/archive_write_open_file.c new file mode 100644 index 000000000..dcd515f65 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_open_file.c @@ -0,0 +1,105 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" + +struct write_FILE_data { + FILE *f; +}; + +static int file_close(struct archive *, void *); +static int file_open(struct archive *, void *); +static ssize_t file_write(struct archive *, void *, const void *buff, size_t); + +int +archive_write_open_FILE(struct archive *a, FILE *f) +{ + struct write_FILE_data *mine; + + mine = (struct write_FILE_data *)malloc(sizeof(*mine)); + if (mine == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); + } + mine->f = f; + return (archive_write_open(a, mine, + file_open, file_write, file_close)); +} + +static int +file_open(struct archive *a, void *client_data) +{ + (void)a; /* UNUSED */ + (void)client_data; /* UNUSED */ + + return (ARCHIVE_OK); +} + +static ssize_t +file_write(struct archive *a, void *client_data, const void *buff, size_t length) +{ + struct write_FILE_data *mine; + size_t bytesWritten; + + mine = client_data; + bytesWritten = fwrite(buff, 1, length, mine->f); + if (bytesWritten < length) { + archive_set_error(a, errno, "Write error"); + return (-1); + } + return (bytesWritten); +} + +static int +file_close(struct archive *a, void *client_data) +{ + struct write_FILE_data *mine = client_data; + + (void)a; /* UNUSED */ + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_open_filename.c b/Utilities/cmlibarchive/libarchive/archive_write_open_filename.c new file mode 100644 index 000000000..3c577fae5 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_open_filename.c @@ -0,0 +1,162 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_filename.c,v 1.20 2008/02/19 05:46:58 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "archive.h" + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +struct write_file_data { + int fd; + char filename[1]; +}; + +static int file_close(struct archive *, void *); +static int file_open(struct archive *, void *); +static ssize_t file_write(struct archive *, void *, const void *buff, size_t); + +int +archive_write_open_file(struct archive *a, const char *filename) +{ + return (archive_write_open_filename(a, filename)); +} + +int +archive_write_open_filename(struct archive *a, const char *filename) +{ + struct write_file_data *mine; + + if (filename == NULL || filename[0] == '\0') + return (archive_write_open_fd(a, 1)); + + mine = (struct write_file_data *)malloc(sizeof(*mine) + strlen(filename)); + if (mine == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); + } + strcpy(mine->filename, filename); + mine->fd = -1; + return (archive_write_open(a, mine, + file_open, file_write, file_close)); +} + +static int +file_open(struct archive *a, void *client_data) +{ + int flags; + struct write_file_data *mine; + struct stat st; + + mine = (struct write_file_data *)client_data; + flags = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY; + + /* + * Open the file. + */ + mine->fd = open(mine->filename, flags, 0666); + if (mine->fd < 0) { + archive_set_error(a, errno, "Failed to open '%s'", + mine->filename); + return (ARCHIVE_FATAL); + } + + if (fstat(mine->fd, &st) != 0) { + archive_set_error(a, errno, "Couldn't stat '%s'", + mine->filename); + return (ARCHIVE_FATAL); + } + + /* + * Set up default last block handling. + */ + if (archive_write_get_bytes_in_last_block(a) < 0) { + if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode) || + S_ISFIFO(st.st_mode)) + /* Pad last block when writing to device or FIFO. */ + archive_write_set_bytes_in_last_block(a, 0); + else + /* Don't pad last block otherwise. */ + archive_write_set_bytes_in_last_block(a, 1); + } + + /* + * If the output file is a regular file, don't add it to + * itself. If it's a device file, it's okay to add the device + * entry to the output archive. + */ + if (S_ISREG(st.st_mode)) + archive_write_set_skip_file(a, st.st_dev, st.st_ino); + + return (ARCHIVE_OK); +} + +static ssize_t +file_write(struct archive *a, void *client_data, const void *buff, size_t length) +{ + struct write_file_data *mine; + ssize_t bytesWritten; + + mine = (struct write_file_data *)client_data; + bytesWritten = write(mine->fd, buff, length); + if (bytesWritten <= 0) { + archive_set_error(a, errno, "Write error"); + return (-1); + } + return (bytesWritten); +} + +static int +file_close(struct archive *a, void *client_data) +{ + struct write_file_data *mine = (struct write_file_data *)client_data; + + (void)a; /* UNUSED */ + close(mine->fd); + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_open_memory.c b/Utilities/cmlibarchive/libarchive/archive_write_open_memory.c new file mode 100644 index 000000000..f04bd9aab --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_open_memory.c @@ -0,0 +1,126 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#include + +#include "archive.h" + +/* + * This is a little tricky. I used to allow the + * compression handling layer to fork the compressor, + * which means this write function gets invoked in + * a separate process. That would, of course, make it impossible + * to actually use the data stored into memory here. + * Fortunately, none of the compressors fork today and + * I'm reluctant to use that route in the future but, if + * forking compressors ever do reappear, this will have + * to get a lot more complicated. + */ + +struct write_memory_data { + size_t used; + size_t size; + size_t * client_size; + unsigned char * buff; +}; + +static int memory_write_close(struct archive *, void *); +static int memory_write_open(struct archive *, void *); +static ssize_t memory_write(struct archive *, void *, const void *buff, size_t); + +/* + * Client provides a pointer to a block of memory to receive + * the data. The 'size' param both tells us the size of the + * client buffer and lets us tell the client the final size. + */ +int +archive_write_open_memory(struct archive *a, void *buff, size_t buffSize, size_t *used) +{ + struct write_memory_data *mine; + + mine = (struct write_memory_data *)malloc(sizeof(*mine)); + if (mine == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); + } + memset(mine, 0, sizeof(*mine)); + mine->buff = buff; + mine->size = buffSize; + mine->client_size = used; + return (archive_write_open(a, mine, + memory_write_open, memory_write, memory_write_close)); +} + +static int +memory_write_open(struct archive *a, void *client_data) +{ + struct write_memory_data *mine; + mine = client_data; + mine->used = 0; + if (mine->client_size != NULL) + *mine->client_size = mine->used; + /* Disable padding if it hasn't been set explicitly. */ + if (-1 == archive_write_get_bytes_in_last_block(a)) + archive_write_set_bytes_in_last_block(a, 1); + return (ARCHIVE_OK); +} + +/* + * Copy the data into the client buffer. + * Note that we update mine->client_size on every write. + * In particular, this means the client can follow exactly + * how much has been written into their buffer at any time. + */ +static ssize_t +memory_write(struct archive *a, void *client_data, const void *buff, size_t length) +{ + struct write_memory_data *mine; + mine = client_data; + + if (mine->used + length > mine->size) { + archive_set_error(a, ENOMEM, "Buffer exhausted"); + return (ARCHIVE_FATAL); + } + memcpy(mine->buff + mine->used, buff, length); + mine->used += length; + if (mine->client_size != NULL) + *mine->client_size = mine->used; + return (length); +} + +static int +memory_write_close(struct archive *a, void *client_data) +{ + struct write_memory_data *mine; + (void)a; /* UNUSED */ + mine = client_data; + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_private.h b/Utilities/cmlibarchive/libarchive/archive_write_private.h new file mode 100644 index 000000000..3cc93a721 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_private.h @@ -0,0 +1,122 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/archive_write_private.h,v 1.3 2008/03/15 11:04:45 kientzle Exp $ + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef ARCHIVE_WRITE_PRIVATE_H_INCLUDED +#define ARCHIVE_WRITE_PRIVATE_H_INCLUDED + +#include "archive.h" +#include "archive_string.h" +#include "archive_private.h" + +struct archive_write { + struct archive archive; + + /* Dev/ino of the archive being written. */ + dev_t skip_file_dev; + int64_t skip_file_ino; + + /* Utility: Pointer to a block of nulls. */ + const unsigned char *nulls; + size_t null_length; + + /* Callbacks to open/read/write/close archive stream. */ + archive_open_callback *client_opener; + archive_write_callback *client_writer; + archive_close_callback *client_closer; + void *client_data; + + /* + * Blocking information. Note that bytes_in_last_block is + * misleadingly named; I should find a better name. These + * control the final output from all compressors, including + * compression_none. + */ + int bytes_per_block; + int bytes_in_last_block; + + /* + * These control whether data within a gzip/bzip2 compressed + * stream gets padded or not. If pad_uncompressed is set, + * the data will be padded to a full block before being + * compressed. The pad_uncompressed_byte determines the value + * that will be used for padding. Note that these have no + * effect on compression "none." + */ + int pad_uncompressed; + int pad_uncompressed_byte; /* TODO: Support this. */ + + /* + * On write, the client just invokes an archive_write_set function + * which sets up the data here directly. + */ + struct { + void *data; + void *config; + int (*init)(struct archive_write *); + int (*options)(struct archive_write *, + const char *key, const char *value); + int (*finish)(struct archive_write *); + int (*write)(struct archive_write *, const void *, size_t); + } compressor; + + /* + * Pointers to format-specific functions for writing. They're + * initialized by archive_write_set_format_XXX() calls. + */ + void *format_data; + const char *format_name; + int (*format_init)(struct archive_write *); + int (*format_options)(struct archive_write *, + const char *key, const char *value); + int (*format_finish)(struct archive_write *); + int (*format_destroy)(struct archive_write *); + int (*format_finish_entry)(struct archive_write *); + int (*format_write_header)(struct archive_write *, + struct archive_entry *); + ssize_t (*format_write_data)(struct archive_write *, + const void *buff, size_t); +}; + +/* + * Utility function to format a USTAR header into a buffer. If + * "strict" is set, this tries to create the absolutely most portable + * version of a ustar header. If "strict" is set to 0, then it will + * relax certain requirements. + * + * Generally, format-specific declarations don't belong in this + * header; this is a rare example of a function that is shared by + * two very similar formats (ustar and pax). + */ +int +__archive_write_format_header_ustar(struct archive_write *, char buff[512], + struct archive_entry *, int tartype, int strict); + +#endif diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_compression_bzip2.c b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_bzip2.c new file mode 100644 index 000000000..a617dafb7 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_bzip2.c @@ -0,0 +1,409 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" + +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_compression_bzip2.c,v 1.13 2007/12/30 04:58:21 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_BZLIB_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_write_private.h" + +#ifndef HAVE_BZLIB_H +int +archive_write_set_compression_bzip2(struct archive *a) +{ + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "bzip2 compression not supported on this platform"); + return (ARCHIVE_FATAL); +} +#else +/* Don't compile this if we don't have bzlib. */ + +struct private_data { + bz_stream stream; + int64_t total_in; + char *compressed; + size_t compressed_buffer_size; +}; + +struct private_config { + int compression_level; +}; + +/* + * Yuck. bzlib.h is not const-correct, so I need this one bit + * of ugly hackery to convert a const * pointer to a non-const pointer. + */ +#define SET_NEXT_IN(st,src) \ + (st)->stream.next_in = (char *)(uintptr_t)(const void *)(src) + +static int archive_compressor_bzip2_finish(struct archive_write *); +static int archive_compressor_bzip2_init(struct archive_write *); +static int archive_compressor_bzip2_options(struct archive_write *, + const char *, const char *); +static int archive_compressor_bzip2_write(struct archive_write *, + const void *, size_t); +static int drive_compressor(struct archive_write *, struct private_data *, + int finishing); + +/* + * Allocate, initialize and return an archive object. + */ +int +archive_write_set_compression_bzip2(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct private_config *config; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_compression_bzip2"); + config = malloc(sizeof(*config)); + if (config == NULL) { + archive_set_error(&a->archive, ENOMEM, "Out of memory"); + return (ARCHIVE_FATAL); + } + a->compressor.config = config; + a->compressor.finish = archive_compressor_bzip2_finish; + config->compression_level = 9; /* default */ + a->compressor.init = &archive_compressor_bzip2_init; + a->compressor.options = &archive_compressor_bzip2_options; + a->archive.compression_code = ARCHIVE_COMPRESSION_BZIP2; + a->archive.compression_name = "bzip2"; + return (ARCHIVE_OK); +} + +/* + * Setup callback. + */ +static int +archive_compressor_bzip2_init(struct archive_write *a) +{ + int ret; + struct private_data *state; + struct private_config *config; + + config = (struct private_config *)a->compressor.config; + if (a->client_opener != NULL) { + ret = (a->client_opener)(&a->archive, a->client_data); + if (ret != 0) + return (ret); + } + + state = (struct private_data *)malloc(sizeof(*state)); + if (state == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression"); + return (ARCHIVE_FATAL); + } + memset(state, 0, sizeof(*state)); + + state->compressed_buffer_size = a->bytes_per_block; + state->compressed = (char *)malloc(state->compressed_buffer_size); + + if (state->compressed == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression buffer"); + free(state); + return (ARCHIVE_FATAL); + } + + state->stream.next_out = state->compressed; + state->stream.avail_out = state->compressed_buffer_size; + a->compressor.write = archive_compressor_bzip2_write; + + /* Initialize compression library */ + ret = BZ2_bzCompressInit(&(state->stream), + config->compression_level, 0, 30); + if (ret == BZ_OK) { + a->compressor.data = state; + return (ARCHIVE_OK); + } + + /* Library setup failed: clean up. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library"); + free(state->compressed); + free(state); + + /* Override the error message if we know what really went wrong. */ + switch (ret) { + case BZ_PARAM_ERROR: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library: " + "invalid setup parameter"); + break; + case BZ_MEM_ERROR: + archive_set_error(&a->archive, ENOMEM, + "Internal error initializing compression library: " + "out of memory"); + break; + case BZ_CONFIG_ERROR: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library: " + "mis-compiled library"); + break; + } + + return (ARCHIVE_FATAL); + +} + +/* + * Set write options. + */ +static int +archive_compressor_bzip2_options(struct archive_write *a, const char *key, + const char *value) +{ + struct private_config *config; + + config = (struct private_config *)a->compressor.config; + if (strcmp(key, "compression-level") == 0) { + if (value == NULL || !(value[0] >= '0' && value[0] <= '9') || + value[1] != '\0') + return (ARCHIVE_WARN); + config->compression_level = value[0] - '0'; + /* Make '0' be a synonym for '1'. */ + /* This way, bzip2 compressor supports the same 0..9 + * range of levels as gzip. */ + if (config->compression_level < 1) + config->compression_level = 1; + return (ARCHIVE_OK); + } + + return (ARCHIVE_WARN); +} + +/* + * Write data to the compressed stream. + * + * Returns ARCHIVE_OK if all data written, error otherwise. + */ +static int +archive_compressor_bzip2_write(struct archive_write *a, const void *buff, + size_t length) +{ + struct private_data *state; + + state = (struct private_data *)a->compressor.data; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + return (ARCHIVE_FATAL); + } + + /* Update statistics */ + state->total_in += length; + + /* Compress input data to output buffer */ + SET_NEXT_IN(state, buff); + state->stream.avail_in = length; + if (drive_compressor(a, state, 0)) + return (ARCHIVE_FATAL); + a->archive.file_position += length; + return (ARCHIVE_OK); +} + + +/* + * Finish the compression. + */ +static int +archive_compressor_bzip2_finish(struct archive_write *a) +{ + ssize_t block_length; + int ret; + struct private_data *state; + ssize_t target_block_length; + ssize_t bytes_written; + unsigned tocopy; + + ret = ARCHIVE_OK; + state = (struct private_data *)a->compressor.data; + if (state != NULL) { + if (a->client_writer == NULL) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered?\n" + "This is probably an internal programming error."); + ret = ARCHIVE_FATAL; + goto cleanup; + } + + /* By default, always pad the uncompressed data. */ + if (a->pad_uncompressed) { + tocopy = a->bytes_per_block - + (state->total_in % a->bytes_per_block); + while (tocopy > 0 && tocopy < (unsigned)a->bytes_per_block) { + SET_NEXT_IN(state, a->nulls); + state->stream.avail_in = tocopy < a->null_length ? + tocopy : a->null_length; + state->total_in += state->stream.avail_in; + tocopy -= state->stream.avail_in; + ret = drive_compressor(a, state, 0); + if (ret != ARCHIVE_OK) + goto cleanup; + } + } + + /* Finish compression cycle. */ + if ((ret = drive_compressor(a, state, 1))) + goto cleanup; + + /* Optionally, pad the final compressed block. */ + block_length = state->stream.next_out - state->compressed; + + /* Tricky calculation to determine size of last block. */ + target_block_length = block_length; + if (a->bytes_in_last_block <= 0) + /* Default or Zero: pad to full block */ + target_block_length = a->bytes_per_block; + else + /* Round length to next multiple of bytes_in_last_block. */ + target_block_length = a->bytes_in_last_block * + ( (block_length + a->bytes_in_last_block - 1) / + a->bytes_in_last_block); + if (target_block_length > a->bytes_per_block) + target_block_length = a->bytes_per_block; + if (block_length < target_block_length) { + memset(state->stream.next_out, 0, + target_block_length - block_length); + block_length = target_block_length; + } + + /* Write the last block */ + bytes_written = (a->client_writer)(&a->archive, a->client_data, + state->compressed, block_length); + + /* TODO: Handle short write of final block. */ + if (bytes_written <= 0) + ret = ARCHIVE_FATAL; + else { + a->archive.raw_position += ret; + ret = ARCHIVE_OK; + } + + /* Cleanup: shut down compressor, release memory, etc. */ +cleanup: + switch (BZ2_bzCompressEnd(&(state->stream))) { + case BZ_OK: + break; + default: + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "Failed to clean up compressor"); + ret = ARCHIVE_FATAL; + } + + free(state->compressed); + free(state); + } + /* Free configuration data even if we were never fully initialized. */ + free(a->compressor.config); + a->compressor.config = NULL; + return (ret); +} + +/* + * Utility function to push input data through compressor, writing + * full output blocks as necessary. + * + * Note that this handles both the regular write case (finishing == + * false) and the end-of-archive case (finishing == true). + */ +static int +drive_compressor(struct archive_write *a, struct private_data *state, int finishing) +{ + ssize_t bytes_written; + int ret; + + for (;;) { + if (state->stream.avail_out == 0) { + bytes_written = (a->client_writer)(&a->archive, + a->client_data, state->compressed, + state->compressed_buffer_size); + if (bytes_written <= 0) { + /* TODO: Handle this write failure */ + return (ARCHIVE_FATAL); + } else if ((size_t)bytes_written < state->compressed_buffer_size) { + /* Short write: Move remainder to + * front and keep filling */ + memmove(state->compressed, + state->compressed + bytes_written, + state->compressed_buffer_size - bytes_written); + } + + a->archive.raw_position += bytes_written; + state->stream.next_out = state->compressed + + state->compressed_buffer_size - bytes_written; + state->stream.avail_out = bytes_written; + } + + /* If there's nothing to do, we're done. */ + if (!finishing && state->stream.avail_in == 0) + return (ARCHIVE_OK); + + ret = BZ2_bzCompress(&(state->stream), + finishing ? BZ_FINISH : BZ_RUN); + + switch (ret) { + case BZ_RUN_OK: + /* In non-finishing case, did compressor + * consume everything? */ + if (!finishing && state->stream.avail_in == 0) + return (ARCHIVE_OK); + break; + case BZ_FINISH_OK: /* Finishing: There's more work to do */ + break; + case BZ_STREAM_END: /* Finishing: all done */ + /* Only occurs in finishing case */ + return (ARCHIVE_OK); + default: + /* Any other return value indicates an error */ + archive_set_error(&a->archive, + ARCHIVE_ERRNO_PROGRAMMER, + "Bzip2 compression failed;" + " BZ2_bzCompress() returned %d", + ret); + return (ARCHIVE_FATAL); + } + } +} + +#endif /* HAVE_BZLIB_H */ diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_compression_compress.c b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_compress.c new file mode 100644 index 000000000..3cc73644f --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_compress.c @@ -0,0 +1,494 @@ +/*- + * Copyright (c) 2008 Joerg Sonnenberger + * 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. + */ + +/*- + * Copyright (c) 1985, 1986, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Diomidis Spinellis and James A. Woods, derived from original + * work by Spencer Thomas and Joseph Orost. + * + * 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. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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 "archive_platform.h" + +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_compression_compress.c,v 1.1 2008/03/14 20:35:37 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_write_private.h" + +#define HSIZE 69001 /* 95% occupancy */ +#define HSHIFT 8 /* 8 - trunc(log2(HSIZE / 65536)) */ +#define CHECK_GAP 10000 /* Ratio check interval. */ + +#define MAXCODE(bits) ((1 << (bits)) - 1) + +/* + * the next two codes should not be changed lightly, as they must not + * lie within the contiguous general code space. + */ +#define FIRST 257 /* First free entry. */ +#define CLEAR 256 /* Table clear output code. */ + +struct private_data { + off_t in_count, out_count, checkpoint; + + int code_len; /* Number of bits/code. */ + int cur_maxcode; /* Maximum code, given n_bits. */ + int max_maxcode; /* Should NEVER generate this code. */ + int hashtab [HSIZE]; + unsigned short codetab [HSIZE]; + int first_free; /* First unused entry. */ + int compress_ratio; + + int cur_code, cur_fcode; + + int bit_offset; + unsigned char bit_buf; + + unsigned char *compressed; + size_t compressed_buffer_size; + size_t compressed_offset; +}; + +static int archive_compressor_compress_finish(struct archive_write *); +static int archive_compressor_compress_init(struct archive_write *); +static int archive_compressor_compress_write(struct archive_write *, + const void *, size_t); + +/* + * Allocate, initialize and return a archive object. + */ +int +archive_write_set_compression_compress(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_compression_compress"); + a->compressor.init = &archive_compressor_compress_init; + a->archive.compression_code = ARCHIVE_COMPRESSION_COMPRESS; + a->archive.compression_name = "compress"; + return (ARCHIVE_OK); +} + +/* + * Setup callback. + */ +static int +archive_compressor_compress_init(struct archive_write *a) +{ + int ret; + struct private_data *state; + + a->archive.compression_code = ARCHIVE_COMPRESSION_COMPRESS; + a->archive.compression_name = "compress"; + + if (a->bytes_per_block < 4) { + archive_set_error(&a->archive, EINVAL, + "Can't write Compress header as single block"); + return (ARCHIVE_FATAL); + } + + if (a->client_opener != NULL) { + ret = (a->client_opener)(&a->archive, a->client_data); + if (ret != ARCHIVE_OK) + return (ret); + } + + state = (struct private_data *)malloc(sizeof(*state)); + if (state == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression"); + return (ARCHIVE_FATAL); + } + memset(state, 0, sizeof(*state)); + + state->compressed_buffer_size = a->bytes_per_block; + state->compressed = malloc(state->compressed_buffer_size); + + if (state->compressed == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression buffer"); + free(state); + return (ARCHIVE_FATAL); + } + + a->compressor.write = archive_compressor_compress_write; + a->compressor.finish = archive_compressor_compress_finish; + + state->max_maxcode = 0x10000; /* Should NEVER generate this code. */ + state->in_count = 0; /* Length of input. */ + state->bit_buf = 0; + state->bit_offset = 0; + state->out_count = 3; /* Includes 3-byte header mojo. */ + state->compress_ratio = 0; + state->checkpoint = CHECK_GAP; + state->code_len = 9; + state->cur_maxcode = MAXCODE(state->code_len); + state->first_free = FIRST; + + memset(state->hashtab, 0xff, sizeof(state->hashtab)); + + /* Prime output buffer with a gzip header. */ + state->compressed[0] = 0x1f; /* Compress */ + state->compressed[1] = 0x9d; + state->compressed[2] = 0x90; /* Block mode, 16bit max */ + state->compressed_offset = 3; + + a->compressor.data = state; + return (0); +} + +/*- + * Output the given code. + * Inputs: + * code: A n_bits-bit integer. If == -1, then EOF. This assumes + * that n_bits =< (long)wordsize - 1. + * Outputs: + * Outputs code to the file. + * Assumptions: + * Chars are 8 bits long. + * Algorithm: + * Maintain a BITS character long buffer (so that 8 codes will + * fit in it exactly). Use the VAX insv instruction to insert each + * code in turn. When the buffer fills up empty it and start over. + */ + +static unsigned char rmask[9] = + {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff}; + +static int +output_byte(struct archive_write *a, unsigned char c) +{ + struct private_data *state = a->compressor.data; + ssize_t bytes_written; + + state->compressed[state->compressed_offset++] = c; + ++state->out_count; + + if (state->compressed_buffer_size == state->compressed_offset) { + bytes_written = (a->client_writer)(&a->archive, + a->client_data, + state->compressed, state->compressed_buffer_size); + if (bytes_written <= 0) + return ARCHIVE_FATAL; + a->archive.raw_position += bytes_written; + state->compressed_offset = 0; + } + + return ARCHIVE_OK; +} + +static int +output_code(struct archive_write *a, int ocode) +{ + struct private_data *state = a->compressor.data; + int bits, ret, clear_flg, bit_offset; + + clear_flg = ocode == CLEAR; + bits = state->code_len; + + /* + * Since ocode is always >= 8 bits, only need to mask the first + * hunk on the left. + */ + bit_offset = state->bit_offset % 8; + state->bit_buf |= (ocode << bit_offset) & 0xff; + output_byte(a, state->bit_buf); + + bits = state->code_len - (8 - bit_offset); + ocode >>= 8 - bit_offset; + /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */ + if (bits >= 8) { + output_byte(a, ocode & 0xff); + ocode >>= 8; + bits -= 8; + } + /* Last bits. */ + state->bit_offset += state->code_len; + state->bit_buf = ocode & rmask[bits]; + if (state->bit_offset == state->code_len * 8) + state->bit_offset = 0; + + /* + * If the next entry is going to be too big for the ocode size, + * then increase it, if possible. + */ + if (clear_flg || state->first_free > state->cur_maxcode) { + /* + * Write the whole buffer, because the input side won't + * discover the size increase until after it has read it. + */ + if (state->bit_offset > 0) { + while (state->bit_offset < state->code_len * 8) { + ret = output_byte(a, state->bit_buf); + if (ret != ARCHIVE_OK) + return ret; + state->bit_offset += 8; + state->bit_buf = 0; + } + } + state->bit_buf = 0; + state->bit_offset = 0; + + if (clear_flg) { + state->code_len = 9; + state->cur_maxcode = MAXCODE(state->code_len); + } else { + state->code_len++; + if (state->code_len == 16) + state->cur_maxcode = state->max_maxcode; + else + state->cur_maxcode = MAXCODE(state->code_len); + } + } + + return (ARCHIVE_OK); +} + +static int +output_flush(struct archive_write *a) +{ + struct private_data *state = a->compressor.data; + int ret; + + /* At EOF, write the rest of the buffer. */ + if (state->bit_offset % 8) { + state->code_len = (state->bit_offset % 8 + 7) / 8; + ret = output_byte(a, state->bit_buf); + if (ret != ARCHIVE_OK) + return ret; + } + + return (ARCHIVE_OK); +} + +/* + * Write data to the compressed stream. + */ +static int +archive_compressor_compress_write(struct archive_write *a, const void *buff, + size_t length) +{ + struct private_data *state; + int i; + int ratio; + int c, disp, ret; + const unsigned char *bp; + + state = (struct private_data *)a->compressor.data; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + return (ARCHIVE_FATAL); + } + + if (length == 0) + return ARCHIVE_OK; + + bp = buff; + + if (state->in_count == 0) { + state->cur_code = *bp++; + ++state->in_count; + --length; + } + + while (length--) { + c = *bp++; + state->in_count++; + state->cur_fcode = (c << 16) + state->cur_code; + i = ((c << HSHIFT) ^ state->cur_code); /* Xor hashing. */ + + if (state->hashtab[i] == state->cur_fcode) { + state->cur_code = state->codetab[i]; + continue; + } + if (state->hashtab[i] < 0) /* Empty slot. */ + goto nomatch; + /* Secondary hash (after G. Knott). */ + if (i == 0) + disp = 1; + else + disp = HSIZE - i; + probe: + if ((i -= disp) < 0) + i += HSIZE; + + if (state->hashtab[i] == state->cur_fcode) { + state->cur_code = state->codetab[i]; + continue; + } + if (state->hashtab[i] >= 0) + goto probe; + nomatch: + ret = output_code(a, state->cur_code); + if (ret != ARCHIVE_OK) + return ret; + state->cur_code = c; + if (state->first_free < state->max_maxcode) { + state->codetab[i] = state->first_free++; /* code -> hashtable */ + state->hashtab[i] = state->cur_fcode; + continue; + } + if (state->in_count < state->checkpoint) + continue; + + state->checkpoint = state->in_count + CHECK_GAP; + + if (state->in_count <= 0x007fffff) + ratio = state->in_count * 256 / state->out_count; + else if ((ratio = state->out_count / 256) == 0) + ratio = 0x7fffffff; + else + ratio = state->in_count / ratio; + + if (ratio > state->compress_ratio) + state->compress_ratio = ratio; + else { + state->compress_ratio = 0; + memset(state->hashtab, 0xff, sizeof(state->hashtab)); + state->first_free = FIRST; + ret = output_code(a, CLEAR); + if (ret != ARCHIVE_OK) + return ret; + } + } + + return (ARCHIVE_OK); +} + + +/* + * Finish the compression... + */ +static int +archive_compressor_compress_finish(struct archive_write *a) +{ + ssize_t block_length, target_block_length, bytes_written; + int ret; + struct private_data *state; + unsigned tocopy; + + state = (struct private_data *)a->compressor.data; + ret = 0; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + ret = ARCHIVE_FATAL; + goto cleanup; + } + + /* By default, always pad the uncompressed data. */ + if (a->pad_uncompressed) { + while (state->in_count % a->bytes_per_block != 0) { + tocopy = a->bytes_per_block - + (state->in_count % a->bytes_per_block); + if (tocopy > a->null_length) + tocopy = a->null_length; + ret = archive_compressor_compress_write(a, a->nulls, + tocopy); + if (ret != ARCHIVE_OK) + goto cleanup; + } + } + + ret = output_code(a, state->cur_code); + if (ret != ARCHIVE_OK) + goto cleanup; + ret = output_flush(a); + if (ret != ARCHIVE_OK) + goto cleanup; + + /* Optionally, pad the final compressed block. */ + block_length = state->compressed_offset; + + /* Tricky calculation to determine size of last block. */ + if (a->bytes_in_last_block <= 0) + /* Default or Zero: pad to full block */ + target_block_length = a->bytes_per_block; + else + /* Round length to next multiple of bytes_in_last_block. */ + target_block_length = a->bytes_in_last_block * + ( (block_length + a->bytes_in_last_block - 1) / + a->bytes_in_last_block); + if (target_block_length > a->bytes_per_block) + target_block_length = a->bytes_per_block; + if (block_length < target_block_length) { + memset(state->compressed + state->compressed_offset, 0, + target_block_length - block_length); + block_length = target_block_length; + } + + /* Write the last block */ + bytes_written = (a->client_writer)(&a->archive, a->client_data, + state->compressed, block_length); + if (bytes_written <= 0) + ret = ARCHIVE_FATAL; + else + a->archive.raw_position += bytes_written; + +cleanup: + free(state->compressed); + free(state); + return (ret); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_compression_gzip.c b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_gzip.c new file mode 100644 index 000000000..17a637824 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_gzip.c @@ -0,0 +1,478 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" + +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_compression_gzip.c,v 1.16 2008/02/21 03:21:50 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#ifdef HAVE_ZLIB_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_write_private.h" + +#ifndef HAVE_ZLIB_H +int +archive_write_set_compression_gzip(struct archive *a) +{ + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "gzip compression not supported on this platform"); + return (ARCHIVE_FATAL); +} +#else +/* Don't compile this if we don't have zlib. */ + +struct private_data { + z_stream stream; + int64_t total_in; + unsigned char *compressed; + size_t compressed_buffer_size; + unsigned long crc; +}; + +struct private_config { + int compression_level; +}; + + +/* + * Yuck. zlib.h is not const-correct, so I need this one bit + * of ugly hackery to convert a const * pointer to a non-const pointer. + */ +#define SET_NEXT_IN(st,src) \ + (st)->stream.next_in = (Bytef *)(uintptr_t)(const void *)(src) + +static int archive_compressor_gzip_finish(struct archive_write *); +static int archive_compressor_gzip_init(struct archive_write *); +static int archive_compressor_gzip_options(struct archive_write *, + const char *, const char *); +static int archive_compressor_gzip_write(struct archive_write *, + const void *, size_t); +static int drive_compressor(struct archive_write *, struct private_data *, + int finishing); + + +/* + * Allocate, initialize and return a archive object. + */ +int +archive_write_set_compression_gzip(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct private_config *config; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_compression_gzip"); + config = malloc(sizeof(*config)); + if (config == NULL) { + archive_set_error(&a->archive, ENOMEM, "Out of memory"); + return (ARCHIVE_FATAL); + } + a->compressor.config = config; + a->compressor.finish = &archive_compressor_gzip_finish; + config->compression_level = Z_DEFAULT_COMPRESSION; + a->compressor.init = &archive_compressor_gzip_init; + a->compressor.options = &archive_compressor_gzip_options; + a->archive.compression_code = ARCHIVE_COMPRESSION_GZIP; + a->archive.compression_name = "gzip"; + return (ARCHIVE_OK); +} + +/* + * Setup callback. + */ +static int +archive_compressor_gzip_init(struct archive_write *a) +{ + int ret; + struct private_data *state; + struct private_config *config; + time_t t; + + config = (struct private_config *)a->compressor.config; + + if (a->client_opener != NULL) { + ret = (a->client_opener)(&a->archive, a->client_data); + if (ret != ARCHIVE_OK) + return (ret); + } + + /* + * The next check is a temporary workaround until the gzip + * code can be overhauled some. The code should not require + * that compressed_buffer_size == bytes_per_block. Removing + * this assumption will allow us to compress larger chunks at + * a time, which should improve overall performance + * marginally. As a minor side-effect, such a cleanup would + * allow us to support truly arbitrary block sizes. + */ + if (a->bytes_per_block < 10) { + archive_set_error(&a->archive, EINVAL, + "GZip compressor requires a minimum 10 byte block size"); + return (ARCHIVE_FATAL); + } + + state = (struct private_data *)malloc(sizeof(*state)); + if (state == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression"); + return (ARCHIVE_FATAL); + } + memset(state, 0, sizeof(*state)); + + /* + * See comment above. We should set compressed_buffer_size to + * max(bytes_per_block, 65536), but the code can't handle that yet. + */ + state->compressed_buffer_size = a->bytes_per_block; + state->compressed = (unsigned char *)malloc(state->compressed_buffer_size); + state->crc = crc32(0L, NULL, 0); + + if (state->compressed == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression buffer"); + free(state); + return (ARCHIVE_FATAL); + } + + state->stream.next_out = state->compressed; + state->stream.avail_out = state->compressed_buffer_size; + + /* Prime output buffer with a gzip header. */ + t = time(NULL); + state->compressed[0] = 0x1f; /* GZip signature bytes */ + state->compressed[1] = 0x8b; + state->compressed[2] = 0x08; /* "Deflate" compression */ + state->compressed[3] = 0; /* No options */ + state->compressed[4] = (t)&0xff; /* Timestamp */ + state->compressed[5] = (t>>8)&0xff; + state->compressed[6] = (t>>16)&0xff; + state->compressed[7] = (t>>24)&0xff; + state->compressed[8] = 0; /* No deflate options */ + state->compressed[9] = 3; /* OS=Unix */ + state->stream.next_out += 10; + state->stream.avail_out -= 10; + + a->compressor.write = archive_compressor_gzip_write; + + /* Initialize compression library. */ + ret = deflateInit2(&(state->stream), + config->compression_level, + Z_DEFLATED, + -15 /* < 0 to suppress zlib header */, + 8, + Z_DEFAULT_STRATEGY); + + if (ret == Z_OK) { + a->compressor.data = state; + return (0); + } + + /* Library setup failed: clean up. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Internal error " + "initializing compression library"); + free(state->compressed); + free(state); + + /* Override the error message if we know what really went wrong. */ + switch (ret) { + case Z_STREAM_ERROR: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing " + "compression library: invalid setup parameter"); + break; + case Z_MEM_ERROR: + archive_set_error(&a->archive, ENOMEM, "Internal error initializing " + "compression library"); + break; + case Z_VERSION_ERROR: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing " + "compression library: invalid library version"); + break; + } + + return (ARCHIVE_FATAL); +} + +/* + * Set write options. + */ +static int +archive_compressor_gzip_options(struct archive_write *a, const char *key, + const char *value) +{ + struct private_config *config; + + config = (struct private_config *)a->compressor.config; + if (strcmp(key, "compression-level") == 0) { + if (value == NULL || !(value[0] >= '0' && value[0] <= '9') || + value[1] != '\0') + return (ARCHIVE_WARN); + config->compression_level = value[0] - '0'; + return (ARCHIVE_OK); + } + + return (ARCHIVE_WARN); +} + +/* + * Write data to the compressed stream. + */ +static int +archive_compressor_gzip_write(struct archive_write *a, const void *buff, + size_t length) +{ + struct private_data *state; + int ret; + + state = (struct private_data *)a->compressor.data; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + return (ARCHIVE_FATAL); + } + + /* Update statistics */ + state->crc = crc32(state->crc, (const Bytef *)buff, length); + state->total_in += length; + + /* Compress input data to output buffer */ + SET_NEXT_IN(state, buff); + state->stream.avail_in = length; + if ((ret = drive_compressor(a, state, 0)) != ARCHIVE_OK) + return (ret); + + a->archive.file_position += length; + return (ARCHIVE_OK); +} + +/* + * Finish the compression... + */ +static int +archive_compressor_gzip_finish(struct archive_write *a) +{ + ssize_t block_length, target_block_length, bytes_written; + int ret; + struct private_data *state; + unsigned tocopy; + unsigned char trailer[8]; + + state = (struct private_data *)a->compressor.data; + ret = 0; + if (state != NULL) { + if (a->client_writer == NULL) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + ret = ARCHIVE_FATAL; + goto cleanup; + } + + /* By default, always pad the uncompressed data. */ + if (a->pad_uncompressed) { + tocopy = a->bytes_per_block - + (state->total_in % a->bytes_per_block); + while (tocopy > 0 && tocopy < (unsigned)a->bytes_per_block) { + SET_NEXT_IN(state, a->nulls); + state->stream.avail_in = tocopy < a->null_length ? + tocopy : a->null_length; + state->crc = crc32(state->crc, a->nulls, + state->stream.avail_in); + state->total_in += state->stream.avail_in; + tocopy -= state->stream.avail_in; + ret = drive_compressor(a, state, 0); + if (ret != ARCHIVE_OK) + goto cleanup; + } + } + + /* Finish compression cycle */ + if (((ret = drive_compressor(a, state, 1))) != ARCHIVE_OK) + goto cleanup; + + /* Build trailer: 4-byte CRC and 4-byte length. */ + trailer[0] = (state->crc)&0xff; + trailer[1] = (state->crc >> 8)&0xff; + trailer[2] = (state->crc >> 16)&0xff; + trailer[3] = (state->crc >> 24)&0xff; + trailer[4] = (state->total_in)&0xff; + trailer[5] = (state->total_in >> 8)&0xff; + trailer[6] = (state->total_in >> 16)&0xff; + trailer[7] = (state->total_in >> 24)&0xff; + + /* Add trailer to current block. */ + tocopy = 8; + if (tocopy > state->stream.avail_out) + tocopy = state->stream.avail_out; + memcpy(state->stream.next_out, trailer, tocopy); + state->stream.next_out += tocopy; + state->stream.avail_out -= tocopy; + + /* If it overflowed, flush and start a new block. */ + if (tocopy < 8) { + bytes_written = (a->client_writer)(&a->archive, a->client_data, + state->compressed, state->compressed_buffer_size); + if (bytes_written <= 0) { + ret = ARCHIVE_FATAL; + goto cleanup; + } + a->archive.raw_position += bytes_written; + state->stream.next_out = state->compressed; + state->stream.avail_out = state->compressed_buffer_size; + memcpy(state->stream.next_out, trailer + tocopy, 8-tocopy); + state->stream.next_out += 8-tocopy; + state->stream.avail_out -= 8-tocopy; + } + + /* Optionally, pad the final compressed block. */ + block_length = state->stream.next_out - state->compressed; + + /* Tricky calculation to determine size of last block. */ + target_block_length = block_length; + if (a->bytes_in_last_block <= 0) + /* Default or Zero: pad to full block */ + target_block_length = a->bytes_per_block; + else + /* Round length to next multiple of bytes_in_last_block. */ + target_block_length = a->bytes_in_last_block * + ( (block_length + a->bytes_in_last_block - 1) / + a->bytes_in_last_block); + if (target_block_length > a->bytes_per_block) + target_block_length = a->bytes_per_block; + if (block_length < target_block_length) { + memset(state->stream.next_out, 0, + target_block_length - block_length); + block_length = target_block_length; + } + + /* Write the last block */ + bytes_written = (a->client_writer)(&a->archive, a->client_data, + state->compressed, block_length); + if (bytes_written <= 0) { + ret = ARCHIVE_FATAL; + goto cleanup; + } + a->archive.raw_position += bytes_written; + + /* Cleanup: shut down compressor, release memory, etc. */ + cleanup: + switch (deflateEnd(&(state->stream))) { + case Z_OK: + break; + default: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Failed to clean up compressor"); + ret = ARCHIVE_FATAL; + } + free(state->compressed); + free(state); + } + /* Clean up config area even if we never initialized. */ + free(a->compressor.config); + a->compressor.config = NULL; + return (ret); +} + +/* + * Utility function to push input data through compressor, + * writing full output blocks as necessary. + * + * Note that this handles both the regular write case (finishing == + * false) and the end-of-archive case (finishing == true). + */ +static int +drive_compressor(struct archive_write *a, struct private_data *state, int finishing) +{ + ssize_t bytes_written; + int ret; + + for (;;) { + if (state->stream.avail_out == 0) { + bytes_written = (a->client_writer)(&a->archive, + a->client_data, state->compressed, + state->compressed_buffer_size); + if (bytes_written <= 0) { + /* TODO: Handle this write failure */ + return (ARCHIVE_FATAL); + } else if ((size_t)bytes_written < state->compressed_buffer_size) { + /* Short write: Move remaining to + * front of block and keep filling */ + memmove(state->compressed, + state->compressed + bytes_written, + state->compressed_buffer_size - bytes_written); + } + a->archive.raw_position += bytes_written; + state->stream.next_out + = state->compressed + + state->compressed_buffer_size - bytes_written; + state->stream.avail_out = bytes_written; + } + + /* If there's nothing to do, we're done. */ + if (!finishing && state->stream.avail_in == 0) + return (ARCHIVE_OK); + + ret = deflate(&(state->stream), + finishing ? Z_FINISH : Z_NO_FLUSH ); + + switch (ret) { + case Z_OK: + /* In non-finishing case, check if compressor + * consumed everything */ + if (!finishing && state->stream.avail_in == 0) + return (ARCHIVE_OK); + /* In finishing case, this return always means + * there's more work */ + break; + case Z_STREAM_END: + /* This return can only occur in finishing case. */ + return (ARCHIVE_OK); + default: + /* Any other return value indicates an error. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "GZip compression failed:" + " deflate() call returned status %d", + ret); + return (ARCHIVE_FATAL); + } + } +} + +#endif /* HAVE_ZLIB_H */ diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_compression_none.c b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_none.c new file mode 100644 index 000000000..f27d629a1 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_none.c @@ -0,0 +1,259 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_compression_none.c,v 1.16 2007/12/30 04:58:22 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_write_private.h" + +static int archive_compressor_none_finish(struct archive_write *a); +static int archive_compressor_none_init(struct archive_write *); +static int archive_compressor_none_write(struct archive_write *, + const void *, size_t); + +struct archive_none { + char *buffer; + ssize_t buffer_size; + char *next; /* Current insert location */ + ssize_t avail; /* Free space left in buffer */ +}; + +int +archive_write_set_compression_none(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_compression_none"); + a->compressor.init = &archive_compressor_none_init; + return (0); +} + +/* + * Setup callback. + */ +static int +archive_compressor_none_init(struct archive_write *a) +{ + int ret; + struct archive_none *state; + + a->archive.compression_code = ARCHIVE_COMPRESSION_NONE; + a->archive.compression_name = "none"; + + if (a->client_opener != NULL) { + ret = (a->client_opener)(&a->archive, a->client_data); + if (ret != 0) + return (ret); + } + + state = (struct archive_none *)malloc(sizeof(*state)); + if (state == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for output buffering"); + return (ARCHIVE_FATAL); + } + memset(state, 0, sizeof(*state)); + + state->buffer_size = a->bytes_per_block; + if (state->buffer_size != 0) { + state->buffer = (char *)malloc(state->buffer_size); + if (state->buffer == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate output buffer"); + free(state); + return (ARCHIVE_FATAL); + } + } + + state->next = state->buffer; + state->avail = state->buffer_size; + + a->compressor.data = state; + a->compressor.write = archive_compressor_none_write; + a->compressor.finish = archive_compressor_none_finish; + return (ARCHIVE_OK); +} + +/* + * Write data to the stream. + */ +static int +archive_compressor_none_write(struct archive_write *a, const void *vbuff, + size_t length) +{ + const char *buff; + ssize_t remaining, to_copy; + ssize_t bytes_written; + struct archive_none *state; + + state = (struct archive_none *)a->compressor.data; + buff = (const char *)vbuff; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + return (ARCHIVE_FATAL); + } + + remaining = length; + + /* + * If there is no buffer for blocking, just pass the data + * straight through to the client write callback. In + * particular, this supports "no write delay" operation for + * special applications. Just set the block size to zero. + */ + if (state->buffer_size == 0) { + while (remaining > 0) { + bytes_written = (a->client_writer)(&a->archive, + a->client_data, buff, remaining); + if (bytes_written <= 0) + return (ARCHIVE_FATAL); + a->archive.raw_position += bytes_written; + remaining -= bytes_written; + buff += bytes_written; + } + a->archive.file_position += length; + return (ARCHIVE_OK); + } + + /* If the copy buffer isn't empty, try to fill it. */ + if (state->avail < state->buffer_size) { + /* If buffer is not empty... */ + /* ... copy data into buffer ... */ + to_copy = (remaining > state->avail) ? + state->avail : remaining; + memcpy(state->next, buff, to_copy); + state->next += to_copy; + state->avail -= to_copy; + buff += to_copy; + remaining -= to_copy; + /* ... if it's full, write it out. */ + if (state->avail == 0) { + bytes_written = (a->client_writer)(&a->archive, + a->client_data, state->buffer, state->buffer_size); + if (bytes_written <= 0) + return (ARCHIVE_FATAL); + /* XXX TODO: if bytes_written < state->buffer_size */ + a->archive.raw_position += bytes_written; + state->next = state->buffer; + state->avail = state->buffer_size; + } + } + + while (remaining > state->buffer_size) { + /* Write out full blocks directly to client. */ + bytes_written = (a->client_writer)(&a->archive, + a->client_data, buff, state->buffer_size); + if (bytes_written <= 0) + return (ARCHIVE_FATAL); + a->archive.raw_position += bytes_written; + buff += bytes_written; + remaining -= bytes_written; + } + + if (remaining > 0) { + /* Copy last bit into copy buffer. */ + memcpy(state->next, buff, remaining); + state->next += remaining; + state->avail -= remaining; + } + + a->archive.file_position += length; + return (ARCHIVE_OK); +} + + +/* + * Finish the compression. + */ +static int +archive_compressor_none_finish(struct archive_write *a) +{ + ssize_t block_length; + ssize_t target_block_length; + ssize_t bytes_written; + int ret; + int ret2; + struct archive_none *state; + + state = (struct archive_none *)a->compressor.data; + ret = ret2 = ARCHIVE_OK; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + return (ARCHIVE_FATAL); + } + + /* If there's pending data, pad and write the last block */ + if (state->next != state->buffer) { + block_length = state->buffer_size - state->avail; + + /* Tricky calculation to determine size of last block */ + target_block_length = block_length; + if (a->bytes_in_last_block <= 0) + /* Default or Zero: pad to full block */ + target_block_length = a->bytes_per_block; + else + /* Round to next multiple of bytes_in_last_block. */ + target_block_length = a->bytes_in_last_block * + ( (block_length + a->bytes_in_last_block - 1) / + a->bytes_in_last_block); + if (target_block_length > a->bytes_per_block) + target_block_length = a->bytes_per_block; + if (block_length < target_block_length) { + memset(state->next, 0, + target_block_length - block_length); + block_length = target_block_length; + } + bytes_written = (a->client_writer)(&a->archive, + a->client_data, state->buffer, block_length); + if (bytes_written <= 0) + ret = ARCHIVE_FATAL; + else { + a->archive.raw_position += bytes_written; + ret = ARCHIVE_OK; + } + } + if (state->buffer) + free(state->buffer); + free(state); + a->compressor.data = NULL; + + return (ret); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_compression_program.c b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_program.c new file mode 100644 index 000000000..e9f995273 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_program.c @@ -0,0 +1,349 @@ +/*- + * Copyright (c) 2007 Joerg Sonnenberger + * 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 "archive_platform.h" + +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_compression_program.c,v 1.3 2008/06/15 10:45:57 kientzle Exp $"); + +/* This capability is only available on POSIX systems. */ +#if (!defined(HAVE_PIPE) || !defined(HAVE_FCNTL) || \ + !(defined(HAVE_FORK) || defined(HAVE_VFORK))) && (!defined(_WIN32) || defined(__CYGWIN__)) +#include "archive.h" + +/* + * On non-Posix systems, allow the program to build, but choke if + * this function is actually invoked. + */ +int +archive_write_set_compression_program(struct archive *_a, const char *cmd) +{ + archive_set_error(_a, -1, + "External compression programs not supported on this platform"); + return (ARCHIVE_FATAL); +} + +#else + +#ifdef HAVE_SYS_WAIT_H +# include +#endif +#ifdef HAVE_ERRNO_H +# include +#endif +#ifdef HAVE_FCNTL_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_write_private.h" + +#include "filter_fork.h" + +struct private_data { + char *description; + pid_t child; + int child_stdin, child_stdout; + + char *child_buf; + size_t child_buf_len, child_buf_avail; +}; + +static int archive_compressor_program_finish(struct archive_write *); +static int archive_compressor_program_init(struct archive_write *); +static int archive_compressor_program_write(struct archive_write *, + const void *, size_t); + +/* + * Allocate, initialize and return a archive object. + */ +int +archive_write_set_compression_program(struct archive *_a, const char *cmd) +{ + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_compression_program"); + a->compressor.init = &archive_compressor_program_init; + a->compressor.config = strdup(cmd); + return (ARCHIVE_OK); +} + +/* + * Setup callback. + */ +static int +archive_compressor_program_init(struct archive_write *a) +{ + int ret; + struct private_data *state; + static const char *prefix = "Program: "; + char *cmd = a->compressor.config; + + if (a->client_opener != NULL) { + ret = (a->client_opener)(&a->archive, a->client_data); + if (ret != ARCHIVE_OK) + return (ret); + } + + state = (struct private_data *)malloc(sizeof(*state)); + if (state == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression"); + return (ARCHIVE_FATAL); + } + memset(state, 0, sizeof(*state)); + + a->archive.compression_code = ARCHIVE_COMPRESSION_PROGRAM; + state->description = (char *)malloc(strlen(prefix) + strlen(cmd) + 1); + strcpy(state->description, prefix); + strcat(state->description, cmd); + a->archive.compression_name = state->description; + + state->child_buf_len = a->bytes_per_block; + state->child_buf_avail = 0; + state->child_buf = malloc(state->child_buf_len); + + if (state->child_buf == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression buffer"); + free(state); + return (ARCHIVE_FATAL); + } + + if ((state->child = __archive_create_child(cmd, + &state->child_stdin, &state->child_stdout)) == -1) { + archive_set_error(&a->archive, EINVAL, + "Can't initialise filter"); + free(state->child_buf); + free(state); + return (ARCHIVE_FATAL); + } + + a->compressor.write = archive_compressor_program_write; + a->compressor.finish = archive_compressor_program_finish; + + a->compressor.data = state; + return (0); +} + +static ssize_t +child_write(struct archive_write *a, const char *buf, size_t buf_len) +{ + struct private_data *state = a->compressor.data; + ssize_t ret; + + if (state->child_stdin == -1) + return (-1); + + if (buf_len == 0) + return (-1); + +restart_write: + do { + ret = write(state->child_stdin, buf, buf_len); + } while (ret == -1 && errno == EINTR); + + if (ret > 0) + return (ret); + if (ret == 0) { + close(state->child_stdin); + state->child_stdin = -1; + fcntl(state->child_stdout, F_SETFL, 0); + return (0); + } + if (ret == -1 && errno != EAGAIN) + return (-1); + + if (state->child_stdout == -1) { + fcntl(state->child_stdin, F_SETFL, 0); + __archive_check_child(state->child_stdin, state->child_stdout); + goto restart_write; + } + + do { + ret = read(state->child_stdout, + state->child_buf + state->child_buf_avail, + state->child_buf_len - state->child_buf_avail); + } while (ret == -1 && errno == EINTR); + + if (ret == 0 || (ret == -1 && errno == EPIPE)) { + close(state->child_stdout); + state->child_stdout = -1; + fcntl(state->child_stdin, F_SETFL, 0); + goto restart_write; + } + if (ret == -1 && errno == EAGAIN) { + __archive_check_child(state->child_stdin, state->child_stdout); + goto restart_write; + } + if (ret == -1) + return (-1); + + state->child_buf_avail += ret; + + ret = (a->client_writer)(&a->archive, a->client_data, + state->child_buf, state->child_buf_avail); + if (ret <= 0) + return (-1); + + if ((size_t)ret < state->child_buf_avail) { + memmove(state->child_buf, state->child_buf + ret, + state->child_buf_avail - ret); + } + state->child_buf_avail -= ret; + a->archive.raw_position += ret; + goto restart_write; +} + +/* + * Write data to the compressed stream. + */ +static int +archive_compressor_program_write(struct archive_write *a, const void *buff, + size_t length) +{ + struct private_data *state; + ssize_t ret; + const char *buf; + + state = (struct private_data *)a->compressor.data; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + return (ARCHIVE_FATAL); + } + + buf = buff; + while (length > 0) { + ret = child_write(a, buf, length); + if (ret == -1 || ret == 0) { + archive_set_error(&a->archive, EIO, + "Can't write to filter"); + return (ARCHIVE_FATAL); + } + length -= ret; + buf += ret; + } + + a->archive.file_position += length; + return (ARCHIVE_OK); +} + + +/* + * Finish the compression... + */ +static int +archive_compressor_program_finish(struct archive_write *a) +{ + int ret, status; + ssize_t bytes_read, bytes_written; + struct private_data *state; + + state = (struct private_data *)a->compressor.data; + ret = 0; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + ret = ARCHIVE_FATAL; + goto cleanup; + } + + /* XXX pad compressed data. */ + + close(state->child_stdin); + state->child_stdin = -1; + fcntl(state->child_stdout, F_SETFL, 0); + + for (;;) { + do { + bytes_read = read(state->child_stdout, + state->child_buf + state->child_buf_avail, + state->child_buf_len - state->child_buf_avail); + } while (bytes_read == -1 && errno == EINTR); + + if (bytes_read == 0 || (bytes_read == -1 && errno == EPIPE)) + break; + + if (bytes_read == -1) { + archive_set_error(&a->archive, errno, + "Read from filter failed unexpectedly."); + ret = ARCHIVE_FATAL; + goto cleanup; + } + state->child_buf_avail += bytes_read; + + bytes_written = (a->client_writer)(&a->archive, a->client_data, + state->child_buf, state->child_buf_avail); + if (bytes_written <= 0) { + ret = ARCHIVE_FATAL; + goto cleanup; + } + if ((size_t)bytes_written < state->child_buf_avail) { + memmove(state->child_buf, + state->child_buf + bytes_written, + state->child_buf_avail - bytes_written); + } + state->child_buf_avail -= bytes_written; + a->archive.raw_position += bytes_written; + } + + /* XXX pad final compressed block. */ + +cleanup: + /* Shut down the child. */ + if (state->child_stdin != -1) + close(state->child_stdin); + if (state->child_stdout != -1) + close(state->child_stdout); + while (waitpid(state->child, &status, 0) == -1 && errno == EINTR) + continue; + + if (status != 0) { + archive_set_error(&a->archive, EIO, + "Filter exited with failure."); + ret = ARCHIVE_FATAL; + } + + /* Release our configuration data. */ + free(a->compressor.config); + a->compressor.config = NULL; + + /* Release our private state data. */ + free(state->child_buf); + free(state->description); + free(state); + return (ret); +} + +#endif /* !defined(HAVE_PIPE) || !defined(HAVE_VFORK) || !defined(HAVE_FCNTL) */ diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_compression_xz.c b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_xz.c new file mode 100644 index 000000000..3883b4062 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_compression_xz.c @@ -0,0 +1,439 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" + +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#ifdef HAVE_LZMA_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" +#include "archive_write_private.h" + +#ifndef HAVE_LZMA_H +int +archive_write_set_compression_xz(struct archive *a) +{ + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "xz compression not supported on this platform"); + return (ARCHIVE_FATAL); +} + +int +archive_write_set_compression_lzma(struct archive *a) +{ + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "lzma compression not supported on this platform"); + return (ARCHIVE_FATAL); +} +#else +/* Don't compile this if we don't have liblzma. */ + +struct private_data { + lzma_stream stream; + lzma_filter lzmafilters[2]; + lzma_options_lzma lzma_opt; + int64_t total_in; + unsigned char *compressed; + size_t compressed_buffer_size; +}; + +struct private_config { + int compression_level; +}; + +static int archive_compressor_xz_init(struct archive_write *); +static int archive_compressor_xz_options(struct archive_write *, + const char *, const char *); +static int archive_compressor_xz_finish(struct archive_write *); +static int archive_compressor_xz_write(struct archive_write *, + const void *, size_t); +static int drive_compressor(struct archive_write *, struct private_data *, + int finishing); + + +/* + * Allocate, initialize and return a archive object. + */ +int +archive_write_set_compression_xz(struct archive *_a) +{ + struct private_config *config; + struct archive_write *a = (struct archive_write *)_a; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW, "archive_write_set_compression_xz"); + config = calloc(1, sizeof(*config)); + if (config == NULL) { + archive_set_error(&a->archive, ENOMEM, "Out of memory"); + return (ARCHIVE_FATAL); + } + a->compressor.config = config; + a->compressor.finish = archive_compressor_xz_finish; + config->compression_level = LZMA_PRESET_DEFAULT; + a->compressor.init = &archive_compressor_xz_init; + a->compressor.options = &archive_compressor_xz_options; + a->archive.compression_code = ARCHIVE_COMPRESSION_XZ; + a->archive.compression_name = "xz"; + return (ARCHIVE_OK); +} + +/* LZMA is handled identically, we just need a different compression + * code set. (The liblzma setup looks at the code to determine + * the one place that XZ and LZMA require different handling.) */ +int +archive_write_set_compression_lzma(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int r = archive_write_set_compression_xz(_a); + if (r != ARCHIVE_OK) + return (r); + a->archive.compression_code = ARCHIVE_COMPRESSION_LZMA; + a->archive.compression_name = "lzma"; + return (ARCHIVE_OK); +} + +static int +archive_compressor_xz_init_stream(struct archive_write *a, + struct private_data *state) +{ + int ret; + + state->stream = (lzma_stream)LZMA_STREAM_INIT; + state->stream.next_out = state->compressed; + state->stream.avail_out = state->compressed_buffer_size; + if (a->archive.compression_code == ARCHIVE_COMPRESSION_XZ) + ret = lzma_stream_encoder(&(state->stream), + state->lzmafilters, LZMA_CHECK_CRC64); + else + ret = lzma_alone_encoder(&(state->stream), &state->lzma_opt); + if (ret == LZMA_OK) + return (ARCHIVE_OK); + + switch (ret) { + case LZMA_MEM_ERROR: + archive_set_error(&a->archive, ENOMEM, + "Internal error initializing compression library: " + "Cannot allocate memory"); + break; + default: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library: " + "It's a bug in liblzma"); + break; + } + return (ARCHIVE_FATAL); +} + +/* + * Setup callback. + */ +static int +archive_compressor_xz_init(struct archive_write *a) +{ + int ret; + struct private_data *state; + struct private_config *config; + + if (a->client_opener != NULL) { + ret = (a->client_opener)(&a->archive, a->client_data); + if (ret != ARCHIVE_OK) + return (ret); + } + + state = (struct private_data *)malloc(sizeof(*state)); + if (state == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression"); + return (ARCHIVE_FATAL); + } + memset(state, 0, sizeof(*state)); + config = a->compressor.config; + + /* + * See comment above. We should set compressed_buffer_size to + * max(bytes_per_block, 65536), but the code can't handle that yet. + */ + state->compressed_buffer_size = a->bytes_per_block; + state->compressed = (unsigned char *)malloc(state->compressed_buffer_size); + if (state->compressed == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate data for compression buffer"); + free(state); + return (ARCHIVE_FATAL); + } + a->compressor.write = archive_compressor_xz_write; + + /* Initialize compression library. */ + if (lzma_lzma_preset(&state->lzma_opt, config->compression_level)) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Internal error initializing compression library"); + free(state->compressed); + free(state); + } + state->lzmafilters[0].id = LZMA_FILTER_LZMA2; + state->lzmafilters[0].options = &state->lzma_opt; + state->lzmafilters[1].id = LZMA_VLI_UNKNOWN;/* Terminate */ + ret = archive_compressor_xz_init_stream(a, state); + if (ret == LZMA_OK) { + a->compressor.data = state; + return (0); + } + /* Library setup failed: clean up. */ + free(state->compressed); + free(state); + + return (ARCHIVE_FATAL); +} + +/* + * Set write options. + */ +static int +archive_compressor_xz_options(struct archive_write *a, const char *key, + const char *value) +{ + struct private_config *config; + + config = (struct private_config *)a->compressor.config; + if (strcmp(key, "compression-level") == 0) { + if (value == NULL || !(value[0] >= '0' && value[0] <= '9') || + value[1] != '\0') + return (ARCHIVE_WARN); + config->compression_level = value[0] - '0'; + if (config->compression_level > 6) + config->compression_level = 6; + return (ARCHIVE_OK); + } + + return (ARCHIVE_WARN); +} + +/* + * Write data to the compressed stream. + */ +static int +archive_compressor_xz_write(struct archive_write *a, const void *buff, + size_t length) +{ + struct private_data *state; + int ret; + + state = (struct private_data *)a->compressor.data; + if (a->client_writer == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + return (ARCHIVE_FATAL); + } + + /* Update statistics */ + state->total_in += length; + + /* Compress input data to output buffer */ + state->stream.next_in = buff; + state->stream.avail_in = length; + if ((ret = drive_compressor(a, state, 0)) != ARCHIVE_OK) + return (ret); + + a->archive.file_position += length; + return (ARCHIVE_OK); +} + + +/* + * Finish the compression... + */ +static int +archive_compressor_xz_finish(struct archive_write *a) +{ + ssize_t block_length, target_block_length, bytes_written; + int ret; + struct private_data *state; + unsigned tocopy; + + ret = ARCHIVE_OK; + state = (struct private_data *)a->compressor.data; + if (state != NULL) { + if (a->client_writer == NULL) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_PROGRAMMER, + "No write callback is registered? " + "This is probably an internal programming error."); + ret = ARCHIVE_FATAL; + goto cleanup; + } + + /* By default, always pad the uncompressed data. */ + if (a->pad_uncompressed) { + tocopy = a->bytes_per_block - + (state->total_in % a->bytes_per_block); + while (tocopy > 0 && tocopy < (unsigned)a->bytes_per_block) { + state->stream.next_in = a->nulls; + state->stream.avail_in = tocopy < a->null_length ? + tocopy : a->null_length; + state->total_in += state->stream.avail_in; + tocopy -= state->stream.avail_in; + ret = drive_compressor(a, state, 0); + if (ret != ARCHIVE_OK) + goto cleanup; + } + } + + /* Finish compression cycle */ + if (((ret = drive_compressor(a, state, 1))) != ARCHIVE_OK) + goto cleanup; + + /* Optionally, pad the final compressed block. */ + block_length = state->stream.next_out - state->compressed; + + /* Tricky calculation to determine size of last block. */ + target_block_length = block_length; + if (a->bytes_in_last_block <= 0) + /* Default or Zero: pad to full block */ + target_block_length = a->bytes_per_block; + else + /* Round length to next multiple of bytes_in_last_block. */ + target_block_length = a->bytes_in_last_block * + ( (block_length + a->bytes_in_last_block - 1) / + a->bytes_in_last_block); + if (target_block_length > a->bytes_per_block) + target_block_length = a->bytes_per_block; + if (block_length < target_block_length) { + memset(state->stream.next_out, 0, + target_block_length - block_length); + block_length = target_block_length; + } + + /* Write the last block */ + bytes_written = (a->client_writer)(&a->archive, a->client_data, + state->compressed, block_length); + if (bytes_written <= 0) { + ret = ARCHIVE_FATAL; + goto cleanup; + } + a->archive.raw_position += bytes_written; + + /* Cleanup: shut down compressor, release memory, etc. */ + cleanup: + lzma_end(&(state->stream)); + free(state->compressed); + free(state); + } + free(a->compressor.config); + a->compressor.config = NULL; + return (ret); +} + +/* + * Utility function to push input data through compressor, + * writing full output blocks as necessary. + * + * Note that this handles both the regular write case (finishing == + * false) and the end-of-archive case (finishing == true). + */ +static int +drive_compressor(struct archive_write *a, struct private_data *state, int finishing) +{ + ssize_t bytes_written; + int ret; + + for (;;) { + if (state->stream.avail_out == 0) { + bytes_written = (a->client_writer)(&a->archive, + a->client_data, state->compressed, + state->compressed_buffer_size); + if (bytes_written <= 0) { + /* TODO: Handle this write failure */ + return (ARCHIVE_FATAL); + } else if ((size_t)bytes_written < state->compressed_buffer_size) { + /* Short write: Move remaining to + * front of block and keep filling */ + memmove(state->compressed, + state->compressed + bytes_written, + state->compressed_buffer_size - bytes_written); + } + a->archive.raw_position += bytes_written; + state->stream.next_out + = state->compressed + + state->compressed_buffer_size - bytes_written; + state->stream.avail_out = bytes_written; + } + + /* If there's nothing to do, we're done. */ + if (!finishing && state->stream.avail_in == 0) + return (ARCHIVE_OK); + + ret = lzma_code(&(state->stream), + finishing ? LZMA_FINISH : LZMA_RUN ); + + switch (ret) { + case LZMA_OK: + /* In non-finishing case, check if compressor + * consumed everything */ + if (!finishing && state->stream.avail_in == 0) + return (ARCHIVE_OK); + /* In finishing case, this return always means + * there's more work */ + break; + case LZMA_STREAM_END: + /* This return can only occur in finishing case. */ + if (finishing) + return (ARCHIVE_OK); + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "lzma compression data error"); + return (ARCHIVE_FATAL); + case LZMA_MEMLIMIT_ERROR: + archive_set_error(&a->archive, ENOMEM, + "lzma compression error: " + "%ju MiB would have been needed", + (lzma_memusage(&(state->stream)) + 1024 * 1024 -1) + / (1024 * 1024)); + return (ARCHIVE_FATAL); + default: + /* Any other return value indicates an error. */ + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "lzma compression failed:" + " lzma_code() call returned status %d", + ret); + return (ARCHIVE_FATAL); + } + } +} + +#endif /* HAVE_LZMA_H */ diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format.c new file mode 100644 index 000000000..c2088f667 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format.c @@ -0,0 +1,72 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_format.c,v 1.6 2008/08/31 07:21:46 kientzle Exp $"); + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_ERRNO_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" + +/* A table that maps format codes to functions. */ +static +struct { int code; int (*setter)(struct archive *); } codes[] = +{ + { ARCHIVE_FORMAT_CPIO, archive_write_set_format_cpio }, + { ARCHIVE_FORMAT_CPIO_SVR4_NOCRC, archive_write_set_format_cpio_newc }, + { ARCHIVE_FORMAT_CPIO_POSIX, archive_write_set_format_cpio }, + { ARCHIVE_FORMAT_MTREE, archive_write_set_format_mtree }, + { ARCHIVE_FORMAT_SHAR, archive_write_set_format_shar }, + { ARCHIVE_FORMAT_SHAR_BASE, archive_write_set_format_shar }, + { ARCHIVE_FORMAT_SHAR_DUMP, archive_write_set_format_shar_dump }, + { ARCHIVE_FORMAT_TAR, archive_write_set_format_pax_restricted }, + { ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE, archive_write_set_format_pax }, + { ARCHIVE_FORMAT_TAR_PAX_RESTRICTED, + archive_write_set_format_pax_restricted }, + { ARCHIVE_FORMAT_TAR_USTAR, archive_write_set_format_ustar }, + { ARCHIVE_FORMAT_ZIP, archive_write_set_format_zip }, + { 0, NULL } +}; + +int +archive_write_set_format(struct archive *a, int code) +{ + int i; + + for (i = 0; codes[i].code != 0; i++) { + if (code == codes[i].code) + return ((codes[i].setter)(a)); + } + + archive_set_error(a, EINVAL, "No such format"); + return (ARCHIVE_FATAL); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_ar.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_ar.c new file mode 100644 index 000000000..82ef9294b --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_ar.c @@ -0,0 +1,551 @@ +/*- + * Copyright (c) 2007 Kai Wang + * Copyright (c) 2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_format_ar.c,v 1.8 2008/08/10 02:06:28 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +struct ar_w { + uint64_t entry_bytes_remaining; + uint64_t entry_padding; + int is_strtab; + int has_strtab; + char *strtab; +}; + +/* + * Define structure of the "ar" header. + */ +#define AR_name_offset 0 +#define AR_name_size 16 +#define AR_date_offset 16 +#define AR_date_size 12 +#define AR_uid_offset 28 +#define AR_uid_size 6 +#define AR_gid_offset 34 +#define AR_gid_size 6 +#define AR_mode_offset 40 +#define AR_mode_size 8 +#define AR_size_offset 48 +#define AR_size_size 10 +#define AR_fmag_offset 58 +#define AR_fmag_size 2 + +static int archive_write_set_format_ar(struct archive_write *); +static int archive_write_ar_header(struct archive_write *, + struct archive_entry *); +static ssize_t archive_write_ar_data(struct archive_write *, + const void *buff, size_t s); +static int archive_write_ar_destroy(struct archive_write *); +static int archive_write_ar_finish(struct archive_write *); +static int archive_write_ar_finish_entry(struct archive_write *); +static const char *ar_basename(const char *path); +static int format_octal(int64_t v, char *p, int s); +static int format_decimal(int64_t v, char *p, int s); + +int +archive_write_set_format_ar_bsd(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int r = archive_write_set_format_ar(a); + if (r == ARCHIVE_OK) { + a->archive.archive_format = ARCHIVE_FORMAT_AR_BSD; + a->archive.archive_format_name = "ar (BSD)"; + } + return (r); +} + +int +archive_write_set_format_ar_svr4(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int r = archive_write_set_format_ar(a); + if (r == ARCHIVE_OK) { + a->archive.archive_format = ARCHIVE_FORMAT_AR_GNU; + a->archive.archive_format_name = "ar (GNU/SVR4)"; + } + return (r); +} + +/* + * Generic initialization. + */ +static int +archive_write_set_format_ar(struct archive_write *a) +{ + struct ar_w *ar; + + /* If someone else was already registered, unregister them. */ + if (a->format_destroy != NULL) + (a->format_destroy)(a); + + ar = (struct ar_w *)malloc(sizeof(*ar)); + if (ar == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate ar data"); + return (ARCHIVE_FATAL); + } + memset(ar, 0, sizeof(*ar)); + a->format_data = ar; + + a->format_name = "ar"; + a->format_write_header = archive_write_ar_header; + a->format_write_data = archive_write_ar_data; + a->format_finish = archive_write_ar_finish; + a->format_destroy = archive_write_ar_destroy; + a->format_finish_entry = archive_write_ar_finish_entry; + return (ARCHIVE_OK); +} + +static int +archive_write_ar_header(struct archive_write *a, struct archive_entry *entry) +{ + int ret, append_fn; + char buff[60]; + char *ss, *se; + struct ar_w *ar; + const char *pathname; + const char *filename; + int64_t size; + + ret = 0; + append_fn = 0; + ar = (struct ar_w *)a->format_data; + ar->is_strtab = 0; + filename = NULL; + size = archive_entry_size(entry); + + + /* + * Reject files with empty name. + */ + pathname = archive_entry_pathname(entry); + if (*pathname == '\0') { + archive_set_error(&a->archive, EINVAL, + "Invalid filename"); + return (ARCHIVE_WARN); + } + + /* + * If we are now at the beginning of the archive, + * we need first write the ar global header. + */ + if (a->archive.file_position == 0) + (a->compressor.write)(a, "!\n", 8); + + memset(buff, ' ', 60); + strncpy(&buff[AR_fmag_offset], "`\n", 2); + + if (strcmp(pathname, "/") == 0 ) { + /* Entry is archive symbol table in GNU format */ + buff[AR_name_offset] = '/'; + goto stat; + } + if (strcmp(pathname, "__.SYMDEF") == 0) { + /* Entry is archive symbol table in BSD format */ + strncpy(buff + AR_name_offset, "__.SYMDEF", 9); + goto stat; + } + if (strcmp(pathname, "//") == 0) { + /* + * Entry is archive filename table, inform that we should + * collect strtab in next _data call. + */ + ar->is_strtab = 1; + buff[AR_name_offset] = buff[AR_name_offset + 1] = '/'; + /* + * For archive string table, only ar_size filed should + * be set. + */ + goto size; + } + + /* + * Otherwise, entry is a normal archive member. + * Strip leading paths from filenames, if any. + */ + if ((filename = ar_basename(pathname)) == NULL) { + /* Reject filenames with trailing "/" */ + archive_set_error(&a->archive, EINVAL, + "Invalid filename"); + return (ARCHIVE_WARN); + } + + if (a->archive.archive_format == ARCHIVE_FORMAT_AR_GNU) { + /* + * SVR4/GNU variant use a "/" to mark then end of the filename, + * make it possible to have embedded spaces in the filename. + * So, the longest filename here (without extension) is + * actually 15 bytes. + */ + if (strlen(filename) <= 15) { + strncpy(&buff[AR_name_offset], + filename, strlen(filename)); + buff[AR_name_offset + strlen(filename)] = '/'; + } else { + /* + * For filename longer than 15 bytes, GNU variant + * makes use of a string table and instead stores the + * offset of the real filename to in the ar_name field. + * The string table should have been written before. + */ + if (ar->has_strtab <= 0) { + archive_set_error(&a->archive, EINVAL, + "Can't find string table"); + return (ARCHIVE_WARN); + } + + se = (char *)malloc(strlen(filename) + 3); + if (se == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate filename buffer"); + return (ARCHIVE_FATAL); + } + + strncpy(se, filename, strlen(filename)); + strcpy(se + strlen(filename), "/\n"); + + ss = strstr(ar->strtab, se); + free(se); + + if (ss == NULL) { + archive_set_error(&a->archive, EINVAL, + "Invalid string table"); + return (ARCHIVE_WARN); + } + + /* + * GNU variant puts "/" followed by digits into + * ar_name field. These digits indicates the real + * filename string's offset to the string table. + */ + buff[AR_name_offset] = '/'; + if (format_decimal(ss - ar->strtab, + buff + AR_name_offset + 1, + AR_name_size - 1)) { + archive_set_error(&a->archive, ERANGE, + "string table offset too large"); + return (ARCHIVE_WARN); + } + } + } else if (a->archive.archive_format == ARCHIVE_FORMAT_AR_BSD) { + /* + * BSD variant: for any file name which is more than + * 16 chars or contains one or more embedded space(s), the + * string "#1/" followed by the ASCII length of the name is + * put into the ar_name field. The file size (stored in the + * ar_size field) is incremented by the length of the name. + * The name is then written immediately following the + * archive header. + */ + if (strlen(filename) <= 16 && strchr(filename, ' ') == NULL) { + strncpy(&buff[AR_name_offset], filename, strlen(filename)); + buff[AR_name_offset + strlen(filename)] = ' '; + } + else { + strncpy(buff + AR_name_offset, "#1/", 3); + if (format_decimal(strlen(filename), + buff + AR_name_offset + 3, + AR_name_size - 3)) { + archive_set_error(&a->archive, ERANGE, + "File name too long"); + return (ARCHIVE_WARN); + } + append_fn = 1; + size += strlen(filename); + } + } + +stat: + if (format_decimal(archive_entry_mtime(entry), buff + AR_date_offset, AR_date_size)) { + archive_set_error(&a->archive, ERANGE, + "File modification time too large"); + return (ARCHIVE_WARN); + } + if (format_decimal(archive_entry_uid(entry), buff + AR_uid_offset, AR_uid_size)) { + archive_set_error(&a->archive, ERANGE, + "Numeric user ID too large"); + return (ARCHIVE_WARN); + } + if (format_decimal(archive_entry_gid(entry), buff + AR_gid_offset, AR_gid_size)) { + archive_set_error(&a->archive, ERANGE, + "Numeric group ID too large"); + return (ARCHIVE_WARN); + } + if (format_octal(archive_entry_mode(entry), buff + AR_mode_offset, AR_mode_size)) { + archive_set_error(&a->archive, ERANGE, + "Numeric mode too large"); + return (ARCHIVE_WARN); + } + /* + * Sanity Check: A non-pseudo archive member should always be + * a regular file. + */ + if (filename != NULL && archive_entry_filetype(entry) != AE_IFREG) { + archive_set_error(&a->archive, EINVAL, + "Regular file required for non-pseudo member"); + return (ARCHIVE_WARN); + } + +size: + if (format_decimal(size, buff + AR_size_offset, AR_size_size)) { + archive_set_error(&a->archive, ERANGE, + "File size out of range"); + return (ARCHIVE_WARN); + } + + ret = (a->compressor.write)(a, buff, 60); + if (ret != ARCHIVE_OK) + return (ret); + + ar->entry_bytes_remaining = size; + ar->entry_padding = ar->entry_bytes_remaining % 2; + + if (append_fn > 0) { + ret = (a->compressor.write)(a, filename, strlen(filename)); + if (ret != ARCHIVE_OK) + return (ret); + ar->entry_bytes_remaining -= strlen(filename); + } + + return (ARCHIVE_OK); +} + +static ssize_t +archive_write_ar_data(struct archive_write *a, const void *buff, size_t s) +{ + struct ar_w *ar; + int ret; + + ar = (struct ar_w *)a->format_data; + if (s > ar->entry_bytes_remaining) + s = ar->entry_bytes_remaining; + + if (ar->is_strtab > 0) { + if (ar->has_strtab > 0) { + archive_set_error(&a->archive, EINVAL, + "More than one string tables exist"); + return (ARCHIVE_WARN); + } + + ar->strtab = (char *)malloc(s); + if (ar->strtab == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate strtab buffer"); + return (ARCHIVE_FATAL); + } + strncpy(ar->strtab, buff, s); + ar->has_strtab = 1; + } + + ret = (a->compressor.write)(a, buff, s); + if (ret != ARCHIVE_OK) + return (ret); + + ar->entry_bytes_remaining -= s; + return (s); +} + +static int +archive_write_ar_destroy(struct archive_write *a) +{ + struct ar_w *ar; + + ar = (struct ar_w *)a->format_data; + + if (ar == NULL) + return (ARCHIVE_OK); + + if (ar->has_strtab > 0) { + free(ar->strtab); + ar->strtab = NULL; + } + + free(ar); + a->format_data = NULL; + return (ARCHIVE_OK); +} + +static int +archive_write_ar_finish(struct archive_write *a) +{ + int ret; + + /* + * If we haven't written anything yet, we need to write + * the ar global header now to make it a valid ar archive. + */ + if (a->archive.file_position == 0) { + ret = (a->compressor.write)(a, "!\n", 8); + return (ret); + } + + return (ARCHIVE_OK); +} + +static int +archive_write_ar_finish_entry(struct archive_write *a) +{ + struct ar_w *ar; + int ret; + + ar = (struct ar_w *)a->format_data; + + if (ar->entry_bytes_remaining != 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Entry remaining bytes larger than 0"); + return (ARCHIVE_WARN); + } + + if (ar->entry_padding == 0) { + return (ARCHIVE_OK); + } + + if (ar->entry_padding != 1) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Padding wrong size: %d should be 1 or 0", + ar->entry_padding); + return (ARCHIVE_WARN); + } + + ret = (a->compressor.write)(a, "\n", 1); + return (ret); +} + +/* + * Format a number into the specified field using base-8. + * NB: This version is slightly different from the one in + * _ustar.c + */ +static int +format_octal(int64_t v, char *p, int s) +{ + int len; + char *h; + + len = s; + h = p; + + /* Octal values can't be negative, so use 0. */ + if (v < 0) { + while (len-- > 0) + *p++ = '0'; + return (-1); + } + + p += s; /* Start at the end and work backwards. */ + do { + *--p = (char)('0' + (v & 7)); + v >>= 3; + } while (--s > 0 && v > 0); + + if (v == 0) { + memmove(h, p, len - s); + p = h + len - s; + while (s-- > 0) + *p++ = ' '; + return (0); + } + /* If it overflowed, fill field with max value. */ + while (len-- > 0) + *p++ = '7'; + + return (-1); +} + +/* + * Format a number into the specified field using base-10. + */ +static int +format_decimal(int64_t v, char *p, int s) +{ + int len; + char *h; + + len = s; + h = p; + + /* Negative values in ar header are meaningless , so use 0. */ + if (v < 0) { + while (len-- > 0) + *p++ = '0'; + return (-1); + } + + p += s; + do { + *--p = (char)('0' + (v % 10)); + v /= 10; + } while (--s > 0 && v > 0); + + if (v == 0) { + memmove(h, p, len - s); + p = h + len - s; + while (s-- > 0) + *p++ = ' '; + return (0); + } + /* If it overflowed, fill field with max value. */ + while (len-- > 0) + *p++ = '9'; + + return (-1); +} + +static const char * +ar_basename(const char *path) +{ + const char *endp, *startp; + + endp = path + strlen(path) - 1; + /* + * For filename with trailing slash(es), we return + * NULL indicating an error. + */ + if (*endp == '/') + return (NULL); + + /* Find the start of the base */ + startp = endp; + while (startp > path && *(startp - 1) != '/') + startp--; + + return (startp); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_by_name.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_by_name.c new file mode 100644 index 000000000..db1c950e1 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_by_name.c @@ -0,0 +1,76 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_format_by_name.c,v 1.9 2008/09/01 02:50:53 kientzle Exp $"); + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_private.h" + +/* A table that maps names to functions. */ +static +struct { const char *name; int (*setter)(struct archive *); } names[] = +{ + { "ar", archive_write_set_format_ar_bsd }, + { "arbsd", archive_write_set_format_ar_bsd }, + { "argnu", archive_write_set_format_ar_svr4 }, + { "arsvr4", archive_write_set_format_ar_svr4 }, + { "cpio", archive_write_set_format_cpio }, + { "mtree", archive_write_set_format_mtree }, + { "newc", archive_write_set_format_cpio_newc }, + { "odc", archive_write_set_format_cpio }, + { "pax", archive_write_set_format_pax }, + { "posix", archive_write_set_format_pax }, + { "shar", archive_write_set_format_shar }, + { "shardump", archive_write_set_format_shar_dump }, + { "ustar", archive_write_set_format_ustar }, + { "zip", archive_write_set_format_zip }, + { NULL, NULL } +}; + +int +archive_write_set_format_by_name(struct archive *a, const char *name) +{ + int i; + + for (i = 0; names[i].name != NULL; i++) { + if (strcmp(name, names[i].name) == 0) + return ((names[i].setter)(a)); + } + + archive_set_error(a, EINVAL, "No such format '%s'", name); + return (ARCHIVE_FATAL); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio.c new file mode 100644 index 000000000..1c5bb1396 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio.c @@ -0,0 +1,271 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_format_cpio.c,v 1.14 2008/03/15 11:04:45 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +static ssize_t archive_write_cpio_data(struct archive_write *, + const void *buff, size_t s); +static int archive_write_cpio_finish(struct archive_write *); +static int archive_write_cpio_destroy(struct archive_write *); +static int archive_write_cpio_finish_entry(struct archive_write *); +static int archive_write_cpio_header(struct archive_write *, + struct archive_entry *); +static int format_octal(int64_t, void *, int); +static int64_t format_octal_recursive(int64_t, char *, int); + +struct cpio { + uint64_t entry_bytes_remaining; +}; + +struct cpio_header { + char c_magic[6]; + char c_dev[6]; + char c_ino[6]; + char c_mode[6]; + char c_uid[6]; + char c_gid[6]; + char c_nlink[6]; + char c_rdev[6]; + char c_mtime[11]; + char c_namesize[6]; + char c_filesize[11]; +}; + +/* + * Set output format to 'cpio' format. + */ +int +archive_write_set_format_cpio(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct cpio *cpio; + + /* If someone else was already registered, unregister them. */ + if (a->format_destroy != NULL) + (a->format_destroy)(a); + + cpio = (struct cpio *)malloc(sizeof(*cpio)); + if (cpio == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate cpio data"); + return (ARCHIVE_FATAL); + } + memset(cpio, 0, sizeof(*cpio)); + a->format_data = cpio; + + a->pad_uncompressed = 1; + a->format_name = "cpio"; + a->format_write_header = archive_write_cpio_header; + a->format_write_data = archive_write_cpio_data; + a->format_finish_entry = archive_write_cpio_finish_entry; + a->format_finish = archive_write_cpio_finish; + a->format_destroy = archive_write_cpio_destroy; + a->archive.archive_format = ARCHIVE_FORMAT_CPIO_POSIX; + a->archive.archive_format_name = "POSIX cpio"; + return (ARCHIVE_OK); +} + +static int +archive_write_cpio_header(struct archive_write *a, struct archive_entry *entry) +{ + struct cpio *cpio; + const char *p, *path; + int pathlength, ret; + int64_t ino; + struct cpio_header h; + + cpio = (struct cpio *)a->format_data; + ret = 0; + + path = archive_entry_pathname(entry); + pathlength = strlen(path) + 1; /* Include trailing null. */ + + memset(&h, 0, sizeof(h)); + format_octal(070707, &h.c_magic, sizeof(h.c_magic)); + format_octal(archive_entry_dev(entry), &h.c_dev, sizeof(h.c_dev)); + /* + * TODO: Generate artificial inode numbers rather than just + * re-using the ones off the disk. That way, the 18-bit c_ino + * field only limits the number of files in the archive. + */ + ino = archive_entry_ino64(entry); + if (ino < 0 || ino > 0777777) { + archive_set_error(&a->archive, ERANGE, + "large inode number truncated"); + ret = ARCHIVE_WARN; + } + + format_octal(archive_entry_ino64(entry) & 0777777, &h.c_ino, sizeof(h.c_ino)); + format_octal(archive_entry_mode(entry), &h.c_mode, sizeof(h.c_mode)); + format_octal(archive_entry_uid(entry), &h.c_uid, sizeof(h.c_uid)); + format_octal(archive_entry_gid(entry), &h.c_gid, sizeof(h.c_gid)); + format_octal(archive_entry_nlink(entry), &h.c_nlink, sizeof(h.c_nlink)); + if (archive_entry_filetype(entry) == AE_IFBLK + || archive_entry_filetype(entry) == AE_IFCHR) + format_octal(archive_entry_dev(entry), &h.c_rdev, sizeof(h.c_rdev)); + else + format_octal(0, &h.c_rdev, sizeof(h.c_rdev)); + format_octal(archive_entry_mtime(entry), &h.c_mtime, sizeof(h.c_mtime)); + format_octal(pathlength, &h.c_namesize, sizeof(h.c_namesize)); + + /* Non-regular files don't store bodies. */ + if (archive_entry_filetype(entry) != AE_IFREG) + archive_entry_set_size(entry, 0); + + /* Symlinks get the link written as the body of the entry. */ + p = archive_entry_symlink(entry); + if (p != NULL && *p != '\0') + format_octal(strlen(p), &h.c_filesize, sizeof(h.c_filesize)); + else + format_octal(archive_entry_size(entry), + &h.c_filesize, sizeof(h.c_filesize)); + + ret = (a->compressor.write)(a, &h, sizeof(h)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + + ret = (a->compressor.write)(a, path, pathlength); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + + cpio->entry_bytes_remaining = archive_entry_size(entry); + + /* Write the symlink now. */ + if (p != NULL && *p != '\0') + ret = (a->compressor.write)(a, p, strlen(p)); + + return (ret); +} + +static ssize_t +archive_write_cpio_data(struct archive_write *a, const void *buff, size_t s) +{ + struct cpio *cpio; + int ret; + + cpio = (struct cpio *)a->format_data; + if (s > cpio->entry_bytes_remaining) + s = cpio->entry_bytes_remaining; + + ret = (a->compressor.write)(a, buff, s); + cpio->entry_bytes_remaining -= s; + if (ret >= 0) + return (s); + else + return (ret); +} + +/* + * Format a number into the specified field. + */ +static int +format_octal(int64_t v, void *p, int digits) +{ + int64_t max; + int ret; + + max = (((int64_t)1) << (digits * 3)) - 1; + if (v >= 0 && v <= max) { + format_octal_recursive(v, (char *)p, digits); + ret = 0; + } else { + format_octal_recursive(max, (char *)p, digits); + ret = -1; + } + return (ret); +} + +static int64_t +format_octal_recursive(int64_t v, char *p, int s) +{ + if (s == 0) + return (v); + v = format_octal_recursive(v, p+1, s-1); + *p = '0' + (v & 7); + return (v >>= 3); +} + +static int +archive_write_cpio_finish(struct archive_write *a) +{ + struct cpio *cpio; + int er; + struct archive_entry *trailer; + + cpio = (struct cpio *)a->format_data; + trailer = archive_entry_new(); + /* nlink = 1 here for GNU cpio compat. */ + archive_entry_set_nlink(trailer, 1); + archive_entry_set_pathname(trailer, "TRAILER!!!"); + er = archive_write_cpio_header(a, trailer); + archive_entry_free(trailer); + return (er); +} + +static int +archive_write_cpio_destroy(struct archive_write *a) +{ + struct cpio *cpio; + + cpio = (struct cpio *)a->format_data; + free(cpio); + a->format_data = NULL; + return (ARCHIVE_OK); +} + +static int +archive_write_cpio_finish_entry(struct archive_write *a) +{ + struct cpio *cpio; + int to_write, ret; + + cpio = (struct cpio *)a->format_data; + ret = ARCHIVE_OK; + while (cpio->entry_bytes_remaining > 0) { + to_write = cpio->entry_bytes_remaining < a->null_length ? + cpio->entry_bytes_remaining : a->null_length; + ret = (a->compressor.write)(a, a->nulls, to_write); + if (ret != ARCHIVE_OK) + return (ret); + cpio->entry_bytes_remaining -= to_write; + } + return (ret); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio_newc.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio_newc.c new file mode 100644 index 000000000..c8a188241 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_cpio_newc.c @@ -0,0 +1,289 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * Copyright (c) 2006 Rudolf Marek SYSGO s.r.o. + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_format_cpio_newc.c,v 1.4 2008/03/15 11:04:45 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +static ssize_t archive_write_newc_data(struct archive_write *, + const void *buff, size_t s); +static int archive_write_newc_finish(struct archive_write *); +static int archive_write_newc_destroy(struct archive_write *); +static int archive_write_newc_finish_entry(struct archive_write *); +static int archive_write_newc_header(struct archive_write *, + struct archive_entry *); +static int format_hex(int64_t, void *, int); +static int64_t format_hex_recursive(int64_t, char *, int); + +struct cpio { + uint64_t entry_bytes_remaining; + int padding; +}; + +struct cpio_header_newc { + char c_magic[6]; + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_checksum[8]; +}; + +/* Logic trick: difference between 'n' and next multiple of 4 */ +#define PAD4(n) (3 & (1 + ~(n))) + +/* + * Set output format to 'cpio' format. + */ +int +archive_write_set_format_cpio_newc(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct cpio *cpio; + + /* If someone else was already registered, unregister them. */ + if (a->format_destroy != NULL) + (a->format_destroy)(a); + + cpio = (struct cpio *)malloc(sizeof(*cpio)); + if (cpio == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate cpio data"); + return (ARCHIVE_FATAL); + } + memset(cpio, 0, sizeof(*cpio)); + a->format_data = cpio; + + a->pad_uncompressed = 1; + a->format_name = "cpio"; + a->format_write_header = archive_write_newc_header; + a->format_write_data = archive_write_newc_data; + a->format_finish_entry = archive_write_newc_finish_entry; + a->format_finish = archive_write_newc_finish; + a->format_destroy = archive_write_newc_destroy; + a->archive.archive_format = ARCHIVE_FORMAT_CPIO_SVR4_NOCRC; + a->archive.archive_format_name = "SVR4 cpio nocrc"; + return (ARCHIVE_OK); +} + +static int +archive_write_newc_header(struct archive_write *a, struct archive_entry *entry) +{ + struct cpio *cpio; + const char *p, *path; + int pathlength, ret; + struct cpio_header_newc h; + int pad; + + cpio = (struct cpio *)a->format_data; + ret = 0; + + path = archive_entry_pathname(entry); + pathlength = strlen(path) + 1; /* Include trailing null. */ + + memset(&h, 0, sizeof(h)); + format_hex(0x070701, &h.c_magic, sizeof(h.c_magic)); + format_hex(archive_entry_devmajor(entry), &h.c_devmajor, sizeof(h.c_devmajor)); + format_hex(archive_entry_devminor(entry), &h.c_devminor, sizeof(h.c_devminor)); + if (archive_entry_ino64(entry) > 0xffffffff) { + archive_set_error(&a->archive, ERANGE, "large inode number truncated"); + ret = ARCHIVE_WARN; + } + + format_hex(archive_entry_ino64(entry) & 0xffffffff, &h.c_ino, sizeof(h.c_ino)); + format_hex(archive_entry_mode(entry), &h.c_mode, sizeof(h.c_mode)); + format_hex(archive_entry_uid(entry), &h.c_uid, sizeof(h.c_uid)); + format_hex(archive_entry_gid(entry), &h.c_gid, sizeof(h.c_gid)); + format_hex(archive_entry_nlink(entry), &h.c_nlink, sizeof(h.c_nlink)); + if (archive_entry_filetype(entry) == AE_IFBLK + || archive_entry_filetype(entry) == AE_IFCHR) { + format_hex(archive_entry_rdevmajor(entry), &h.c_rdevmajor, sizeof(h.c_rdevmajor)); + format_hex(archive_entry_rdevminor(entry), &h.c_rdevminor, sizeof(h.c_rdevminor)); + } else { + format_hex(0, &h.c_rdevmajor, sizeof(h.c_rdevmajor)); + format_hex(0, &h.c_rdevminor, sizeof(h.c_rdevminor)); + } + format_hex(archive_entry_mtime(entry), &h.c_mtime, sizeof(h.c_mtime)); + format_hex(pathlength, &h.c_namesize, sizeof(h.c_namesize)); + format_hex(0, &h.c_checksum, sizeof(h.c_checksum)); + + /* Non-regular files don't store bodies. */ + if (archive_entry_filetype(entry) != AE_IFREG) + archive_entry_set_size(entry, 0); + + /* Symlinks get the link written as the body of the entry. */ + p = archive_entry_symlink(entry); + if (p != NULL && *p != '\0') + format_hex(strlen(p), &h.c_filesize, sizeof(h.c_filesize)); + else + format_hex(archive_entry_size(entry), + &h.c_filesize, sizeof(h.c_filesize)); + + ret = (a->compressor.write)(a, &h, sizeof(h)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + + /* Pad pathname to even length. */ + ret = (a->compressor.write)(a, path, pathlength); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + pad = PAD4(pathlength + sizeof(struct cpio_header_newc)); + if (pad) + ret = (a->compressor.write)(a, "\0\0\0", pad); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + + cpio->entry_bytes_remaining = archive_entry_size(entry); + cpio->padding = PAD4(cpio->entry_bytes_remaining); + + /* Write the symlink now. */ + if (p != NULL && *p != '\0') { + ret = (a->compressor.write)(a, p, strlen(p)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + pad = PAD4(strlen(p)); + ret = (a->compressor.write)(a, "\0\0\0", pad); + } + + return (ret); +} + +static ssize_t +archive_write_newc_data(struct archive_write *a, const void *buff, size_t s) +{ + struct cpio *cpio; + int ret; + + cpio = (struct cpio *)a->format_data; + if (s > cpio->entry_bytes_remaining) + s = cpio->entry_bytes_remaining; + + ret = (a->compressor.write)(a, buff, s); + cpio->entry_bytes_remaining -= s; + if (ret >= 0) + return (s); + else + return (ret); +} + +/* + * Format a number into the specified field. + */ +static int +format_hex(int64_t v, void *p, int digits) +{ + int64_t max; + int ret; + + max = (((int64_t)1) << (digits * 4)) - 1; + if (v >= 0 && v <= max) { + format_hex_recursive(v, (char *)p, digits); + ret = 0; + } else { + format_hex_recursive(max, (char *)p, digits); + ret = -1; + } + return (ret); +} + +static int64_t +format_hex_recursive(int64_t v, char *p, int s) +{ + if (s == 0) + return (v); + v = format_hex_recursive(v, p+1, s-1); + *p = "0123456789abcdef"[v & 0xf]; + return (v >>= 4); +} + +static int +archive_write_newc_finish(struct archive_write *a) +{ + struct cpio *cpio; + int er; + struct archive_entry *trailer; + + cpio = (struct cpio *)a->format_data; + trailer = archive_entry_new(); + archive_entry_set_nlink(trailer, 1); + archive_entry_set_pathname(trailer, "TRAILER!!!"); + er = archive_write_newc_header(a, trailer); + archive_entry_free(trailer); + return (er); +} + +static int +archive_write_newc_destroy(struct archive_write *a) +{ + struct cpio *cpio; + + cpio = (struct cpio *)a->format_data; + free(cpio); + a->format_data = NULL; + return (ARCHIVE_OK); +} + +static int +archive_write_newc_finish_entry(struct archive_write *a) +{ + struct cpio *cpio; + int to_write, ret; + + cpio = (struct cpio *)a->format_data; + ret = ARCHIVE_OK; + while (cpio->entry_bytes_remaining > 0) { + to_write = cpio->entry_bytes_remaining < a->null_length ? + cpio->entry_bytes_remaining : a->null_length; + ret = (a->compressor.write)(a, a->nulls, to_write); + if (ret != ARCHIVE_OK) + return (ret); + cpio->entry_bytes_remaining -= to_write; + } + ret = (a->compressor.write)(a, a->nulls, cpio->padding); + return (ret); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c new file mode 100644 index 000000000..68dc92b56 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_mtree.c @@ -0,0 +1,1050 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2008 Joerg Sonnenberger + * 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 "archive_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include +#include +#include + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +#include "archive_hash.h" + +#define INDENTNAMELEN 15 +#define MAXLINELEN 80 + +struct mtree_writer { + struct archive_entry *entry; + struct archive_string ebuf; + struct archive_string buf; + int first; + uint64_t entry_bytes_remaining; + struct { + int output; + int processed; + struct archive_string parent; + mode_t type; + int keys; + uid_t uid; + gid_t gid; + mode_t mode; + unsigned long fflags_set; + unsigned long fflags_clear; + } set; + /* chekc sum */ + int compute_sum; + uint32_t crc; + uint64_t crc_len; +#ifdef ARCHIVE_HAS_MD5 + archive_md5_ctx md5ctx; +#endif +#ifdef ARCHIVE_HAS_RMD160 + archive_rmd160_ctx rmd160ctx; +#endif +#ifdef ARCHIVE_HAS_SHA1 + archive_sha1_ctx sha1ctx; +#endif +#ifdef ARCHIVE_HAS_SHA256 + archive_sha256_ctx sha256ctx; +#endif +#ifdef ARCHIVE_HAS_SHA384 + archive_sha384_ctx sha384ctx; +#endif +#ifdef ARCHIVE_HAS_SHA512 + archive_sha512_ctx sha512ctx; +#endif + /* Keyword options */ + int keys; +#define F_CKSUM 0x00000001 /* check sum */ +#define F_DEV 0x00000002 /* device type */ +#define F_DONE 0x00000004 /* directory done */ +#define F_FLAGS 0x00000008 /* file flags */ +#define F_GID 0x00000010 /* gid */ +#define F_GNAME 0x00000020 /* group name */ +#define F_IGN 0x00000040 /* ignore */ +#define F_MAGIC 0x00000080 /* name has magic chars */ +#define F_MD5 0x00000100 /* MD5 digest */ +#define F_MODE 0x00000200 /* mode */ +#define F_NLINK 0x00000400 /* number of links */ +#define F_NOCHANGE 0x00000800 /* If owner/mode "wrong", do + * not change */ +#define F_OPT 0x00001000 /* existence optional */ +#define F_RMD160 0x00002000 /* RIPEMD160 digest */ +#define F_SHA1 0x00004000 /* SHA-1 digest */ +#define F_SIZE 0x00008000 /* size */ +#define F_SLINK 0x00010000 /* symbolic link */ +#define F_TAGS 0x00020000 /* tags */ +#define F_TIME 0x00040000 /* modification time */ +#define F_TYPE 0x00080000 /* file type */ +#define F_UID 0x00100000 /* uid */ +#define F_UNAME 0x00200000 /* user name */ +#define F_VISIT 0x00400000 /* file visited */ +#define F_SHA256 0x00800000 /* SHA-256 digest */ +#define F_SHA384 0x01000000 /* SHA-384 digest */ +#define F_SHA512 0x02000000 /* SHA-512 digest */ + + /* Options */ + int dironly; /* if the dironly is 1, ignore everything except + * directory type files. like mtree(8) -d option. + */ + int indent; /* if the indent is 1, indent writing data. */ +}; + +#define DEFAULT_KEYS (F_DEV | F_FLAGS | F_GID | F_GNAME | F_SLINK | F_MODE\ + | F_NLINK | F_SIZE | F_TIME | F_TYPE | F_UID\ + | F_UNAME) + +#define COMPUTE_CRC(var, ch) (var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)] +static const uint32_t crctab[] = { + 0x0, + 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, + 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, + 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, + 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, + 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, + 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, + 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, + 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, + 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, + 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, + 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, + 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, + 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, + 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, + 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, + 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, + 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, + 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, + 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, + 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, + 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, + 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, + 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, + 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, + 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, + 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, + 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, + 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, + 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, + 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, + 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, + 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, + 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, + 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, + 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, + 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, + 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, + 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, + 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, + 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, + 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, + 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, + 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, + 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, + 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, + 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, + 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 +}; + +static int +mtree_safe_char(char c) +{ + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) + return 1; + if (c >= '0' && c <= '9') + return 1; + if (c == 35 || c == 61 || c == 92) + return 0; /* #, = and \ are always quoted */ + + if (c >= 33 && c <= 47) /* !"$%&'()*+,-./ */ + return 1; + if (c >= 58 && c <= 64) /* :;<>?@ */ + return 1; + if (c >= 91 && c <= 96) /* []^_` */ + return 1; + if (c >= 123 && c <= 126) /* {|}~ */ + return 1; + return 0; +} + +static void +mtree_quote(struct archive_string *s, const char *str) +{ + const char *start; + char buf[4]; + unsigned char c; + + for (start = str; *str != '\0'; ++str) { + if (mtree_safe_char(*str)) + continue; + if (start != str) + archive_strncat(s, start, str - start); + c = (unsigned char)*str; + buf[0] = '\\'; + buf[1] = (c / 64) + '0'; + buf[2] = (c / 8 % 8) + '0'; + buf[3] = (c % 8) + '0'; + archive_strncat(s, buf, 4); + start = str + 1; + } + + if (start != str) + archive_strncat(s, start, str - start); +} + +static void +mtree_indent(struct mtree_writer *mtree) +{ + int i, fn; + const char *r, *s, *x; + + fn = 1; + s = r = mtree->ebuf.s; + x = NULL; + while (*r == ' ') + r++; + while ((r = strchr(r, ' ')) != NULL) { + if (fn) { + fn = 0; + archive_strncat(&mtree->buf, s, r - s); + if (r -s > INDENTNAMELEN) { + archive_strncat(&mtree->buf, " \\\n", 3); + for (i = 0; i < (INDENTNAMELEN + 1); i++) + archive_strappend_char(&mtree->buf, ' '); + } else { + for (i = r -s; i < (INDENTNAMELEN + 1); i++) + archive_strappend_char(&mtree->buf, ' '); + } + s = ++r; + x = NULL; + continue; + } + if (r - s <= MAXLINELEN - 3 - INDENTNAMELEN) + x = r++; + else { + if (x == NULL) + x = r; + archive_strncat(&mtree->buf, s, x - s); + archive_strncat(&mtree->buf, " \\\n", 3); + for (i = 0; i < (INDENTNAMELEN + 1); i++) + archive_strappend_char(&mtree->buf, ' '); + s = r = ++x; + x = NULL; + } + } + if (x != NULL && strlen(s) > MAXLINELEN - 3 - INDENTNAMELEN) { + /* Last keyword is longer. */ + archive_strncat(&mtree->buf, s, x - s); + archive_strncat(&mtree->buf, " \\\n", 3); + for (i = 0; i < (INDENTNAMELEN + 1); i++) + archive_strappend_char(&mtree->buf, ' '); + s = ++x; + } + archive_strcat(&mtree->buf, s); + archive_string_empty(&mtree->ebuf); +} + +#if !defined(_WIN32) || defined(__CYGWIN__) +static size_t +dir_len(struct archive_entry *entry) +{ + const char *path, *r; + + path = archive_entry_pathname(entry); + r = strrchr(path, '/'); + if (r == NULL) + return (0); + /* Include a separator size */ + return (r - path + 1); +} + +#else /* _WIN32 && !__CYGWIN__ */ +/* + * Note: We should use wide-character for findng '\' character, + * a directory separator on Windows, because some character-set have + * been using the '\' character for a part of its multibyte character + * code. + */ +static size_t +dir_len(struct archive_entry *entry) +{ + wchar_t wc; + const char *path; + const char *p, *rp; + size_t al, l, size; + + path = archive_entry_pathname(entry); + al = l = -1; + for (p = path; *p != '\0'; ++p) { + if (*p == '\\') + al = l = p - path; + else if (*p == '/') + al = p - path; + } + if (l == -1) + goto alen; + size = p - path; + rp = p = path; + while (*p != '\0') { + l = mbtowc(&wc, p, size); + if (l == -1) + goto alen; + if (l == 1 && (wc == L'/' || wc == L'\\')) + rp = p; + p += l; + size -= l; + } + return (rp - path + 1); +alen: + if (al == -1) + return (0); + return (al + 1); +} +#endif /* _WIN32 && !__CYGWIN__ */ + +static int +parent_dir_changed(struct archive_string *dir, struct archive_entry *entry) +{ + const char *path; + size_t l; + + l = dir_len(entry); + path = archive_entry_pathname(entry); + if (archive_strlen(dir) > 0) { + if (l == 0) { + archive_string_empty(dir); + return (1); + } + if (strncmp(dir->s, path, l) == 0) + return (0); /* The parent directory is the same. */ + } else if (l == 0) + return (0); /* The parent directory is the same. */ + archive_strncpy(dir, path, l); + return (1); +} + +/* + * Write /set keyword. It means set global datas. + * [directory-only mode] + * - It is only once to write /set keyword. It is using values of the + * first entry. + * [normal mode] + * - Write /set keyword. It is using values of the first entry whose + * filetype is a regular file. + * - When a parent directory of the entry whose filetype is the regular + * file is changed, check the global datas and write it again if its + * values are different from the entry's. + */ +static void +set_global(struct mtree_writer *mtree, struct archive_entry *entry) +{ + struct archive_string setstr; + struct archive_string unsetstr; + const char *name; + int keys, oldkeys, effkeys; + mode_t set_type = 0; + + switch (archive_entry_filetype(entry)) { + case AE_IFLNK: case AE_IFSOCK: case AE_IFCHR: + case AE_IFBLK: case AE_IFIFO: + break; + case AE_IFDIR: + if (mtree->dironly) + set_type = AE_IFDIR; + break; + case AE_IFREG: + default: /* Handle unknown file types as regular files. */ + if (!mtree->dironly) + set_type = AE_IFREG; + break; + } + if (set_type == 0) + return; + if (mtree->set.processed && + !parent_dir_changed(&mtree->set.parent, entry)) + return; + /* At first, save a parent directory of the entry for following + * entries. */ + if (!mtree->set.processed && set_type == AE_IFREG) + parent_dir_changed(&mtree->set.parent, entry); + + archive_string_init(&setstr); + archive_string_init(&unsetstr); + keys = mtree->keys & (F_FLAGS | F_GID | F_GNAME | F_NLINK | F_MODE + | F_TYPE | F_UID | F_UNAME); + oldkeys = mtree->set.keys; + effkeys = keys; + if (mtree->set.processed) { + /* + * Check the global datas for whether it needs updating. + */ + effkeys &= ~F_TYPE; + if ((oldkeys & (F_UNAME | F_UID)) != 0 && + mtree->set.uid == archive_entry_uid(entry)) + effkeys &= ~(F_UNAME | F_UID); + if ((oldkeys & (F_GNAME | F_GID)) != 0 && + mtree->set.gid == archive_entry_gid(entry)) + effkeys &= ~(F_GNAME | F_GID); + if ((oldkeys & F_MODE) != 0 && + mtree->set.mode == (archive_entry_mode(entry) & 07777)) + effkeys &= ~F_MODE; + if ((oldkeys & F_FLAGS) != 0) { + unsigned long fflags_set; + unsigned long fflags_clear; + + archive_entry_fflags(entry, &fflags_set, &fflags_clear); + if (fflags_set == mtree->set.fflags_set && + fflags_clear == mtree->set.fflags_clear) + effkeys &= ~F_FLAGS; + } + } + if ((keys & effkeys & F_TYPE) != 0) { + mtree->set.type = set_type; + if (set_type == AE_IFDIR) + archive_strcat(&setstr, " type=dir"); + else + archive_strcat(&setstr, " type=file"); + } + if ((keys & effkeys & F_UNAME) != 0) { + if ((name = archive_entry_uname(entry)) != NULL) { + archive_strcat(&setstr, " uname="); + mtree_quote(&setstr, name); + } else if ((oldkeys & F_UNAME) != 0) + archive_strcat(&unsetstr, " uname"); + else + keys &= ~F_UNAME; + } + if ((keys & effkeys & F_UID) != 0) { + mtree->set.uid = archive_entry_uid(entry); + archive_string_sprintf(&setstr, " uid=%jd", + (intmax_t)mtree->set.uid); + } + if ((keys & effkeys & F_GNAME) != 0) { + if ((name = archive_entry_gname(entry)) != NULL) { + archive_strcat(&setstr, " gname="); + mtree_quote(&setstr, name); + } else if ((oldkeys & F_GNAME) != 0) + archive_strcat(&unsetstr, " gname"); + else + keys &= ~F_GNAME; + } + if ((keys & effkeys & F_GID) != 0) { + mtree->set.gid = archive_entry_gid(entry); + archive_string_sprintf(&setstr, " gid=%jd", + (intmax_t)mtree->set.gid); + } + if ((keys & effkeys & F_MODE) != 0) { + mtree->set.mode = archive_entry_mode(entry) & 07777; + archive_string_sprintf(&setstr, " mode=%o", mtree->set.mode); + } + if ((keys & effkeys & F_FLAGS) != 0) { + if ((name = archive_entry_fflags_text(entry)) != NULL) { + archive_strcat(&setstr, " flags="); + mtree_quote(&setstr, name); + archive_entry_fflags(entry, &mtree->set.fflags_set, + &mtree->set.fflags_clear); + } else if ((oldkeys & F_FLAGS) != 0) + archive_strcat(&unsetstr, " flags"); + else + keys &= ~F_FLAGS; + } + if (unsetstr.length > 0) + archive_string_sprintf(&mtree->buf, "/unset%s\n", unsetstr.s); + archive_string_free(&unsetstr); + if (setstr.length > 0) + archive_string_sprintf(&mtree->buf, "/set%s\n", setstr.s); + archive_string_free(&setstr); + mtree->set.keys = keys; + mtree->set.processed = 1; + /* On directory-only mode, it is only once to write /set keyword. */ + if (mtree->dironly) + mtree->set.output = 0; +} + +static int +get_keys(struct mtree_writer *mtree, struct archive_entry *entry) +{ + int keys; + + keys = mtree->keys; + if (mtree->set.keys == 0) + return (keys); + if ((mtree->set.keys & (F_GNAME | F_GID)) != 0 && + mtree->set.gid == archive_entry_gid(entry)) + keys &= ~(F_GNAME | F_GID); + if ((mtree->set.keys & (F_UNAME | F_UID)) != 0 && + mtree->set.uid == archive_entry_uid(entry)) + keys &= ~(F_UNAME | F_UID); + if (mtree->set.keys & F_FLAGS) { + unsigned long set, clear; + + archive_entry_fflags(entry, &set, &clear); + if (mtree->set.fflags_set == set && + mtree->set.fflags_clear == clear) + keys &= ~F_FLAGS; + } + if ((mtree->set.keys & F_MODE) != 0 && + mtree->set.mode == (archive_entry_mode(entry) & 07777)) + keys &= ~F_MODE; + + switch (archive_entry_filetype(entry)) { + case AE_IFLNK: case AE_IFSOCK: case AE_IFCHR: + case AE_IFBLK: case AE_IFIFO: + break; + case AE_IFDIR: + if ((mtree->set.keys & F_TYPE) != 0 && + mtree->set.type == AE_IFDIR) + keys &= ~F_TYPE; + break; + case AE_IFREG: + default: /* Handle unknown file types as regular files. */ + if ((mtree->set.keys & F_TYPE) != 0 && + mtree->set.type == AE_IFREG) + keys &= ~F_TYPE; + break; + } + + return (keys); +} + +static int +archive_write_mtree_header(struct archive_write *a, + struct archive_entry *entry) +{ + struct mtree_writer *mtree= a->format_data; + struct archive_string *str; + const char *path; + + mtree->entry = archive_entry_clone(entry); + path = archive_entry_pathname(mtree->entry); + + if (mtree->first) { + mtree->first = 0; + archive_strcat(&mtree->buf, "#mtree\n"); + } + if (mtree->set.output) + set_global(mtree, entry); + + archive_string_empty(&mtree->ebuf); + str = (mtree->indent)? &mtree->ebuf : &mtree->buf; + if (!mtree->dironly || archive_entry_filetype(entry) == AE_IFDIR) + mtree_quote(str, path); + + mtree->entry_bytes_remaining = archive_entry_size(entry); + if ((mtree->keys & F_CKSUM) != 0 && + archive_entry_filetype(entry) == AE_IFREG) { + mtree->compute_sum |= F_CKSUM; + mtree->crc = 0; + mtree->crc_len = 0; + } else + mtree->compute_sum &= ~F_CKSUM; +#ifdef ARCHIVE_HAS_MD5 + if ((mtree->keys & F_MD5) != 0 && + archive_entry_filetype(entry) == AE_IFREG) { + mtree->compute_sum |= F_MD5; + archive_md5_init(&mtree->md5ctx); + } else + mtree->compute_sum &= ~F_MD5; +#endif +#ifdef ARCHIVE_HAS_RMD160 + if ((mtree->keys & F_RMD160) != 0 && + archive_entry_filetype(entry) == AE_IFREG) { + mtree->compute_sum |= F_RMD160; + archive_rmd160_init(&mtree->rmd160ctx); + } else + mtree->compute_sum &= ~F_RMD160; +#endif +#ifdef ARCHIVE_HAS_SHA1 + if ((mtree->keys & F_SHA1) != 0 && + archive_entry_filetype(entry) == AE_IFREG) { + mtree->compute_sum |= F_SHA1; + archive_sha1_init(&mtree->sha1ctx); + } else + mtree->compute_sum &= ~F_SHA1; +#endif +#ifdef ARCHIVE_HAS_SHA256 + if ((mtree->keys & F_SHA256) != 0 && + archive_entry_filetype(entry) == AE_IFREG) { + mtree->compute_sum |= F_SHA256; + archive_sha256_init(&mtree->sha256ctx); + } else + mtree->compute_sum &= ~F_SHA256; +#endif +#ifdef ARCHIVE_HAS_SHA384 + if ((mtree->keys & F_SHA384) != 0 && + archive_entry_filetype(entry) == AE_IFREG) { + mtree->compute_sum |= F_SHA384; + archive_sha384_init(&mtree->sha384ctx); + } else + mtree->compute_sum &= ~F_SHA384; +#endif +#ifdef ARCHIVE_HAS_SHA512 + if ((mtree->keys & F_SHA512) != 0 && + archive_entry_filetype(entry) == AE_IFREG) { + mtree->compute_sum |= F_SHA512; + archive_sha512_init(&mtree->sha512ctx); + } else + mtree->compute_sum &= ~F_SHA512; +#endif + + return (ARCHIVE_OK); +} + +#if defined(ARCHIVE_HAS_MD5) || defined(ARCHIVE_HAS_RMD160) || \ + defined(ARCHIVE_HAS_SHA1) || defined(ARCHIVE_HAS_SHA256) || \ + defined(ARCHIVE_HAS_SHA384) || defined(ARCHIVE_HAS_SHA512) +static void +strappend_bin(struct archive_string *s, const unsigned char *bin, int n) +{ + static const char hex[] = "0123456789abcdef"; + int i; + + for (i = 0; i < n; i++) { + archive_strappend_char(s, hex[bin[i] >> 4]); + archive_strappend_char(s, hex[bin[i] & 0x0f]); + } +} +#endif + +static int +archive_write_mtree_finish_entry(struct archive_write *a) +{ + struct mtree_writer *mtree = a->format_data; + struct archive_entry *entry; + struct archive_string *str; + const char *name; + int keys, ret; + + entry = mtree->entry; + if (entry == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, + "Finished entry without being open first."); + return (ARCHIVE_FATAL); + } + mtree->entry = NULL; + + if (mtree->dironly && archive_entry_filetype(entry) != AE_IFDIR) { + archive_entry_free(entry); + return (ARCHIVE_OK); + } + + str = (mtree->indent)? &mtree->ebuf : &mtree->buf; + keys = get_keys(mtree, entry); + if ((keys & F_NLINK) != 0 && + archive_entry_nlink(entry) != 1 && + archive_entry_filetype(entry) != AE_IFDIR) + archive_string_sprintf(str, + " nlink=%u", archive_entry_nlink(entry)); + + if ((keys & F_GNAME) != 0 && + (name = archive_entry_gname(entry)) != NULL) { + archive_strcat(str, " gname="); + mtree_quote(str, name); + } + if ((keys & F_UNAME) != 0 && + (name = archive_entry_uname(entry)) != NULL) { + archive_strcat(str, " uname="); + mtree_quote(str, name); + } + if ((keys & F_FLAGS) != 0 && + (name = archive_entry_fflags_text(entry)) != NULL) { + archive_strcat(str, " flags="); + mtree_quote(str, name); + } + if ((keys & F_TIME) != 0) + archive_string_sprintf(str, " time=%jd.%jd", + (intmax_t)archive_entry_mtime(entry), + (intmax_t)archive_entry_mtime_nsec(entry)); + if ((keys & F_MODE) != 0) + archive_string_sprintf(str, " mode=%o", + archive_entry_mode(entry) & 07777); + if ((keys & F_GID) != 0) + archive_string_sprintf(str, " gid=%jd", + (intmax_t)archive_entry_gid(entry)); + if ((keys & F_UID) != 0) + archive_string_sprintf(str, " uid=%jd", + (intmax_t)archive_entry_uid(entry)); + + switch (archive_entry_filetype(entry)) { + case AE_IFLNK: + if ((keys & F_TYPE) != 0) + archive_strcat(str, " type=link"); + if ((keys & F_SLINK) != 0) { + archive_strcat(str, " link="); + mtree_quote(str, archive_entry_symlink(entry)); + } + break; + case AE_IFSOCK: + if ((keys & F_TYPE) != 0) + archive_strcat(str, " type=socket"); + break; + case AE_IFCHR: + if ((keys & F_TYPE) != 0) + archive_strcat(str, " type=char"); + if ((keys & F_DEV) != 0) { + archive_string_sprintf(str, + " device=native,%d,%d", + archive_entry_rdevmajor(entry), + archive_entry_rdevminor(entry)); + } + break; + case AE_IFBLK: + if ((keys & F_TYPE) != 0) + archive_strcat(str, " type=block"); + if ((keys & F_DEV) != 0) { + archive_string_sprintf(str, + " device=native,%d,%d", + archive_entry_rdevmajor(entry), + archive_entry_rdevminor(entry)); + } + break; + case AE_IFDIR: + if ((keys & F_TYPE) != 0) + archive_strcat(str, " type=dir"); + break; + case AE_IFIFO: + if ((keys & F_TYPE) != 0) + archive_strcat(str, " type=fifo"); + break; + case AE_IFREG: + default: /* Handle unknown file types as regular files. */ + if ((keys & F_TYPE) != 0) + archive_strcat(str, " type=file"); + if ((keys & F_SIZE) != 0) + archive_string_sprintf(str, " size=%jd", + (intmax_t)archive_entry_size(entry)); + break; + } + + if (mtree->compute_sum & F_CKSUM) { + uint64_t len; + /* Include the length of the file. */ + for (len = mtree->crc_len; len != 0; len >>= 8) + COMPUTE_CRC(mtree->crc, len & 0xff); + mtree->crc = ~mtree->crc; + archive_string_sprintf(str, " cksum=%ju", + (uintmax_t)mtree->crc); + } +#ifdef ARCHIVE_HAS_MD5 + if (mtree->compute_sum & F_MD5) { + unsigned char buf[16]; + + archive_md5_final(&mtree->md5ctx, buf); + archive_strcat(str, " md5digest="); + strappend_bin(str, buf, sizeof(buf)); + } +#endif +#ifdef ARCHIVE_HAS_RMD160 + if (mtree->compute_sum & F_RMD160) { + unsigned char buf[20]; + + archive_rmd160_final(&mtree->rmd160ctx, buf); + archive_strcat(str, " rmd160digest="); + strappend_bin(str, buf, sizeof(buf)); + } +#endif +#ifdef ARCHIVE_HAS_SHA1 + if (mtree->compute_sum & F_SHA1) { + unsigned char buf[20]; + + archive_sha1_final(&mtree->sha1ctx, buf); + archive_strcat(str, " sha1digest="); + strappend_bin(str, buf, sizeof(buf)); + } +#endif +#ifdef ARCHIVE_HAS_SHA256 + if (mtree->compute_sum & F_SHA256) { + unsigned char buf[32]; + + archive_sha256_final(&mtree->sha256ctx, buf); + archive_strcat(str, " sha256digest="); + strappend_bin(str, buf, sizeof(buf)); + } +#endif +#ifdef ARCHIVE_HAS_SHA384 + if (mtree->compute_sum & F_SHA384) { + unsigned char buf[48]; + + archive_sha384_final(&mtree->sha384ctx, buf); + archive_strcat(str, " sha384digest="); + strappend_bin(str, buf, sizeof(buf)); + } +#endif +#ifdef ARCHIVE_HAS_SHA512 + if (mtree->compute_sum & F_SHA512) { + unsigned char buf[64]; + + archive_sha512_final(&mtree->sha512ctx, buf); + archive_strcat(str, " sha512digest="); + strappend_bin(str, buf, sizeof(buf)); + } +#endif + archive_strcat(str, "\n"); + if (mtree->indent) + mtree_indent(mtree); + + archive_entry_free(entry); + + if (mtree->buf.length > 32768) { + ret = (a->compressor.write)(a, mtree->buf.s, mtree->buf.length); + archive_string_empty(&mtree->buf); + } else + ret = ARCHIVE_OK; + + return (ret == ARCHIVE_OK ? ret : ARCHIVE_FATAL); +} + +static int +archive_write_mtree_finish(struct archive_write *a) +{ + struct mtree_writer *mtree= a->format_data; + + archive_write_set_bytes_in_last_block(&a->archive, 1); + + return (a->compressor.write)(a, mtree->buf.s, mtree->buf.length); +} + +static ssize_t +archive_write_mtree_data(struct archive_write *a, const void *buff, size_t n) +{ + struct mtree_writer *mtree= a->format_data; + + if (n > mtree->entry_bytes_remaining) + n = mtree->entry_bytes_remaining; + if (mtree->dironly) + /* We don't need compute a regular file sum */ + return (n); + if (mtree->compute_sum & F_CKSUM) { + /* + * Compute a POSIX 1003.2 checksum + */ + const unsigned char *p; + int nn; + + for (nn = n, p = buff; nn--; ++p) + COMPUTE_CRC(mtree->crc, *p); + mtree->crc_len += n; + } +#ifdef ARCHIVE_HAS_MD5 + if (mtree->compute_sum & F_MD5) + archive_md5_update(&mtree->md5ctx, buff, n); +#endif +#ifdef ARCHIVE_HAS_RMD160 + if (mtree->compute_sum & F_RMD160) + archive_rmd160_update(&mtree->rmd160ctx, buff, n); +#endif +#ifdef ARCHIVE_HAS_SHA1 + if (mtree->compute_sum & F_SHA1) + archive_sha1_update(&mtree->sha1ctx, buff, n); +#endif +#ifdef ARCHIVE_HAS_SHA256 + if (mtree->compute_sum & F_SHA256) + archive_sha256_update(&mtree->sha256ctx, buff, n); +#endif +#ifdef ARCHIVE_HAS_SHA384 + if (mtree->compute_sum & F_SHA384) + archive_sha384_update(&mtree->sha384ctx, buff, n); +#endif +#ifdef ARCHIVE_HAS_SHA512 + if (mtree->compute_sum & F_SHA512) + archive_sha512_update(&mtree->sha512ctx, buff, n); +#endif + return (n); +} + +static int +archive_write_mtree_destroy(struct archive_write *a) +{ + struct mtree_writer *mtree= a->format_data; + + if (mtree == NULL) + return (ARCHIVE_OK); + + archive_entry_free(mtree->entry); + archive_string_free(&mtree->ebuf); + archive_string_free(&mtree->buf); + archive_string_free(&mtree->set.parent); + free(mtree); + a->format_data = NULL; + return (ARCHIVE_OK); +} + +static int +archive_write_mtree_options(struct archive_write *a, const char *key, + const char *value) +{ + struct mtree_writer *mtree= a->format_data; + int keybit = 0; + + switch (key[0]) { + case 'a': + if (strcmp(key, "all") == 0) + keybit = ~0; + break; + case 'c': + if (strcmp(key, "cksum") == 0) + keybit = F_CKSUM; + break; + case 'd': + if (strcmp(key, "device") == 0) + keybit = F_DEV; + else if (strcmp(key, "dironly") == 0) { + mtree->dironly = (value != NULL)? 1: 0; + return (ARCHIVE_OK); + } + break; + case 'f': + if (strcmp(key, "flags") == 0) + keybit = F_FLAGS; + break; + case 'g': + if (strcmp(key, "gid") == 0) + keybit = F_GID; + else if (strcmp(key, "gname") == 0) + keybit = F_GNAME; + break; + case 'i': + if (strcmp(key, "indent") == 0) { + mtree->indent = (value != NULL)? 1: 0; + return (ARCHIVE_OK); + } + break; + case 'l': + if (strcmp(key, "link") == 0) + keybit = F_SLINK; + break; + case 'm': + if (strcmp(key, "md5") == 0 || + strcmp(key, "md5digest") == 0) + keybit = F_MD5; + if (strcmp(key, "mode") == 0) + keybit = F_MODE; + break; + case 'n': + if (strcmp(key, "nlink") == 0) + keybit = F_NLINK; + break; + case 'r': + if (strcmp(key, "ripemd160digest") == 0 || + strcmp(key, "rmd160") == 0 || + strcmp(key, "rmd160digest") == 0) + keybit = F_RMD160; + break; + case 's': + if (strcmp(key, "sha1") == 0 || + strcmp(key, "sha1digest") == 0) + keybit = F_SHA1; + if (strcmp(key, "sha256") == 0 || + strcmp(key, "sha256digest") == 0) + keybit = F_SHA256; + if (strcmp(key, "sha384") == 0 || + strcmp(key, "sha384digest") == 0) + keybit = F_SHA384; + if (strcmp(key, "sha512") == 0 || + strcmp(key, "sha512digest") == 0) + keybit = F_SHA512; + if (strcmp(key, "size") == 0) + keybit = F_SIZE; + break; + case 't': + if (strcmp(key, "time") == 0) + keybit = F_TIME; + else if (strcmp(key, "type") == 0) + keybit = F_TYPE; + break; + case 'u': + if (strcmp(key, "uid") == 0) + keybit = F_UID; + else if (strcmp(key, "uname") == 0) + keybit = F_UNAME; + else if (strcmp(key, "use-set") == 0) { + mtree->set.output = (value != NULL)? 1: 0; + return (ARCHIVE_OK); + } + break; + } + if (keybit != 0) { + if (value != NULL) + mtree->keys |= keybit; + else + mtree->keys &= ~keybit; + return (ARCHIVE_OK); + } + + return (ARCHIVE_WARN); +} + +int +archive_write_set_format_mtree(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct mtree_writer *mtree; + + if (a->format_destroy != NULL) + (a->format_destroy)(a); + + if ((mtree = malloc(sizeof(*mtree))) == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate mtree data"); + return (ARCHIVE_FATAL); + } + + mtree->entry = NULL; + mtree->first = 1; + memset(&(mtree->set), 0, sizeof(mtree->set)); + archive_string_init(&mtree->set.parent); + mtree->keys = DEFAULT_KEYS; + mtree->dironly = 0; + mtree->indent = 0; + archive_string_init(&mtree->ebuf); + archive_string_init(&mtree->buf); + a->format_data = mtree; + a->format_destroy = archive_write_mtree_destroy; + + a->pad_uncompressed = 0; + a->format_name = "mtree"; + a->format_options = archive_write_mtree_options; + a->format_write_header = archive_write_mtree_header; + a->format_finish = archive_write_mtree_finish; + a->format_write_data = archive_write_mtree_data; + a->format_finish_entry = archive_write_mtree_finish_entry; + a->archive.archive_format = ARCHIVE_FORMAT_MTREE; + a->archive.archive_format_name = "mtree"; + + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c new file mode 100644 index 000000000..7dee2c9a1 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_pax.c @@ -0,0 +1,1393 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_format_pax.c,v 1.49 2008/09/30 03:57:07 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +struct pax { + uint64_t entry_bytes_remaining; + uint64_t entry_padding; + struct archive_string pax_header; +}; + +static void add_pax_attr(struct archive_string *, const char *key, + const char *value); +static void add_pax_attr_int(struct archive_string *, + const char *key, int64_t value); +static void add_pax_attr_time(struct archive_string *, + const char *key, int64_t sec, + unsigned long nanos); +static void add_pax_attr_w(struct archive_string *, + const char *key, const wchar_t *wvalue); +static ssize_t archive_write_pax_data(struct archive_write *, + const void *, size_t); +static int archive_write_pax_finish(struct archive_write *); +static int archive_write_pax_destroy(struct archive_write *); +static int archive_write_pax_finish_entry(struct archive_write *); +static int archive_write_pax_header(struct archive_write *, + struct archive_entry *); +static char *base64_encode(const char *src, size_t len); +static char *build_pax_attribute_name(char *dest, const char *src); +static char *build_ustar_entry_name(char *dest, const char *src, + size_t src_length, const char *insert); +static char *format_int(char *dest, int64_t); +static int has_non_ASCII(const wchar_t *); +static char *url_encode(const char *in); +static int write_nulls(struct archive_write *, size_t); + +/* + * Set output format to 'restricted pax' format. + * + * This is the same as normal 'pax', but tries to suppress + * the pax header whenever possible. This is the default for + * bsdtar, for instance. + */ +int +archive_write_set_format_pax_restricted(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int r; + r = archive_write_set_format_pax(&a->archive); + a->archive.archive_format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED; + a->archive.archive_format_name = "restricted POSIX pax interchange"; + return (r); +} + +/* + * Set output format to 'pax' format. + */ +int +archive_write_set_format_pax(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct pax *pax; + + if (a->format_destroy != NULL) + (a->format_destroy)(a); + + pax = (struct pax *)malloc(sizeof(*pax)); + if (pax == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate pax data"); + return (ARCHIVE_FATAL); + } + memset(pax, 0, sizeof(*pax)); + a->format_data = pax; + + a->pad_uncompressed = 1; + a->format_name = "pax"; + a->format_write_header = archive_write_pax_header; + a->format_write_data = archive_write_pax_data; + a->format_finish = archive_write_pax_finish; + a->format_destroy = archive_write_pax_destroy; + a->format_finish_entry = archive_write_pax_finish_entry; + a->archive.archive_format = ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE; + a->archive.archive_format_name = "POSIX pax interchange"; + return (ARCHIVE_OK); +} + +/* + * Note: This code assumes that 'nanos' has the same sign as 'sec', + * which implies that sec=-1, nanos=200000000 represents -1.2 seconds + * and not -0.8 seconds. This is a pretty pedantic point, as we're + * unlikely to encounter many real files created before Jan 1, 1970, + * much less ones with timestamps recorded to sub-second resolution. + */ +static void +add_pax_attr_time(struct archive_string *as, const char *key, + int64_t sec, unsigned long nanos) +{ + int digit, i; + char *t; + /* + * Note that each byte contributes fewer than 3 base-10 + * digits, so this will always be big enough. + */ + char tmp[1 + 3*sizeof(sec) + 1 + 3*sizeof(nanos)]; + + tmp[sizeof(tmp) - 1] = 0; + t = tmp + sizeof(tmp) - 1; + + /* Skip trailing zeros in the fractional part. */ + for (digit = 0, i = 10; i > 0 && digit == 0; i--) { + digit = nanos % 10; + nanos /= 10; + } + + /* Only format the fraction if it's non-zero. */ + if (i > 0) { + while (i > 0) { + *--t = "0123456789"[digit]; + digit = nanos % 10; + nanos /= 10; + i--; + } + *--t = '.'; + } + t = format_int(t, sec); + + add_pax_attr(as, key, t); +} + +static char * +format_int(char *t, int64_t i) +{ + int sign; + + if (i < 0) { + sign = -1; + i = -i; + } else + sign = 1; + + do { + *--t = "0123456789"[i % 10]; + } while (i /= 10); + if (sign < 0) + *--t = '-'; + return (t); +} + +static void +add_pax_attr_int(struct archive_string *as, const char *key, int64_t value) +{ + char tmp[1 + 3 * sizeof(value)]; + + tmp[sizeof(tmp) - 1] = 0; + add_pax_attr(as, key, format_int(tmp + sizeof(tmp) - 1, value)); +} + +static char * +utf8_encode(const wchar_t *wval) +{ + int utf8len; + const wchar_t *wp; + unsigned long wc; + char *utf8_value, *p; + + utf8len = 0; + for (wp = wval; *wp != L'\0'; ) { + wc = *wp++; + + if (wc >= 0xd800 && wc <= 0xdbff + && *wp >= 0xdc00 && *wp <= 0xdfff) { + /* This is a surrogate pair. Combine into a + * full Unicode value before encoding into + * UTF-8. */ + wc = (wc - 0xd800) << 10; /* High 10 bits */ + wc += (*wp++ - 0xdc00); /* Low 10 bits */ + wc += 0x10000; /* Skip BMP */ + } + if (wc <= 0x7f) + utf8len++; + else if (wc <= 0x7ff) + utf8len += 2; + else if (wc <= 0xffff) + utf8len += 3; + else if (wc <= 0x1fffff) + utf8len += 4; + else if (wc <= 0x3ffffff) + utf8len += 5; + else if (wc <= 0x7fffffff) + utf8len += 6; + /* Ignore larger values; UTF-8 can't encode them. */ + } + + utf8_value = (char *)malloc(utf8len + 1); + if (utf8_value == NULL) { + __archive_errx(1, "Not enough memory for attributes"); + return (NULL); + } + + for (wp = wval, p = utf8_value; *wp != L'\0'; ) { + wc = *wp++; + if (wc >= 0xd800 && wc <= 0xdbff + && *wp >= 0xdc00 && *wp <= 0xdfff) { + /* Combine surrogate pair. */ + wc = (wc - 0xd800) << 10; + wc += *wp++ - 0xdc00 + 0x10000; + } + if (wc <= 0x7f) { + *p++ = (char)wc; + } else if (wc <= 0x7ff) { + p[0] = 0xc0 | ((wc >> 6) & 0x1f); + p[1] = 0x80 | (wc & 0x3f); + p += 2; + } else if (wc <= 0xffff) { + p[0] = 0xe0 | ((wc >> 12) & 0x0f); + p[1] = 0x80 | ((wc >> 6) & 0x3f); + p[2] = 0x80 | (wc & 0x3f); + p += 3; + } else if (wc <= 0x1fffff) { + p[0] = 0xf0 | ((wc >> 18) & 0x07); + p[1] = 0x80 | ((wc >> 12) & 0x3f); + p[2] = 0x80 | ((wc >> 6) & 0x3f); + p[3] = 0x80 | (wc & 0x3f); + p += 4; + } else if (wc <= 0x3ffffff) { + p[0] = 0xf8 | ((wc >> 24) & 0x03); + p[1] = 0x80 | ((wc >> 18) & 0x3f); + p[2] = 0x80 | ((wc >> 12) & 0x3f); + p[3] = 0x80 | ((wc >> 6) & 0x3f); + p[4] = 0x80 | (wc & 0x3f); + p += 5; + } else if (wc <= 0x7fffffff) { + p[0] = 0xfc | ((wc >> 30) & 0x01); + p[1] = 0x80 | ((wc >> 24) & 0x3f); + p[1] = 0x80 | ((wc >> 18) & 0x3f); + p[2] = 0x80 | ((wc >> 12) & 0x3f); + p[3] = 0x80 | ((wc >> 6) & 0x3f); + p[4] = 0x80 | (wc & 0x3f); + p += 6; + } + /* Ignore larger values; UTF-8 can't encode them. */ + } + *p = '\0'; + + return (utf8_value); +} + +static void +add_pax_attr_w(struct archive_string *as, const char *key, const wchar_t *wval) +{ + char *utf8_value = utf8_encode(wval); + if (utf8_value == NULL) + return; + add_pax_attr(as, key, utf8_value); + free(utf8_value); +} + +/* + * Add a key/value attribute to the pax header. This function handles + * the length field and various other syntactic requirements. + */ +static void +add_pax_attr(struct archive_string *as, const char *key, const char *value) +{ + int digits, i, len, next_ten; + char tmp[1 + 3 * sizeof(int)]; /* < 3 base-10 digits per byte */ + + /*- + * PAX attributes have the following layout: + * <=> + */ + len = 1 + strlen(key) + 1 + strlen(value) + 1; + + /* + * The field includes the length of the field, so + * computing the correct length is tricky. I start by + * counting the number of base-10 digits in 'len' and + * computing the next higher power of 10. + */ + next_ten = 1; + digits = 0; + i = len; + while (i > 0) { + i = i / 10; + digits++; + next_ten = next_ten * 10; + } + /* + * For example, if string without the length field is 99 + * chars, then adding the 2 digit length "99" will force the + * total length past 100, requiring an extra digit. The next + * statement adjusts for this effect. + */ + if (len + digits >= next_ten) + digits++; + + /* Now, we have the right length so we can build the line. */ + tmp[sizeof(tmp) - 1] = 0; /* Null-terminate the work area. */ + archive_strcat(as, format_int(tmp + sizeof(tmp) - 1, len + digits)); + archive_strappend_char(as, ' '); + archive_strcat(as, key); + archive_strappend_char(as, '='); + archive_strcat(as, value); + archive_strappend_char(as, '\n'); +} + +static void +archive_write_pax_header_xattrs(struct pax *pax, struct archive_entry *entry) +{ + struct archive_string s; + int i = archive_entry_xattr_reset(entry); + + while (i--) { + const char *name; + const void *value; + char *encoded_value; + char *url_encoded_name = NULL, *encoded_name = NULL; + wchar_t *wcs_name = NULL; + size_t size; + + archive_entry_xattr_next(entry, &name, &value, &size); + /* Name is URL-encoded, then converted to wchar_t, + * then UTF-8 encoded. */ + url_encoded_name = url_encode(name); + if (url_encoded_name != NULL) { + /* Convert narrow-character to wide-character. */ + int wcs_length = strlen(url_encoded_name); + wcs_name = (wchar_t *)malloc((wcs_length + 1) * sizeof(wchar_t)); + if (wcs_name == NULL) + __archive_errx(1, "No memory for xattr conversion"); + mbstowcs(wcs_name, url_encoded_name, wcs_length); + wcs_name[wcs_length] = 0; + free(url_encoded_name); /* Done with this. */ + } + if (wcs_name != NULL) { + encoded_name = utf8_encode(wcs_name); + free(wcs_name); /* Done with wchar_t name. */ + } + + encoded_value = base64_encode((const char *)value, size); + + if (encoded_name != NULL && encoded_value != NULL) { + archive_string_init(&s); + archive_strcpy(&s, "LIBARCHIVE.xattr."); + archive_strcat(&s, encoded_name); + add_pax_attr(&(pax->pax_header), s.s, encoded_value); + archive_string_free(&s); + } + free(encoded_name); + free(encoded_value); + } +} + +/* + * TODO: Consider adding 'comment' and 'charset' fields to + * archive_entry so that clients can specify them. Also, consider + * adding generic key/value tags so clients can add arbitrary + * key/value data. + */ +static int +archive_write_pax_header(struct archive_write *a, + struct archive_entry *entry_original) +{ + struct archive_entry *entry_main; + const char *p; + char *t; + const wchar_t *wp; + const char *suffix; + int need_extension, r, ret; + struct pax *pax; + const char *hdrcharset = NULL; + const char *hardlink; + const char *path = NULL, *linkpath = NULL; + const char *uname = NULL, *gname = NULL; + const wchar_t *path_w = NULL, *linkpath_w = NULL; + const wchar_t *uname_w = NULL, *gname_w = NULL; + + char paxbuff[512]; + char ustarbuff[512]; + char ustar_entry_name[256]; + char pax_entry_name[256]; + + ret = ARCHIVE_OK; + need_extension = 0; + pax = (struct pax *)a->format_data; + + hardlink = archive_entry_hardlink(entry_original); + + /* Make sure this is a type of entry that we can handle here */ + if (hardlink == NULL) { + switch (archive_entry_filetype(entry_original)) { + case AE_IFBLK: + case AE_IFCHR: + case AE_IFIFO: + case AE_IFLNK: + case AE_IFREG: + break; + case AE_IFDIR: + /* + * Ensure a trailing '/'. Modify the original + * entry so the client sees the change. + */ + p = archive_entry_pathname(entry_original); + if (p[strlen(p) - 1] != '/') { + t = (char *)malloc(strlen(p) + 2); + if (t == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate pax data"); + return(ARCHIVE_FATAL); + } + strcpy(t, p); + strcat(t, "/"); + archive_entry_copy_pathname(entry_original, t); + free(t); + } + break; + case AE_IFSOCK: + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "tar format cannot archive socket"); + return (ARCHIVE_WARN); + default: + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "tar format cannot archive this (type=0%lo)", + (unsigned long)archive_entry_filetype(entry_original)); + return (ARCHIVE_WARN); + } + } + + /* Copy entry so we can modify it as needed. */ + entry_main = archive_entry_clone(entry_original); + archive_string_empty(&(pax->pax_header)); /* Blank our work area. */ + + /* + * First, check the name fields and see if any of them + * require binary coding. If any of them does, then all of + * them do. + */ + hdrcharset = NULL; + path = archive_entry_pathname(entry_main); + path_w = archive_entry_pathname_w(entry_main); + if (path != NULL && path_w == NULL) { + archive_set_error(&a->archive, EILSEQ, + "Can't translate pathname '%s' to UTF-8", path); + ret = ARCHIVE_WARN; + hdrcharset = "BINARY"; + } + uname = archive_entry_uname(entry_main); + uname_w = archive_entry_uname_w(entry_main); + if (uname != NULL && uname_w == NULL) { + archive_set_error(&a->archive, EILSEQ, + "Can't translate uname '%s' to UTF-8", uname); + ret = ARCHIVE_WARN; + hdrcharset = "BINARY"; + } + gname = archive_entry_gname(entry_main); + gname_w = archive_entry_gname_w(entry_main); + if (gname != NULL && gname_w == NULL) { + archive_set_error(&a->archive, EILSEQ, + "Can't translate gname '%s' to UTF-8", gname); + ret = ARCHIVE_WARN; + hdrcharset = "BINARY"; + } + linkpath = hardlink; + if (linkpath != NULL) { + linkpath_w = archive_entry_hardlink_w(entry_main); + } else { + linkpath = archive_entry_symlink(entry_main); + if (linkpath != NULL) + linkpath_w = archive_entry_symlink_w(entry_main); + } + if (linkpath != NULL && linkpath_w == NULL) { + archive_set_error(&a->archive, EILSEQ, + "Can't translate linkpath '%s' to UTF-8", linkpath); + ret = ARCHIVE_WARN; + hdrcharset = "BINARY"; + } + + /* Store the header encoding first, to be nice to readers. */ + if (hdrcharset != NULL) + add_pax_attr(&(pax->pax_header), "hdrcharset", hdrcharset); + + + /* + * If name is too long, or has non-ASCII characters, add + * 'path' to pax extended attrs. (Note that an unconvertible + * name must have non-ASCII characters.) + */ + if (path == NULL) { + /* We don't have a narrow version, so we have to store + * the wide version. */ + add_pax_attr_w(&(pax->pax_header), "path", path_w); + archive_entry_set_pathname(entry_main, "@WidePath"); + need_extension = 1; + } else if (has_non_ASCII(path_w)) { + /* We have non-ASCII characters. */ + if (path_w == NULL || hdrcharset != NULL) { + /* Can't do UTF-8, so store it raw. */ + add_pax_attr(&(pax->pax_header), "path", path); + } else { + /* Store UTF-8 */ + add_pax_attr_w(&(pax->pax_header), + "path", path_w); + } + archive_entry_set_pathname(entry_main, + build_ustar_entry_name(ustar_entry_name, + path, strlen(path), NULL)); + need_extension = 1; + } else { + /* We have an all-ASCII path; we'd like to just store + * it in the ustar header if it will fit. Yes, this + * duplicates some of the logic in + * write_set_format_ustar.c + */ + if (strlen(path) <= 100) { + /* Fits in the old 100-char tar name field. */ + } else { + /* Find largest suffix that will fit. */ + /* Note: strlen() > 100, so strlen() - 100 - 1 >= 0 */ + suffix = strchr(path + strlen(path) - 100 - 1, '/'); + /* Don't attempt an empty prefix. */ + if (suffix == path) + suffix = strchr(suffix + 1, '/'); + /* We can put it in the ustar header if it's + * all ASCII and it's either <= 100 characters + * or can be split at a '/' into a prefix <= + * 155 chars and a suffix <= 100 chars. (Note + * the strchr() above will return NULL exactly + * when the path can't be split.) + */ + if (suffix == NULL /* Suffix > 100 chars. */ + || suffix[1] == '\0' /* empty suffix */ + || suffix - path > 155) /* Prefix > 155 chars */ + { + if (path_w == NULL || hdrcharset != NULL) { + /* Can't do UTF-8, so store it raw. */ + add_pax_attr(&(pax->pax_header), + "path", path); + } else { + /* Store UTF-8 */ + add_pax_attr_w(&(pax->pax_header), + "path", path_w); + } + archive_entry_set_pathname(entry_main, + build_ustar_entry_name(ustar_entry_name, + path, strlen(path), NULL)); + need_extension = 1; + } + } + } + + if (linkpath != NULL) { + /* If link name is too long or has non-ASCII characters, add + * 'linkpath' to pax extended attrs. */ + if (strlen(linkpath) > 100 || linkpath_w == NULL + || linkpath_w == NULL || has_non_ASCII(linkpath_w)) { + if (linkpath_w == NULL || hdrcharset != NULL) + /* If the linkpath is not convertible + * to wide, or we're encoding in + * binary anyway, store it raw. */ + add_pax_attr(&(pax->pax_header), + "linkpath", linkpath); + else + /* If the link is long or has a + * non-ASCII character, store it as a + * pax extended attribute. */ + add_pax_attr_w(&(pax->pax_header), + "linkpath", linkpath_w); + if (strlen(linkpath) > 100) { + if (hardlink != NULL) + archive_entry_set_hardlink(entry_main, + "././@LongHardLink"); + else + archive_entry_set_symlink(entry_main, + "././@LongSymLink"); + } + need_extension = 1; + } + } + + /* If file size is too large, add 'size' to pax extended attrs. */ + if (archive_entry_size(entry_main) >= (((int64_t)1) << 33)) { + add_pax_attr_int(&(pax->pax_header), "size", + archive_entry_size(entry_main)); + need_extension = 1; + } + + /* If numeric GID is too large, add 'gid' to pax extended attrs. */ + if ((unsigned int)archive_entry_gid(entry_main) >= (1 << 18)) { + add_pax_attr_int(&(pax->pax_header), "gid", + archive_entry_gid(entry_main)); + need_extension = 1; + } + + /* If group name is too large or has non-ASCII characters, add + * 'gname' to pax extended attrs. */ + if (gname != NULL) { + if (strlen(gname) > 31 + || gname_w == NULL + || has_non_ASCII(gname_w)) + { + if (gname_w == NULL || hdrcharset != NULL) { + add_pax_attr(&(pax->pax_header), + "gname", gname); + } else { + add_pax_attr_w(&(pax->pax_header), + "gname", gname_w); + } + need_extension = 1; + } + } + + /* If numeric UID is too large, add 'uid' to pax extended attrs. */ + if ((unsigned int)archive_entry_uid(entry_main) >= (1 << 18)) { + add_pax_attr_int(&(pax->pax_header), "uid", + archive_entry_uid(entry_main)); + need_extension = 1; + } + + /* Add 'uname' to pax extended attrs if necessary. */ + if (uname != NULL) { + if (strlen(uname) > 31 + || uname_w == NULL + || has_non_ASCII(uname_w)) + { + if (uname_w == NULL || hdrcharset != NULL) { + add_pax_attr(&(pax->pax_header), + "uname", uname); + } else { + add_pax_attr_w(&(pax->pax_header), + "uname", uname_w); + } + need_extension = 1; + } + } + + /* + * POSIX/SUSv3 doesn't provide a standard key for large device + * numbers. I use the same keys here that Joerg Schilling + * used for 'star.' (Which, somewhat confusingly, are called + * "devXXX" even though they code "rdev" values.) No doubt, + * other implementations use other keys. Note that there's no + * reason we can't write the same information into a number of + * different keys. + * + * Of course, this is only needed for block or char device entries. + */ + if (archive_entry_filetype(entry_main) == AE_IFBLK + || archive_entry_filetype(entry_main) == AE_IFCHR) { + /* + * If rdevmajor is too large, add 'SCHILY.devmajor' to + * extended attributes. + */ + dev_t rdevmajor, rdevminor; + rdevmajor = archive_entry_rdevmajor(entry_main); + rdevminor = archive_entry_rdevminor(entry_main); + if (rdevmajor >= (1 << 18)) { + add_pax_attr_int(&(pax->pax_header), "SCHILY.devmajor", + rdevmajor); + /* + * Non-strict formatting below means we don't + * have to truncate here. Not truncating improves + * the chance that some more modern tar archivers + * (such as GNU tar 1.13) can restore the full + * value even if they don't understand the pax + * extended attributes. See my rant below about + * file size fields for additional details. + */ + /* archive_entry_set_rdevmajor(entry_main, + rdevmajor & ((1 << 18) - 1)); */ + need_extension = 1; + } + + /* + * If devminor is too large, add 'SCHILY.devminor' to + * extended attributes. + */ + if (rdevminor >= (1 << 18)) { + add_pax_attr_int(&(pax->pax_header), "SCHILY.devminor", + rdevminor); + /* Truncation is not necessary here, either. */ + /* archive_entry_set_rdevminor(entry_main, + rdevminor & ((1 << 18) - 1)); */ + need_extension = 1; + } + } + + /* + * Technically, the mtime field in the ustar header can + * support 33 bits, but many platforms use signed 32-bit time + * values. The cutoff of 0x7fffffff here is a compromise. + * Yes, this check is duplicated just below; this helps to + * avoid writing an mtime attribute just to handle a + * high-resolution timestamp in "restricted pax" mode. + */ + if (!need_extension && + ((archive_entry_mtime(entry_main) < 0) + || (archive_entry_mtime(entry_main) >= 0x7fffffff))) + need_extension = 1; + + /* I use a star-compatible file flag attribute. */ + p = archive_entry_fflags_text(entry_main); + if (!need_extension && p != NULL && *p != '\0') + need_extension = 1; + + /* If there are non-trivial ACL entries, we need an extension. */ + if (!need_extension && archive_entry_acl_count(entry_original, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS) > 0) + need_extension = 1; + + /* If there are non-trivial ACL entries, we need an extension. */ + if (!need_extension && archive_entry_acl_count(entry_original, + ARCHIVE_ENTRY_ACL_TYPE_DEFAULT) > 0) + need_extension = 1; + + /* If there are extended attributes, we need an extension */ + if (!need_extension && archive_entry_xattr_count(entry_original) > 0) + need_extension = 1; + + /* + * The following items are handled differently in "pax + * restricted" format. In particular, in "pax restricted" + * format they won't be added unless need_extension is + * already set (we're already generating an extended header, so + * may as well include these). + */ + if (a->archive.archive_format != ARCHIVE_FORMAT_TAR_PAX_RESTRICTED || + need_extension) { + + if (archive_entry_mtime(entry_main) < 0 || + archive_entry_mtime(entry_main) >= 0x7fffffff || + archive_entry_mtime_nsec(entry_main) != 0) + add_pax_attr_time(&(pax->pax_header), "mtime", + archive_entry_mtime(entry_main), + archive_entry_mtime_nsec(entry_main)); + + if (archive_entry_ctime(entry_main) != 0 || + archive_entry_ctime_nsec(entry_main) != 0) + add_pax_attr_time(&(pax->pax_header), "ctime", + archive_entry_ctime(entry_main), + archive_entry_ctime_nsec(entry_main)); + + if (archive_entry_atime(entry_main) != 0 || + archive_entry_atime_nsec(entry_main) != 0) + add_pax_attr_time(&(pax->pax_header), "atime", + archive_entry_atime(entry_main), + archive_entry_atime_nsec(entry_main)); + + /* Store birth/creationtime only if it's earlier than mtime */ + if (archive_entry_birthtime_is_set(entry_main) && + archive_entry_birthtime(entry_main) + < archive_entry_mtime(entry_main)) + add_pax_attr_time(&(pax->pax_header), + "LIBARCHIVE.creationtime", + archive_entry_birthtime(entry_main), + archive_entry_birthtime_nsec(entry_main)); + + /* I use a star-compatible file flag attribute. */ + p = archive_entry_fflags_text(entry_main); + if (p != NULL && *p != '\0') + add_pax_attr(&(pax->pax_header), "SCHILY.fflags", p); + + /* I use star-compatible ACL attributes. */ + wp = archive_entry_acl_text_w(entry_original, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS | + ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID); + if (wp != NULL && *wp != L'\0') + add_pax_attr_w(&(pax->pax_header), + "SCHILY.acl.access", wp); + wp = archive_entry_acl_text_w(entry_original, + ARCHIVE_ENTRY_ACL_TYPE_DEFAULT | + ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID); + if (wp != NULL && *wp != L'\0') + add_pax_attr_w(&(pax->pax_header), + "SCHILY.acl.default", wp); + + /* Include star-compatible metadata info. */ + /* Note: "SCHILY.dev{major,minor}" are NOT the + * major/minor portions of "SCHILY.dev". */ + add_pax_attr_int(&(pax->pax_header), "SCHILY.dev", + archive_entry_dev(entry_main)); + add_pax_attr_int(&(pax->pax_header), "SCHILY.ino", + archive_entry_ino64(entry_main)); + add_pax_attr_int(&(pax->pax_header), "SCHILY.nlink", + archive_entry_nlink(entry_main)); + + /* Store extended attributes */ + archive_write_pax_header_xattrs(pax, entry_original); + } + + /* Only regular files have data. */ + if (archive_entry_filetype(entry_main) != AE_IFREG) + archive_entry_set_size(entry_main, 0); + + /* + * Pax-restricted does not store data for hardlinks, in order + * to improve compatibility with ustar. + */ + if (a->archive.archive_format != ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE && + hardlink != NULL) + archive_entry_set_size(entry_main, 0); + + /* + * XXX Full pax interchange format does permit a hardlink + * entry to have data associated with it. I'm not supporting + * that here because the client expects me to tell them whether + * or not this format expects data for hardlinks. If I + * don't check here, then every pax archive will end up with + * duplicated data for hardlinks. Someday, there may be + * need to select this behavior, in which case the following + * will need to be revisited. XXX + */ + if (hardlink != NULL) + archive_entry_set_size(entry_main, 0); + + /* Format 'ustar' header for main entry. + * + * The trouble with file size: If the reader can't understand + * the file size, they may not be able to locate the next + * entry and the rest of the archive is toast. Pax-compliant + * readers are supposed to ignore the file size in the main + * header, so the question becomes how to maximize portability + * for readers that don't support pax attribute extensions. + * For maximum compatibility, I permit numeric extensions in + * the main header so that the file size stored will always be + * correct, even if it's in a format that only some + * implementations understand. The technique used here is: + * + * a) If possible, follow the standard exactly. This handles + * files up to 8 gigabytes minus 1. + * + * b) If that fails, try octal but omit the field terminator. + * That handles files up to 64 gigabytes minus 1. + * + * c) Otherwise, use base-256 extensions. That handles files + * up to 2^63 in this implementation, with the potential to + * go up to 2^94. That should hold us for a while. ;-) + * + * The non-strict formatter uses similar logic for other + * numeric fields, though they're less critical. + */ + __archive_write_format_header_ustar(a, ustarbuff, entry_main, -1, 0); + + /* If we built any extended attributes, write that entry first. */ + if (archive_strlen(&(pax->pax_header)) > 0) { + struct archive_entry *pax_attr_entry; + time_t s; + uid_t uid; + gid_t gid; + mode_t mode; + long ns; + + pax_attr_entry = archive_entry_new(); + p = archive_entry_pathname(entry_main); + archive_entry_set_pathname(pax_attr_entry, + build_pax_attribute_name(pax_entry_name, p)); + archive_entry_set_size(pax_attr_entry, + archive_strlen(&(pax->pax_header))); + /* Copy uid/gid (but clip to ustar limits). */ + uid = archive_entry_uid(entry_main); + if ((unsigned int)uid >= 1 << 18) + uid = (uid_t)(1 << 18) - 1; + archive_entry_set_uid(pax_attr_entry, uid); + gid = archive_entry_gid(entry_main); + if ((unsigned int)gid >= 1 << 18) + gid = (gid_t)(1 << 18) - 1; + archive_entry_set_gid(pax_attr_entry, gid); + /* Copy mode over (but not setuid/setgid bits) */ + mode = archive_entry_mode(entry_main); +#ifdef S_ISUID + mode &= ~S_ISUID; +#endif +#ifdef S_ISGID + mode &= ~S_ISGID; +#endif +#ifdef S_ISVTX + mode &= ~S_ISVTX; +#endif + archive_entry_set_mode(pax_attr_entry, mode); + + /* Copy uname/gname. */ + archive_entry_set_uname(pax_attr_entry, + archive_entry_uname(entry_main)); + archive_entry_set_gname(pax_attr_entry, + archive_entry_gname(entry_main)); + + /* Copy mtime, but clip to ustar limits. */ + s = archive_entry_mtime(entry_main); + ns = archive_entry_mtime_nsec(entry_main); + if (s < 0) { s = 0; ns = 0; } + if (s > 0x7fffffff) { s = 0x7fffffff; ns = 0; } + archive_entry_set_mtime(pax_attr_entry, s, ns); + + /* Ditto for atime. */ + s = archive_entry_atime(entry_main); + ns = archive_entry_atime_nsec(entry_main); + if (s < 0) { s = 0; ns = 0; } + if (s > 0x7fffffff) { s = 0x7fffffff; ns = 0; } + archive_entry_set_atime(pax_attr_entry, s, ns); + + /* Standard ustar doesn't support ctime. */ + archive_entry_set_ctime(pax_attr_entry, 0, 0); + + r = __archive_write_format_header_ustar(a, paxbuff, + pax_attr_entry, 'x', 1); + + archive_entry_free(pax_attr_entry); + + /* Note that the 'x' header shouldn't ever fail to format */ + if (r != 0) { + const char *msg = "archive_write_pax_header: " + "'x' header failed?! This can't happen.\n"; + size_t u = write(2, msg, strlen(msg)); + (void)u; /* UNUSED */ + exit(1); + } + r = (a->compressor.write)(a, paxbuff, 512); + if (r != ARCHIVE_OK) { + pax->entry_bytes_remaining = 0; + pax->entry_padding = 0; + return (ARCHIVE_FATAL); + } + + pax->entry_bytes_remaining = archive_strlen(&(pax->pax_header)); + pax->entry_padding = 0x1ff & (-(int64_t)pax->entry_bytes_remaining); + + r = (a->compressor.write)(a, pax->pax_header.s, + archive_strlen(&(pax->pax_header))); + if (r != ARCHIVE_OK) { + /* If a write fails, we're pretty much toast. */ + return (ARCHIVE_FATAL); + } + /* Pad out the end of the entry. */ + r = write_nulls(a, pax->entry_padding); + if (r != ARCHIVE_OK) { + /* If a write fails, we're pretty much toast. */ + return (ARCHIVE_FATAL); + } + pax->entry_bytes_remaining = pax->entry_padding = 0; + } + + /* Write the header for main entry. */ + r = (a->compressor.write)(a, ustarbuff, 512); + if (r != ARCHIVE_OK) + return (r); + + /* + * Inform the client of the on-disk size we're using, so + * they can avoid unnecessarily writing a body for something + * that we're just going to ignore. + */ + archive_entry_set_size(entry_original, archive_entry_size(entry_main)); + pax->entry_bytes_remaining = archive_entry_size(entry_main); + pax->entry_padding = 0x1ff & (-(int64_t)pax->entry_bytes_remaining); + archive_entry_free(entry_main); + + return (ret); +} + +/* + * We need a valid name for the regular 'ustar' entry. This routine + * tries to hack something more-or-less reasonable. + * + * The approach here tries to preserve leading dir names. We do so by + * working with four sections: + * 1) "prefix" directory names, + * 2) "suffix" directory names, + * 3) inserted dir name (optional), + * 4) filename. + * + * These sections must satisfy the following requirements: + * * Parts 1 & 2 together form an initial portion of the dir name. + * * Part 3 is specified by the caller. (It should not contain a leading + * or trailing '/'.) + * * Part 4 forms an initial portion of the base filename. + * * The filename must be <= 99 chars to fit the ustar 'name' field. + * * Parts 2, 3, 4 together must be <= 99 chars to fit the ustar 'name' fld. + * * Part 1 must be <= 155 chars to fit the ustar 'prefix' field. + * * If the original name ends in a '/', the new name must also end in a '/' + * * Trailing '/.' sequences may be stripped. + * + * Note: Recall that the ustar format does not store the '/' separating + * parts 1 & 2, but does store the '/' separating parts 2 & 3. + */ +static char * +build_ustar_entry_name(char *dest, const char *src, size_t src_length, + const char *insert) +{ + const char *prefix, *prefix_end; + const char *suffix, *suffix_end; + const char *filename, *filename_end; + char *p; + int need_slash = 0; /* Was there a trailing slash? */ + size_t suffix_length = 99; + int insert_length; + + /* Length of additional dir element to be added. */ + if (insert == NULL) + insert_length = 0; + else + /* +2 here allows for '/' before and after the insert. */ + insert_length = strlen(insert) + 2; + + /* Step 0: Quick bailout in a common case. */ + if (src_length < 100 && insert == NULL) { + strncpy(dest, src, src_length); + dest[src_length] = '\0'; + return (dest); + } + + /* Step 1: Locate filename and enforce the length restriction. */ + filename_end = src + src_length; + /* Remove trailing '/' chars and '/.' pairs. */ + for (;;) { + if (filename_end > src && filename_end[-1] == '/') { + filename_end --; + need_slash = 1; /* Remember to restore trailing '/'. */ + continue; + } + if (filename_end > src + 1 && filename_end[-1] == '.' + && filename_end[-2] == '/') { + filename_end -= 2; + need_slash = 1; /* "foo/." will become "foo/" */ + continue; + } + break; + } + if (need_slash) + suffix_length--; + /* Find start of filename. */ + filename = filename_end - 1; + while ((filename > src) && (*filename != '/')) + filename --; + if ((*filename == '/') && (filename < filename_end - 1)) + filename ++; + /* Adjust filename_end so that filename + insert fits in 99 chars. */ + suffix_length -= insert_length; + if (filename_end > filename + suffix_length) + filename_end = filename + suffix_length; + /* Calculate max size for "suffix" section (#3 above). */ + suffix_length -= filename_end - filename; + + /* Step 2: Locate the "prefix" section of the dirname, including + * trailing '/'. */ + prefix = src; + prefix_end = prefix + 155; + if (prefix_end > filename) + prefix_end = filename; + while (prefix_end > prefix && *prefix_end != '/') + prefix_end--; + if ((prefix_end < filename) && (*prefix_end == '/')) + prefix_end++; + + /* Step 3: Locate the "suffix" section of the dirname, + * including trailing '/'. */ + suffix = prefix_end; + suffix_end = suffix + suffix_length; /* Enforce limit. */ + if (suffix_end > filename) + suffix_end = filename; + if (suffix_end < suffix) + suffix_end = suffix; + while (suffix_end > suffix && *suffix_end != '/') + suffix_end--; + if ((suffix_end < filename) && (*suffix_end == '/')) + suffix_end++; + + /* Step 4: Build the new name. */ + /* The OpenBSD strlcpy function is safer, but less portable. */ + /* Rather than maintain two versions, just use the strncpy version. */ + p = dest; + if (prefix_end > prefix) { + strncpy(p, prefix, prefix_end - prefix); + p += prefix_end - prefix; + } + if (suffix_end > suffix) { + strncpy(p, suffix, suffix_end - suffix); + p += suffix_end - suffix; + } + if (insert != NULL) { + /* Note: assume insert does not have leading or trailing '/' */ + strcpy(p, insert); + p += strlen(insert); + *p++ = '/'; + } + strncpy(p, filename, filename_end - filename); + p += filename_end - filename; + if (need_slash) + *p++ = '/'; + *p++ = '\0'; + + return (dest); +} + +/* + * The ustar header for the pax extended attributes must have a + * reasonable name: SUSv3 requires 'dirname'/PaxHeader.'pid'/'filename' + * where 'pid' is the PID of the archiving process. Unfortunately, + * that makes testing a pain since the output varies for each run, + * so I'm sticking with the simpler 'dirname'/PaxHeader/'filename' + * for now. (Someday, I'll make this settable. Then I can use the + * SUS recommendation as default and test harnesses can override it + * to get predictable results.) + * + * Joerg Schilling has argued that this is unnecessary because, in + * practice, if the pax extended attributes get extracted as regular + * files, noone is going to bother reading those attributes to + * manually restore them. Based on this, 'star' uses + * /tmp/PaxHeader/'basename' as the ustar header name. This is a + * tempting argument, in part because it's simpler than the SUSv3 + * recommendation, but I'm not entirely convinced. I'm also + * uncomfortable with the fact that "/tmp" is a Unix-ism. + * + * The following routine leverages build_ustar_entry_name() above and + * so is simpler than you might think. It just needs to provide the + * additional path element and handle a few pathological cases). + */ +static char * +build_pax_attribute_name(char *dest, const char *src) +{ + char buff[64]; + const char *p; + + /* Handle the null filename case. */ + if (src == NULL || *src == '\0') { + strcpy(dest, "PaxHeader/blank"); + return (dest); + } + + /* Prune final '/' and other unwanted final elements. */ + p = src + strlen(src); + for (;;) { + /* Ends in "/", remove the '/' */ + if (p > src && p[-1] == '/') { + --p; + continue; + } + /* Ends in "/.", remove the '.' */ + if (p > src + 1 && p[-1] == '.' + && p[-2] == '/') { + --p; + continue; + } + break; + } + + /* Pathological case: After above, there was nothing left. + * This includes "/." "/./." "/.//./." etc. */ + if (p == src) { + strcpy(dest, "/PaxHeader/rootdir"); + return (dest); + } + + /* Convert unadorned "." into a suitable filename. */ + if (*src == '.' && p == src + 1) { + strcpy(dest, "PaxHeader/currentdir"); + return (dest); + } + + /* + * TODO: Push this string into the 'pax' structure to avoid + * recomputing it every time. That will also open the door + * to having clients override it. + */ +#if HAVE_GETPID && 0 /* Disable this for now; see above comment. */ + sprintf(buff, "PaxHeader.%d", getpid()); +#else + /* If the platform can't fetch the pid, don't include it. */ + strcpy(buff, "PaxHeader"); +#endif + /* General case: build a ustar-compatible name adding "/PaxHeader/". */ + build_ustar_entry_name(dest, src, p - src, buff); + + return (dest); +} + +/* Write two null blocks for the end of archive */ +static int +archive_write_pax_finish(struct archive_write *a) +{ + struct pax *pax; + int r; + + if (a->compressor.write == NULL) + return (ARCHIVE_OK); + + pax = (struct pax *)a->format_data; + r = write_nulls(a, 512 * 2); + return (r); +} + +static int +archive_write_pax_destroy(struct archive_write *a) +{ + struct pax *pax; + + pax = (struct pax *)a->format_data; + if (pax == NULL) + return (ARCHIVE_OK); + + archive_string_free(&pax->pax_header); + free(pax); + a->format_data = NULL; + return (ARCHIVE_OK); +} + +static int +archive_write_pax_finish_entry(struct archive_write *a) +{ + struct pax *pax; + int ret; + + pax = (struct pax *)a->format_data; + ret = write_nulls(a, pax->entry_bytes_remaining + pax->entry_padding); + pax->entry_bytes_remaining = pax->entry_padding = 0; + return (ret); +} + +static int +write_nulls(struct archive_write *a, size_t padding) +{ + int ret, to_write; + + while (padding > 0) { + to_write = padding < a->null_length ? padding : a->null_length; + ret = (a->compressor.write)(a, a->nulls, to_write); + if (ret != ARCHIVE_OK) + return (ret); + padding -= to_write; + } + return (ARCHIVE_OK); +} + +static ssize_t +archive_write_pax_data(struct archive_write *a, const void *buff, size_t s) +{ + struct pax *pax; + int ret; + + pax = (struct pax *)a->format_data; + if (s > pax->entry_bytes_remaining) + s = pax->entry_bytes_remaining; + + ret = (a->compressor.write)(a, buff, s); + pax->entry_bytes_remaining -= s; + if (ret == ARCHIVE_OK) + return (s); + else + return (ret); +} + +static int +has_non_ASCII(const wchar_t *wp) +{ + if (wp == NULL) + return (1); + while (*wp != L'\0' && *wp < 128) + wp++; + return (*wp != L'\0'); +} + +/* + * Used by extended attribute support; encodes the name + * so that there will be no '=' characters in the result. + */ +static char * +url_encode(const char *in) +{ + const char *s; + char *d; + int out_len = 0; + char *out; + + for (s = in; *s != '\0'; s++) { + if (*s < 33 || *s > 126 || *s == '%' || *s == '=') + out_len += 3; + else + out_len++; + } + + out = (char *)malloc(out_len + 1); + if (out == NULL) + return (NULL); + + for (s = in, d = out; *s != '\0'; s++) { + /* encode any non-printable ASCII character or '%' or '=' */ + if (*s < 33 || *s > 126 || *s == '%' || *s == '=') { + /* URL encoding is '%' followed by two hex digits */ + *d++ = '%'; + *d++ = "0123456789ABCDEF"[0x0f & (*s >> 4)]; + *d++ = "0123456789ABCDEF"[0x0f & *s]; + } else { + *d++ = *s; + } + } + *d = '\0'; + return (out); +} + +/* + * Encode a sequence of bytes into a C string using base-64 encoding. + * + * Returns a null-terminated C string allocated with malloc(); caller + * is responsible for freeing the result. + */ +static char * +base64_encode(const char *s, size_t len) +{ + static const char digits[64] = + { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', + 'P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d', + 'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s', + 't','u','v','w','x','y','z','0','1','2','3','4','5','6','7', + '8','9','+','/' }; + int v; + char *d, *out; + + /* 3 bytes becomes 4 chars, but round up and allow for trailing NUL */ + out = (char *)malloc((len * 4 + 2) / 3 + 1); + if (out == NULL) + return (NULL); + d = out; + + /* Convert each group of 3 bytes into 4 characters. */ + while (len >= 3) { + v = (((int)s[0] << 16) & 0xff0000) + | (((int)s[1] << 8) & 0xff00) + | (((int)s[2]) & 0x00ff); + s += 3; + len -= 3; + *d++ = digits[(v >> 18) & 0x3f]; + *d++ = digits[(v >> 12) & 0x3f]; + *d++ = digits[(v >> 6) & 0x3f]; + *d++ = digits[(v) & 0x3f]; + } + /* Handle final group of 1 byte (2 chars) or 2 bytes (3 chars). */ + switch (len) { + case 0: break; + case 1: + v = (((int)s[0] << 16) & 0xff0000); + *d++ = digits[(v >> 18) & 0x3f]; + *d++ = digits[(v >> 12) & 0x3f]; + break; + case 2: + v = (((int)s[0] << 16) & 0xff0000) + | (((int)s[1] << 8) & 0xff00); + *d++ = digits[(v >> 18) & 0x3f]; + *d++ = digits[(v >> 12) & 0x3f]; + *d++ = digits[(v >> 6) & 0x3f]; + break; + } + /* Add trailing NUL character so output is a valid C string. */ + *d++ = '\0'; + return (out); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_shar.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_shar.c new file mode 100644 index 000000000..0ee46320f --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_shar.c @@ -0,0 +1,626 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * Copyright (c) 2008 Joerg Sonnenberger + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_format_shar.c,v 1.20 2008/08/31 07:10:40 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +struct shar { + int dump; + int end_of_line; + struct archive_entry *entry; + int has_data; + char *last_dir; + + /* Line buffer for uuencoded dump format */ + char outbuff[45]; + size_t outpos; + + int wrote_header; + struct archive_string work; + struct archive_string quoted_name; +}; + +static int archive_write_shar_finish(struct archive_write *); +static int archive_write_shar_destroy(struct archive_write *); +static int archive_write_shar_header(struct archive_write *, + struct archive_entry *); +static ssize_t archive_write_shar_data_sed(struct archive_write *, + const void * buff, size_t); +static ssize_t archive_write_shar_data_uuencode(struct archive_write *, + const void * buff, size_t); +static int archive_write_shar_finish_entry(struct archive_write *); + +/* + * Copy the given string to the buffer, quoting all shell meta characters + * found. + */ +static void +shar_quote(struct archive_string *buf, const char *str, int in_shell) +{ + static const char meta[] = "\n \t'`\";&<>()|*?{}[]\\$!#^~"; + size_t len; + + while (*str != '\0') { + if ((len = strcspn(str, meta)) != 0) { + archive_strncat(buf, str, len); + str += len; + } else if (*str == '\n') { + if (in_shell) + archive_strcat(buf, "\"\n\""); + else + archive_strcat(buf, "\\n"); + ++str; + } else { + archive_strappend_char(buf, '\\'); + archive_strappend_char(buf, *str); + ++str; + } + } +} + +/* + * Set output format to 'shar' format. + */ +int +archive_write_set_format_shar(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct shar *shar; + + /* If someone else was already registered, unregister them. */ + if (a->format_destroy != NULL) + (a->format_destroy)(a); + + shar = (struct shar *)malloc(sizeof(*shar)); + if (shar == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate shar data"); + return (ARCHIVE_FATAL); + } + memset(shar, 0, sizeof(*shar)); + archive_string_init(&shar->work); + archive_string_init(&shar->quoted_name); + a->format_data = shar; + + a->pad_uncompressed = 0; + a->format_name = "shar"; + a->format_write_header = archive_write_shar_header; + a->format_finish = archive_write_shar_finish; + a->format_destroy = archive_write_shar_destroy; + a->format_write_data = archive_write_shar_data_sed; + a->format_finish_entry = archive_write_shar_finish_entry; + a->archive.archive_format = ARCHIVE_FORMAT_SHAR_BASE; + a->archive.archive_format_name = "shar"; + return (ARCHIVE_OK); +} + +/* + * An alternate 'shar' that uses uudecode instead of 'sed' to encode + * file contents and can therefore be used to archive binary files. + * In addition, this variant also attempts to restore ownership, file modes, + * and other extended file information. + */ +int +archive_write_set_format_shar_dump(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct shar *shar; + + archive_write_set_format_shar(&a->archive); + shar = (struct shar *)a->format_data; + shar->dump = 1; + a->format_write_data = archive_write_shar_data_uuencode; + a->archive.archive_format = ARCHIVE_FORMAT_SHAR_DUMP; + a->archive.archive_format_name = "shar dump"; + return (ARCHIVE_OK); +} + +static int +archive_write_shar_header(struct archive_write *a, struct archive_entry *entry) +{ + const char *linkname; + const char *name; + char *p, *pp; + struct shar *shar; + + shar = (struct shar *)a->format_data; + if (!shar->wrote_header) { + archive_strcat(&shar->work, "#!/bin/sh\n"); + archive_strcat(&shar->work, "# This is a shell archive\n"); + shar->wrote_header = 1; + } + + /* Save the entry for the closing. */ + if (shar->entry) + archive_entry_free(shar->entry); + shar->entry = archive_entry_clone(entry); + name = archive_entry_pathname(entry); + + /* Handle some preparatory issues. */ + switch(archive_entry_filetype(entry)) { + case AE_IFREG: + /* Only regular files have non-zero size. */ + break; + case AE_IFDIR: + archive_entry_set_size(entry, 0); + /* Don't bother trying to recreate '.' */ + if (strcmp(name, ".") == 0 || strcmp(name, "./") == 0) + return (ARCHIVE_OK); + break; + case AE_IFIFO: + case AE_IFCHR: + case AE_IFBLK: + /* All other file types have zero size in the archive. */ + archive_entry_set_size(entry, 0); + break; + default: + archive_entry_set_size(entry, 0); + if (archive_entry_hardlink(entry) == NULL && + archive_entry_symlink(entry) == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "shar format cannot archive this"); + return (ARCHIVE_WARN); + } + } + + archive_string_empty(&shar->quoted_name); + shar_quote(&shar->quoted_name, name, 1); + + /* Stock preparation for all file types. */ + archive_string_sprintf(&shar->work, "echo x %s\n", shar->quoted_name.s); + + if (archive_entry_filetype(entry) != AE_IFDIR) { + /* Try to create the dir. */ + p = strdup(name); + pp = strrchr(p, '/'); + /* If there is a / character, try to create the dir. */ + if (pp != NULL) { + *pp = '\0'; + + /* Try to avoid a lot of redundant mkdir commands. */ + if (strcmp(p, ".") == 0) { + /* Don't try to "mkdir ." */ + free(p); + } else if (shar->last_dir == NULL) { + archive_strcat(&shar->work, "mkdir -p "); + shar_quote(&shar->work, p, 1); + archive_strcat(&shar->work, + " > /dev/null 2>&1\n"); + shar->last_dir = p; + } else if (strcmp(p, shar->last_dir) == 0) { + /* We've already created this exact dir. */ + free(p); + } else if (strlen(p) < strlen(shar->last_dir) && + strncmp(p, shar->last_dir, strlen(p)) == 0) { + /* We've already created a subdir. */ + free(p); + } else { + archive_strcat(&shar->work, "mkdir -p "); + shar_quote(&shar->work, p, 1); + archive_strcat(&shar->work, + " > /dev/null 2>&1\n"); + shar->last_dir = p; + } + } else { + free(p); + } + } + + /* Handle file-type specific issues. */ + shar->has_data = 0; + if ((linkname = archive_entry_hardlink(entry)) != NULL) { + archive_strcat(&shar->work, "ln -f "); + shar_quote(&shar->work, linkname, 1); + archive_string_sprintf(&shar->work, " %s\n", + shar->quoted_name.s); + } else if ((linkname = archive_entry_symlink(entry)) != NULL) { + archive_strcat(&shar->work, "ln -fs "); + shar_quote(&shar->work, linkname, 1); + archive_string_sprintf(&shar->work, " %s\n", + shar->quoted_name.s); + } else { + switch(archive_entry_filetype(entry)) { + case AE_IFREG: + if (archive_entry_size(entry) == 0) { + /* More portable than "touch." */ + archive_string_sprintf(&shar->work, + "test -e \"%s\" || :> \"%s\"\n", + shar->quoted_name.s, shar->quoted_name.s); + } else { + if (shar->dump) { + archive_string_sprintf(&shar->work, + "uudecode -p > %s << 'SHAR_END'\n", + shar->quoted_name.s); + archive_string_sprintf(&shar->work, + "begin %o ", + archive_entry_mode(entry) & 0777); + shar_quote(&shar->work, name, 0); + archive_strcat(&shar->work, "\n"); + } else { + archive_string_sprintf(&shar->work, + "sed 's/^X//' > %s << 'SHAR_END'\n", + shar->quoted_name.s); + } + shar->has_data = 1; + shar->end_of_line = 1; + shar->outpos = 0; + } + break; + case AE_IFDIR: + archive_string_sprintf(&shar->work, + "mkdir -p %s > /dev/null 2>&1\n", + shar->quoted_name.s); + /* Record that we just created this directory. */ + if (shar->last_dir != NULL) + free(shar->last_dir); + + shar->last_dir = strdup(name); + /* Trim a trailing '/'. */ + pp = strrchr(shar->last_dir, '/'); + if (pp != NULL && pp[1] == '\0') + *pp = '\0'; + /* + * TODO: Put dir name/mode on a list to be fixed + * up at end of archive. + */ + break; + case AE_IFIFO: + archive_string_sprintf(&shar->work, + "mkfifo %s\n", shar->quoted_name.s); + break; + case AE_IFCHR: + archive_string_sprintf(&shar->work, + "mknod %s c %d %d\n", shar->quoted_name.s, + archive_entry_rdevmajor(entry), + archive_entry_rdevminor(entry)); + break; + case AE_IFBLK: + archive_string_sprintf(&shar->work, + "mknod %s b %d %d\n", shar->quoted_name.s, + archive_entry_rdevmajor(entry), + archive_entry_rdevminor(entry)); + break; + default: + return (ARCHIVE_WARN); + } + } + + return (ARCHIVE_OK); +} + +static ssize_t +archive_write_shar_data_sed(struct archive_write *a, const void *buff, size_t n) +{ + static const size_t ensured = 65533; + struct shar *shar; + const char *src; + char *buf, *buf_end; + int ret; + size_t written = n; + + shar = (struct shar *)a->format_data; + if (!shar->has_data || n == 0) + return (0); + + src = (const char *)buff; + + /* + * ensure is the number of bytes in buffer before expanding the + * current character. Each operation writes the current character + * and optionally the start-of-new-line marker. This can happen + * twice before entering the loop, so make sure three additional + * bytes can be written. + */ + if (archive_string_ensure(&shar->work, ensured + 3) == NULL) + __archive_errx(1, "Out of memory"); + + if (shar->work.length > ensured) { + ret = (*a->compressor.write)(a, shar->work.s, + shar->work.length); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + archive_string_empty(&shar->work); + } + buf = shar->work.s + shar->work.length; + buf_end = shar->work.s + ensured; + + if (shar->end_of_line) { + *buf++ = 'X'; + shar->end_of_line = 0; + } + + while (n-- != 0) { + if ((*buf++ = *src++) == '\n') { + if (n == 0) + shar->end_of_line = 1; + else + *buf++ = 'X'; + } + + if (buf >= buf_end) { + shar->work.length = buf - shar->work.s; + ret = (*a->compressor.write)(a, shar->work.s, + shar->work.length); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + archive_string_empty(&shar->work); + buf = shar->work.s; + } + } + + shar->work.length = buf - shar->work.s; + + return (written); +} + +#define UUENC(c) (((c)!=0) ? ((c) & 077) + ' ': '`') + +static void +uuencode_group(const char _in[3], char out[4]) +{ + const unsigned char *in = (const unsigned char *)_in; + int t; + + t = (in[0] << 16) | (in[1] << 8) | in[2]; + out[0] = UUENC( 0x3f & (t >> 18) ); + out[1] = UUENC( 0x3f & (t >> 12) ); + out[2] = UUENC( 0x3f & (t >> 6) ); + out[3] = UUENC( 0x3f & t ); +} + +static void +uuencode_line(struct shar *shar, const char *inbuf, size_t len) +{ + char tmp_buf[3], *buf; + size_t alloc_len; + + /* len <= 45 -> expanded to 60 + len byte + new line */ + alloc_len = shar->work.length + 62; + if (archive_string_ensure(&shar->work, alloc_len) == NULL) + __archive_errx(1, "Out of memory"); + + buf = shar->work.s + shar->work.length; + *buf++ = UUENC(len); + while (len >= 3) { + uuencode_group(inbuf, buf); + len -= 3; + inbuf += 3; + buf += 4; + } + if (len != 0) { + tmp_buf[0] = inbuf[0]; + if (len == 1) + tmp_buf[1] = '\0'; + else + tmp_buf[1] = inbuf[1]; + tmp_buf[2] = '\0'; + uuencode_group(inbuf, buf); + buf += 4; + } + *buf++ = '\n'; + if ((buf - shar->work.s) > (ptrdiff_t)(shar->work.length + 62)) + __archive_errx(1, "Buffer overflow"); + shar->work.length = buf - shar->work.s; +} + +static ssize_t +archive_write_shar_data_uuencode(struct archive_write *a, const void *buff, + size_t length) +{ + struct shar *shar; + const char *src; + size_t n; + int ret; + + shar = (struct shar *)a->format_data; + if (!shar->has_data) + return (ARCHIVE_OK); + src = (const char *)buff; + + if (shar->outpos != 0) { + n = 45 - shar->outpos; + if (n > length) + n = length; + memcpy(shar->outbuff + shar->outpos, src, n); + if (shar->outpos + n < 45) { + shar->outpos += n; + return length; + } + uuencode_line(shar, shar->outbuff, 45); + src += n; + n = length - n; + } else { + n = length; + } + + while (n >= 45) { + uuencode_line(shar, src, 45); + src += 45; + n -= 45; + + if (shar->work.length < 65536) + continue; + ret = (*a->compressor.write)(a, shar->work.s, + shar->work.length); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + archive_string_empty(&shar->work); + } + if (n != 0) { + memcpy(shar->outbuff, src, n); + shar->outpos = n; + } + return (length); +} + +static int +archive_write_shar_finish_entry(struct archive_write *a) +{ + const char *g, *p, *u; + struct shar *shar; + int ret; + + shar = (struct shar *)a->format_data; + if (shar->entry == NULL) + return (0); + + if (shar->dump) { + /* Finish uuencoded data. */ + if (shar->has_data) { + if (shar->outpos > 0) + uuencode_line(shar, shar->outbuff, + shar->outpos); + archive_strcat(&shar->work, "`\nend\n"); + archive_strcat(&shar->work, "SHAR_END\n"); + } + /* Restore file mode, owner, flags. */ + /* + * TODO: Don't immediately restore mode for + * directories; defer that to end of script. + */ + archive_string_sprintf(&shar->work, "chmod %o ", + archive_entry_mode(shar->entry) & 07777); + shar_quote(&shar->work, archive_entry_pathname(shar->entry), 1); + archive_strcat(&shar->work, "\n"); + + u = archive_entry_uname(shar->entry); + g = archive_entry_gname(shar->entry); + if (u != NULL || g != NULL) { + archive_strcat(&shar->work, "chown "); + if (u != NULL) + shar_quote(&shar->work, u, 1); + if (g != NULL) { + archive_strcat(&shar->work, ":"); + shar_quote(&shar->work, g, 1); + } + shar_quote(&shar->work, + archive_entry_pathname(shar->entry), 1); + archive_strcat(&shar->work, "\n"); + } + + if ((p = archive_entry_fflags_text(shar->entry)) != NULL) { + archive_string_sprintf(&shar->work, "chflags %s ", + p, archive_entry_pathname(shar->entry)); + shar_quote(&shar->work, + archive_entry_pathname(shar->entry), 1); + archive_strcat(&shar->work, "\n"); + } + + /* TODO: restore ACLs */ + + } else { + if (shar->has_data) { + /* Finish sed-encoded data: ensure last line ends. */ + if (!shar->end_of_line) + archive_strappend_char(&shar->work, '\n'); + archive_strcat(&shar->work, "SHAR_END\n"); + } + } + + archive_entry_free(shar->entry); + shar->entry = NULL; + + if (shar->work.length < 65536) + return (ARCHIVE_OK); + + ret = (*a->compressor.write)(a, shar->work.s, shar->work.length); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + archive_string_empty(&shar->work); + + return (ARCHIVE_OK); +} + +static int +archive_write_shar_finish(struct archive_write *a) +{ + struct shar *shar; + int ret; + + /* + * TODO: Accumulate list of directory names/modes and + * fix them all up at end-of-archive. + */ + + shar = (struct shar *)a->format_data; + + /* + * Only write the end-of-archive markers if the archive was + * actually started. This avoids problems if someone sets + * shar format, then sets another format (which would invoke + * shar_finish to free the format-specific data). + */ + if (shar->wrote_header == 0) + return (ARCHIVE_OK); + + archive_strcat(&shar->work, "exit\n"); + + ret = (*a->compressor.write)(a, shar->work.s, shar->work.length); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + + /* Shar output is never padded. */ + archive_write_set_bytes_in_last_block(&a->archive, 1); + /* + * TODO: shar should also suppress padding of + * uncompressed data within gzip/bzip2 streams. + */ + + return (ARCHIVE_OK); +} + +static int +archive_write_shar_destroy(struct archive_write *a) +{ + struct shar *shar; + + shar = (struct shar *)a->format_data; + if (shar == NULL) + return (ARCHIVE_OK); + + archive_entry_free(shar->entry); + free(shar->last_dir); + archive_string_free(&(shar->work)); + archive_string_free(&(shar->quoted_name)); + free(shar); + a->format_data = NULL; + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c new file mode 100644 index 000000000..5fe7a4361 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_ustar.c @@ -0,0 +1,587 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "archive_platform.h" +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_set_format_ustar.c,v 1.27 2008/05/26 17:00:23 kientzle Exp $"); + + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "archive.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +struct ustar { + uint64_t entry_bytes_remaining; + uint64_t entry_padding; +}; + +/* + * Define structure of POSIX 'ustar' tar header. + */ +#define USTAR_name_offset 0 +#define USTAR_name_size 100 +#define USTAR_mode_offset 100 +#define USTAR_mode_size 6 +#define USTAR_mode_max_size 8 +#define USTAR_uid_offset 108 +#define USTAR_uid_size 6 +#define USTAR_uid_max_size 8 +#define USTAR_gid_offset 116 +#define USTAR_gid_size 6 +#define USTAR_gid_max_size 8 +#define USTAR_size_offset 124 +#define USTAR_size_size 11 +#define USTAR_size_max_size 12 +#define USTAR_mtime_offset 136 +#define USTAR_mtime_size 11 +#define USTAR_mtime_max_size 11 +#define USTAR_checksum_offset 148 +#define USTAR_checksum_size 8 +#define USTAR_typeflag_offset 156 +#define USTAR_typeflag_size 1 +#define USTAR_linkname_offset 157 +#define USTAR_linkname_size 100 +#define USTAR_magic_offset 257 +#define USTAR_magic_size 6 +#define USTAR_version_offset 263 +#define USTAR_version_size 2 +#define USTAR_uname_offset 265 +#define USTAR_uname_size 32 +#define USTAR_gname_offset 297 +#define USTAR_gname_size 32 +#define USTAR_rdevmajor_offset 329 +#define USTAR_rdevmajor_size 6 +#define USTAR_rdevmajor_max_size 8 +#define USTAR_rdevminor_offset 337 +#define USTAR_rdevminor_size 6 +#define USTAR_rdevminor_max_size 8 +#define USTAR_prefix_offset 345 +#define USTAR_prefix_size 155 +#define USTAR_padding_offset 500 +#define USTAR_padding_size 12 + +/* + * A filled-in copy of the header for initialization. + */ +static const char template_header[] = { + /* name: 100 bytes */ + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0, + /* Mode, space-null termination: 8 bytes */ + '0','0','0','0','0','0', ' ','\0', + /* uid, space-null termination: 8 bytes */ + '0','0','0','0','0','0', ' ','\0', + /* gid, space-null termination: 8 bytes */ + '0','0','0','0','0','0', ' ','\0', + /* size, space termation: 12 bytes */ + '0','0','0','0','0','0','0','0','0','0','0', ' ', + /* mtime, space termation: 12 bytes */ + '0','0','0','0','0','0','0','0','0','0','0', ' ', + /* Initial checksum value: 8 spaces */ + ' ',' ',' ',' ',' ',' ',' ',' ', + /* Typeflag: 1 byte */ + '0', /* '0' = regular file */ + /* Linkname: 100 bytes */ + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0, + /* Magic: 6 bytes, Version: 2 bytes */ + 'u','s','t','a','r','\0', '0','0', + /* Uname: 32 bytes */ + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + /* Gname: 32 bytes */ + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + /* rdevmajor + space/null padding: 8 bytes */ + '0','0','0','0','0','0', ' ','\0', + /* rdevminor + space/null padding: 8 bytes */ + '0','0','0','0','0','0', ' ','\0', + /* Prefix: 155 bytes */ + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0, + /* Padding: 12 bytes */ + 0,0,0,0,0,0,0,0, 0,0,0,0 +}; + +static ssize_t archive_write_ustar_data(struct archive_write *a, const void *buff, + size_t s); +static int archive_write_ustar_destroy(struct archive_write *); +static int archive_write_ustar_finish(struct archive_write *); +static int archive_write_ustar_finish_entry(struct archive_write *); +static int archive_write_ustar_header(struct archive_write *, + struct archive_entry *entry); +static int format_256(int64_t, char *, int); +static int format_number(int64_t, char *, int size, int max, int strict); +static int format_octal(int64_t, char *, int); +static int write_nulls(struct archive_write *a, size_t); + +/* + * Set output format to 'ustar' format. + */ +int +archive_write_set_format_ustar(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct ustar *ustar; + + /* If someone else was already registered, unregister them. */ + if (a->format_destroy != NULL) + (a->format_destroy)(a); + + /* Basic internal sanity test. */ + if (sizeof(template_header) != 512) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Internal: template_header wrong size: %d should be 512", sizeof(template_header)); + return (ARCHIVE_FATAL); + } + + ustar = (struct ustar *)malloc(sizeof(*ustar)); + if (ustar == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate ustar data"); + return (ARCHIVE_FATAL); + } + memset(ustar, 0, sizeof(*ustar)); + a->format_data = ustar; + + a->pad_uncompressed = 1; /* Mimic gtar in this respect. */ + a->format_name = "ustar"; + a->format_write_header = archive_write_ustar_header; + a->format_write_data = archive_write_ustar_data; + a->format_finish = archive_write_ustar_finish; + a->format_destroy = archive_write_ustar_destroy; + a->format_finish_entry = archive_write_ustar_finish_entry; + a->archive.archive_format = ARCHIVE_FORMAT_TAR_USTAR; + a->archive.archive_format_name = "POSIX ustar"; + return (ARCHIVE_OK); +} + +static int +archive_write_ustar_header(struct archive_write *a, struct archive_entry *entry) +{ + char buff[512]; + int ret, ret2; + struct ustar *ustar; + + ustar = (struct ustar *)a->format_data; + + /* Only regular files (not hardlinks) have data. */ + if (archive_entry_hardlink(entry) != NULL || + archive_entry_symlink(entry) != NULL || + !(archive_entry_filetype(entry) == AE_IFREG)) + archive_entry_set_size(entry, 0); + + if (AE_IFDIR == archive_entry_filetype(entry)) { + const char *p; + char *t; + /* + * Ensure a trailing '/'. Modify the entry so + * the client sees the change. + */ + p = archive_entry_pathname(entry); + if (p[strlen(p) - 1] != '/') { + t = (char *)malloc(strlen(p) + 2); + if (t == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate ustar data"); + return(ARCHIVE_FATAL); + } + strcpy(t, p); + strcat(t, "/"); + archive_entry_copy_pathname(entry, t); + free(t); + } + } + + ret = __archive_write_format_header_ustar(a, buff, entry, -1, 1); + if (ret < ARCHIVE_WARN) + return (ret); + ret2 = (a->compressor.write)(a, buff, 512); + if (ret2 < ARCHIVE_WARN) + return (ret2); + if (ret2 < ret) + ret = ret2; + + ustar->entry_bytes_remaining = archive_entry_size(entry); + ustar->entry_padding = 0x1ff & (-(int64_t)ustar->entry_bytes_remaining); + return (ret); +} + +/* + * Format a basic 512-byte "ustar" header. + * + * Returns -1 if format failed (due to field overflow). + * Note that this always formats as much of the header as possible. + * If "strict" is set to zero, it will extend numeric fields as + * necessary (overwriting terminators or using base-256 extensions). + * + * This is exported so that other 'tar' formats can use it. + */ +int +__archive_write_format_header_ustar(struct archive_write *a, char h[512], + struct archive_entry *entry, int tartype, int strict) +{ + unsigned int checksum; + int i, ret; + size_t copy_length; + const char *p, *pp; + int mytartype; + + ret = 0; + mytartype = -1; + /* + * The "template header" already includes the "ustar" + * signature, various end-of-field markers and other required + * elements. + */ + memcpy(h, &template_header, 512); + + /* + * Because the block is already null-filled, and strings + * are allowed to exactly fill their destination (without null), + * I use memcpy(dest, src, strlen()) here a lot to copy strings. + */ + + pp = archive_entry_pathname(entry); + if (strlen(pp) <= USTAR_name_size) + memcpy(h + USTAR_name_offset, pp, strlen(pp)); + else { + /* Store in two pieces, splitting at a '/'. */ + p = strchr(pp + strlen(pp) - USTAR_name_size - 1, '/'); + /* + * Look for the next '/' if we chose the first character + * as the separator. (ustar format doesn't permit + * an empty prefix.) + */ + if (p == pp) + p = strchr(p + 1, '/'); + /* Fail if the name won't fit. */ + if (!p) { + /* No separator. */ + archive_set_error(&a->archive, ENAMETOOLONG, + "Pathname too long"); + ret = ARCHIVE_FAILED; + } else if (p[1] == '\0') { + /* + * The only feasible separator is a final '/'; + * this would result in a non-empty prefix and + * an empty name, which POSIX doesn't + * explicity forbid, but it just feels wrong. + */ + archive_set_error(&a->archive, ENAMETOOLONG, + "Pathname too long"); + ret = ARCHIVE_FAILED; + } else if (p > pp + USTAR_prefix_size) { + /* Prefix is too long. */ + archive_set_error(&a->archive, ENAMETOOLONG, + "Pathname too long"); + ret = ARCHIVE_FAILED; + } else { + /* Copy prefix and remainder to appropriate places */ + memcpy(h + USTAR_prefix_offset, pp, p - pp); + memcpy(h + USTAR_name_offset, p + 1, pp + strlen(pp) - p - 1); + } + } + + p = archive_entry_hardlink(entry); + if (p != NULL) + mytartype = '1'; + else + p = archive_entry_symlink(entry); + if (p != NULL && p[0] != '\0') { + copy_length = strlen(p); + if (copy_length > USTAR_linkname_size) { + archive_set_error(&a->archive, ENAMETOOLONG, + "Link contents too long"); + ret = ARCHIVE_FAILED; + copy_length = USTAR_linkname_size; + } + memcpy(h + USTAR_linkname_offset, p, copy_length); + } + + p = archive_entry_uname(entry); + if (p != NULL && p[0] != '\0') { + copy_length = strlen(p); + if (copy_length > USTAR_uname_size) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Username too long"); + ret = ARCHIVE_FAILED; + copy_length = USTAR_uname_size; + } + memcpy(h + USTAR_uname_offset, p, copy_length); + } + + p = archive_entry_gname(entry); + if (p != NULL && p[0] != '\0') { + copy_length = strlen(p); + if (strlen(p) > USTAR_gname_size) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Group name too long"); + ret = ARCHIVE_FAILED; + copy_length = USTAR_gname_size; + } + memcpy(h + USTAR_gname_offset, p, copy_length); + } + + if (format_number(archive_entry_mode(entry) & 07777, h + USTAR_mode_offset, USTAR_mode_size, USTAR_mode_max_size, strict)) { + archive_set_error(&a->archive, ERANGE, "Numeric mode too large"); + ret = ARCHIVE_FAILED; + } + + if (format_number(archive_entry_uid(entry), h + USTAR_uid_offset, USTAR_uid_size, USTAR_uid_max_size, strict)) { + archive_set_error(&a->archive, ERANGE, "Numeric user ID too large"); + ret = ARCHIVE_FAILED; + } + + if (format_number(archive_entry_gid(entry), h + USTAR_gid_offset, USTAR_gid_size, USTAR_gid_max_size, strict)) { + archive_set_error(&a->archive, ERANGE, "Numeric group ID too large"); + ret = ARCHIVE_FAILED; + } + + if (format_number(archive_entry_size(entry), h + USTAR_size_offset, USTAR_size_size, USTAR_size_max_size, strict)) { + archive_set_error(&a->archive, ERANGE, "File size out of range"); + ret = ARCHIVE_FAILED; + } + + if (format_number(archive_entry_mtime(entry), h + USTAR_mtime_offset, USTAR_mtime_size, USTAR_mtime_max_size, strict)) { + archive_set_error(&a->archive, ERANGE, + "File modification time too large"); + ret = ARCHIVE_FAILED; + } + + if (archive_entry_filetype(entry) == AE_IFBLK + || archive_entry_filetype(entry) == AE_IFCHR) { + if (format_number(archive_entry_rdevmajor(entry), h + USTAR_rdevmajor_offset, + USTAR_rdevmajor_size, USTAR_rdevmajor_max_size, strict)) { + archive_set_error(&a->archive, ERANGE, + "Major device number too large"); + ret = ARCHIVE_FAILED; + } + + if (format_number(archive_entry_rdevminor(entry), h + USTAR_rdevminor_offset, + USTAR_rdevminor_size, USTAR_rdevminor_max_size, strict)) { + archive_set_error(&a->archive, ERANGE, + "Minor device number too large"); + ret = ARCHIVE_FAILED; + } + } + + if (tartype >= 0) { + h[USTAR_typeflag_offset] = tartype; + } else if (mytartype >= 0) { + h[USTAR_typeflag_offset] = mytartype; + } else { + switch (archive_entry_filetype(entry)) { + case AE_IFREG: h[USTAR_typeflag_offset] = '0' ; break; + case AE_IFLNK: h[USTAR_typeflag_offset] = '2' ; break; + case AE_IFCHR: h[USTAR_typeflag_offset] = '3' ; break; + case AE_IFBLK: h[USTAR_typeflag_offset] = '4' ; break; + case AE_IFDIR: h[USTAR_typeflag_offset] = '5' ; break; + case AE_IFIFO: h[USTAR_typeflag_offset] = '6' ; break; + case AE_IFSOCK: + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "tar format cannot archive socket"); + return (ARCHIVE_FAILED); + default: + archive_set_error(&a->archive, + ARCHIVE_ERRNO_FILE_FORMAT, + "tar format cannot archive this (mode=0%lo)", + (unsigned long)archive_entry_mode(entry)); + ret = ARCHIVE_FAILED; + } + } + + checksum = 0; + for (i = 0; i < 512; i++) + checksum += 255 & (unsigned int)h[i]; + h[USTAR_checksum_offset + 6] = '\0'; /* Can't be pre-set in the template. */ + /* h[USTAR_checksum_offset + 7] = ' '; */ /* This is pre-set in the template. */ + format_octal(checksum, h + USTAR_checksum_offset, 6); + return (ret); +} + +/* + * Format a number into a field, with some intelligence. + */ +static int +format_number(int64_t v, char *p, int s, int maxsize, int strict) +{ + int64_t limit; + + limit = ((int64_t)1 << (s*3)); + + /* "Strict" only permits octal values with proper termination. */ + if (strict) + return (format_octal(v, p, s)); + + /* + * In non-strict mode, we allow the number to overwrite one or + * more bytes of the field termination. Even old tar + * implementations should be able to handle this with no + * problem. + */ + if (v >= 0) { + while (s <= maxsize) { + if (v < limit) + return (format_octal(v, p, s)); + s++; + limit <<= 3; + } + } + + /* Base-256 can handle any number, positive or negative. */ + return (format_256(v, p, maxsize)); +} + +/* + * Format a number into the specified field using base-256. + */ +static int +format_256(int64_t v, char *p, int s) +{ + p += s; + while (s-- > 0) { + *--p = (char)(v & 0xff); + v >>= 8; + } + *p |= 0x80; /* Set the base-256 marker bit. */ + return (0); +} + +/* + * Format a number into the specified field. + */ +static int +format_octal(int64_t v, char *p, int s) +{ + int len; + + len = s; + + /* Octal values can't be negative, so use 0. */ + if (v < 0) { + while (len-- > 0) + *p++ = '0'; + return (-1); + } + + p += s; /* Start at the end and work backwards. */ + while (s-- > 0) { + *--p = (char)('0' + (v & 7)); + v >>= 3; + } + + if (v == 0) + return (0); + + /* If it overflowed, fill field with max value. */ + while (len-- > 0) + *p++ = '7'; + + return (-1); +} + +static int +archive_write_ustar_finish(struct archive_write *a) +{ + int r; + + if (a->compressor.write == NULL) + return (ARCHIVE_OK); + + r = write_nulls(a, 512*2); + return (r); +} + +static int +archive_write_ustar_destroy(struct archive_write *a) +{ + struct ustar *ustar; + + ustar = (struct ustar *)a->format_data; + free(ustar); + a->format_data = NULL; + return (ARCHIVE_OK); +} + +static int +archive_write_ustar_finish_entry(struct archive_write *a) +{ + struct ustar *ustar; + int ret; + + ustar = (struct ustar *)a->format_data; + ret = write_nulls(a, + ustar->entry_bytes_remaining + ustar->entry_padding); + ustar->entry_bytes_remaining = ustar->entry_padding = 0; + return (ret); +} + +static int +write_nulls(struct archive_write *a, size_t padding) +{ + int ret; + size_t to_write; + + while (padding > 0) { + to_write = padding < a->null_length ? padding : a->null_length; + ret = (a->compressor.write)(a, a->nulls, to_write); + if (ret != ARCHIVE_OK) + return (ret); + padding -= to_write; + } + return (ARCHIVE_OK); +} + +static ssize_t +archive_write_ustar_data(struct archive_write *a, const void *buff, size_t s) +{ + struct ustar *ustar; + int ret; + + ustar = (struct ustar *)a->format_data; + if (s > ustar->entry_bytes_remaining) + s = ustar->entry_bytes_remaining; + ret = (a->compressor.write)(a, buff, s); + ustar->entry_bytes_remaining -= s; + if (ret != ARCHIVE_OK) + return (ret); + return (s); +} diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_zip.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_zip.c new file mode 100644 index 000000000..6cbc03ca9 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_zip.c @@ -0,0 +1,667 @@ +/*- + * Copyright (c) 2008 Anselm Strauss + * Copyright (c) 2009 Joerg Sonnenberger + * 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. + */ + +/* + * Development supported by Google Summer of Code 2008. + */ + +/* + * The current implementation is very limited: + * + * - No encryption support. + * - No ZIP64 support. + * - No support for splitting and spanning. + * - Only supports regular file and folder entries. + * + * Note that generally data in ZIP files is little-endian encoded, + * with some exceptions. + * + * TODO: Since Libarchive is generally 64bit oriented, but this implementation + * does not yet support sizes exceeding 32bit, it is highly fragile for + * big archives. This should change when ZIP64 is finally implemented, otherwise + * some serious checking has to be done. + * + */ + +#include "archive_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_ZLIB_H +#include +#endif + +#include "archive.h" +#include "archive_endian.h" +#include "archive_entry.h" +#include "archive_private.h" +#include "archive_write_private.h" + +#ifndef HAVE_ZLIB_H +#include "archive_crc32.h" +#endif + +#define ZIP_SIGNATURE_LOCAL_FILE_HEADER 0x04034b50 +#define ZIP_SIGNATURE_DATA_DESCRIPTOR 0x08074b50 +#define ZIP_SIGNATURE_FILE_HEADER 0x02014b50 +#define ZIP_SIGNATURE_CENTRAL_DIRECTORY_END 0x06054b50 +#define ZIP_SIGNATURE_EXTRA_TIMESTAMP 0x5455 +#define ZIP_SIGNATURE_EXTRA_UNIX 0x7855 +#define ZIP_VERSION_EXTRACT 0x0014 /* ZIP version 2.0 is needed. */ +#define ZIP_VERSION_BY 0x0314 /* Made by UNIX, using ZIP version 2.0. */ +#define ZIP_FLAGS 0x08 /* Flagging bit 3 (count from 0) for using data descriptor. */ + +enum compression { + COMPRESSION_STORE = 0 +#ifdef HAVE_ZLIB_H + , + COMPRESSION_DEFLATE = 8 +#endif +}; + +static ssize_t archive_write_zip_data(struct archive_write *, const void *buff, size_t s); +static int archive_write_zip_finish(struct archive_write *); +static int archive_write_zip_destroy(struct archive_write *); +static int archive_write_zip_finish_entry(struct archive_write *); +static int archive_write_zip_header(struct archive_write *, struct archive_entry *); +static unsigned int dos_time(const time_t); +static size_t path_length(struct archive_entry *); +static int write_path(struct archive_entry *, struct archive_write *); + +struct zip_local_file_header { + char signature[4]; + char version[2]; + char flags[2]; + char compression[2]; + char timedate[4]; + char crc32[4]; + char compressed_size[4]; + char uncompressed_size[4]; + char filename_length[2]; + char extra_length[2]; +}; + +struct zip_file_header { + char signature[4]; + char version_by[2]; + char version_extract[2]; + char flags[2]; + char compression[2]; + char timedate[4]; + char crc32[4]; + char compressed_size[4]; + char uncompressed_size[4]; + char filename_length[2]; + char extra_length[2]; + char comment_length[2]; + char disk_number[2]; + char attributes_internal[2]; + char attributes_external[4]; + char offset[4]; +}; + +struct zip_data_descriptor { + char signature[4]; /* Not mandatory, but recommended by specification. */ + char crc32[4]; + char compressed_size[4]; + char uncompressed_size[4]; +}; + +struct zip_extra_data_local { + char time_id[2]; + char time_size[2]; + char time_flag[1]; + char mtime[4]; + char atime[4]; + char ctime[4]; + char unix_id[2]; + char unix_size[2]; + char unix_uid[2]; + char unix_gid[2]; +}; + +struct zip_extra_data_central { + char time_id[2]; + char time_size[2]; + char time_flag[1]; + char mtime[4]; + char unix_id[2]; + char unix_size[2]; +}; + +struct zip_file_header_link { + struct zip_file_header_link *next; + struct archive_entry *entry; + off_t offset; + unsigned long crc32; + off_t compressed_size; + enum compression compression; +}; + +struct zip { + struct zip_data_descriptor data_descriptor; + struct zip_file_header_link *central_directory; + struct zip_file_header_link *central_directory_end; + int64_t offset; + int64_t written_bytes; + int64_t remaining_data_bytes; + enum compression compression; + +#ifdef HAVE_ZLIB_H + z_stream stream; + size_t len_buf; + unsigned char *buf; +#endif +}; + +struct zip_central_directory_end { + char signature[4]; + char disk[2]; + char start_disk[2]; + char entries_disk[2]; + char entries[2]; + char size[4]; + char offset[4]; + char comment_length[2]; +}; + +static int +archive_write_zip_options(struct archive_write *a, const char *key, + const char *value) +{ + struct zip *zip = a->format_data; + + if (strcmp(key, "compression") == 0) { + if (strcmp(value, "deflate") == 0) { +#ifdef HAVE_ZLIB_H + zip->compression = COMPRESSION_DEFLATE; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "deflate compression not supported"); + return ARCHIVE_WARN; +#endif + } else if (strcmp(value, "store") == 0) + zip->compression = COMPRESSION_STORE; + else + return (ARCHIVE_WARN); + return (ARCHIVE_OK); + } + return (ARCHIVE_WARN); +} + +int +archive_write_set_format_zip(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + struct zip *zip; + + /* If another format was already registered, unregister it. */ + if (a->format_destroy != NULL) + (a->format_destroy)(a); + + zip = (struct zip *) malloc(sizeof(*zip)); + if (zip == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate zip data"); + return (ARCHIVE_FATAL); + } + zip->central_directory = NULL; + zip->central_directory_end = NULL; + zip->offset = 0; + zip->written_bytes = 0; + zip->remaining_data_bytes = 0; + +#ifdef HAVE_ZLIB_H + zip->compression = COMPRESSION_DEFLATE; + zip->len_buf = 65536; + zip->buf = malloc(zip->len_buf); + if (zip->buf == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate compression buffer"); + return (ARCHIVE_FATAL); + } +#else + zip->compression = COMPRESSION_STORE; +#endif + + a->format_data = zip; + + a->pad_uncompressed = 0; /* Actually not needed for now, since no compression support yet. */ + a->format_name = "zip"; + a->format_options = archive_write_zip_options; + a->format_write_header = archive_write_zip_header; + a->format_write_data = archive_write_zip_data; + a->format_finish_entry = archive_write_zip_finish_entry; + a->format_finish = archive_write_zip_finish; + a->format_destroy = archive_write_zip_destroy; + a->archive.archive_format = ARCHIVE_FORMAT_ZIP; + a->archive.archive_format_name = "ZIP"; + + archive_le32enc(&zip->data_descriptor.signature, + ZIP_SIGNATURE_DATA_DESCRIPTOR); + + return (ARCHIVE_OK); +} + +static int +archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) +{ + struct zip *zip; + struct zip_local_file_header h; + struct zip_extra_data_local e; + struct zip_data_descriptor *d; + struct zip_file_header_link *l; + int ret; + int64_t size; + mode_t type; + + /* Entries other than a regular file or a folder are skipped. */ + type = archive_entry_filetype(entry); + if ((type != AE_IFREG) & (type != AE_IFDIR)) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Filetype not supported"); + return ARCHIVE_FAILED; + }; + + /* Directory entries should have a size of 0. */ + if (type == AE_IFDIR) + archive_entry_set_size(entry, 0); + + zip = a->format_data; + d = &zip->data_descriptor; + size = archive_entry_size(entry); + zip->remaining_data_bytes = size; + + /* Append archive entry to the central directory data. */ + l = (struct zip_file_header_link *) malloc(sizeof(*l)); + if (l == NULL) { + archive_set_error(&a->archive, ENOMEM, "Can't allocate zip header data"); + return (ARCHIVE_FATAL); + } + l->entry = archive_entry_clone(entry); + /* Initialize the CRC variable and potentially the local crc32(). */ + l->crc32 = crc32(0, NULL, 0); + l->compression = zip->compression; + l->compressed_size = 0; + l->next = NULL; + if (zip->central_directory == NULL) { + zip->central_directory = l; + } else { + zip->central_directory_end->next = l; + } + zip->central_directory_end = l; + + /* Store the offset of this header for later use in central directory. */ + l->offset = zip->written_bytes; + + memset(&h, 0, sizeof(h)); + archive_le32enc(&h.signature, ZIP_SIGNATURE_LOCAL_FILE_HEADER); + archive_le16enc(&h.version, ZIP_VERSION_EXTRACT); + archive_le16enc(&h.flags, ZIP_FLAGS); + archive_le16enc(&h.compression, zip->compression); + archive_le32enc(&h.timedate, dos_time(archive_entry_mtime(entry))); + archive_le16enc(&h.filename_length, path_length(entry)); + + switch (zip->compression) { + case COMPRESSION_STORE: + /* Setting compressed and uncompressed sizes even when specification says + * to set to zero when using data descriptors. Otherwise the end of the + * data for an entry is rather difficult to find. */ + archive_le32enc(&h.compressed_size, size); + archive_le32enc(&h.uncompressed_size, size); + break; +#ifdef HAVE_ZLIB_H + case COMPRESSION_DEFLATE: + archive_le32enc(&h.uncompressed_size, size); + + zip->stream.zalloc = Z_NULL; + zip->stream.zfree = Z_NULL; + zip->stream.opaque = Z_NULL; + zip->stream.next_out = zip->buf; + zip->stream.avail_out = zip->len_buf; + if (deflateInit2(&zip->stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, + -15, 8, Z_DEFAULT_STRATEGY) != Z_OK) { + archive_set_error(&a->archive, ENOMEM, "Can't init deflate compressor"); + return (ARCHIVE_FATAL); + } + break; +#endif + } + + /* Formatting extra data. */ + archive_le16enc(&h.extra_length, sizeof(e)); + archive_le16enc(&e.time_id, ZIP_SIGNATURE_EXTRA_TIMESTAMP); + archive_le16enc(&e.time_size, sizeof(e.time_flag) + + sizeof(e.mtime) + sizeof(e.atime) + sizeof(e.ctime)); + e.time_flag[0] = 0x07; + archive_le32enc(&e.mtime, archive_entry_mtime(entry)); + archive_le32enc(&e.atime, archive_entry_atime(entry)); + archive_le32enc(&e.ctime, archive_entry_ctime(entry)); + + archive_le16enc(&e.unix_id, ZIP_SIGNATURE_EXTRA_UNIX); + archive_le16enc(&e.unix_size, sizeof(e.unix_uid) + sizeof(e.unix_gid)); + archive_le16enc(&e.unix_uid, archive_entry_uid(entry)); + archive_le16enc(&e.unix_gid, archive_entry_gid(entry)); + + archive_le32enc(&d->uncompressed_size, size); + + ret = (a->compressor.write)(a, &h, sizeof(h)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + zip->written_bytes += sizeof(h); + + ret = write_path(entry, a); + if (ret <= ARCHIVE_OK) + return (ARCHIVE_FATAL); + zip->written_bytes += ret; + + ret = (a->compressor.write)(a, &e, sizeof(e)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + zip->written_bytes += sizeof(e); + + return (ARCHIVE_OK); +} + +static ssize_t +archive_write_zip_data(struct archive_write *a, const void *buff, size_t s) +{ + int ret; + struct zip *zip = a->format_data; + struct zip_file_header_link *l = zip->central_directory_end; + + if (s > zip->remaining_data_bytes) + s = zip->remaining_data_bytes; + + if (s == 0) return 0; + + switch (zip->compression) { + case COMPRESSION_STORE: + ret = (a->compressor.write)(a, buff, s); + if (ret != ARCHIVE_OK) return (ret); + zip->written_bytes += s; + zip->remaining_data_bytes -= s; + l->compressed_size += s; + l->crc32 = crc32(l->crc32, buff, s); + return (s); +#if HAVE_ZLIB_H + case COMPRESSION_DEFLATE: + zip->stream.next_in = (unsigned char*)(uintptr_t)buff; + zip->stream.avail_in = s; + do { + ret = deflate(&zip->stream, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR) + return (ARCHIVE_FATAL); + if (zip->stream.avail_out == 0) { + ret = (a->compressor.write)(a, zip->buf, zip->len_buf); + if (ret != ARCHIVE_OK) + return (ret); + l->compressed_size += zip->len_buf; + zip->written_bytes += zip->len_buf; + zip->stream.next_out = zip->buf; + zip->stream.avail_out = zip->len_buf; + } + } while (zip->stream.avail_in != 0); + zip->remaining_data_bytes -= s; + /* If we have it, use zlib's fast crc32() */ + l->crc32 = crc32(l->crc32, buff, s); + return (s); +#endif + + default: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Invalid ZIP compression type"); + return ARCHIVE_FATAL; + } +} + +static int +archive_write_zip_finish_entry(struct archive_write *a) +{ + /* Write the data descripter after file data has been written. */ + int ret; + struct zip *zip = a->format_data; + struct zip_data_descriptor *d = &zip->data_descriptor; + struct zip_file_header_link *l = zip->central_directory_end; +#if HAVE_ZLIB_H + size_t reminder; +#endif + + switch(zip->compression) { + case COMPRESSION_STORE: + break; +#if HAVE_ZLIB_H + case COMPRESSION_DEFLATE: + for (;;) { + ret = deflate(&zip->stream, Z_FINISH); + if (ret == Z_STREAM_ERROR) + return (ARCHIVE_FATAL); + reminder = zip->len_buf - zip->stream.avail_out; + ret = (a->compressor.write)(a, zip->buf, reminder); + if (ret != ARCHIVE_OK) + return (ret); + l->compressed_size += reminder; + zip->written_bytes += reminder; + zip->stream.next_out = zip->buf; + if (zip->stream.avail_out != 0) + break; + zip->stream.avail_out = zip->len_buf; + } + deflateEnd(&zip->stream); + break; +#endif + } + + archive_le32enc(&d->crc32, l->crc32); + archive_le32enc(&d->compressed_size, l->compressed_size); + ret = (a->compressor.write)(a, d, sizeof(*d)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + zip->written_bytes += sizeof(*d); + return (ARCHIVE_OK); +} + +static int +archive_write_zip_finish(struct archive_write *a) +{ + struct zip *zip; + struct zip_file_header_link *l; + struct zip_file_header h; + struct zip_central_directory_end end; + struct zip_extra_data_central e; + off_t offset_start, offset_end; + int entries; + int ret; + + zip = a->format_data; + l = zip->central_directory; + + /* + * Formatting central directory file header fields that are fixed for all entries. + * Fields not used (and therefor 0) are: + * + * - comment_length + * - disk_number + * - attributes_internal + */ + memset(&h, 0, sizeof(h)); + archive_le32enc(&h.signature, ZIP_SIGNATURE_FILE_HEADER); + archive_le16enc(&h.version_by, ZIP_VERSION_BY); + archive_le16enc(&h.version_extract, ZIP_VERSION_EXTRACT); + archive_le16enc(&h.flags, ZIP_FLAGS); + + entries = 0; + offset_start = zip->written_bytes; + + /* Formatting individual header fields per entry and + * writing each entry. */ + while (l != NULL) { + archive_le16enc(&h.compression, l->compression); + archive_le32enc(&h.timedate, dos_time(archive_entry_mtime(l->entry))); + archive_le32enc(&h.crc32, l->crc32); + archive_le32enc(&h.compressed_size, l->compressed_size); + archive_le32enc(&h.uncompressed_size, archive_entry_size(l->entry)); + archive_le16enc(&h.filename_length, path_length(l->entry)); + archive_le16enc(&h.extra_length, sizeof(e)); + archive_le16enc(&h.attributes_external[2], archive_entry_mode(l->entry)); + archive_le32enc(&h.offset, l->offset); + + /* Formatting extra data. */ + archive_le16enc(&e.time_id, ZIP_SIGNATURE_EXTRA_TIMESTAMP); + archive_le16enc(&e.time_size, sizeof(e.mtime) + sizeof(e.time_flag)); + e.time_flag[0] = 0x07; + archive_le32enc(&e.mtime, archive_entry_mtime(l->entry)); + archive_le16enc(&e.unix_id, ZIP_SIGNATURE_EXTRA_UNIX); + archive_le16enc(&e.unix_size, 0x0000); + + ret = (a->compressor.write)(a, &h, sizeof(h)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + zip->written_bytes += sizeof(h); + + ret = write_path(l->entry, a); + if (ret <= ARCHIVE_OK) + return (ARCHIVE_FATAL); + zip->written_bytes += ret; + + ret = (a->compressor.write)(a, &e, sizeof(e)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + zip->written_bytes += sizeof(e); + + l = l->next; + entries++; + } + offset_end = zip->written_bytes; + + /* Formatting end of central directory. */ + memset(&end, 0, sizeof(end)); + archive_le32enc(&end.signature, ZIP_SIGNATURE_CENTRAL_DIRECTORY_END); + archive_le16enc(&end.entries_disk, entries); + archive_le16enc(&end.entries, entries); + archive_le32enc(&end.size, offset_end - offset_start); + archive_le32enc(&end.offset, offset_start); + + /* Writing end of central directory. */ + ret = (a->compressor.write)(a, &end, sizeof(end)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + zip->written_bytes += sizeof(end); + return (ARCHIVE_OK); +} + +static int +archive_write_zip_destroy(struct archive_write *a) +{ + struct zip *zip; + struct zip_file_header_link *l; + + zip = a->format_data; + while (zip->central_directory != NULL) { + l = zip->central_directory; + zip->central_directory = l->next; + archive_entry_free(l->entry); + free(l); + } +#ifdef HAVE_ZLIB_H + free(zip->buf); +#endif + free(zip); + a->format_data = NULL; + return (ARCHIVE_OK); +} + +/* Convert into MSDOS-style date/time. */ +static unsigned int +dos_time(const time_t unix_time) +{ + struct tm *t; + unsigned int dt; + + /* This will not preserve time when creating/extracting the archive + * on two systems with different time zones. */ + t = localtime(&unix_time); + + dt = 0; + dt += ((t->tm_year - 80) & 0x7f) << 9; + dt += ((t->tm_mon + 1) & 0x0f) << 5; + dt += (t->tm_mday & 0x1f); + dt <<= 16; + dt += (t->tm_hour & 0x1f) << 11; + dt += (t->tm_min & 0x3f) << 5; + dt += (t->tm_sec & 0x3e) >> 1; /* Only counting every 2 seconds. */ + return dt; +} + +static size_t +path_length(struct archive_entry *entry) +{ + mode_t type; + const char *path; + + type = archive_entry_filetype(entry); + path = archive_entry_pathname(entry); + + if ((type == AE_IFDIR) & (path[strlen(path) - 1] != '/')) { + return strlen(path) + 1; + } else { + return strlen(path); + } +} + +static int +write_path(struct archive_entry *entry, struct archive_write *archive) +{ + int ret; + const char *path; + mode_t type; + size_t written_bytes; + + path = archive_entry_pathname(entry); + type = archive_entry_filetype(entry); + written_bytes = 0; + + ret = (archive->compressor.write)(archive, path, strlen(path)); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + written_bytes += strlen(path); + + /* Folders are recognized by a traling slash. */ + if ((type == AE_IFDIR) & (path[strlen(path) - 1] != '/')) { + ret = (archive->compressor.write)(archive, "/", 1); + if (ret != ARCHIVE_OK) + return (ARCHIVE_FATAL); + written_bytes += 1; + } + + return written_bytes; +} diff --git a/Utilities/cmlibarchive/libarchive/config_freebsd.h b/Utilities/cmlibarchive/libarchive/config_freebsd.h new file mode 100644 index 000000000..edfc7bd36 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/config_freebsd.h @@ -0,0 +1,150 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/config_freebsd.h,v 1.15 2008/09/30 03:53:03 kientzle Exp $ + */ + +/* FreeBSD 5.0 and later have ACL and extattr support. */ +#if __FreeBSD__ > 4 +#define HAVE_ACL_CREATE_ENTRY 1 +#define HAVE_ACL_GET_LINK_NP 1 +#define HAVE_ACL_GET_PERM_NP 1 +#define HAVE_ACL_INIT 1 +#define HAVE_ACL_SET_FD 1 +#define HAVE_ACL_SET_FD_NP 1 +#define HAVE_ACL_SET_FILE 1 +#define HAVE_ACL_USER 1 +#define HAVE_EXTATTR_GET_FILE 1 +#define HAVE_EXTATTR_LIST_FILE 1 +#define HAVE_EXTATTR_SET_FD 1 +#define HAVE_EXTATTR_SET_FILE 1 +#define HAVE_SYS_ACL_H 1 +#define HAVE_SYS_EXTATTR_H 1 +#endif + +#define HAVE_BZLIB_H 1 +#define HAVE_CHFLAGS 1 +#define HAVE_CHOWN 1 +#define HAVE_DECL_INT64_MAX 1 +#define HAVE_DECL_INT64_MIN 1 +#define HAVE_DECL_SIZE_MAX 1 +#define HAVE_DECL_SSIZE_MAX 1 +#define HAVE_DECL_STRERROR_R 1 +#define HAVE_DECL_UINT32_MAX 1 +#define HAVE_DECL_UINT64_MAX 1 +#define HAVE_DIRENT_H 1 +#define HAVE_EFTYPE 1 +#define HAVE_EILSEQ 1 +#define HAVE_ERRNO_H 1 +#define HAVE_FCHDIR 1 +#define HAVE_FCHFLAGS 1 +#define HAVE_FCHMOD 1 +#define HAVE_FCHOWN 1 +#define HAVE_FCNTL 1 +#define HAVE_FCNTL_H 1 +#define HAVE_FSEEKO 1 +#define HAVE_FSTAT 1 +#define HAVE_FTRUNCATE 1 +#define HAVE_FUTIMES 1 +#define HAVE_GETEUID 1 +#define HAVE_GETPID 1 +#define HAVE_GRP_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_LCHFLAGS 1 +#define HAVE_LCHMOD 1 +#define HAVE_LCHOWN 1 +#define HAVE_LIMITS_H 1 +#define HAVE_LINK 1 +#define HAVE_LSTAT 1 +#define HAVE_LUTIMES 1 +#define HAVE_MALLOC 1 +#define HAVE_MD5 1 +#define HAVE_MD5_H 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MKDIR 1 +#define HAVE_MKFIFO 1 +#define HAVE_MKNOD 1 +#define HAVE_OPENSSL_MD5_H 1 +#define HAVE_OPENSSL_RIPEMD_H 1 +#define HAVE_OPENSSL_SHA_H 1 +#define HAVE_PIPE 1 +#define HAVE_POLL 1 +#define HAVE_POLL_H 1 +#define HAVE_PWD_H 1 +#define HAVE_READLINK 1 +#define HAVE_RMD160 1 +#define HAVE_SELECT 1 +#define HAVE_SETENV 1 +#define HAVE_SHA_H 1 +#define HAVE_SHA1 1 +#define HAVE_SHA256 1 +#define HAVE_SHA256_H 1 +#define HAVE_SHA384 1 +#define HAVE_SHA512 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRCHR 1 +#define HAVE_STRDUP 1 +#define HAVE_STRERROR 1 +#define HAVE_STRERROR_R 1 +#define HAVE_STRINGS_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 +#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1 +#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1 +#define HAVE_STRUCT_STAT_ST_FLAGS 1 +#define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1 +#define HAVE_SYMLINK 1 +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_SYS_SELECT_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_TYPES_H 1 +#undef HAVE_SYS_UTIME_H +#define HAVE_SYS_WAIT_H 1 +#define HAVE_TIMEGM 1 +#define HAVE_TZSET 1 +#define HAVE_UNISTD_H 1 +#define HAVE_UNSETENV 1 +#define HAVE_UTIME 1 +#define HAVE_UTIMES 1 +#define HAVE_UTIME_H 1 +#define HAVE_VFORK 1 +#define HAVE_WCHAR_H 1 +#define HAVE_WCSCPY 1 +#define HAVE_WCSLEN 1 +#define HAVE_WCTOMB 1 +#define HAVE_WMEMCMP 1 +#define HAVE_WMEMCPY 1 +#define HAVE_ZLIB_H 1 +#define STDC_HEADERS 1 +#define TIME_WITH_SYS_TIME 1 + +/* FreeBSD 4 and earlier lack intmax_t/uintmax_t */ +#if __FreeBSD__ < 5 +#define intmax_t int64_t +#define uintmax_t uint64_t +#endif diff --git a/Utilities/cmlibarchive/libarchive/config_windows.h b/Utilities/cmlibarchive/libarchive/config_windows.h new file mode 100644 index 000000000..f609d2001 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/config_windows.h @@ -0,0 +1,578 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef CONFIG_H_INCLUDED +#define CONFIG_H_INCLUDED + +/////////////////////////////////////////////////////////////////////////// +// Check for Watcom and Microsoft Visual C compilers (WIN32 only) /////// +/////////////////////////////////////////////////////////////////////////// +#if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) + #define IS_WIN32 1 + + #if defined(__TURBOC__) || defined(__BORLANDC__) /* Borland compilers */ + #elif defined( __WATCOMC__ ) || defined(__WATCOMCPP__) /* Watcom compilers */ + #define IS_WATCOM 1 + /* Define to 1 if __INT64 is defined */ + #elif defined(__IBMC__) || defined(__IBMCPP__) /* IBM compilers */ + #elif defined( __SC__ ) /* Symantec C++ compilers */ + #elif defined( M_I86 ) && defined( MSDOS ) /* Microsoft DOS/Win 16 compilers */ + #elif defined( _M_IX86 ) || defined( _68K_ ) /* Microsoft Win32 compilers */ + #define IS_VISUALC 1 + /* Define to 1 if __INT64 is defined */ + #else + #endif + + /* Define to 1 if UID should be unsigned */ + #define USE_UNSIGNED_UID 1 + + /* Define to 1 if UID should be unsigned */ + #define USE_UNSIGNED_GID 1 +#endif +/////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////// + +/* Define to 1 if you have the `acl_create_entry' function. */ +/* #undef HAVE_ACL_CREATE_ENTRY */ + +/* Define to 1 if you have the `acl_get_perm' function. */ +/* #undef HAVE_ACL_GET_PERM */ + +/* Define to 1 if you have the `acl_get_perm_np' function. */ +/* #undef HAVE_ACL_GET_PERM_NP */ + +/* Define to 1 if you have the `acl_init' function. */ +/* #undef HAVE_ACL_INIT */ + +/* Define to 1 if the system has the type `acl_permset_t'. */ +/* #undef HAVE_ACL_PERMSET_T */ + +/* Define to 1 if you have the `acl_set_fd' function. */ +/* #undef HAVE_ACL_SET_FD */ + +/* Define to 1 if you have the `acl_set_fd_np' function. */ +/* #undef HAVE_ACL_SET_FD_NP */ + +/* Define to 1 if you have the `acl_set_file' function. */ +/* #undef HAVE_ACL_SET_FILE */ + +/* True for systems with POSIX ACL support */ +/* #undef HAVE_ACL_USER */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ATTR_XATTR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BZLIB_H */ + +/* Define to 1 if you have the `chflags' function. */ +/* #undef HAVE_CHFLAGS */ + +/* Define to 1 if you have the `chown' function. */ +/* #undef HAVE_CHOWN */ + +/* Define to 1 if you have the declaration of `INT64_MAX', and to 0 if you + don't. */ +#if defined(_MSC_VER) +/* #undef HAVE_DECL_INT64_MAX */ +#else +#define HAVE_DECL_INT64_MAX 1 +#endif + +/* Define to 1 if you have the declaration of `INT64_MIN', and to 0 if you + don't. */ +#if defined(_MSC_VER) +/* #undef HAVE_DECL_INT64_MIN */ +#else +#define HAVE_DECL_INT64_MIN 1 +#endif + +/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. + */ +/* #undef HAVE_DECL_OPTARG */ + +/* Define to 1 if you have the declaration of `optind', and to 0 if you don't. + */ +/* #undef HAVE_DECL_OPTIND */ + +/* Define to 1 if you have the declaration of `SIZE_MAX', and to 0 if you + don't. */ +#if defined(_MSC_VER) + #if _MSC_VER >= 1400 + #define HAVE_DECL_SIZE_MAX 1 + #else + /* #undef HAVE_DECL_SIZE_MAX */ + #endif +#else +#define HAVE_DECL_SIZE_MAX 1 +#endif + +/* Define to 1 if you have the declaration of `SSIZE_MAX', and to 0 if you + don't. */ +/* #undef HAVE_DECL_SSIZE_MAX */ + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +/* #undef HAVE_DECL_STRERROR_R */ + +/* Define to 1 if you have the declaration of `UINT32_MAX', and to 0 if you + don't. */ +#if defined(_MSC_VER) +/* #undef HAVE_DECL_UINT32_MAX */ +#else +#define HAVE_DECL_UINT32_MAX 1 +#endif + +/* Define to 1 if you have the declaration of `UINT64_MAX', and to 0 if you + don't. */ +#if defined(_MSC_VER) +/* #undef HAVE_DECL_UINT64_MAX */ +#else +#define HAVE_DECL_UINT64_MAX 1 +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_DIRENT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* Define to 1 if nl_langinfo supports D_MD_ORDER */ +/* #undef HAVE_D_MD_ORDER */ + +/* A possible errno value for invalid file format errors */ +/* #undef HAVE_EFTYPE */ + +/* A possible errno value for invalid file format errors */ +#define HAVE_EILSEQ 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_EXT2FS_EXT2_FS_H */ + +/* Define to 1 if you have the `fchdir' function. */ +/* #undef HAVE_FCHDIR */ + +/* Define to 1 if you have the `fchflags' function. */ +/* #undef HAVE_FCHFLAGS */ + +/* Define to 1 if you have the `fchmod' function. */ +/* #undef HAVE_FCHMOD */ + +/* Define to 1 if you have the `fchown' function. */ +/* #undef HAVE_FCHOWN */ + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the fcntl() function. */ +/* #undef HAVE_FCNTL_FN */ + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +/* #undef HAVE_FSEEKO */ + +/* Define to 1 if you have the `fsetxattr' function. */ +/* #undef HAVE_FSETXATTR */ + +/* Define to 1 if you have the `ftruncate' function. */ +#define HAVE_FTRUNCATE 1 + +/* Define to 1 if you have the `futimes' function. */ +#define HAVE_FUTIMES 1 + +/* Define to 1 if you have the `geteuid' function. */ +/* #undef HAVE_GETEUID */ + +/* Define to 1 if you have the `getxattr' function. */ +/* #undef HAVE_GETXATTR */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GRP_H */ + +/* Define to 1 if the system has the type `intmax_t'. */ +/* #undef HAVE_INTMAX_T */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_INTTYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LANGINFO_H */ + +/* Define to 1 if you have the `lchflags' function. */ +/* #undef HAVE_LCHFLAGS */ + +/* Define to 1 if you have the `lchmod' function. */ +/* #undef HAVE_LCHMOD */ + +/* Define to 1 if you have the `lchown' function. */ +/* #undef HAVE_LCHOWN */ + +/* Define to 1 if you have the `lgetxattr' function. */ +/* #undef HAVE_LGETXATTR */ + +/* Define to 1 if you have the `acl' library (-lacl). */ +/* #undef HAVE_LIBACL */ + +/* Define to 1 if you have the `attr' library (-lattr). */ +/* #undef HAVE_LIBATTR */ + +/* Define to 1 if you have the `bz2' library (-lbz2). */ +/* #undef HAVE_LIBBZ2 */ + +/* Define to 1 if you have the `z' library (-lz). */ +/* #undef HAVE_LIBZ */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_EXT2_FS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_FS_H */ + +/* Define to 1 if you have the `listxattr' function. */ +/* #undef HAVE_LISTXATTR */ + +/* Define to 1 if you have the `llistxattr' function. */ +/* #undef HAVE_LLISTXATTR */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if the system has the type `long long int'. */ +#define HAVE_LONG_LONG_INT 1 + +/* Define to 1 if you have the `lsetxattr' function. */ +/* #undef HAVE_LSETXATTR */ + +/* Define to 1 if `lstat' has the bug that it succeeds when given the + zero-length file name argument. */ +/* #undef HAVE_LSTAT_EMPTY_STRING_BUG */ + +/* Define to 1 if you have the `lutimes' function. */ +/* #undef HAVE_LUTIMES */ + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkdir' function. */ +#define HAVE_MKDIR 1 + +/* Define to 1 if you have the `mkfifo' function. */ +/* #undef HAVE_MKFIFO */ + +/* Define to 1 if you have the `mknod' function. */ +/* #undef HAVE_MKNOD */ + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the `nl_langinfo' function. */ +/* #undef HAVE_NL_LANGINFO */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PATHS_H */ + +/* Define to 1 if you have the `poll' function. */ +/* #undef HAVE_POLL */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_POLL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PWD_H */ + +/* Define to 1 if you have the `select' function. */ +/* #undef HAVE_SELECT */ + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +/* #undef HAVE_STAT_EMPTY_STRING_BUG */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#if defined(_MSC_VER) +/* #undef HAVE_STDINT_H */ +#else +#define HAVE_STDINT_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the `strerror_r' function. */ +/* #undef HAVE_STRERROR_R */ + +/* Define to 1 if you have the `strftime' function. */ +#define HAVE_STRFTIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if `st_mtimespec.tv_nsec' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC */ + +/* Define to 1 if `st_mtim.tv_nsec' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_ACL_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_IOCTL_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PARAM_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_POLL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SELECT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#if defined(_MSC_VER) +/* #undef HAVE_SYS_TIME_H */ +#else +#define HAVE_SYS_TIME_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UTIME_H 1 + +/* Define to 1 if you have that is POSIX.1 compatible. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define to 1 if you have the `timegm' function. */ +/* #undef HAVE_TIMEGM */ + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if the system has the type `uintmax_t'. */ +#if defined(_MSC_VER) +/* #undef HAVE_UINTMAX_T */ +#else +#define HAVE_UINTMAX_T 1 +#endif + +/* Define to 1 if you have the header file. */ +#if defined(_MSC_VER) +/* #undef HAVE_UNISTD_H */ +#else +#define HAVE_UNISTD_H 1 +#endif + +/* Define to 1 if the system has the type `unsigned long long'. */ +#define HAVE_UNSIGNED_LONG_LONG 1 + +/* Define to 1 if the system has the type `unsigned long long int'. */ +#define HAVE_UNSIGNED_LONG_LONG_INT 1 + +/* Define to 1 if you have the `utime' function. */ +#define HAVE_UTIME 1 + +/* Define to 1 if you have the `utimes' function. */ +#define HAVE_UTIMES 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UTIME_H */ + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_WCHAR_H 1 + +/* Define to 1 if you have the `wcscpy' function. */ +#define HAVE_WCSCPY 1 + +/* Define to 1 if you have the `wcslen' function. */ +#define HAVE_WCSLEN 1 + +/* Define to 1 if you have the `wctomb' function. */ +#define HAVE_WCTOMB 1 + +/* Define to 1 if you have the `wmemcmp' function. */ +/* #undef HAVE_WMEMCMP */ + +/* Define to 1 if you have the `wmemcpy' function. */ +/* #undef HAVE_WMEMCPY */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ZLIB_H */ + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +/* #undef LSTAT_FOLLOWS_SLASHED_SYMLINK */ + +/* Define to 1 if `major', `minor', and `makedev' are declared in . + */ +/* #undef MAJOR_IN_MKDEV */ + +/* Define to 1 if `major', `minor', and `makedev' are declared in + . */ +/* #undef MAJOR_IN_SYSMACROS */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if strerror_r returns char *. */ +/* #undef STRERROR_R_CHAR_P */ + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +/* #undef _LARGEFILE_SOURCE */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef was allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT64_T */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `int' if doesn't define. */ +#if (USE_UNSIGNED_GID) +#define gid_t unsigned int +#else +#define gid_t int +#endif + +/* Define to `unsigned long' if does not define. */ +#define id_t int + +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#if defined(_MSC_VER) +#define int64_t __int64 +#else +/* #undef int64_t */ +#endif + +/* Define to the widest signed integer type if and do + not define. */ +#if defined(_MSC_VER) +#define intmax_t long long +#else +/* #undef intmax_t */ +#endif + +/* Define to `int' if does not define. */ +#if defined(_MSC_VER) +#define mode_t unsigned short +#else +/* #undef mode_t */ +#endif + +/* Define to `long long' if does not define. */ +/* #undef off_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to `int' if doesn't define. */ +#if (USE_UNSIGNED_UID) +#define uid_t unsigned int +#else +#define uid_t int +#endif + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#if defined(_MSC_VER) +#define uint64_t unsigned __int64 +#else +/* #undef uint64_t */ +#endif + +/* Define to the widest unsigned integer type if and + do not define. */ +#if defined(_MSC_VER) +#define uintmax_t unsigned long long +#else +/* #undef uintmax_t */ +#endif + +/* Define to `unsigned int' if does not define. */ +/* #undef uintptr_t */ + +/* Define to `unsigned int' if does not define. */ +#if defined(_MSC_VER) +#define pid_t unsigned int +#else +/* #undef pid_t */ +#endif + +#if defined(_MSC_VER) +#define uint32_t unsigned long +#define uint16_t unsigned short + #ifdef _WIN64 + #define ssize_t __int64 + #else + #define ssize_t long + #endif +#endif + +#include "archive_windows.h" + +#endif /* CONFIG_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/libarchive/cpio.5 b/Utilities/cmlibarchive/libarchive/cpio.5 new file mode 100644 index 000000000..12ab7d451 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/cpio.5 @@ -0,0 +1,325 @@ +.\" Copyright (c) 2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/cpio.5,v 1.2 2008/05/26 17:00:23 kientzle Exp $ +.\" +.Dd October 5, 2007 +.Dt CPIO 5 +.Os +.Sh NAME +.Nm cpio +.Nd format of cpio archive files +.Sh DESCRIPTION +The +.Nm +archive format collects any number of files, directories, and other +file system objects (symbolic links, device nodes, etc.) into a single +stream of bytes. +.Ss General Format +Each file system object in a +.Nm +archive comprises a header record with basic numeric metadata +followed by the full pathname of the entry and the file data. +The header record stores a series of integer values that generally +follow the fields in +.Va struct stat . +(See +.Xr stat 2 +for details.) +The variants differ primarily in how they store those integers +(binary, octal, or hexadecimal). +The header is followed by the pathname of the +entry (the length of the pathname is stored in the header) +and any file data. +The end of the archive is indicated by a special record with +the pathname +.Dq TRAILER!!! . +.Ss PWB format +XXX Any documentation of the original PWB/UNIX 1.0 format? XXX +.Ss Old Binary Format +The old binary +.Nm +format stores numbers as 2-byte and 4-byte binary values. +Each entry begins with a header in the following format: +.Bd -literal -offset indent +struct header_old_cpio { + unsigned short c_magic; + unsigned short c_dev; + unsigned short c_ino; + unsigned short c_mode; + unsigned short c_uid; + unsigned short c_gid; + unsigned short c_nlink; + unsigned short c_rdev; + unsigned short c_mtime[2]; + unsigned short c_namesize; + unsigned short c_filesize[2]; +}; +.Ed +.Pp +The +.Va unsigned short +fields here are 16-bit integer values; the +.Va unsigned int +fields are 32-bit integer values. +The fields are as follows +.Bl -tag -width indent +.It Va magic +The integer value octal 070707. +This value can be used to determine whether this archive is +written with little-endian or big-endian integers. +.It Va dev , Va ino +The device and inode numbers from the disk. +These are used by programs that read +.Nm +archives to determine when two entries refer to the same file. +Programs that synthesize +.Nm +archives should be careful to set these to distinct values for each entry. +.It Va mode +The mode specifies both the regular permissions and the file type. +It consists of several bit fields as follows: +.Bl -tag -width "MMMMMMM" -compact +.It 0170000 +This masks the file type bits. +.It 0140000 +File type value for sockets. +.It 0120000 +File type value for symbolic links. +For symbolic links, the link body is stored as file data. +.It 0100000 +File type value for regular files. +.It 0060000 +File type value for block special devices. +.It 0040000 +File type value for directories. +.It 0020000 +File type value for character special devices. +.It 0010000 +File type value for named pipes or FIFOs. +.It 0004000 +SUID bit. +.It 0002000 +SGID bit. +.It 0001000 +Sticky bit. +On some systems, this modifies the behavior of executables and/or directories. +.It 0000777 +The lower 9 bits specify read/write/execute permissions +for world, group, and user following standard POSIX conventions. +.El +.It Va uid , Va gid +The numeric user id and group id of the owner. +.It Va nlink +The number of links to this file. +Directories always have a value of at least two here. +Note that hardlinked files include file data with every copy in the archive. +.It Va rdev +For block special and character special entries, +this field contains the associated device number. +For all other entry types, it should be set to zero by writers +and ignored by readers. +.It Va mtime +Modification time of the file, indicated as the number +of seconds since the start of the epoch, +00:00:00 UTC January 1, 1970. +The four-byte integer is stored with the most-significant 16 bits first +followed by the least-significant 16 bits. +Each of the two 16 bit values are stored in machine-native byte order. +.It Va namesize +The number of bytes in the pathname that follows the header. +This count includes the trailing NUL byte. +.It Va filesize +The size of the file. +Note that this archive format is limited to +four gigabyte file sizes. +See +.Va mtime +above for a description of the storage of four-byte integers. +.El +.Pp +The pathname immediately follows the fixed header. +If the +.Cm namesize +is odd, an additional NUL byte is added after the pathname. +The file data is then appended, padded with NUL +bytes to an even length. +.Pp +Hardlinked files are not given special treatment; +the full file contents are included with each copy of the +file. +.Ss Portable ASCII Format +.St -susv2 +standardized an ASCII variant that is portable across all +platforms. +It is commonly known as the +.Dq old character +format or as the +.Dq odc +format. +It stores the same numeric fields as the old binary format, but +represents them as 6-character or 11-character octal values. +.Bd -literal -offset indent +struct cpio_odc_header { + char c_magic[6]; + char c_dev[6]; + char c_ino[6]; + char c_mode[6]; + char c_uid[6]; + char c_gid[6]; + char c_nlink[6]; + char c_rdev[6]; + char c_mtime[11]; + char c_namesize[6]; + char c_filesize[11]; +}; +.Ed +.Pp +The fields are identical to those in the old binary format. +The name and file body follow the fixed header. +Unlike the old binary format, there is no additional padding +after the pathname or file contents. +If the files being archived are themselves entirely ASCII, then +the resulting archive will be entirely ASCII, except for the +NUL byte that terminates the name field. +.Ss New ASCII Format +The "new" ASCII format uses 8-byte hexadecimal fields for +all numbers and separates device numbers into separate fields +for major and minor numbers. +.Bd -literal -offset indent +struct cpio_newc_header { + char c_magic[6]; + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_check[8]; +}; +.Ed +.Pp +Except as specified below, the fields here match those specified +for the old binary format above. +.Bl -tag -width indent +.It Va magic +The string +.Dq 070701 . +.It Va check +This field is always set to zero by writers and ignored by readers. +See the next section for more details. +.El +.Pp +The pathname is followed by NUL bytes so that the total size +of the fixed header plus pathname is a multiple of four. +Likewise, the file data is padded to a multiple of four bytes. +Note that this format supports only 4 gigabyte files (unlike the +older ASCII format, which supports 8 gigabyte files). +.Pp +In this format, hardlinked files are handled by setting the +filesize to zero for each entry except the last one that +appears in the archive. +.Ss New CRC Format +The CRC format is identical to the new ASCII format described +in the previous section except that the magic field is set +to +.Dq 070702 +and the +.Va check +field is set to the sum of all bytes in the file data. +This sum is computed treating all bytes as unsigned values +and using unsigned arithmetic. +Only the least-significant 32 bits of the sum are stored. +.Ss HP variants +The +.Nm cpio +implementation distributed with HPUX used XXXX but stored +device numbers differently XXX. +.Ss Other Extensions and Variants +Sun Solaris uses additional file types to store extended file +data, including ACLs and extended attributes, as special +entries in cpio archives. +.Pp +XXX Others? XXX +.Sh BUGS +The +.Dq CRC +format is mis-named, as it uses a simple checksum and +not a cyclic redundancy check. +.Pp +The old binary format is limited to 16 bits for user id, +group id, device, and inode numbers. +It is limited to 4 gigabyte file sizes. +.Pp +The old ASCII format is limited to 18 bits for +the user id, group id, device, and inode numbers. +It is limited to 8 gigabyte file sizes. +.Pp +The new ASCII format is limited to 4 gigabyte file sizes. +.Pp +None of the cpio formats store user or group names, +which are essential when moving files between systems with +dissimilar user or group numbering. +.Pp +Especially when writing older cpio variants, it may be necessary +to map actual device/inode values to synthesized values that +fit the available fields. +With very large filesystems, this may be necessary even for +the newer formats. +.Sh SEE ALSO +.Xr cpio 1 , +.Xr tar 5 +.Sh STANDARDS +The +.Nm cpio +utility is no longer a part of POSIX or the Single Unix Standard. +It last appeared in +.St -susv2 . +It has been supplanted in subsequent standards by +.Xr pax 1 . +The portable ASCII format is currently part of the specification for the +.Xr pax 1 +utility. +.Sh HISTORY +The original cpio utility was written by Dick Haight +while working in AT&T's Unix Support Group. +It appeared in 1977 as part of PWB/UNIX 1.0, the +.Dq Programmer's Work Bench +derived from +.At v6 +that was used internally at AT&T. +Both the old binary and old character formats were in use +by 1980, according to the System III source released +by SCO under their +.Dq Ancient Unix +license. +The character format was adopted as part of +.St -p1003.1-88 . +XXX when did "newc" appear? Who invented it? When did HP come out with their variant? When did Sun introduce ACLs and extended attributes? XXX diff --git a/Utilities/cmlibarchive/libarchive/filter_fork.c b/Utilities/cmlibarchive/libarchive/filter_fork.c new file mode 100644 index 000000000..4127878b6 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/filter_fork.c @@ -0,0 +1,161 @@ +/*- + * Copyright (c) 2007 Joerg Sonnenberger + * 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 "archive_platform.h" + +/* This capability is only available on POSIX systems. */ +#if defined(HAVE_PIPE) && defined(HAVE_FCNTL) && \ + (defined(HAVE_FORK) || defined(HAVE_VFORK)) + +__FBSDID("$FreeBSD: src/lib/libarchive/filter_fork.c,v 1.5 2008/09/12 05:33:00 kientzle Exp $"); + +#if defined(HAVE_POLL) +# if defined(HAVE_POLL_H) +# include +# elif defined(HAVE_SYS_POLL_H) +# include +# endif +#elif defined(HAVE_SELECT) +# if defined(HAVE_SYS_SELECT_H) +# include +# elif defined(HAVE_UNISTD_H) +# include +# endif +#endif +#ifdef HAVE_FCNTL_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif + +#include "filter_fork.h" + +pid_t +__archive_create_child(const char *path, int *child_stdin, int *child_stdout) +{ + pid_t child; + int stdin_pipe[2], stdout_pipe[2], tmp; + + if (pipe(stdin_pipe) == -1) + goto state_allocated; + if (stdin_pipe[0] == 1 /* stdout */) { + if ((tmp = dup(stdin_pipe[0])) == -1) + goto stdin_opened; + close(stdin_pipe[0]); + stdin_pipe[0] = tmp; + } + if (pipe(stdout_pipe) == -1) + goto stdin_opened; + if (stdout_pipe[1] == 0 /* stdin */) { + if ((tmp = dup(stdout_pipe[1])) == -1) + goto stdout_opened; + close(stdout_pipe[1]); + stdout_pipe[1] = tmp; + } + +#if HAVE_VFORK + switch ((child = vfork())) { +#else + switch ((child = fork())) { +#endif + case -1: + goto stdout_opened; + case 0: + close(stdin_pipe[1]); + close(stdout_pipe[0]); + if (dup2(stdin_pipe[0], 0 /* stdin */) == -1) + _exit(254); + if (stdin_pipe[0] != 0 /* stdin */) + close(stdin_pipe[0]); + if (dup2(stdout_pipe[1], 1 /* stdout */) == -1) + _exit(254); + if (stdout_pipe[1] != 1 /* stdout */) + close(stdout_pipe[1]); + execlp(path, path, (char *)NULL); + _exit(254); + default: + close(stdin_pipe[0]); + close(stdout_pipe[1]); + + *child_stdin = stdin_pipe[1]; + fcntl(*child_stdin, F_SETFL, O_NONBLOCK); + *child_stdout = stdout_pipe[0]; + fcntl(*child_stdout, F_SETFL, O_NONBLOCK); + } + + return child; + +stdout_opened: + close(stdout_pipe[0]); + close(stdout_pipe[1]); +stdin_opened: + close(stdin_pipe[0]); + close(stdin_pipe[1]); +state_allocated: + return -1; +} + +void +__archive_check_child(int in, int out) +{ +#if defined(HAVE_POLL) + struct pollfd fds[2]; + int idx; + + idx = 0; + if (in != -1) { + fds[idx].fd = in; + fds[idx].events = POLLOUT; + ++idx; + } + if (out != -1) { + fds[idx].fd = out; + fds[idx].events = POLLIN; + ++idx; + } + + poll(fds, idx, -1); /* -1 == INFTIM, wait forever */ +#elif defined(HAVE_SELECT) + fd_set fds_in, fds_out, fds_error; + + FD_ZERO(&fds_in); + FD_ZERO(&fds_out); + FD_ZERO(&fds_error); + if (out != -1) { + FD_SET(out, &fds_in); + FD_SET(out, &fds_error); + } + if (in != -1) { + FD_SET(in, &fds_out); + FD_SET(in, &fds_error); + } + select(in < out ? out + 1 : in + 1, &fds_in, &fds_out, &fds_error, NULL); +#else + sleep(1); +#endif +} + +#endif /* defined(HAVE_PIPE) && defined(HAVE_VFORK) && defined(HAVE_FCNTL) */ diff --git a/Utilities/cmlibarchive/libarchive/filter_fork.h b/Utilities/cmlibarchive/libarchive/filter_fork.h new file mode 100644 index 000000000..3eb446eeb --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/filter_fork.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2007 Joerg Sonnenberger + * 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. + * + * $FreeBSD: src/lib/libarchive/filter_fork.h,v 1.1 2007/05/29 01:00:20 kientzle Exp $ + */ + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif + +#ifndef FILTER_FORK_H +#define FILTER_FORK_H + +pid_t +__archive_create_child(const char *path, int *child_stdin, int *child_stdout); + +void +__archive_check_child(int in, int out); + +#endif diff --git a/Utilities/cmlibarchive/libarchive/filter_fork_windows.c b/Utilities/cmlibarchive/libarchive/filter_fork_windows.c new file mode 100644 index 000000000..3dae4b6b4 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/filter_fork_windows.c @@ -0,0 +1,111 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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 "archive_platform.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) + +#include "filter_fork.h" + +pid_t +__archive_create_child(const char *path, int *child_stdin, int *child_stdout) +{ + HANDLE childStdout[2], childStdin[2], childStdinWr, childStdoutRd; + SECURITY_ATTRIBUTES secAtts; + STARTUPINFO staInfo; + PROCESS_INFORMATION childInfo; + char cmd[MAX_PATH]; + DWORD mode; + + secAtts.nLength = sizeof(SECURITY_ATTRIBUTES); + secAtts.bInheritHandle = TRUE; + secAtts.lpSecurityDescriptor = NULL; + if (CreatePipe(&childStdout[0], &childStdout[1], &secAtts, 0) == 0) + goto fail; + if (DuplicateHandle(GetCurrentProcess(), childStdout[0], + GetCurrentProcess(), &childStdoutRd, 0, FALSE, + DUPLICATE_SAME_ACCESS) == 0) { + CloseHandle(childStdout[0]); + CloseHandle(childStdout[1]); + goto fail; + } + CloseHandle(childStdout[0]); + + if (CreatePipe(&childStdin[0], &childStdin[1], &secAtts, 0) == 0) { + CloseHandle(childStdoutRd); + CloseHandle(childStdout[1]); + goto fail; + } + + if (DuplicateHandle(GetCurrentProcess(), childStdin[1], + GetCurrentProcess(), &childStdinWr, 0, FALSE, + DUPLICATE_SAME_ACCESS) == 0) { + CloseHandle(childStdoutRd); + CloseHandle(childStdout[1]); + CloseHandle(childStdin[0]); + CloseHandle(childStdin[1]); + goto fail; + } + CloseHandle(childStdin[1]); + + memset(&staInfo, 0, sizeof(staInfo)); + staInfo.cb = sizeof(staInfo); + staInfo.hStdOutput = childStdout[1]; + staInfo.hStdInput = childStdin[0]; + staInfo.wShowWindow = SW_HIDE; + staInfo.dwFlags = STARTF_USEFILLATTRIBUTE | STARTF_USECOUNTCHARS | + STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + strncpy(cmd, path, sizeof(cmd)-1); + cmd[sizeof(cmd)-1] = '\0'; + if (CreateProcessA(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, + &staInfo, &childInfo) == 0) { + CloseHandle(childStdoutRd); + CloseHandle(childStdout[1]); + CloseHandle(childStdin[0]); + CloseHandle(childStdinWr); + goto fail; + } + WaitForInputIdle(childInfo.hProcess, INFINITE); + CloseHandle(childInfo.hProcess); + CloseHandle(childInfo.hThread); + + mode = PIPE_NOWAIT; + SetNamedPipeHandleState(childStdoutRd, &mode, NULL, NULL); + *child_stdout = _open_osfhandle((intptr_t)childStdoutRd, _O_RDONLY); + *child_stdin = _open_osfhandle((intptr_t)childStdinWr, _O_WRONLY); + + return (childInfo.dwProcessId); + +fail: + return (-1); +} + +void +__archive_check_child(int in, int out) +{ + Sleep(100); +} + +#endif /* _WIN32 && !__CYGWIN__ */ diff --git a/Utilities/cmlibarchive/libarchive/libarchive-formats.5 b/Utilities/cmlibarchive/libarchive/libarchive-formats.5 new file mode 100644 index 000000000..2022531d1 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/libarchive-formats.5 @@ -0,0 +1,346 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/libarchive-formats.5,v 1.16 2008/05/26 17:00:23 kientzle Exp $ +.\" +.Dd July 17, 2009 +.Dt libarchive-formats 5 +.Os +.Sh NAME +.Nm libarchive-formats +.Nd archive formats supported by the libarchive library +.Sh DESCRIPTION +The +.Xr libarchive 3 +library reads and writes a variety of streaming archive formats. +Generally speaking, all of these archive formats consist of a series of +.Dq entries . +Each entry stores a single file system object, such as a file, directory, +or symbolic link. +.Pp +The following provides a brief description of each format supported +by libarchive, with some information about recognized extensions or +limitations of the current library support. +Note that just because a format is supported by libarchive does not +imply that a program that uses libarchive will support that format. +Applications that use libarchive specify which formats they wish +to support, though many programs do use libarchive convenience +functions to enable all supported formats. +.Ss Tar Formats +The +.Xr libarchive 3 +library can read most tar archives. +However, it only writes POSIX-standard +.Dq ustar +and +.Dq pax interchange +formats. +.Pp +All tar formats store each entry in one or more 512-byte records. +The first record is used for file metadata, including filename, +timestamp, and mode information, and the file data is stored in +subsequent records. +Later variants have extended this by either appropriating undefined +areas of the header record, extending the header to multiple records, +or by storing special entries that modify the interpretation of +subsequent entries. +.Pp +.Bl -tag -width indent +.It Cm gnutar +The +.Xr libarchive 3 +library can read GNU-format tar archives. +It currently supports the most popular GNU extensions, including +modern long filename and linkname support, as well as atime and ctime data. +The libarchive library does not support multi-volume +archives, nor the old GNU long filename format. +It can read GNU sparse file entries, including the new POSIX-based +formats, but cannot write GNU sparse file entries. +.It Cm pax +The +.Xr libarchive 3 +library can read and write POSIX-compliant pax interchange format +archives. +Pax interchange format archives are an extension of the older ustar +format that adds a separate entry with additional attributes stored +as key/value pairs immediately before each regular entry. +The presence of these additional entries is the only difference between +pax interchange format and the older ustar format. +The extended attributes are of unlimited length and are stored +as UTF-8 Unicode strings. +Keywords defined in the standard are in all lowercase; vendors are allowed +to define custom keys by preceding them with the vendor name in all uppercase. +When writing pax archives, libarchive uses many of the SCHILY keys +defined by Joerg Schilling's +.Dq star +archiver and a few LIBARCHIVE keys. +The libarchive library can read most of the SCHILY keys +and most of the GNU keys introduced by GNU tar. +It silently ignores any keywords that it does not understand. +.It Cm restricted pax +The libarchive library can also write pax archives in which it +attempts to suppress the extended attributes entry whenever +possible. +The result will be identical to a ustar archive unless the +extended attributes entry is required to store a long file +name, long linkname, extended ACL, file flags, or if any of the standard +ustar data (user name, group name, UID, GID, etc) cannot be fully +represented in the ustar header. +In all cases, the result can be dearchived by any program that +can read POSIX-compliant pax interchange format archives. +Programs that correctly read ustar format (see below) will also be +able to read this format; any extended attributes will be extracted as +separate files stored in +.Pa PaxHeader +directories. +.It Cm ustar +The libarchive library can both read and write this format. +This format has the following limitations: +.Bl -bullet -compact +.It +Device major and minor numbers are limited to 21 bits. +Nodes with larger numbers will not be added to the archive. +.It +Path names in the archive are limited to 255 bytes. +(Shorter if there is no / character in exactly the right place.) +.It +Symbolic links and hard links are stored in the archive with +the name of the referenced file. +This name is limited to 100 bytes. +.It +Extended attributes, file flags, and other extended +security information cannot be stored. +.It +Archive entries are limited to 2 gigabytes in size. +.El +Note that the pax interchange format has none of these restrictions. +.El +.It Solaris extensions +Libarchive recognizes ACL and extended attribute records written +by Solaris tar. +Currently, libarchive only has support for old-style ACLs; the +newer NFSv4 ACLs are recognized but discarded. +.Pp +The libarchive library can also read a variety of commonly-used extensions to +the basic tar format. +In particular, it supports base-256 values in certain numeric fields. +This essentially removes the limitations on file size, modification time, +and device numbers. +.Pp +The first tar program appeared in Seventh Edition Unix in 1979. +The first official standard for the tar file format was the +.Dq ustar +(Unix Standard Tar) format defined by POSIX in 1988. +POSIX.1-2001 extended the ustar format to create the +.Dq pax interchange +format. +.Ss Cpio Formats +The libarchive library can read a number of common cpio variants and can write +.Dq odc +and +.Dq newc +format archives. +A cpio archive stores each entry as a fixed-size header followed +by a variable-length filename and variable-length data. +Unlike the tar format, the cpio format does only minimal padding +of the header or file data. +There are several cpio variants, which differ primarily in +how they store the initial header: some store the values as +octal or hexadecimal numbers in ASCII, others as binary values of +varying byte order and length. +.Bl -tag -width indent +.It Cm binary +The libarchive library transparently reads both big-endian and little-endian +variants of the original binary cpio format. +This format used 32-bit binary values for file size and mtime, +and 16-bit binary values for the other fields. +.It Cm odc +The libarchive library can both read and write this +POSIX-standard format, which is officially known as the +.Dq cpio interchange format +or the +.Dq octet-oriented cpio archive format +and sometimes unofficially referred to as the +.Dq old character format . +This format stores the header contents as octal values in ASCII. +It is standard, portable, and immune from byte-order confusion. +File sizes and mtime are limited to 33 bits (8GB file size), +other fields are limited to 18 bits. +.It Cm SVR4 +The libarchive library can read both CRC and non-CRC variants of +this format. +The SVR4 format uses eight-digit hexadecimal values for +all header fields. +This limits file size to 4GB, and also limits the mtime and +other fields to 32 bits. +The SVR4 format can optionally include a CRC of the file +contents, although libarchive does not currently verify this CRC. +.El +.Pp +Cpio first appeared in PWB/UNIX 1.0, which was released within +AT&T in 1977. +PWB/UNIX 1.0 formed the basis of System III Unix, released outside +of AT&T in 1981. +This makes cpio older than tar, although cpio was not included +in Version 7 AT&T Unix. +As a result, the tar command became much better known in universities +and research groups that used Version 7. +The combination of the +.Nm find +and +.Nm cpio +utilities provided very precise control over file selection. +Unfortunately, the format has many limitations that make it unsuitable +for widespread use. +Only the POSIX format permits files over 4GB, and its 18-bit +limit for most other fields makes it unsuitable for modern systems. +In addition, cpio formats only store numeric UID/GID values (not +usernames and group names), which can make it very difficult to correctly +transfer archives across systems with dissimilar user numbering. +.Ss Shar Formats +A +.Dq shell archive +is a shell script that, when executed on a POSIX-compliant +system, will recreate a collection of file system objects. +The libarchive library can write two different kinds of shar archives: +.Bl -tag -width indent +.It Cm shar +The traditional shar format uses a limited set of POSIX +commands, including +.Xr echo 1 , +.Xr mkdir 1 , +and +.Xr sed 1 . +It is suitable for portably archiving small collections of plain text files. +However, it is not generally well-suited for large archives +(many implementations of +.Xr sh 1 +have limits on the size of a script) nor should it be used with non-text files. +.It Cm shardump +This format is similar to shar but encodes files using +.Xr uuencode 1 +so that the result will be a plain text file regardless of the file contents. +It also includes additional shell commands that attempt to reproduce as +many file attributes as possible, including owner, mode, and flags. +The additional commands used to restore file attributes make +shardump archives less portable than plain shar archives. +.El +.Ss ISO9660 format +Libarchive can read and extract from files containing ISO9660-compliant +CDROM images. +In many cases, this can remove the need to burn a physical CDROM +just in order to read the files contained in an ISO9660 image. +It also avoids security and complexity issues that come with +virtual mounts and loopback devices. +Libarchive supports the most common Rockridge extensions and has partial +support for Joliet extensions. +If both extensions are present, the Joliet extensions will be +used and the Rockridge extensions will be ignored. +In particular, this can create problems with hardlinks and symlinks, +which are supported by Rockridge but not by Joliet. +.Ss Zip format +Libarchive can read and write zip format archives that have +uncompressed entries and entries compressed with the +.Dq deflate +algorithm. +Older zip compression algorithms are not supported. +It can extract jar archives, archives that use Zip64 extensions and many +self-extracting zip archives. +Libarchive reads Zip archives as they are being streamed, +which allows it to read archives of arbitrary size. +It currently does not use the central directory; this +limits libarchive's ability to support some self-extracting +archives and ones that have been modified in certain ways. +.Ss Archive (library) file format +The Unix archive format (commonly created by the +.Xr ar 1 +archiver) is a general-purpose format which is +used almost exclusively for object files to be +read by the link editor +.Xr ld 1 . +The ar format has never been standardised. +There are two common variants: +the GNU format derived from SVR4, +and the BSD format, which first appeared in 4.4BSD. +The two differ primarily in their handling of filenames +longer than 15 characters: +the GNU/SVR4 variant writes a filename table at the beginning of the archive; +the BSD format stores each long filename in an extension +area adjacent to the entry. +Libarchive can read both extensions, +including archives that may include both types of long filenames. +Programs using libarchive can write GNU/SVR4 format +if they provide a filename table to be written into +the archive before any of the entries. +Any entries whose names are not in the filename table +will be written using BSD-style long filenames. +This can cause problems for programs such as +GNU ld that do not support the BSD-style long filenames. +.Ss mtree +Libarchive can read and write files in +.Xr mtree 5 +format. +This format is not a true archive format, but rather a textual description +of a file hierarchy in which each line specifies the name of a file and +provides specific metadata about that file. +Libarchive can read all of the keywords supported by both +the NetBSD and FreeBSD versions of +.Xr mtree 1 , +although many of the keywords cannot currently be stored in an +.Tn archive_entry +object. +When writing, libarchive supports use of the +.Xr archive_write_set_options 3 +interface to specify which keywords should be included in the +output. +If libarchive was compiled with access to suitable +cryptographic libraries (such as the OpenSSL libraries), +it can compute hash entries such as +.Cm sha512 +or +.Cm md5 +from file data being written to the mtree writer. +.Pp +When reading an mtree file, libarchive will locate the corresponding +files on disk using the +.Cm contents +keyword if present or the regular filename. +If it can locate and open the file on disk, it will use that +to fill in any metadata that is missing from the mtree file +and will read the file contents and return those to the program +using libarchive. +If it cannot locate and open the file on disk, libarchive +will return an error for any attempt to read the entry +body. +.Sh SEE ALSO +.Xr ar 1 , +.Xr cpio 1 , +.Xr mkisofs 1 , +.Xr shar 1 , +.Xr tar 1 , +.Xr zip 1 , +.Xr zlib 3 , +.Xr cpio 5 , +.Xr mtree 5 , +.Xr tar 5 diff --git a/Utilities/cmlibarchive/libarchive/libarchive.3 b/Utilities/cmlibarchive/libarchive/libarchive.3 new file mode 100644 index 000000000..8c19d008a --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/libarchive.3 @@ -0,0 +1,331 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/libarchive.3,v 1.11 2007/01/09 08:05:56 kientzle Exp $ +.\" +.Dd August 19, 2006 +.Dt LIBARCHIVE 3 +.Os +.Sh NAME +.Nm libarchive +.Nd functions for reading and writing streaming archives +.Sh LIBRARY +.Lb libarchive +.Sh OVERVIEW +The +.Nm +library provides a flexible interface for reading and writing +streaming archive files such as tar and cpio. +The library is inherently stream-oriented; readers serially iterate through +the archive, writers serially add things to the archive. +In particular, note that there is no built-in support for +random access nor for in-place modification. +.Pp +When reading an archive, the library automatically detects the +format and the compression. +The library currently has read support for: +.Bl -bullet -compact +.It +old-style tar archives, +.It +most variants of the POSIX +.Dq ustar +format, +.It +the POSIX +.Dq pax interchange +format, +.It +GNU-format tar archives, +.It +most common cpio archive formats, +.It +ISO9660 CD images (with or without RockRidge extensions), +.It +Zip archives. +.El +The library automatically detects archives compressed with +.Xr gzip 1 , +.Xr bzip2 1 , +or +.Xr compress 1 +and decompresses them transparently. +.Pp +When writing an archive, you can specify the compression +to be used and the format to use. +The library can write +.Bl -bullet -compact +.It +POSIX-standard +.Dq ustar +archives, +.It +POSIX +.Dq pax interchange format +archives, +.It +POSIX octet-oriented cpio archives, +.It +two different variants of shar archives. +.El +Pax interchange format is an extension of the tar archive format that +eliminates essentially all of the limitations of historic tar formats +in a standard fashion that is supported +by POSIX-compliant +.Xr pax 1 +implementations on many systems as well as several newer implementations of +.Xr tar 1 . +Note that the default write format will suppress the pax extended +attributes for most entries; explicitly requesting pax format will +enable those attributes for all entries. +.Pp +The read and write APIs are accessed through the +.Fn archive_read_XXX +functions and the +.Fn archive_write_XXX +functions, respectively, and either can be used independently +of the other. +.Pp +The rest of this manual page provides an overview of the library +operation. +More detailed information can be found in the individual manual +pages for each API or utility function. +.Sh READING AN ARCHIVE +To read an archive, you must first obtain an initialized +.Tn struct archive +object from +.Fn archive_read_new . +You can then modify this object for the desired operations with the +various +.Fn archive_read_set_XXX +and +.Fn archive_read_support_XXX +functions. +In particular, you will need to invoke appropriate +.Fn archive_read_support_XXX +functions to enable the corresponding compression and format +support. +Note that these latter functions perform two distinct operations: +they cause the corresponding support code to be linked into your +program, and they enable the corresponding auto-detect code. +Unless you have specific constraints, you will generally want +to invoke +.Fn archive_read_support_compression_all +and +.Fn archive_read_support_format_all +to enable auto-detect for all formats and compression types +currently supported by the library. +.Pp +Once you have prepared the +.Tn struct archive +object, you call +.Fn archive_read_open +to actually open the archive and prepare it for reading. +There are several variants of this function; +the most basic expects you to provide pointers to several +functions that can provide blocks of bytes from the archive. +There are convenience forms that allow you to +specify a filename, file descriptor, +.Ft "FILE *" +object, or a block of memory from which to read the archive data. +Note that the core library makes no assumptions about the +size of the blocks read; +callback functions are free to read whatever block size is +most appropriate for the medium. +.Pp +Each archive entry consists of a header followed by a certain +amount of data. +You can obtain the next header with +.Fn archive_read_next_header , +which returns a pointer to an +.Tn struct archive_entry +structure with information about the current archive element. +If the entry is a regular file, then the header will be followed +by the file data. +You can use +.Fn archive_read_data +(which works much like the +.Xr read 2 +system call) +to read this data from the archive. +You may prefer to use the higher-level +.Fn archive_read_data_skip , +which reads and discards the data for this entry, +.Fn archive_read_data_to_buffer , +which reads the data into an in-memory buffer, +.Fn archive_read_data_to_file , +which copies the data to the provided file descriptor, or +.Fn archive_read_extract , +which recreates the specified entry on disk and copies data +from the archive. +In particular, note that +.Fn archive_read_extract +uses the +.Tn struct archive_entry +structure that you provide it, which may differ from the +entry just read from the archive. +In particular, many applications will want to override the +pathname, file permissions, or ownership. +.Pp +Once you have finished reading data from the archive, you +should call +.Fn archive_read_close +to close the archive, then call +.Fn archive_read_finish +to release all resources, including all memory allocated by the library. +.Pp +The +.Xr archive_read 3 +manual page provides more detailed calling information for this API. +.Sh WRITING AN ARCHIVE +You use a similar process to write an archive. +The +.Fn archive_write_new +function creates an archive object useful for writing, +the various +.Fn archive_write_set_XXX +functions are used to set parameters for writing the archive, and +.Fn archive_write_open +completes the setup and opens the archive for writing. +.Pp +Individual archive entries are written in a three-step +process: +You first initialize a +.Tn struct archive_entry +structure with information about the new entry. +At a minimum, you should set the pathname of the +entry and provide a +.Va struct stat +with a valid +.Va st_mode +field, which specifies the type of object and +.Va st_size +field, which specifies the size of the data portion of the object. +The +.Fn archive_write_header +function actually writes the header data to the archive. +You can then use +.Fn archive_write_data +to write the actual data. +.Pp +After all entries have been written, use the +.Fn archive_write_finish +function to release all resources. +.Pp +The +.Xr archive_write 3 +manual page provides more detailed calling information for this API. +.Sh DESCRIPTION +Detailed descriptions of each function are provided by the +corresponding manual pages. +.Pp +All of the functions utilize an opaque +.Tn struct archive +datatype that provides access to the archive contents. +.Pp +The +.Tn struct archive_entry +structure contains a complete description of a single archive +entry. +It uses an opaque interface that is fully documented in +.Xr archive_entry 3 . +.Pp +Users familiar with historic formats should be aware that the newer +variants have eliminated most restrictions on the length of textual fields. +Clients should not assume that filenames, link names, user names, or +group names are limited in length. +In particular, pax interchange format can easily accommodate pathnames +in arbitrary character sets that exceed +.Va PATH_MAX . +.Sh RETURN VALUES +Most functions return zero on success, non-zero on error. +The return value indicates the general severity of the error, ranging +from +.Cm ARCHIVE_WARN , +which indicates a minor problem that should probably be reported +to the user, to +.Cm ARCHIVE_FATAL , +which indicates a serious problem that will prevent any further +operations on this archive. +On error, the +.Fn archive_errno +function can be used to retrieve a numeric error code (see +.Xr errno 2 ) . +The +.Fn archive_error_string +returns a textual error message suitable for display. +.Pp +.Fn archive_read_new +and +.Fn archive_write_new +return pointers to an allocated and initialized +.Tn struct archive +object. +.Pp +.Fn archive_read_data +and +.Fn archive_write_data +return a count of the number of bytes actually read or written. +A value of zero indicates the end of the data for this entry. +A negative value indicates an error, in which case the +.Fn archive_errno +and +.Fn archive_error_string +functions can be used to obtain more information. +.Sh ENVIRONMENT +There are character set conversions within the +.Xr archive_entry 3 +functions that are impacted by the currently-selected locale. +.Sh SEE ALSO +.Xr tar 1 , +.Xr archive_entry 3 , +.Xr archive_read 3 , +.Xr archive_util 3 , +.Xr archive_write 3 , +.Xr tar 5 +.Sh HISTORY +The +.Nm libarchive +library first appeared in +.Fx 5.3 . +.Sh AUTHORS +.An -nosplit +The +.Nm libarchive +library was written by +.An Tim Kientzle Aq kientzle@acm.org . +.Sh BUGS +Some archive formats support information that is not supported by +.Tn struct archive_entry . +Such information cannot be fully archived or restored using this library. +This includes, for example, comments, character sets, +or the arbitrary key/value pairs that can appear in +pax interchange format archives. +.Pp +Conversely, of course, not all of the information that can be +stored in an +.Tn struct archive_entry +is supported by all formats. +For example, cpio formats do not support nanosecond timestamps; +old tar formats do not support large device numbers. diff --git a/Utilities/cmlibarchive/libarchive/libarchive_internals.3 b/Utilities/cmlibarchive/libarchive/libarchive_internals.3 new file mode 100644 index 000000000..9a42b76d4 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/libarchive_internals.3 @@ -0,0 +1,366 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/libarchive_internals.3,v 1.2 2007/12/30 04:58:22 kientzle Exp $ +.\" +.Dd April 16, 2007 +.Dt LIBARCHIVE 3 +.Os +.Sh NAME +.Nm libarchive_internals +.Nd description of libarchive internal interfaces +.Sh OVERVIEW +The +.Nm libarchive +library provides a flexible interface for reading and writing +streaming archive files such as tar and cpio. +Internally, it follows a modular layered design that should +make it easy to add new archive and compression formats. +.Sh GENERAL ARCHITECTURE +Externally, libarchive exposes most operations through an +opaque, object-style interface. +The +.Xr archive_entry 1 +objects store information about a single filesystem object. +The rest of the library provides facilities to write +.Xr archive_entry 1 +objects to archive files, +read them from archive files, +and write them to disk. +(There are plans to add a facility to read +.Xr archive_entry 1 +objects from disk as well.) +.Pp +The read and write APIs each have four layers: a public API +layer, a format layer that understands the archive file format, +a compression layer, and an I/O layer. +The I/O layer is completely exposed to clients who can replace +it entirely with their own functions. +.Pp +In order to provide as much consistency as possible for clients, +some public functions are virtualized. +Eventually, it should be possible for clients to open +an archive or disk writer, and then use a single set of +code to select and write entries, regardless of the target. +.Sh READ ARCHITECTURE +From the outside, clients use the +.Xr archive_read 3 +API to manipulate an +.Nm archive +object to read entries and bodies from an archive stream. +Internally, the +.Nm archive +object is cast to an +.Nm archive_read +object, which holds all read-specific data. +The API has four layers: +The lowest layer is the I/O layer. +This layer can be overridden by clients, but most clients use +the packaged I/O callbacks provided, for example, by +.Xr archive_read_open_memory 3 , +and +.Xr archive_read_open_fd 3 . +The compression layer calls the I/O layer to +read bytes and decompresses them for the format layer. +The format layer unpacks a stream of uncompressed bytes and +creates +.Nm archive_entry +objects from the incoming data. +The API layer tracks overall state +(for example, it prevents clients from reading data before reading a header) +and invokes the format and compression layer operations +through registered function pointers. +In particular, the API layer drives the format-detection process: +When opening the archive, it reads an initial block of data +and offers it to each registered compression handler. +The one with the highest bid is initialized with the first block. +Similarly, the format handlers are polled to see which handler +is the best for each archive. +(Prior to 2.4.0, the format bidders were invoked for each +entry, but this design hindered error recovery.) +.Ss I/O Layer and Client Callbacks +The read API goes to some lengths to be nice to clients. +As a result, there are few restrictions on the behavior of +the client callbacks. +.Pp +The client read callback is expected to provide a block +of data on each call. +A zero-length return does indicate end of file, but otherwise +blocks may be as small as one byte or as large as the entire file. +In particular, blocks may be of different sizes. +.Pp +The client skip callback returns the number of bytes actually +skipped, which may be much smaller than the skip requested. +The only requirement is that the skip not be larger. +In particular, clients are allowed to return zero for any +skip that they don't want to handle. +The skip callback must never be invoked with a negative value. +.Pp +Keep in mind that not all clients are reading from disk: +clients reading from networks may provide different-sized +blocks on every request and cannot skip at all; +advanced clients may use +.Xr mmap 2 +to read the entire file into memory at once and return the +entire file to libarchive as a single block; +other clients may begin asynchronous I/O operations for the +next block on each request. +.Ss Decompresssion Layer +The decompression layer not only handles decompression, +it also buffers data so that the format handlers see a +much nicer I/O model. +The decompression API is a two stage peek/consume model. +A read_ahead request specifies a minimum read amount; +the decompression layer must provide a pointer to at least +that much data. +If more data is immediately available, it should return more: +the format layer handles bulk data reads by asking for a minimum +of one byte and then copying as much data as is available. +.Pp +A subsequent call to the +.Fn consume +function advances the read pointer. +Note that data returned from a +.Fn read_ahead +call is guaranteed to remain in place until +the next call to +.Fn read_ahead . +Intervening calls to +.Fn consume +should not cause the data to move. +.Pp +Skip requests must always be handled exactly. +Decompression handlers that cannot seek forward should +not register a skip handler; +the API layer fills in a generic skip handler that reads and discards data. +.Pp +A decompression handler has a specific lifecycle: +.Bl -tag -compact -width indent +.It Registration/Configuration +When the client invokes the public support function, +the decompression handler invokes the internal +.Fn __archive_read_register_compression +function to provide bid and initialization functions. +This function returns +.Cm NULL +on error or else a pointer to a +.Cm struct decompressor_t . +This structure contains a +.Va void * config +slot that can be used for storing any customization information. +.It Bid +The bid function is invoked with a pointer and size of a block of data. +The decompressor can access its config data +through the +.Va decompressor +element of the +.Cm archive_read +object. +The bid function is otherwise stateless. +In particular, it must not perform any I/O operations. +.Pp +The value returned by the bid function indicates its suitability +for handling this data stream. +A bid of zero will ensure that this decompressor is never invoked. +Return zero if magic number checks fail. +Otherwise, your initial implementation should return the number of bits +actually checked. +For example, if you verify two full bytes and three bits of another +byte, bid 19. +Note that the initial block may be very short; +be careful to only inspect the data you are given. +(The current decompressors require two bytes for correct bidding.) +.It Initialize +The winning bidder will have its init function called. +This function should initialize the remaining slots of the +.Va struct decompressor_t +object pointed to by the +.Va decompressor +element of the +.Va archive_read +object. +In particular, it should allocate any working data it needs +in the +.Va data +slot of that structure. +The init function is called with the block of data that +was used for tasting. +At this point, the decompressor is responsible for all I/O +requests to the client callbacks. +The decompressor is free to read more data as and when +necessary. +.It Satisfy I/O requests +The format handler will invoke the +.Va read_ahead , +.Va consume , +and +.Va skip +functions as needed. +.It Finish +The finish method is called only once when the archive is closed. +It should release anything stored in the +.Va data +and +.Va config +slots of the +.Va decompressor +object. +It should not invoke the client close callback. +.El +.Ss Format Layer +The read formats have a similar lifecycle to the decompression handlers: +.Bl -tag -compact -width indent +.It Registration +Allocate your private data and initialize your pointers. +.It Bid +Formats bid by invoking the +.Fn read_ahead +decompression method but not calling the +.Fn consume +method. +This allows each bidder to look ahead in the input stream. +Bidders should not look further ahead than necessary, as long +look aheads put pressure on the decompression layer to buffer +lots of data. +Most formats only require a few hundred bytes of look ahead; +look aheads of a few kilobytes are reasonable. +(The ISO9660 reader sometimes looks ahead by 48k, which +should be considered an upper limit.) +.It Read header +The header read is usually the most complex part of any format. +There are a few strategies worth mentioning: +For formats such as tar or cpio, reading and parsing the header is +straightforward since headers alternate with data. +For formats that store all header data at the beginning of the file, +the first header read request may have to read all headers into +memory and store that data, sorted by the location of the file +data. +Subsequent header read requests will skip forward to the +beginning of the file data and return the corresponding header. +.It Read Data +The read data interface supports sparse files; this requires that +each call return a block of data specifying the file offset and +size. +This may require you to carefully track the location so that you +can return accurate file offsets for each read. +Remember that the decompressor will return as much data as it has. +Generally, you will want to request one byte, +examine the return value to see how much data is available, and +possibly trim that to the amount you can use. +You should invoke consume for each block just before you return it. +.It Skip All Data +The skip data call should skip over all file data and trailing padding. +This is called automatically by the API layer just before each +header read. +It is also called in response to the client calling the public +.Fn data_skip +function. +.It Cleanup +On cleanup, the format should release all of its allocated memory. +.El +.Ss API Layer +XXX to do XXX +.Sh WRITE ARCHITECTURE +The write API has a similar set of four layers: +an API layer, a format layer, a compression layer, and an I/O layer. +The registration here is much simpler because only +one format and one compression can be registered at a time. +.Ss I/O Layer and Client Callbacks +XXX To be written XXX +.Ss Compression Layer +XXX To be written XXX +.Ss Format Layer +XXX To be written XXX +.Ss API Layer +XXX To be written XXX +.Sh WRITE_DISK ARCHITECTURE +The write_disk API is intended to look just like the write API +to clients. +Since it does not handle multiple formats or compression, it +is not layered internally. +.Sh GENERAL SERVICES +The +.Nm archive_read , +.Nm archive_write , +and +.Nm archive_write_disk +objects all contain an initial +.Nm archive +object which provides common support for a set of standard services. +(Recall that ANSI/ISO C90 guarantees that you can cast freely between +a pointer to a structure and a pointer to the first element of that +structure.) +The +.Nm archive +object has a magic value that indicates which API this object +is associated with, +slots for storing error information, +and function pointers for virtualized API functions. +.Sh MISCELLANEOUS NOTES +Connecting existing archiving libraries into libarchive is generally +quite difficult. +In particular, many existing libraries strongly assume that you +are reading from a file; they seek forwards and backwards as necessary +to locate various pieces of information. +In contrast, libarchive never seeks backwards in its input, which +sometimes requires very different approaches. +.Pp +For example, libarchive's ISO9660 support operates very differently +from most ISO9660 readers. +The libarchive support utilizes a work-queue design that +keeps a list of known entries sorted by their location in the input. +Whenever libarchive's ISO9660 implementation is asked for the next +header, checks this list to find the next item on the disk. +Directories are parsed when they are encountered and new +items are added to the list. +This design relies heavily on the ISO9660 image being optimized so that +directories always occur earlier on the disk than the files they +describe. +.Pp +Depending on the specific format, such approaches may not be possible. +The ZIP format specification, for example, allows archivers to store +key information only at the end of the file. +In theory, it is possible to create ZIP archives that cannot +be read without seeking. +Fortunately, such archives are very rare, and libarchive can read +most ZIP archives, though it cannot always extract as much information +as a dedicated ZIP program. +.Sh SEE ALSO +.Xr archive 3 , +.Xr archive_entry 3 , +.Xr archive_read 3 , +.Xr archive_write 3 , +.Xr archive_write_disk 3 +.Sh HISTORY +The +.Nm libarchive +library first appeared in +.Fx 5.3 . +.Sh AUTHORS +.An -nosplit +The +.Nm libarchive +library was written by +.An Tim Kientzle Aq kientzle@acm.org . +.Sh BUGS diff --git a/Utilities/cmlibarchive/libarchive/mtree.5 b/Utilities/cmlibarchive/libarchive/mtree.5 new file mode 100644 index 000000000..b6637d6f5 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/mtree.5 @@ -0,0 +1,269 @@ +.\" Copyright (c) 1989, 1990, 1993 +.\" The Regents of the University of California. 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. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. +.\" +.\" From: @(#)mtree.8 8.2 (Berkeley) 12/11/93 +.\" $FreeBSD$ +.\" +.Dd August 20, 2007 +.Dt MTREE 5 +.Os +.Sh NAME +.Nm mtree +.Nd format of mtree dir hierarchy files +.Sh DESCRIPTION +The +.Nm +format is a textual format that describes a collection of filesystem objects. +Such files are typically used to create or verify directory hierarchies. +.Ss General Format +An +.Nm +file consists of a series of lines, each providing information +about a single filesystem object. +Leading whitespace is always ignored. +.Pp +When encoding file or pathnames, any backslash character or +character outside of the 95 printable ASCII characters must be +encoded as a a backslash followed by three +octal digits. +When reading mtree files, any appearance of a backslash +followed by three octal digits should be converted into the +corresponding character. +.Pp +Each line is interpreted independently as one of the following types: +.Bl -tag -width Cm +.It Signature +The first line of any mtree file must begin with +.Dq #mtree . +If a file contains any full path entries, the first line should +begin with +.Dq #mtree v2.0 , +otherwise, the first line should begin with +.Dq #mtree v1.0 . +.It Blank +Blank lines are ignored. +.It Comment +Lines beginning with +.Cm # +are ignored. +.It Special +Lines beginning with +.Cm / +are special commands that influence +the interpretation of later lines. +.It Relative +If the first whitespace-delimited word has no +.Cm / +characters, +it is the name of a file in the current directory. +Any relative entry that describes a directory changes the +current directory. +.It dot-dot +As a special case, a relative entry with the filename +.Pa .. +changes the current directory to the parent directory. +Options on dot-dot entries are always ignored. +.It Full +If the first whitespace-delimited word has a +.Cm / +character after +the first character, it is the pathname of a file relative to the +starting directory. +There can be multiple full entries describing the same file. +.El +.Pp +Some tools that process +.Nm +files may require that multiple lines describing the same file +occur consecutively. +It is not permitted for the same file to be mentioned using +both a relative and a full file specification. +.Ss Special commands +Two special commands are currently defined: +.Bl -tag -width Cm +.It Cm /set +This command defines default values for one or more keywords. +It is followed on the same line by one or more whitespace-separated +keyword definitions. +These definitions apply to all following files that do not specify +a value for that keyword. +.It Cm /unset +This command removes any default value set by a previous +.Cm /set +command. +It is followed on the same line by one or more keywords +separated by whitespace. +.El +.Ss Keywords +After the filename, a full or relative entry consists of zero +or more whitespace-separated keyword definitions. +Each such definition consists of a key from the following +list immediately followed by an '=' sign +and a value. +Software programs reading mtree files should warn about +unrecognized keywords. +.Pp +Currently supported keywords are as follows: +.Bl -tag -width Cm +.It Cm cksum +The checksum of the file using the default algorithm specified by +the +.Xr cksum 1 +utility. +.It Cm contents +The full pathname of a file that holds the contents of this file. +.It Cm flags +The file flags as a symbolic name. +See +.Xr chflags 1 +for information on these names. +If no flags are to be set the string +.Dq none +may be used to override the current default. +.It Cm gid +The file group as a numeric value. +.It Cm gname +The file group as a symbolic name. +.It Cm ignore +Ignore any file hierarchy below this file. +.It Cm link +The target of the symbolic link when type=link. +.It Cm md5 +The MD5 message digest of the file. +.It Cm md5digest +A synonym for +.Cm md5 . +.It Cm mode +The current file's permissions as a numeric (octal) or symbolic +value. +.It Cm nlink +The number of hard links the file is expected to have. +.It Cm nochange +Make sure this file or directory exists but otherwise ignore all attributes. +.It Cm ripemd160digest +The +.Tn RIPEMD160 +message digest of the file. +.It Cm rmd160 +A synonym for +.Cm ripemd160digest . +.It Cm rmd160digest +A synonym for +.Cm ripemd160digest . +.It Cm sha1 +The +.Tn FIPS +160-1 +.Pq Dq Tn SHA-1 +message digest of the file. +.It Cm sha1digest +A synonym for +.Cm sha1 . +.It Cm sha256 +The +.Tn FIPS +180-2 +.Pq Dq Tn SHA-256 +message digest of the file. +.It Cm sha256digest +A synonym for +.Cm sha256 . +.It Cm size +The size, in bytes, of the file. +.It Cm time +The last modification time of the file. +.It Cm type +The type of the file; may be set to any one of the following: +.Pp +.Bl -tag -width Cm -compact +.It Cm block +block special device +.It Cm char +character special device +.It Cm dir +directory +.It Cm fifo +fifo +.It Cm file +regular file +.It Cm link +symbolic link +.It Cm socket +socket +.El +.It Cm uid +The file owner as a numeric value. +.It Cm uname +The file owner as a symbolic name. +.El +.Pp +.Sh SEE ALSO +.Xr cksum 1 , +.Xr find 1 , +.Xr mtree 8 +.Sh BUGS +The +.Fx +implementation of mtree does not currently support +the +.Nm +2.0 +format. +The requirement for a +.Dq #mtree +signature line is new and not yet widely implemented. +.Sh HISTORY +The +.Nm +utility appeared in +.Bx 4.3 Reno . +The +.Tn MD5 +digest capability was added in +.Fx 2.1 , +in response to the widespread use of programs which can spoof +.Xr cksum 1 . +The +.Tn SHA-1 +and +.Tn RIPEMD160 +digests were added in +.Fx 4.0 , +as new attacks have demonstrated weaknesses in +.Tn MD5 . +The +.Tn SHA-256 +digest was added in +.Fx 6.0 . +Support for file flags was added in +.Fx 4.0 , +and mostly comes from +.Nx . +The +.Dq full +entry format was added by +.Nx . diff --git a/Utilities/cmlibarchive/libarchive/o2 b/Utilities/cmlibarchive/libarchive/o2 new file mode 100644 index 000000000..580c9c34e --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/o2 @@ -0,0 +1,483 @@ +archive_write(3) BSD Library Functions Manual archive_write(3) + +NAME + archive_write_new, archive_write_set_format_cpio, + archive_write_set_format_pax, archive_write_set_format_pax_restricted, + archive_write_set_format_shar, archive_write_set_format_shar_binary, + archive_write_set_format_ustar, archive_write_get_bytes_per_block, + archive_write_set_bytes_per_block, archive_write_set_bytes_in_last_block, + archive_write_set_compression_bzip2, + archive_write_set_compression_compress, + archive_write_set_compression_gzip, archive_write_set_compression_none, + archive_write_set_compression_program, + archive_write_set_compressor_options, archive_write_set_format_options, + archive_write_set_options, archive_write_open, archive_write_open_fd, + archive_write_open_FILE, archive_write_open_filename, + archive_write_open_memory, archive_write_header, archive_write_data, + archive_write_finish_entry, archive_write_close, archive_write_finish -- + functions for creating archives + +SYNOPSIS + #include  + + struct archive * + archive_write_new(void); + + int + archive_write_get_bytes_per_block(struct archive *); + + int + archive_write_set_bytes_per_block(struct archive *, int bytes_per_block); + + int + archive_write_set_bytes_in_last_block(struct archive *, int); + + int + archive_write_set_compression_bzip2(struct archive *); + + int + archive_write_set_compression_compress(struct archive *); + + int + archive_write_set_compression_gzip(struct archive *); + + int + archive_write_set_compression_none(struct archive *); + + int + archive_write_set_compression_program(struct archive *, + const char * cmd); + + int + archive_write_set_format_cpio(struct archive *); + + int + archive_write_set_format_pax(struct archive *); + + int + archive_write_set_format_pax_restricted(struct archive *); + + int + archive_write_set_format_shar(struct archive *); + + int + archive_write_set_format_shar_binary(struct archive *); + + int + archive_write_set_format_ustar(struct archive *); + + int + archive_write_set_format_options(struct archive *, const char *); + + int + archive_write_set_compressor_options(struct archive *, const char *); + + int + archive_write_set_options(struct archive *, const char *); + + int + archive_write_open(struct archive *, void *client_data, + archive_open_callback *, archive_write_callback *, + archive_close_callback *); + + int + archive_write_open_fd(struct archive *, int fd); + + int + archive_write_open_FILE(struct archive *, FILE *file); + + int + archive_write_open_filename(struct archive *, const char *filename); + + int + archive_write_open_memory(struct archive *, void *buffer, + size_t bufferSize, size_t *outUsed); + + int + archive_write_header(struct archive *, struct archive_entry *); + + ssize_t + archive_write_data(struct archive *, const void *, size_t); + + int + archive_write_finish_entry(struct archive *); + + int + archive_write_close(struct archive *); + + int + archive_write_finish(struct archive *); + +DESCRIPTION + These functions provide a complete API for creating streaming archive + files. The general process is to first create the struct archive object, + set any desired options, initialize the archive, append entries, then + close the archive and release all resources. The following summary + describes the functions in approximately the order they are ordinarily + used: + + archive_write_new() + Allocates and initializes a struct archive object suitable for + writing a tar archive. + + archive_write_set_bytes_per_block() + Sets the block size used for writing the archive data. Every + call to the write callback function, except possibly the last + one, will use this value for the length. The third parameter is + a boolean that specifies whether or not the final block written + will be padded to the full block size. If it is zero, the last + block will not be padded. If it is non-zero, padding will be + added both before and after compression. The default is to use a + block size of 10240 bytes and to pad the last block. Note that a + block size of zero will suppress internal blocking and cause + writes to be sent directly to the write callback as they occur. + + archive_write_get_bytes_per_block() + Retrieve the block size to be used for writing. A value of -1 + here indicates that the library should use default values. A + value of zero indicates that internal blocking is suppressed. + + archive_write_set_bytes_in_last_block() + Sets the block size used for writing the last block. If this + value is zero, the last block will be padded to the same size as + the other blocks. Otherwise, the final block will be padded to a + multiple of this size. In particular, setting it to 1 will cause + the final block to not be padded. For compressed output, any + padding generated by this option is applied only after the com- + pression. The uncompressed data is always unpadded. The default + is to pad the last block to the full block size (note that + archive_write_open_filename() will set this based on the file + type). Unlike the other ``set'' functions, this function can be + called after the archive is opened. + + archive_write_get_bytes_in_last_block() + Retrieve the currently-set value for last block size. A value of + -1 here indicates that the library should use default values. + + archive_write_set_format_cpio(), archive_write_set_format_pax(), + archive_write_set_format_pax_restricted(), + archive_write_set_format_shar(), + archive_write_set_format_shar_binary(), + archive_write_set_format_ustar() + Sets the format that will be used for the archive. The library + can write POSIX octet-oriented cpio format archives, POSIX-stan- + dard ``pax interchange'' format archives, traditional ``shar'' + archives, enhanced ``binary'' shar archives that store a variety + of file attributes and handle binary files, and POSIX-standard + ``ustar'' archives. The pax interchange format is a backwards- + compatible tar format that adds key/value attributes to each + entry and supports arbitrary filenames, linknames, uids, sizes, + etc. ``Restricted pax interchange format'' is the library + default; this is the same as pax format, but suppresses the pax + extended header for most normal files. In most cases, this will + result in ordinary ustar archives. + + archive_write_set_compression_bzip2(), + archive_write_set_compression_compress(), + archive_write_set_compression_gzip(), + archive_write_set_compression_none() + The resulting archive will be compressed as specified. Note that + the compressed output is always properly blocked. + + archive_write_set_compression_program() + The archive will be fed into the specified compression program. + The output of that program is blocked and written to the client + write callbacks. + + archive_write_set_compressor_options(), + archive_write_set_format_options(), archive_write_set_options() + Specifies options that will be passed to the currently-enabled + compressor and/or format writer. The argument is a comma-sepa- + rated list of individual options. Individual options have one of + the following forms: + option=value + The option/value pair will be provided to every module. + Modules that do not accept an option with this name will + ignore it. + option The option will be provided to every module with a value + of ``1''. + !option + The option will be provided to every module with a NULL + value. + module:option=value, module:option, module:!option + As above, but the corresponding option and value will be + provided only to modules whose name matches module. + The return value will be ARCHIVE_OK if any module accepts the + option, or ARCHIVE_WARN if no module accepted the option, or + ARCHIVE_FATAL if there was a fatal error while attempting to + process the option. + + The currently supported options are: + Compressor gzip + compression-level + The value is interpreted as a decimal integer + specifying the gzip compression level. + Compressor xz + compression-level + The value is interpreted as a decimal integer + specifying the compression level. + Format mtree + cksum, device, flags, gid, gname, indent, link, md5, + mode, nlink, rmd160, sha1, sha256, sha384, + sha512, size, time, uid, uname + Enable a particular keyword in the mtree output. + Prefix with an exclamation mark to disable the + corresponding keyword. The default is equivalent + to ``device, flags, gid, gname, link, mode, + nlink, size, time, type, uid, uname''. + all Enables all of the above keywords. + use-set + Enables generation of /set lines that specify + default values for the following files and/or + directories. + indent XXX needs explanation XXX + + archive_write_open() + Freeze the settings, open the archive, and prepare for writing + entries. This is the most generic form of this function, which + accepts pointers to three callback functions which will be + invoked by the compression layer to write the constructed ar- + chive. + + archive_write_open_fd() + A convenience form of archive_write_open() that accepts a file + descriptor. The archive_write_open_fd() function is safe for use + with tape drives or other block-oriented devices. + + archive_write_open_FILE() + A convenience form of archive_write_open() that accepts a FILE * + pointer. Note that archive_write_open_FILE() is not safe for + writing to tape drives or other devices that require correct + blocking. + + archive_write_open_file() + A deprecated synonym for archive_write_open_filename(). + + archive_write_open_filename() + A convenience form of archive_write_open() that accepts a file- + name. A NULL argument indicates that the output should be writ- + ten to standard output; an argument of ``-'' will open a file + with that name. If you have not invoked + archive_write_set_bytes_in_last_block(), then + archive_write_open_filename() will adjust the last-block padding + depending on the file: it will enable padding when writing to + standard output or to a character or block device node, it will + disable padding otherwise. You can override this by manually + invoking archive_write_set_bytes_in_last_block() before calling + archive_write_open(). The archive_write_open_filename() function + is safe for use with tape drives or other block-oriented devices. + + archive_write_open_memory() + A convenience form of archive_write_open() that accepts a pointer + to a block of memory that will receive the archive. The final + size_t * argument points to a variable that will be updated after + each write to reflect how much of the buffer is currently in use. + You should be careful to ensure that this variable remains allo- + cated until after the archive is closed. + + archive_write_header() + Build and write a header using the data in the provided struct + archive_entry structure. See archive_entry(3) for information on + creating and populating struct archive_entry objects. + + archive_write_data() + Write data corresponding to the header just written. Returns + number of bytes written or -1 on error. + + archive_write_finish_entry() + Close out the entry just written. In particular, this writes out + the final padding required by some formats. Ordinarily, clients + never need to call this, as it is called automatically by + archive_write_next_header() and archive_write_close() as needed. + + archive_write_close() + Complete the archive and invoke the close callback. + + archive_write_finish() + Invokes archive_write_close() if it was not invoked manually, + then releases all resources. Note that this function was + declared to return void in libarchive 1.x, which made it impossi- + ble to detect errors when archive_write_close() was invoked + implicitly from this function. This is corrected beginning with + libarchive 2.0. + More information about the struct archive object and the overall design + of the library can be found in the libarchive(3) overview. + +IMPLEMENTATION + Compression support is built-in to libarchive, which uses zlib and bzlib + to handle gzip and bzip2 compression, respectively. + +CLIENT CALLBACKS + To use this library, you will need to define and register callback func- + tions that will be invoked to write data to the resulting archive. These + functions are registered by calling archive_write_open(): + + typedef int archive_open_callback(struct archive *, void + *client_data) + + The open callback is invoked by archive_write_open(). It should return + ARCHIVE_OK if the underlying file or data source is successfully opened. + If the open fails, it should call archive_set_error() to register an + error code and message and return ARCHIVE_FATAL. + + typedef ssize_t archive_write_callback(struct archive *, + void *client_data, const void *buffer, size_t length) + + The write callback is invoked whenever the library needs to write raw + bytes to the archive. For correct blocking, each call to the write call- + back function should translate into a single write(2) system call. This + is especially critical when writing archives to tape drives. On success, + the write callback should return the number of bytes actually written. + On error, the callback should invoke archive_set_error() to register an + error code and message and return -1. + + typedef int archive_close_callback(struct archive *, void + *client_data) + + The close callback is invoked by archive_close when the archive process- + ing is complete. The callback should return ARCHIVE_OK on success. On + failure, the callback should invoke archive_set_error() to register an + error code and message and return ARCHIVE_FATAL. + +EXAMPLE + The following sketch illustrates basic usage of the library. In this + example, the callback functions are simply wrappers around the standard + open(2), write(2), and close(2) system calls. + + #include + #include + #include + #include + #include + #include + + struct mydata { + const char *name; + int fd; + }; + + int + myopen(struct archive *a, void *client_data) + { + struct mydata *mydata = client_data; + + mydata->fd = open(mydata->name, O_WRONLY | O_CREAT, 0644); + if (mydata->fd >= 0) + return (ARCHIVE_OK); + else + return (ARCHIVE_FATAL); + } + + ssize_t + mywrite(struct archive *a, void *client_data, const void *buff, size_t n) + { + struct mydata *mydata = client_data; + + return (write(mydata->fd, buff, n)); + } + + int + myclose(struct archive *a, void *client_data) + { + struct mydata *mydata = client_data; + + if (mydata->fd > 0) + close(mydata->fd); + return (0); + } + + void + write_archive(const char *outname, const char **filename) + { + struct mydata *mydata = malloc(sizeof(struct mydata)); + struct archive *a; + struct archive_entry *entry; + struct stat st; + char buff[8192]; + int len; + int fd; + + a = archive_write_new(); + mydata->name = outname; + archive_write_set_compression_gzip(a); + archive_write_set_format_ustar(a); + archive_write_open(a, mydata, myopen, mywrite, myclose); + while (*filename) { + stat(*filename, &st); + entry = archive_entry_new(); + archive_entry_copy_stat(entry, &st); + archive_entry_set_pathname(entry, *filename); + archive_write_header(a, entry); + fd = open(*filename, O_RDONLY); + len = read(fd, buff, sizeof(buff)); + while ( len > 0 ) { + archive_write_data(a, buff, len); + len = read(fd, buff, sizeof(buff)); + } + archive_entry_free(entry); + filename++; + } + archive_write_finish(a); + } + + int main(int argc, const char **argv) + { + const char *outname; + argv++; + outname = argv++; + write_archive(outname, argv); + return 0; + } + +RETURN VALUES + Most functions return ARCHIVE_OK (zero) on success, or one of several + non-zero error codes for errors. Specific error codes include: + ARCHIVE_RETRY for operations that might succeed if retried, ARCHIVE_WARN + for unusual conditions that do not prevent further operations, and + ARCHIVE_FATAL for serious errors that make remaining operations impossi- + ble. The archive_errno() and archive_error_string() functions can be + used to retrieve an appropriate error code and a textual error message. + + archive_write_new() returns a pointer to a newly-allocated struct archive + object. + + archive_write_data() returns a count of the number of bytes actually + written. On error, -1 is returned and the archive_errno() and + archive_error_string() functions will return appropriate values. Note + that if the client-provided write callback function returns a non-zero + value, that error will be propagated back to the caller through whatever + API function resulted in that call, which may include + archive_write_header(), archive_write_data(), archive_write_close(), or + archive_write_finish(). The client callback can call archive_set_error() + to provide values that can then be retrieved by archive_errno() and + archive_error_string(). + +SEE ALSO + tar(1), libarchive(3), tar(5) + +HISTORY + The libarchive library first appeared in FreeBSD 5.3. + +AUTHORS + The libarchive library was written by Tim Kientzle . + +BUGS + There are many peculiar bugs in historic tar implementations that may + cause certain programs to reject archives written by this library. For + example, several historic implementations calculated header checksums + incorrectly and will thus reject valid archives; GNU tar does not fully + support pax interchange format; some old tar implementations required + specific field terminations. + + The default pax interchange format eliminates most of the historic tar + limitations and provides a generic key/value attribute facility for ven- + dor-defined extensions. One oversight in POSIX is the failure to provide + a standard attribute for large device numbers. This library uses + ``SCHILY.devminor'' and ``SCHILY.devmajor'' for device numbers that + exceed the range supported by the backwards-compatible ustar header. + These keys are compatible with Joerg Schilling's star archiver. Other + implementations may not recognize these keys and will thus be unable to + correctly restore device nodes with large device numbers from archives + created by this library. + +BSD May 11, 2008 BSD diff --git a/Utilities/cmlibarchive/libarchive/out b/Utilities/cmlibarchive/libarchive/out new file mode 100644 index 000000000..7de16c668 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/out @@ -0,0 +1,185 @@ +LIBARCHIVE(3) BSD Library Functions Manual LIBARCHIVE(3) + +NAME + libarchive -- functions for reading and writing streaming archives + +LIBRARY + library ``libarchive'' + +OVERVIEW + The libarchive library provides a flexible interface for reading and + writing streaming archive files such as tar and cpio. The library is + inherently stream-oriented; readers serially iterate through the archive, + writers serially add things to the archive. In particular, note that + there is no built-in support for random access nor for in-place modifica- + tion. + + When reading an archive, the library automatically detects the format and + the compression. The library currently has read support for: + +o old-style tar archives, + +o most variants of the POSIX ``ustar'' format, + +o the POSIX ``pax interchange'' format, + +o GNU-format tar archives, + +o most common cpio archive formats, + +o ISO9660 CD images (with or without RockRidge extensions), + +o Zip archives. + The library automatically detects archives compressed with gzip(1), + bzip2(1), or compress(1) and decompresses them transparently. + + When writing an archive, you can specify the compression to be used and + the format to use. The library can write + +o POSIX-standard ``ustar'' archives, + +o POSIX ``pax interchange format'' archives, + +o POSIX octet-oriented cpio archives, + +o two different variants of shar archives. + Pax interchange format is an extension of the tar archive format that + eliminates essentially all of the limitations of historic tar formats in + a standard fashion that is supported by POSIX-compliant pax(1) implemen- + tations on many systems as well as several newer implementations of + tar(1). Note that the default write format will suppress the pax + extended attributes for most entries; explicitly requesting pax format + will enable those attributes for all entries. + + The read and write APIs are accessed through the archive_read_XXX() func- + tions and the archive_write_XXX() functions, respectively, and either can + be used independently of the other. + + The rest of this manual page provides an overview of the library opera- + tion. More detailed information can be found in the individual manual + pages for each API or utility function. + +READING AN ARCHIVE + To read an archive, you must first obtain an initialized struct archive + object from archive_read_new(). You can then modify this object for the + desired operations with the various archive_read_set_XXX() and + archive_read_support_XXX() functions. In particular, you will need to + invoke appropriate archive_read_support_XXX() functions to enable the + corresponding compression and format support. Note that these latter + functions perform two distinct operations: they cause the corresponding + support code to be linked into your program, and they enable the corre- + sponding auto-detect code. Unless you have specific constraints, you + will generally want to invoke archive_read_support_compression_all() and + archive_read_support_format_all() to enable auto-detect for all formats + and compression types currently supported by the library. + + Once you have prepared the struct archive object, you call + archive_read_open() to actually open the archive and prepare it for read- + ing. There are several variants of this function; the most basic expects + you to provide pointers to several functions that can provide blocks of + bytes from the archive. There are convenience forms that allow you to + specify a filename, file descriptor, FILE * object, or a block of memory + from which to read the archive data. Note that the core library makes no + assumptions about the size of the blocks read; callback functions are + free to read whatever block size is most appropriate for the medium. + + Each archive entry consists of a header followed by a certain amount of + data. You can obtain the next header with archive_read_next_header(), + which returns a pointer to an struct archive_entry structure with infor- + mation about the current archive element. If the entry is a regular + file, then the header will be followed by the file data. You can use + archive_read_data() (which works much like the read(2) system call) to + read this data from the archive. You may prefer to use the higher-level + archive_read_data_skip(), which reads and discards the data for this + entry, archive_read_data_to_buffer(), which reads the data into an in- + memory buffer, archive_read_data_to_file(), which copies the data to the + provided file descriptor, or archive_read_extract(), which recreates the + specified entry on disk and copies data from the archive. In particular, + note that archive_read_extract() uses the struct archive_entry structure + that you provide it, which may differ from the entry just read from the + archive. In particular, many applications will want to override the + pathname, file permissions, or ownership. + + Once you have finished reading data from the archive, you should call + archive_read_close() to close the archive, then call + archive_read_finish() to release all resources, including all memory + allocated by the library. + + The archive_read(3) manual page provides more detailed calling informa- + tion for this API. + +WRITING AN ARCHIVE + You use a similar process to write an archive. The archive_write_new() + function creates an archive object useful for writing, the various + archive_write_set_XXX() functions are used to set parameters for writing + the archive, and archive_write_open() completes the setup and opens the + archive for writing. + + Individual archive entries are written in a three-step process: You first + initialize a struct archive_entry structure with information about the + new entry. At a minimum, you should set the pathname of the entry and + provide a struct stat with a valid st_mode field, which specifies the + type of object and st_size field, which specifies the size of the data + portion of the object. The archive_write_header() function actually + writes the header data to the archive. You can then use + archive_write_data() to write the actual data. + + After all entries have been written, use the archive_write_finish() func- + tion to release all resources. + + The archive_write(3) manual page provides more detailed calling informa- + tion for this API. + +DESCRIPTION + Detailed descriptions of each function are provided by the corresponding + manual pages. + + All of the functions utilize an opaque struct archive datatype that pro- + vides access to the archive contents. + + The struct archive_entry structure contains a complete description of a + single archive entry. It uses an opaque interface that is fully docu- + mented in archive_entry(3). + + Users familiar with historic formats should be aware that the newer vari- + ants have eliminated most restrictions on the length of textual fields. + Clients should not assume that filenames, link names, user names, or + group names are limited in length. In particular, pax interchange format + can easily accommodate pathnames in arbitrary character sets that exceed + PATH_MAX. + +RETURN VALUES + Most functions return zero on success, non-zero on error. The return + value indicates the general severity of the error, ranging from + ARCHIVE_WARN, which indicates a minor problem that should probably be + reported to the user, to ARCHIVE_FATAL, which indicates a serious problem + that will prevent any further operations on this archive. On error, the + archive_errno() function can be used to retrieve a numeric error code + (see errno(2)). The archive_error_string() returns a textual error mes- + sage suitable for display. + + archive_read_new() and archive_write_new() return pointers to an allo- + cated and initialized struct archive object. + + archive_read_data() and archive_write_data() return a count of the number + of bytes actually read or written. A value of zero indicates the end of + the data for this entry. A negative value indicates an error, in which + case the archive_errno() and archive_error_string() functions can be used + to obtain more information. + +ENVIRONMENT + There are character set conversions within the archive_entry(3) functions + that are impacted by the currently-selected locale. + +SEE ALSO + tar(1), archive_entry(3), archive_read(3), archive_util(3), + archive_write(3), tar(5) + +HISTORY + The libarchive library first appeared in FreeBSD 5.3. + +AUTHORS + The libarchive library was written by Tim Kientzle . + +BUGS + Some archive formats support information that is not supported by struct + archive_entry. Such information cannot be fully archived or restored + using this library. This includes, for example, comments, character + sets, or the arbitrary key/value pairs that can appear in pax interchange + format archives. + + Conversely, of course, not all of the information that can be stored in + an struct archive_entry is supported by all formats. For example, cpio + formats do not support nanosecond timestamps; old tar formats do not sup- + port large device numbers. + +BSD August 19, 2006 BSD diff --git a/Utilities/cmlibarchive/libarchive/tar.5 b/Utilities/cmlibarchive/libarchive/tar.5 new file mode 100644 index 000000000..853ddab03 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/tar.5 @@ -0,0 +1,817 @@ +.\" Copyright (c) 2003-2009 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/lib/libarchive/tar.5,v 1.18 2008/05/26 17:00:23 kientzle Exp $ +.\" +.Dd April 19, 2009 +.Dt tar 5 +.Os +.Sh NAME +.Nm tar +.Nd format of tape archive files +.Sh DESCRIPTION +The +.Nm +archive format collects any number of files, directories, and other +file system objects (symbolic links, device nodes, etc.) into a single +stream of bytes. +The format was originally designed to be used with +tape drives that operate with fixed-size blocks, but is widely used as +a general packaging mechanism. +.Ss General Format +A +.Nm +archive consists of a series of 512-byte records. +Each file system object requires a header record which stores basic metadata +(pathname, owner, permissions, etc.) and zero or more records containing any +file data. +The end of the archive is indicated by two records consisting +entirely of zero bytes. +.Pp +For compatibility with tape drives that use fixed block sizes, +programs that read or write tar files always read or write a fixed +number of records with each I/O operation. +These +.Dq blocks +are always a multiple of the record size. +The most common block size\(emand the maximum supported by historic +implementations\(emis 10240 bytes or 20 records. +(Note: the terms +.Dq block +and +.Dq record +here are not entirely standard; this document follows the +convention established by John Gilmore in documenting +.Nm pdtar . ) +.Ss Old-Style Archive Format +The original tar archive format has been extended many times to +include additional information that various implementors found +necessary. +This section describes the variant implemented by the tar command +included in +.At v7 , +which seems to be the earliest widely-used version of the tar program. +.Pp +The header record for an old-style +.Nm +archive consists of the following: +.Bd -literal -offset indent +struct header_old_tar { + char name[100]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char checksum[8]; + char linkflag[1]; + char linkname[100]; + char pad[255]; +}; +.Ed +All unused bytes in the header record are filled with nulls. +.Bl -tag -width indent +.It Va name +Pathname, stored as a null-terminated string. +Early tar implementations only stored regular files (including +hardlinks to those files). +One common early convention used a trailing "/" character to indicate +a directory name, allowing directory permissions and owner information +to be archived and restored. +.It Va mode +File mode, stored as an octal number in ASCII. +.It Va uid , Va gid +User id and group id of owner, as octal numbers in ASCII. +.It Va size +Size of file, as octal number in ASCII. +For regular files only, this indicates the amount of data +that follows the header. +In particular, this field was ignored by early tar implementations +when extracting hardlinks. +Modern writers should always store a zero length for hardlink entries. +.It Va mtime +Modification time of file, as an octal number in ASCII. +This indicates the number of seconds since the start of the epoch, +00:00:00 UTC January 1, 1970. +Note that negative values should be avoided +here, as they are handled inconsistently. +.It Va checksum +Header checksum, stored as an octal number in ASCII. +To compute the checksum, set the checksum field to all spaces, +then sum all bytes in the header using unsigned arithmetic. +This field should be stored as six octal digits followed by a null and a space +character. +Note that many early implementations of tar used signed arithmetic +for the checksum field, which can cause interoperability problems +when transferring archives between systems. +Modern robust readers compute the checksum both ways and accept the +header if either computation matches. +.It Va linkflag , Va linkname +In order to preserve hardlinks and conserve tape, a file +with multiple links is only written to the archive the first +time it is encountered. +The next time it is encountered, the +.Va linkflag +is set to an ASCII +.Sq 1 +and the +.Va linkname +field holds the first name under which this file appears. +(Note that regular files have a null value in the +.Va linkflag +field.) +.El +.Pp +Early tar implementations varied in how they terminated these fields. +The tar command in +.At v7 +used the following conventions (this is also documented in early BSD manpages): +the pathname must be null-terminated; +the mode, uid, and gid fields must end in a space and a null byte; +the size and mtime fields must end in a space; +the checksum is terminated by a null and a space. +Early implementations filled the numeric fields with leading spaces. +This seems to have been common practice until the +.St -p1003.1-88 +standard was released. +For best portability, modern implementations should fill the numeric +fields with leading zeros. +.Ss Pre-POSIX Archives +An early draft of +.St -p1003.1-88 +served as the basis for John Gilmore's +.Nm pdtar +program and many system implementations from the late 1980s +and early 1990s. +These archives generally follow the POSIX ustar +format described below with the following variations: +.Bl -bullet -compact -width indent +.It +The magic value is +.Dq ustar\ \& +(note the following space). +The version field contains a space character followed by a null. +.It +The numeric fields are generally filled with leading spaces +(not leading zeros as recommended in the final standard). +.It +The prefix field is often not used, limiting pathnames to +the 100 characters of old-style archives. +.El +.Ss POSIX ustar Archives +.St -p1003.1-88 +defined a standard tar file format to be read and written +by compliant implementations of +.Xr tar 1 . +This format is often called the +.Dq ustar +format, after the magic value used +in the header. +(The name is an acronym for +.Dq Unix Standard TAR . ) +It extends the historic format with new fields: +.Bd -literal -offset indent +struct header_posix_ustar { + char name[100]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char checksum[8]; + char typeflag[1]; + char linkname[100]; + char magic[6]; + char version[2]; + char uname[32]; + char gname[32]; + char devmajor[8]; + char devminor[8]; + char prefix[155]; + char pad[12]; +}; +.Ed +.Bl -tag -width indent +.It Va typeflag +Type of entry. +POSIX extended the earlier +.Va linkflag +field with several new type values: +.Bl -tag -width indent -compact +.It Dq 0 +Regular file. +NUL should be treated as a synonym, for compatibility purposes. +.It Dq 1 +Hard link. +.It Dq 2 +Symbolic link. +.It Dq 3 +Character device node. +.It Dq 4 +Block device node. +.It Dq 5 +Directory. +.It Dq 6 +FIFO node. +.It Dq 7 +Reserved. +.It Other +A POSIX-compliant implementation must treat any unrecognized typeflag value +as a regular file. +In particular, writers should ensure that all entries +have a valid filename so that they can be restored by readers that do not +support the corresponding extension. +Uppercase letters "A" through "Z" are reserved for custom extensions. +Note that sockets and whiteout entries are not archivable. +.El +It is worth noting that the +.Va size +field, in particular, has different meanings depending on the type. +For regular files, of course, it indicates the amount of data +following the header. +For directories, it may be used to indicate the total size of all +files in the directory, for use by operating systems that pre-allocate +directory space. +For all other types, it should be set to zero by writers and ignored +by readers. +.It Va magic +Contains the magic value +.Dq ustar +followed by a NUL byte to indicate that this is a POSIX standard archive. +Full compliance requires the uname and gname fields be properly set. +.It Va version +Version. +This should be +.Dq 00 +(two copies of the ASCII digit zero) for POSIX standard archives. +.It Va uname , Va gname +User and group names, as null-terminated ASCII strings. +These should be used in preference to the uid/gid values +when they are set and the corresponding names exist on +the system. +.It Va devmajor , Va devminor +Major and minor numbers for character device or block device entry. +.It Va prefix +First part of pathname. +If the pathname is too long to fit in the 100 bytes provided by the standard +format, it can be split at any +.Pa / +character with the first portion going here. +If the prefix field is not empty, the reader will prepend +the prefix value and a +.Pa / +character to the regular name field to obtain the full pathname. +.El +.Pp +Note that all unused bytes must be set to +.Dv NUL . +.Pp +Field termination is specified slightly differently by POSIX +than by previous implementations. +The +.Va magic , +.Va uname , +and +.Va gname +fields must have a trailing +.Dv NUL . +The +.Va pathname , +.Va linkname , +and +.Va prefix +fields must have a trailing +.Dv NUL +unless they fill the entire field. +(In particular, it is possible to store a 256-character pathname if it +happens to have a +.Pa / +as the 156th character.) +POSIX requires numeric fields to be zero-padded in the front, and allows +them to be terminated with either space or +.Dv NUL +characters. +.Pp +Currently, most tar implementations comply with the ustar +format, occasionally extending it by adding new fields to the +blank area at the end of the header record. +.Ss Pax Interchange Format +There are many attributes that cannot be portably stored in a +POSIX ustar archive. +.St -p1003.1-2001 +defined a +.Dq pax interchange format +that uses two new types of entries to hold text-formatted +metadata that applies to following entries. +Note that a pax interchange format archive is a ustar archive in every +respect. +The new data is stored in ustar-compatible archive entries that use the +.Dq x +or +.Dq g +typeflag. +In particular, older implementations that do not fully support these +extensions will extract the metadata into regular files, where the +metadata can be examined as necessary. +.Pp +An entry in a pax interchange format archive consists of one or +two standard ustar entries, each with its own header and data. +The first optional entry stores the extended attributes +for the following entry. +This optional first entry has an "x" typeflag and a size field that +indicates the total size of the extended attributes. +The extended attributes themselves are stored as a series of text-format +lines encoded in the portable UTF-8 encoding. +Each line consists of a decimal number, a space, a key string, an equals +sign, a value string, and a new line. +The decimal number indicates the length of the entire line, including the +initial length field and the trailing newline. +An example of such a field is: +.Dl 25 ctime=1084839148.1212\en +Keys in all lowercase are standard keys. +Vendors can add their own keys by prefixing them with an all uppercase +vendor name and a period. +Note that, unlike the historic header, numeric values are stored using +decimal, not octal. +A description of some common keys follows: +.Bl -tag -width indent +.It Cm atime , Cm ctime , Cm mtime +File access, inode change, and modification times. +These fields can be negative or include a decimal point and a fractional value. +.It Cm uname , Cm uid , Cm gname , Cm gid +User name, group name, and numeric UID and GID values. +The user name and group name stored here are encoded in UTF8 +and can thus include non-ASCII characters. +The UID and GID fields can be of arbitrary length. +.It Cm linkpath +The full path of the linked-to file. +Note that this is encoded in UTF8 and can thus include non-ASCII characters. +.It Cm path +The full pathname of the entry. +Note that this is encoded in UTF8 and can thus include non-ASCII characters. +.It Cm realtime.* , Cm security.* +These keys are reserved and may be used for future standardization. +.It Cm size +The size of the file. +Note that there is no length limit on this field, allowing conforming +archives to store files much larger than the historic 8GB limit. +.It Cm SCHILY.* +Vendor-specific attributes used by Joerg Schilling's +.Nm star +implementation. +.It Cm SCHILY.acl.access , Cm SCHILY.acl.default +Stores the access and default ACLs as textual strings in a format +that is an extension of the format specified by POSIX.1e draft 17. +In particular, each user or group access specification can include a fourth +colon-separated field with the numeric UID or GID. +This allows ACLs to be restored on systems that may not have complete +user or group information available (such as when NIS/YP or LDAP services +are temporarily unavailable). +.It Cm SCHILY.devminor , Cm SCHILY.devmajor +The full minor and major numbers for device nodes. +.It Cm SCHILY.fflags +The file flags. +.It Cm SCHILY.realsize +The full size of the file on disk. +XXX explain? XXX +.It Cm SCHILY.dev, Cm SCHILY.ino , Cm SCHILY.nlinks +The device number, inode number, and link count for the entry. +In particular, note that a pax interchange format archive using Joerg +Schilling's +.Cm SCHILY.* +extensions can store all of the data from +.Va struct stat . +.It Cm LIBARCHIVE.xattr. Ns Ar namespace Ns . Ns Ar key +Libarchive stores POSIX.1e-style extended attributes using +keys of this form. +The +.Ar key +value is URL-encoded: +All non-ASCII characters and the two special characters +.Dq = +and +.Dq % +are encoded as +.Dq % +followed by two uppercase hexadecimal digits. +The value of this key is the extended attribute value +encoded in base 64. +XXX Detail the base-64 format here XXX +.It Cm VENDOR.* +XXX document other vendor-specific extensions XXX +.El +.Pp +Any values stored in an extended attribute override the corresponding +values in the regular tar header. +Note that compliant readers should ignore the regular fields when they +are overridden. +This is important, as existing archivers are known to store non-compliant +values in the standard header fields in this situation. +There are no limits on length for any of these fields. +In particular, numeric fields can be arbitrarily large. +All text fields are encoded in UTF8. +Compliant writers should store only portable 7-bit ASCII characters in +the standard ustar header and use extended +attributes whenever a text value contains non-ASCII characters. +.Pp +In addition to the +.Cm x +entry described above, the pax interchange format +also supports a +.Cm g +entry. +The +.Cm g +entry is identical in format, but specifies attributes that serve as +defaults for all subsequent archive entries. +The +.Cm g +entry is not widely used. +.Pp +Besides the new +.Cm x +and +.Cm g +entries, the pax interchange format has a few other minor variations +from the earlier ustar format. +The most troubling one is that hardlinks are permitted to have +data following them. +This allows readers to restore any hardlink to a file without +having to rewind the archive to find an earlier entry. +However, it creates complications for robust readers, as it is no longer +clear whether or not they should ignore the size field for hardlink entries. +.Ss GNU Tar Archives +The GNU tar program started with a pre-POSIX format similar to that +described earlier and has extended it using several different mechanisms: +It added new fields to the empty space in the header (some of which was later +used by POSIX for conflicting purposes); +it allowed the header to be continued over multiple records; +and it defined new entries that modify following entries +(similar in principle to the +.Cm x +entry described above, but each GNU special entry is single-purpose, +unlike the general-purpose +.Cm x +entry). +As a result, GNU tar archives are not POSIX compatible, although +more lenient POSIX-compliant readers can successfully extract most +GNU tar archives. +.Bd -literal -offset indent +struct header_gnu_tar { + char name[100]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char checksum[8]; + char typeflag[1]; + char linkname[100]; + char magic[6]; + char version[2]; + char uname[32]; + char gname[32]; + char devmajor[8]; + char devminor[8]; + char atime[12]; + char ctime[12]; + char offset[12]; + char longnames[4]; + char unused[1]; + struct { + char offset[12]; + char numbytes[12]; + } sparse[4]; + char isextended[1]; + char realsize[12]; + char pad[17]; +}; +.Ed +.Bl -tag -width indent +.It Va typeflag +GNU tar uses the following special entry types, in addition to +those defined by POSIX: +.Bl -tag -width indent +.It "7" +GNU tar treats type "7" records identically to type "0" records, +except on one obscure RTOS where they are used to indicate the +pre-allocation of a contiguous file on disk. +.It "D" +This indicates a directory entry. +Unlike the POSIX-standard "5" +typeflag, the header is followed by data records listing the names +of files in this directory. +Each name is preceded by an ASCII "Y" +if the file is stored in this archive or "N" if the file is not +stored in this archive. +Each name is terminated with a null, and +an extra null marks the end of the name list. +The purpose of this +entry is to support incremental backups; a program restoring from +such an archive may wish to delete files on disk that did not exist +in the directory when the archive was made. +.Pp +Note that the "D" typeflag specifically violates POSIX, which requires +that unrecognized typeflags be restored as normal files. +In this case, restoring the "D" entry as a file could interfere +with subsequent creation of the like-named directory. +.It "K" +The data for this entry is a long linkname for the following regular entry. +.It "L" +The data for this entry is a long pathname for the following regular entry. +.It "M" +This is a continuation of the last file on the previous volume. +GNU multi-volume archives guarantee that each volume begins with a valid +entry header. +To ensure this, a file may be split, with part stored at the end of one volume, +and part stored at the beginning of the next volume. +The "M" typeflag indicates that this entry continues an existing file. +Such entries can only occur as the first or second entry +in an archive (the latter only if the first entry is a volume label). +The +.Va size +field specifies the size of this entry. +The +.Va offset +field at bytes 369-380 specifies the offset where this file fragment +begins. +The +.Va realsize +field specifies the total size of the file (which must equal +.Va size +plus +.Va offset ) . +When extracting, GNU tar checks that the header file name is the one it is +expecting, that the header offset is in the correct sequence, and that +the sum of offset and size is equal to realsize. +.It "N" +Type "N" records are no longer generated by GNU tar. +They contained a +list of files to be renamed or symlinked after extraction; this was +originally used to support long names. +The contents of this record +are a text description of the operations to be done, in the form +.Dq Rename %s to %s\en +or +.Dq Symlink %s to %s\en ; +in either case, both +filenames are escaped using K&R C syntax. +Due to security concerns, "N" records are now generally ignored +when reading archives. +.It "S" +This is a +.Dq sparse +regular file. +Sparse files are stored as a series of fragments. +The header contains a list of fragment offset/length pairs. +If more than four such entries are required, the header is +extended as necessary with +.Dq extra +header extensions (an older format that is no longer used), or +.Dq sparse +extensions. +.It "V" +The +.Va name +field should be interpreted as a tape/volume header name. +This entry should generally be ignored on extraction. +.El +.It Va magic +The magic field holds the five characters +.Dq ustar +followed by a space. +Note that POSIX ustar archives have a trailing null. +.It Va version +The version field holds a space character followed by a null. +Note that POSIX ustar archives use two copies of the ASCII digit +.Dq 0 . +.It Va atime , Va ctime +The time the file was last accessed and the time of +last change of file information, stored in octal as with +.Va mtime . +.It Va longnames +This field is apparently no longer used. +.It Sparse Va offset / Va numbytes +Each such structure specifies a single fragment of a sparse +file. +The two fields store values as octal numbers. +The fragments are each padded to a multiple of 512 bytes +in the archive. +On extraction, the list of fragments is collected from the +header (including any extension headers), and the data +is then read and written to the file at appropriate offsets. +.It Va isextended +If this is set to non-zero, the header will be followed by additional +.Dq sparse header +records. +Each such record contains information about as many as 21 additional +sparse blocks as shown here: +.Bd -literal -offset indent +struct gnu_sparse_header { + struct { + char offset[12]; + char numbytes[12]; + } sparse[21]; + char isextended[1]; + char padding[7]; +}; +.Ed +.It Va realsize +A binary representation of the file's complete size, with a much larger range +than the POSIX file size. +In particular, with +.Cm M +type files, the current entry is only a portion of the file. +In that case, the POSIX size field will indicate the size of this +entry; the +.Va realsize +field will indicate the total size of the file. +.El +.Ss GNU tar pax archives +GNU tar 1.14 (XXX check this XXX) and later will write +pax interchange format archives when you specify the +.Fl -posix +flag. +This format uses custom keywords to store sparse file information. +There have been three iterations of this support, referred to +as +.Dq 0.0 , +.Dq 0.1 , +and +.Dq 1.0 . +.Bl -tag -width indent +.It Cm GNU.sparse.numblocks , Cm GNU.sparse.offset , Cm GNU.sparse.numbytes , Cm GNU.sparse.size +The +.Dq 0.0 +format used an initial +.Cm GNU.sparse.numblocks +attribute to indicate the number of blocks in the file, a pair of +.Cm GNU.sparse.offset +and +.Cm GNU.sparse.numbytes +to indicate the offset and size of each block, +and a single +.Cm GNU.sparse.size +to indicate the full size of the file. +This is not the same as the size in the tar header because the +latter value does not include the size of any holes. +This format required that the order of attributes be preserved and +relied on readers accepting multiple appearances of the same attribute +names, which is not officially permitted by the standards. +.It Cm GNU.sparse.map +The +.Dq 0.1 +format used a single attribute that stored a comma-separated +list of decimal numbers. +Each pair of numbers indicated the offset and size, respectively, +of a block of data. +This does not work well if the archive is extracted by an archiver +that does not recognize this extension, since many pax implementations +simply discard unrecognized attributes. +.It Cm GNU.sparse.major , Cm GNU.sparse.minor , Cm GNU.sparse.name , Cm GNU.sparse.realsize +The +.Dq 1.0 +format stores the sparse block map in one or more 512-byte blocks +prepended to the file data in the entry body. +The pax attributes indicate the existence of this map +(via the +.Cm GNU.sparse.major +and +.Cm GNU.sparse.minor +fields) +and the full size of the file. +The +.Cm GNU.sparse.name +holds the true name of the file. +To avoid confusion, the name stored in the regular tar header +is a modified name so that extraction errors will be apparent +to users. +.El +.Ss Solaris Tar +XXX More Details Needed XXX +.Pp +Solaris tar (beginning with SunOS XXX 5.7 ?? XXX) supports an +.Dq extended +format that is fundamentally similar to pax interchange format, +with the following differences: +.Bl -bullet -compact -width indent +.It +Extended attributes are stored in an entry whose type is +.Cm X , +not +.Cm x , +as used by pax interchange format. +The detailed format of this entry appears to be the same +as detailed above for the +.Cm x +entry. +.It +An additional +.Cm A +entry is used to store an ACL for the following regular entry. +The body of this entry contains a seven-digit octal number +followed by a zero byte, followed by the +textual ACL description. +The octal value is the number of ACL entries +plus a constant that indicates the ACL type: 01000000 +for POSIX.1e ACLs and 03000000 for NFSv4 ACLs. +.El +.Ss AIX Tar +XXX More details needed XXX +.Ss Mac OS X Tar +The tar distributed with Apple's Mac OS X stores most regular files +as two separate entries in the tar archive. +The two entries have the same name except that the first +one has +.Dq ._ +added to the beginning of the name. +This first entry stores the +.Dq resource fork +with additional attributes for the file. +The Mac OS X +.Fn CopyFile +API is used to separate a file on disk into separate +resource and data streams and to reassemble those separate +streams when the file is restored to disk. +.Ss Other Extensions +One obvious extension to increase the size of files is to +eliminate the terminating characters from the various +numeric fields. +For example, the standard only allows the size field to contain +11 octal digits, reserving the twelfth byte for a trailing +NUL character. +Allowing 12 octal digits allows file sizes up to 64 GB. +.Pp +Another extension, utilized by GNU tar, star, and other newer +.Nm +implementations, permits binary numbers in the standard numeric fields. +This is flagged by setting the high bit of the first byte. +This permits 95-bit values for the length and time fields +and 63-bit values for the uid, gid, and device numbers. +GNU tar supports this extension for the +length, mtime, ctime, and atime fields. +Joerg Schilling's star program supports this extension for +all numeric fields. +Note that this extension is largely obsoleted by the extended attribute +record provided by the pax interchange format. +.Pp +Another early GNU extension allowed base-64 values rather than octal. +This extension was short-lived and is no longer supported by any +implementation. +.Sh SEE ALSO +.Xr ar 1 , +.Xr pax 1 , +.Xr tar 1 +.Sh STANDARDS +The +.Nm tar +utility is no longer a part of POSIX or the Single Unix Standard. +It last appeared in +.St -susv2 . +It has been supplanted in subsequent standards by +.Xr pax 1 . +The ustar format is currently part of the specification for the +.Xr pax 1 +utility. +The pax interchange file format is new with +.St -p1003.1-2001 . +.Sh HISTORY +A +.Nm tar +command appeared in Seventh Edition Unix, which was released in January, 1979. +It replaced the +.Nm tp +program from Fourth Edition Unix which in turn replaced the +.Nm tap +program from First Edition Unix. +John Gilmore's +.Nm pdtar +public-domain implementation (circa 1987) was highly influential +and formed the basis of +.Nm GNU tar . +Joerg Shilling's +.Nm star +archiver is another open-source (GPL) archiver (originally developed +circa 1985) which features complete support for pax interchange +format. diff --git a/Utilities/cmlibarchive/libarchive/test/.cvsignore b/Utilities/cmlibarchive/libarchive/test/.cvsignore new file mode 100644 index 000000000..b71f5a0db --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/.cvsignore @@ -0,0 +1,10 @@ +*.tar +*.tar.gz +*.tgz +*.zip +.depend +.deps +.dirstamp +archive.h +libarchive_test +list.h diff --git a/Utilities/cmlibarchive/libarchive/test/CMakeLists.txt b/Utilities/cmlibarchive/libarchive/test/CMakeLists.txt new file mode 100644 index 000000000..654c39829 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/CMakeLists.txt @@ -0,0 +1,145 @@ +############################################ +# +# How to build libarchive_test +# +############################################ +IF(ENABLE_TEST) + FOREACH (_src ${libarchive_SOURCES}) + LIST(APPEND parent_libarchive_SOURCES "../${_src}") + ENDFOREACH(_src) + + SET(libarchive_test_SOURCES + ${parent_libarchive_SOURCES} + main.c + read_open_memory.c + test.h + test_acl_basic.c + test_acl_freebsd.c + test_acl_pax.c + test_archive_api_feature.c + test_bad_fd.c + test_compat_bzip2.c + test_compat_gtar.c + test_compat_gzip.c + test_compat_solaris_tar_acl.c + test_compat_tar_hardlink.c + test_compat_xz.c + test_compat_zip.c + test_empty_write.c + test_entry.c + test_entry_strmode.c + test_extattr_freebsd.c + test_fuzz.c + test_link_resolver.c + test_open_fd.c + test_open_file.c + test_open_filename.c + test_pax_filename_encoding.c + test_read_compress_program.c + test_read_data_large.c + test_read_disk.c + test_read_disk_entry_from_file.c + test_read_extract.c + test_read_file_nonexistent.c + test_read_format_ar.c + test_read_format_cpio_bin.c + test_read_format_cpio_bin_Z.c + test_read_format_cpio_bin_be.c + test_read_format_cpio_bin_bz2.c + test_read_format_cpio_bin_gz.c + test_read_format_cpio_bin_xz.c + test_read_format_cpio_odc.c + test_read_format_cpio_svr4_gzip.c + test_read_format_cpio_svr4c_Z.c + test_read_format_empty.c + test_read_format_gtar_gz.c + test_read_format_gtar_lzma.c + test_read_format_gtar_sparse.c + test_read_format_iso_gz.c + test_read_format_isojoliet_bz2.c + test_read_format_isojoliet_long.c + test_read_format_isojoliet_rr.c + test_read_format_isorr_bz2.c + test_read_format_isorr_new_bz2.c + test_read_format_isozisofs_bz2.c + test_read_format_mtree.c + test_read_format_pax_bz2.c + test_read_format_raw.c + test_read_format_tar.c + test_read_format_tar_empty_filename.c + test_read_format_tbz.c + test_read_format_tgz.c + test_read_format_txz.c + test_read_format_tz.c + test_read_format_zip.c + test_read_large.c + test_read_pax_truncated.c + test_read_position.c + test_read_truncated.c + test_tar_filenames.c + test_tar_large.c + test_ustar_filenames.c + test_write_compress.c + test_write_compress_bzip2.c + test_write_compress_gzip.c + test_write_compress_lzma.c + test_write_compress_program.c + test_write_compress_xz.c + test_write_disk.c + test_write_disk_failures.c + test_write_disk_hardlink.c + test_write_disk_perms.c + test_write_disk_secure.c + test_write_disk_sparse.c + test_write_disk_symlink.c + test_write_disk_times.c + test_write_format_ar.c + test_write_format_cpio.c + test_write_format_cpio_empty.c + test_write_format_cpio_odc.c + test_write_format_cpio_newc.c + test_write_format_mtree.c + test_write_format_pax.c + test_write_format_shar_empty.c + test_write_format_tar.c + test_write_format_tar_empty.c + test_write_format_tar_ustar.c + test_write_format_zip.c + test_write_format_zip_empty.c + test_write_format_zip_no_compression.c + test_write_open_memory.c + ) + + # + # Generate the list.h + # + GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h + ${CMAKE_CURRENT_LIST_FILE} ${libarchive_test_SOURCES}) + SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES + ${CMAKE_CURRENT_BINARY_DIR}) + # + # Register target + # + ADD_EXECUTABLE(libarchive_test ${libarchive_test_SOURCES}) + TARGET_LINK_LIBRARIES(libarchive_test ${ADDITIONAL_LIBS}) + SET_PROPERTY(TARGET libarchive_test PROPERTY COMPILE_DEFINITIONS + LIBARCHIVE_STATIC LIST_H) + + # Register ADD_TEST() for each separate test + SET(num 0) + FOREACH(test ${libarchive_test_SOURCES}) + IF(test MATCHES "^test_[^/]+[.]c$") + STRING(REGEX REPLACE "^(test_[^/]+)[.]c$" "\\1" testname ${test}) + ADD_TEST("libarchive_${testname}" libarchive_test + -q -r ${CMAKE_CURRENT_SOURCE_DIR} ${num}) + MATH(EXPR num "${num} + 1") + ENDIF(test MATCHES "^test_[^/]+[.]c$") + ENDFOREACH(test) + + + # Experimental new test handling + ADD_CUSTOM_TARGET(run_libarchive_test + COMMAND libarchive_test -r ${CMAKE_CURRENT_SOURCE_DIR}) + ADD_DEPENDENCIES(run_all_tests run_libarchive_test) +ENDIF(ENABLE_TEST) + diff --git a/Utilities/cmlibarchive/libarchive/test/Makefile b/Utilities/cmlibarchive/libarchive/test/Makefile new file mode 100644 index 000000000..04cf96d52 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/Makefile @@ -0,0 +1,153 @@ +# $FreeBSD: src/lib/libarchive/test/Makefile,v 1.29 2008/12/06 07:08:08 kientzle Exp $ + +# Where to find the libarchive sources +LA_SRCDIR=${.CURDIR}/.. +.PATH: ${LA_SRCDIR} + +# Get a list of all libarchive source files +LA_SRCS!=make -f ${LA_SRCDIR}/Makefile -V SRCS + +TESTS= \ + test_acl_basic.c \ + test_acl_freebsd.c \ + test_acl_pax.c \ + test_archive_api_feature.c \ + test_bad_fd.c \ + test_compat_bzip2.c \ + test_compat_gtar.c \ + test_compat_gzip.c \ + test_compat_solaris_tar_acl.c \ + test_compat_tar_hardlink.c \ + test_compat_xz.c \ + test_compat_zip.c \ + test_empty_write.c \ + test_entry.c \ + test_entry_strmode.c \ + test_extattr_freebsd.c \ + test_fuzz.c \ + test_link_resolver.c \ + test_open_fd.c \ + test_open_file.c \ + test_open_filename.c \ + test_pax_filename_encoding.c \ + test_read_compress_program.c \ + test_read_data_large.c \ + test_read_disk.c \ + test_read_disk_entry_from_file.c \ + test_read_extract.c \ + test_read_file_nonexistent.c \ + test_read_format_ar.c \ + test_read_format_cpio_bin.c \ + test_read_format_cpio_bin_Z.c \ + test_read_format_cpio_bin_be.c \ + test_read_format_cpio_bin_bz2.c \ + test_read_format_cpio_bin_gz.c \ + test_read_format_cpio_bin_xz.c \ + test_read_format_cpio_odc.c \ + test_read_format_cpio_svr4_gzip.c \ + test_read_format_cpio_svr4c_Z.c \ + test_read_format_empty.c \ + test_read_format_gtar_gz.c \ + test_read_format_gtar_lzma.c \ + test_read_format_gtar_sparse.c \ + test_read_format_iso_gz.c \ + test_read_format_isojoliet_bz2.c \ + test_read_format_isojoliet_long.c \ + test_read_format_isojoliet_rr.c \ + test_read_format_isorr_bz2.c \ + test_read_format_isorr_new_bz2.c \ + test_read_format_isozisofs_bz2.c \ + test_read_format_mtree.c \ + test_read_format_pax_bz2.c \ + test_read_format_raw.c \ + test_read_format_tar.c \ + test_read_format_tar_empty_filename.c \ + test_read_format_tbz.c \ + test_read_format_tgz.c \ + test_read_format_txz.c \ + test_read_format_tz.c \ + test_read_format_zip.c \ + test_read_large.c \ + test_read_pax_truncated.c \ + test_read_position.c \ + test_read_truncated.c \ + test_tar_filenames.c \ + test_tar_large.c \ + test_ustar_filenames.c \ + test_write_compress.c \ + test_write_compress_bzip2.c \ + test_write_compress_gzip.c \ + test_write_compress_lzma.c \ + test_write_compress_program.c \ + test_write_compress_xz.c \ + test_write_disk.c \ + test_write_disk_failures.c \ + test_write_disk_hardlink.c \ + test_write_disk_perms.c \ + test_write_disk_secure.c \ + test_write_disk_sparse.c \ + test_write_disk_symlink.c \ + test_write_disk_times.c \ + test_write_format_ar.c \ + test_write_format_cpio.c \ + test_write_format_cpio_empty.c \ + test_write_format_cpio_newc.c \ + test_write_format_cpio_odc.c \ + test_write_format_mtree.c \ + test_write_format_pax.c \ + test_write_format_shar_empty.c \ + test_write_format_tar.c \ + test_write_format_tar_empty.c \ + test_write_format_tar_ustar.c \ + test_write_format_zip.c \ + test_write_format_zip_empty.c \ + test_write_format_zip_no_compression.c \ + test_write_open_memory.c + + +# Build the test program using all libarchive sources + the test sources. +SRCS= ${LA_SRCS} \ + ${TESTS} \ + list.h \ + main.c \ + read_open_memory.c + +NO_MAN=yes + +PROG=libarchive_test +INTERNALPROG=yes # Don't install this; it's just for testing +DPADD=${LIBBZ2} ${LIBZ} +CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" +LDADD= -lz -lbz2 -lmd -lcrypto +CFLAGS+= -g +CFLAGS+= -I${LA_SRCDIR} -I. + +# Uncomment to build and test lzma support via liblzmadec +#CFLAGS+= -I/usr/local/include -DHAVE_LIBLZMADEC=1 -DHAVE_LZMADEC_H=1 +#LDADD+= -L/usr/local/lib -llzmadec + +# Uncomment to build and test lzma and xz support via liblzma +CFLAGS+= -I/usr/local/include -DHAVE_LIBLZMA=1 -DHAVE_LZMA_H=1 +LDADD+= -L/usr/local/lib -llzma + +# Uncomment to link against dmalloc +#LDADD+= -L/usr/local/lib -ldmalloc +#CFLAGS+= -I/usr/local/include -DUSE_DMALLOC +WARNS=6 + +# Build libarchive_test and run it. +check test: libarchive_test + ./libarchive_test -r ${.CURDIR} + +# list.h is just a list of all tests, as indicated by DEFINE_TEST macro lines +list.h: ${TESTS} Makefile + (cd ${.CURDIR}; cat test_*.c) | grep DEFINE_TEST > list.h + +CLEANFILES += *.out *.o *.core *~ list.h .dirstamp .depend +CLEANDIRS += .deps .libs + +cleantest: + -chmod -R +w /tmp/libarchive_test.* + rm -rf /tmp/libarchive_test.* + +.include diff --git a/Utilities/cmlibarchive/libarchive/test/README b/Utilities/cmlibarchive/libarchive/test/README new file mode 100644 index 000000000..235a70b02 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/README @@ -0,0 +1,63 @@ +$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 +to exercise as much of the library as possible. It is, of course, +very much a work in progress. + +Each test is a function named test_foo in a file named test_foo.c. +Note that the file name is the same as the function name. +Each file must start with this line: + + #include "test.h" + +The test function must be declared with a line of this form + + DEFINE_TEST(test_foo) + +Nothing else should appear on that line. + +When you add a test, please update the Makefile to add your +file to the list of tests. The Makefile and main.c use various +macro trickery to automatically collect a list of test functions +to be invoked. + +Each test function can rely on the following: + + * The current directory will be a freshly-created empty directory + suitable for that test. (The top-level main() creates a + directory for each separate test and chdir()s to that directory + before running the test.) + + * The test function should use assert(), assertA() and similar macros + defined in test.h. If you need to add new macros of this form, feel + free to do so. The current macro set includes assertEqualInt() and + assertEqualString() that print out additional detail about their + arguments if the assertion does fail. 'A' versions also accept + a struct archive * and display any error message from there on + failure. + + * You are encouraged to document each assertion with a failure() call + just before the assert. The failure() function is a printf-like + function whose text is displayed only if the assertion fails. It + can be used to display additional information relevant to the failure: + + failure("The data read from file %s did not match the data written to that file.", filename); + assert(strcmp(buff1, buff2) == 0); + + * Tests are encouraged to be economical with their memory and disk usage, + though this is not essential. The test is occasionally run under + a memory debugger to try to locate memory leaks in the library; + as a result, tests should be careful to release any memory they + allocate. + + * Disable tests on specific platforms as necessary. Please don't + use config.h to adjust feature requirements, as I want the tests + to also serve as a check on the configure process. The following + form is appropriate: + +#if !defined(__PLATFORM) && !defined(__Platform2__) + assert(xxxx) +#endif + diff --git a/Utilities/cmlibarchive/libarchive/test/main.c b/Utilities/cmlibarchive/libarchive/test/main.c new file mode 100644 index 000000000..be5cb7998 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/main.c @@ -0,0 +1,2043 @@ +/* + * Copyright (c) 2003-2009 Tim Kientzle + * 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 +#include +#include +#include +#include "test.h" + +/* + * This same file is used pretty much verbatim for all test harnesses. + * + * The next few lines are the only differences. + * TODO: Move this into a separate configuration header, have all test + * suites share one copy of this file. + */ +__FBSDID("$FreeBSD: src/lib/libarchive/test/main.c,v 1.17 2008/12/21 00:13:50 kientzle Exp $"); +#define KNOWNREF "test_compat_gtar_1.tar.uu" +#define ENVBASE "LIBARCHIVE" /* Prefix for environment variables. */ +#undef PROGRAM /* Testing a library, not a program. */ +#define LIBRARY "libarchive" +#define EXTRA_DUMP(x) archive_error_string((struct archive *)(x)) +#define EXTRA_VERSION archive_version() + +/* + * + * Windows support routines + * + * Note: Configuration is a tricky issue. Using HAVE_* feature macros + * in the test harness is dangerous because they cover up + * configuration errors. The classic example of this is omitting a + * configure check. If libarchive and libarchive_test both look for + * the same feature macro, such errors are hard to detect. Platform + * macros (e.g., _WIN32 or __GNUC__) are a little better, but can + * easily lead to very messy code. It's best to limit yourself + * to only the most generic programming techniques in the test harness + * and thus avoid conditionals altogether. Where that's not possible, + * try to minimize conditionals by grouping platform-specific tests in + * one place (e.g., test_acl_freebsd) or by adding new assert() + * functions (e.g., assertMakeHardlink()) to cover up platform + * differences. Platform-specific coding in libarchive_test is often + * a symptom that some capability is missing from libarchive itself. + */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#if !defined(__GNUC__) +#include +#endif +#include +#include +#ifndef F_OK +#define F_OK (0) +#endif +#ifndef S_ISDIR +#define S_ISDIR(m) ((m) & _S_IFDIR) +#endif +#ifndef S_ISREG +#define S_ISREG(m) ((m) & _S_IFREG) +#endif +#define access _access +#define chdir _chdir +#ifndef fileno +#define fileno _fileno +#endif +/*#define fstat _fstat64*/ +#define getcwd _getcwd +#define lstat stat +/*#define lstat _stat64*/ +/*#define stat _stat64*/ +#define rmdir _rmdir +#define strdup _strdup +#define umask _umask +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) +void *GetFunctionKernel32(const char *name) +{ + static HINSTANCE lib; + static int set; + if (!set) { + set = 1; + lib = LoadLibrary("kernel32.dll"); + } + if (lib == NULL) { + fprintf(stderr, "Can't load kernel32.dll?!\n"); + exit(1); + } + return (void *)GetProcAddress(lib, name); +} + +static int +my_CreateSymbolicLinkA(const char *linkname, const char *target, int flags) +{ + static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, DWORD); + static int set; + if (!set) { + set = 1; + f = GetFunctionKernel32("CreateSymbolicLinkA"); + } + return f == NULL ? 0 : (*f)(linkname, target, flags); +} + +static int +my_CreateHardLinkA(const char *linkname, const char *target) +{ + static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES); + static int set; + if (!set) { + set = 1; + f = GetFunctionKernel32("CreateHardLinkA"); + } + return f == NULL ? 0 : (*f)(linkname, target, NULL); +} + +int +my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi) +{ + HANDLE h; + int r; + + h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) + return (0); + r = GetFileInformationByHandle(h, bhfi); + CloseHandle(h); + return (r); +} +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__) +static void +invalid_parameter_handler(const wchar_t * expression, + const wchar_t * function, const wchar_t * file, + unsigned int line, uintptr_t pReserved) +{ + /* nop */ +} +#endif + +/* + * + * OPTIONS FLAGS + * + */ + +/* Enable core dump on failure. */ +static int dump_on_failure = 0; +/* Default is to remove temp dirs and log data for successful tests. */ +static int keep_temp_files = 0; +/* Default is to just report pass/fail for each test. */ +static int verbosity = 0; +#define VERBOSITY_SUMMARY_ONLY -1 /* -q */ +#define VERBOSITY_PASSFAIL 0 /* Default */ +#define VERBOSITY_LIGHT_REPORT 1 /* -v */ +#define VERBOSITY_FULL 2 /* -vv */ +/* A few places generate even more output for verbosity > VERBOSITY_FULL, + * mostly for debugging the test harness itself. */ +/* Cumulative count of assertion failures. */ +static int failures = 0; +/* Cumulative count of reported skips. */ +static int skips = 0; +/* Cumulative count of assertions checked. */ +static int assertions = 0; + +/* Directory where uuencoded reference files can be found. */ +static const char *refdir; + +/* + * Report log information selectively to console and/or disk log. + */ +static int log_console = 0; +static FILE *logfile; +static void +vlogprintf(const char *fmt, va_list ap) +{ + if (log_console) + vfprintf(stdout, fmt, ap); + if (logfile != NULL) + vfprintf(logfile, fmt, ap); +} + +static void +logprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vlogprintf(fmt, ap); + va_end(ap); +} + +/* Set up a message to display only if next assertion fails. */ +static char msgbuff[4096]; +static const char *msg, *nextmsg; +void +failure(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vsprintf(msgbuff, fmt, ap); + va_end(ap); + nextmsg = msgbuff; +} + +/* + * Copy arguments into file-local variables. + * This was added to permit vararg assert() functions without needing + * variadic wrapper macros. Turns out that the vararg capability is almost + * never used, so almost all of the vararg assertions can be simplified + * by removing the vararg capability and reworking the wrapper macro to + * pass __FILE__, __LINE__ directly into the function instead of using + * this hook. I suspect this machinery is used so rarely that we + * would be better off just removing it entirely. That would simplify + * the code here noticably. + */ +static const char *test_filename; +static int test_line; +static void *test_extra; +void assertion_setup(const char *filename, int line) +{ + test_filename = filename; + test_line = line; +} + +/* Called at the beginning of each assert() function. */ +static void +assertion_count(const char *file, int line) +{ + (void)file; /* UNUSED */ + (void)line; /* UNUSED */ + ++assertions; + /* Proper handling of "failure()" message. */ + msg = nextmsg; + nextmsg = NULL; + /* Uncomment to print file:line after every assertion. + * Verbose, but occasionally useful in tracking down crashes. */ + /* printf("Checked %s:%d\n", file, line); */ +} + +/* + * For each test source file, we remember how many times each + * assertion was reported. Cleared before each new test, + * used by test_summarize(). + */ +static struct line { + int count; + int skip; +} failed_lines[10000]; + +/* Count this failure, setup up log destination and handle initial report. */ +static void +failure_start(const char *filename, int line, const char *fmt, ...) +{ + va_list ap; + + /* Record another failure for this line. */ + ++failures; + test_filename = filename; + failed_lines[line].count++; + + /* Determine whether to log header to console. */ + switch (verbosity) { + case VERBOSITY_FULL: + log_console = 1; + break; + case VERBOSITY_LIGHT_REPORT: + log_console = (failed_lines[line].count < 2); + break; + default: + log_console = 0; + } + + /* Log file:line header for this failure */ + va_start(ap, fmt); +#if _MSC_VER + logprintf("%s(%d): ", filename, line); +#else + logprintf("%s:%d: ", filename, line); +#endif + vlogprintf(fmt, ap); + va_end(ap); + logprintf("\n"); + + if (msg != NULL && msg[0] != '\0') { + logprintf(" Description: %s\n", msg); + msg = NULL; + } + + /* Determine whether to log details to console. */ + if (verbosity == VERBOSITY_LIGHT_REPORT) + log_console = 0; +} + +/* Complete reporting of failed tests. */ +/* + * The 'extra' hook here is used by libarchive to include libarchive + * error messages with assertion failures. It could also be used + * to add strerror() output, for example. Just define the EXTRA_DUMP() + * macro appropriately. + */ +static void +failure_finish(void *extra) +{ + (void)extra; /* UNUSED (maybe) */ +#ifdef EXTRA_DUMP + if (extra != NULL) + logprintf(" detail: %s\n", EXTRA_DUMP(extra)); +#endif + + if (dump_on_failure) { + fprintf(stderr, + " *** forcing core dump so failure can be debugged ***\n"); + *(char *)(NULL) = 0; + exit(1); + } +} + +/* Inform user that we're skipping some checks. */ +void +test_skipping(const char *fmt, ...) +{ + char buff[1024]; + va_list ap; + + va_start(ap, fmt); + vsprintf(buff, fmt, ap); + va_end(ap); + /* failure_start() isn't quite right, but is awfully convenient. */ + failure_start(test_filename, test_line, "SKIPPING: %s", buff); + --failures; /* Undo failures++ in failure_start() */ + /* Don't failure_finish() here. */ + /* Mark as skip, so doesn't count as failed test. */ + failed_lines[test_line].skip = 1; + ++skips; +} + +/* + * + * ASSERTIONS + * + */ + +/* Generic assert() just displays the failed condition. */ +int +assertion_assert(const char *file, int line, int value, + const char *condition, void *extra) +{ + assertion_count(file, line); + if (!value) { + failure_start(file, line, "Assertion failed: %s", condition); + failure_finish(extra); + } + return (value); +} + +/* chdir() and report any errors */ +int +assertion_chdir(const char *file, int line, const char *pathname) +{ + assertion_count(file, line); + if (chdir(pathname) == 0) + return (1); + failure_start(file, line, "chdir(\"%s\")", pathname); + failure_finish(NULL); + return (0); + +} + +/* Verify two integers are equal. */ +int +assertion_equal_int(const char *file, int line, + long long v1, const char *e1, long long 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=%lld (0x%llx, 0%llo)\n", e1, v1, v1, v1); + logprintf(" %s=%lld (0x%llx, 0%llo)\n", e2, v2, v2, v2); + failure_finish(extra); + return (0); +} + +static void strdump(const char *e, const char *p) +{ + logprintf(" %s = ", e); + if (p == NULL) { + logprintf("(null)"); + return; + } + logprintf("\""); + while (*p != '\0') { + unsigned int c = 0xff & *p++; + switch (c) { + case '\a': printf("\a"); break; + case '\b': printf("\b"); break; + case '\n': printf("\n"); break; + case '\r': printf("\r"); break; + default: + if (c >= 32 && c < 127) + logprintf("%c", c); + else + logprintf("\\x%02X", c); + } + } + logprintf("\""); + logprintf(" (length %d)\n", p == NULL ? 0 : (int)strlen(p)); +} + +/* Verify two strings are equal, dump them if not. */ +int +assertion_equal_string(const char *file, int line, + const char *v1, const char *e1, + const char *v2, const char *e2, + void *extra) +{ + assertion_count(file, line); + if (v1 == v2 || strcmp(v1, v2) == 0) + return (1); + failure_start(file, line, "%s != %s", e1, e2); + strdump(e1, v1); + strdump(e2, v2); + failure_finish(extra); + return (0); +} + +static void +wcsdump(const char *e, const wchar_t *w) +{ + logprintf(" %s = ", e); + if (w == NULL) { + logprintf("(null)"); + return; + } + logprintf("\""); + while (*w != L'\0') { + unsigned int c = *w++; + if (c >= 32 && c < 127) + logprintf("%c", c); + else if (c < 256) + logprintf("\\x%02X", c); + else if (c < 0x10000) + logprintf("\\u%04X", c); + else + logprintf("\\U%08X", c); + } + logprintf("\"\n"); +} + +/* Verify that two wide strings are equal, dump them if not. */ +int +assertion_equal_wstring(const char *file, int line, + const wchar_t *v1, const char *e1, + const wchar_t *v2, const char *e2, + void *extra) +{ + assertion_count(file, line); + if (v1 == v2 || wcscmp(v1, v2) == 0) + return (1); + failure_start(file, line, "%s != %s", e1, e2); + wcsdump(e1, v1); + wcsdump(e2, v2); + failure_finish(extra); + return (0); +} + +/* + * Pretty standard hexdump routine. As a bonus, if ref != NULL, then + * any bytes in p that differ from ref will be highlighted with '_' + * before and after the hex value. + */ +static void +hexdump(const char *p, const char *ref, size_t l, size_t offset) +{ + size_t i, j; + char sep; + + for(i=0; i < l; i+=16) { + logprintf("%04x", (unsigned)(i + offset)); + sep = ' '; + for (j = 0; j < 16 && i + j < l; j++) { + if (ref != NULL && p[i + j] != ref[i + j]) + sep = '_'; + logprintf("%c%02x", sep, 0xff & (int)p[i+j]); + if (ref != NULL && p[i + j] == ref[i + j]) + sep = ' '; + } + for (; j < 16; j++) { + logprintf("%c ", sep); + sep = ' '; + } + logprintf("%c", sep); + for (j=0; j < 16 && i + j < l; j++) { + int c = p[i + j]; + if (c >= ' ' && c <= 126) + logprintf("%c", c); + else + logprintf("."); + } + logprintf("\n"); + } +} + +/* Verify that two blocks of memory are the same, display the first + * block of differences if they're not. */ +int +assertion_equal_mem(const char *file, int line, + const void *_v1, const char *e1, + const void *_v2, const char *e2, + size_t l, const char *ld, void *extra) +{ + const char *v1 = (const char *)_v1; + const char *v2 = (const char *)_v2; + size_t offset; + + assertion_count(file, line); + if (v1 == v2 || memcmp(v1, v2, l) == 0) + return (1); + + failure_start(file, line, "%s != %s", e1, e2); + logprintf(" size %s = %d\n", ld, (int)l); + /* Dump 48 bytes (3 lines) so that the first difference is + * in the second line. */ + offset = 0; + while (l > 64 && memcmp(v1, v2, 32) == 0) { + /* Two lines agree, so step forward one line. */ + v1 += 16; + v2 += 16; + l -= 16; + offset += 16; + } + logprintf(" Dump of %s\n", e1); + hexdump(v1, v2, l < 64 ? l : 64, offset); + logprintf(" Dump of %s\n", e2); + hexdump(v2, v1, l < 64 ? l : 64, offset); + logprintf("\n"); + failure_finish(extra); + return (0); +} + +/* Verify that the named file exists and is empty. */ +int +assertion_empty_file(const char *f1fmt, ...) +{ + char buff[1024]; + char f1[1024]; + struct stat st; + va_list ap; + ssize_t s; + FILE *f; + + assertion_count(test_filename, test_line); + va_start(ap, f1fmt); + vsprintf(f1, f1fmt, ap); + va_end(ap); + + if (stat(f1, &st) != 0) { + failure_start(test_filename, test_line, "Stat failed: %s", f1); + failure_finish(NULL); + return (0); + } + if (st.st_size == 0) + return (1); + + failure_start(test_filename, test_line, "File should be empty: %s", f1); + logprintf(" File size: %d\n", (int)st.st_size); + logprintf(" Contents:\n"); + f = fopen(f1, "rb"); + if (f == NULL) { + logprintf(" Unable to open %s\n", f1); + } else { + s = ((off_t)sizeof(buff) < st.st_size) ? + (ssize_t)sizeof(buff) : (ssize_t)st.st_size; + s = fread(buff, 1, s, f); + hexdump(buff, NULL, s, 0); + fclose(f); + } + failure_finish(NULL); + return (0); +} + +/* Verify that the named file exists and is not empty. */ +int +assertion_non_empty_file(const char *f1fmt, ...) +{ + char f1[1024]; + struct stat st; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, f1fmt); + vsprintf(f1, f1fmt, ap); + va_end(ap); + + if (stat(f1, &st) != 0) { + failure_start(test_filename, test_line, "Stat failed: %s", f1); + failure_finish(NULL); + return (0); + } + if (st.st_size == 0) { + failure_start(test_filename, test_line, "File empty: %s", f1); + failure_finish(NULL); + return (0); + } + return (1); +} + +/* Verify that two files have the same contents. */ +/* TODO: hexdump the first bytes that actually differ. */ +int +assertion_equal_file(const char *fn1, const char *f2pattern, ...) +{ + char fn2[1024]; + va_list ap; + char buff1[1024]; + char buff2[1024]; + FILE *f1, *f2; + int n1, n2; + + assertion_count(test_filename, test_line); + va_start(ap, f2pattern); + vsprintf(fn2, f2pattern, ap); + va_end(ap); + + f1 = fopen(fn1, "rb"); + f2 = fopen(fn2, "rb"); + for (;;) { + n1 = fread(buff1, 1, sizeof(buff1), f1); + n2 = fread(buff2, 1, sizeof(buff2), f2); + if (n1 != n2) + break; + if (n1 == 0 && n2 == 0) { + fclose(f1); + fclose(f2); + return (1); + } + if (memcmp(buff1, buff2, n1) != 0) + break; + } + fclose(f1); + fclose(f2); + failure_start(test_filename, test_line, "Files not identical"); + logprintf(" file1=\"%s\"\n", fn1); + logprintf(" file2=\"%s\"\n", fn2); + failure_finish(test_extra); + return (0); +} + +/* Verify that the named file does exist. */ +int +assertion_file_exists(const char *fpattern, ...) +{ + char f[1024]; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(f, fpattern, ap); + va_end(ap); + +#if defined(_WIN32) && !defined(__CYGWIN__) + if (!_access(f, 0)) + return (1); +#else + if (!access(f, F_OK)) + return (1); +#endif + failure_start(test_filename, test_line, "File should exist: %s", f); + failure_finish(test_extra); + return (0); +} + +/* Verify that the named file doesn't exist. */ +int +assertion_file_not_exists(const char *fpattern, ...) +{ + char f[1024]; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(f, fpattern, ap); + va_end(ap); + +#if defined(_WIN32) && !defined(__CYGWIN__) + if (_access(f, 0)) + return (1); +#else + if (access(f, F_OK)) + return (1); +#endif + failure_start(test_filename, test_line, "File should not exist: %s", f); + failure_finish(test_extra); + return (0); +} + +/* Compare the contents of a file to a block of memory. */ +int +assertion_file_contents(const void *buff, int s, const char *fpattern, ...) +{ + char fn[1024]; + va_list ap; + char *contents; + FILE *f; + int n; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(fn, fpattern, ap); + va_end(ap); + + f = fopen(fn, "rb"); + if (f == NULL) { + failure_start(test_filename, test_line, + "File should exist: %s", fn); + failure_finish(test_extra); + return (0); + } + contents = malloc(s * 2); + n = fread(contents, 1, s * 2, f); + fclose(f); + if (n == s && memcmp(buff, contents, s) == 0) { + free(contents); + return (1); + } + failure_start(test_filename, test_line, "File contents don't match"); + logprintf(" file=\"%s\"\n", fn); + if (n > 0) + hexdump(contents, buff, n > 512 ? 512 : 0, 0); + else { + logprintf(" File empty, contents should be:\n"); + hexdump(buff, NULL, s > 512 ? 512 : 0, 0); + } + failure_finish(test_extra); + free(contents); + return (0); +} + +/* Check the contents of a text file, being tolerant of line endings. */ +int +assertion_text_file_contents(const char *buff, const char *fn) +{ + char *contents; + const char *btxt, *ftxt; + FILE *f; + int n, s; + + assertion_count(test_filename, test_line); + f = fopen(fn, "r"); + s = strlen(buff); + contents = malloc(s * 2 + 128); + n = fread(contents, 1, s * 2 + 128 - 1, f); + if (n >= 0) + contents[n] = '\0'; + fclose(f); + /* Compare texts. */ + btxt = buff; + ftxt = (const char *)contents; + while (*btxt != '\0' && *ftxt != '\0') { + if (*btxt == *ftxt) { + ++btxt; + ++ftxt; + continue; + } + if (btxt[0] == '\n' && ftxt[0] == '\r' && ftxt[1] == '\n') { + /* Pass over different new line characters. */ + ++btxt; + ftxt += 2; + continue; + } + break; + } + if (*btxt == '\0' && *ftxt == '\0') { + free(contents); + return (1); + } + failure_start(test_filename, test_line, "Contents don't match"); + logprintf(" file=\"%s\"\n", fn); + if (n > 0) + hexdump(contents, buff, n, 0); + else { + logprintf(" File empty, contents should be:\n"); + hexdump(buff, NULL, s, 0); + } + failure_finish(test_extra); + free(contents); + return (0); +} + +/* Test that two paths point to the same file. */ +/* As a side-effect, asserts that both files exist. */ +static int +is_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2; + int r; + + assertion_count(file, line); + r = my_GetFileInformationByName(path1, &bhfi1); + if (r == 0) { + failure_start(file, line, "File %s can't be inspected?", path1); + failure_finish(NULL); + return (0); + } + r = my_GetFileInformationByName(path2, &bhfi2); + if (r == 0) { + failure_start(file, line, "File %s can't be inspected?", path2); + failure_finish(NULL); + return (0); + } + return (bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh + && bhfi1.nFileIndexLow == bhfi2.nFileIndexLow); +#else + struct stat st1, st2; + int r; + + assertion_count(file, line); + r = lstat(path1, &st1); + if (r != 0) { + failure_start(file, line, "File should exist: %s", path1); + failure_finish(NULL); + return (0); + } + r = lstat(path2, &st2); + if (r != 0) { + failure_start(file, line, "File should exist: %s", path2); + failure_finish(NULL); + return (0); + } + return (st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev); +#endif +} + +int +assertion_is_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ + if (is_hardlink(file, line, path1, path2)) + return (1); + failure_start(file, line, + "Files %s and %s are not hardlinked", path1, path2); + failure_finish(NULL); + return (0); +} + +int +assertion_is_not_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ + if (!is_hardlink(file, line, path1, path2)) + return (1); + failure_start(file, line, + "Files %s and %s should not be hardlinked", path1, path2); + failure_finish(NULL); + return (0); +} + +/* Verify a/b/mtime of 'pathname'. */ +/* If 'recent', verify that it's within last 10 seconds. */ +static int +assertion_file_time(const char *file, int line, + const char *pathname, long t, long nsec, char type, int recent) +{ + long long filet, filet_nsec; + int r; + +#if defined(_WIN32) && !defined(__CYGWIN__) +#define EPOC_TIME (116444736000000000ULL) + FILETIME ftime, fbirthtime, fatime, fmtime; + ULARGE_INTEGER wintm; + HANDLE h; + ftime.dwLowDateTime = 0; + ftime.dwHighDateTime = 0; + + assertion_count(file, line); + h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) { + failure_start(file, line, "Can't access %s\n", pathname); + failure_finish(NULL); + return (0); + } + r = GetFileTime(h, &fbirthtime, &fatime, &fmtime); + switch (type) { + case 'a': ftime = fatime; break; + case 'b': ftime = fbirthtime; break; + case 'm': ftime = fmtime; break; + } + CloseHandle(h); + if (r == 0) { + failure_start(file, line, "Can't GetFileTime %s\n", pathname); + failure_finish(NULL); + return (0); + } + wintm.LowPart = ftime.dwLowDateTime; + wintm.HighPart = ftime.dwHighDateTime; + filet = (wintm.QuadPart - EPOC_TIME) / 10000000; + filet_nsec = ((wintm.QuadPart - EPOC_TIME) % 10000000) * 100; + nsec = (nsec / 100) * 100; /* Round the request */ +#else + struct stat st; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, "Can't stat %s\n", pathname); + failure_finish(NULL); + return (0); + } + switch (type) { + case 'a': filet = st.st_atime; break; + case 'm': filet = st.st_mtime; break; + case 'b': filet = 0; break; + default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type); + exit(1); + } +#if defined(__FreeBSD__) + switch (type) { + case 'a': filet_nsec = st.st_atimespec.tv_nsec; break; + case 'b': filet = st.st_birthtime; + filet_nsec = st.st_birthtimespec.tv_nsec; break; + case 'm': filet_nsec = st.st_mtimespec.tv_nsec; break; + default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type); + exit(1); + } + /* FreeBSD generally only stores to microsecond res, so round. */ + filet_nsec = (filet_nsec / 1000) * 1000; + nsec = (nsec / 1000) * 1000; +#else + filet_nsec = nsec = 0; /* Generic POSIX only has whole seconds. */ + if (type == 'b') return (1); /* Generic POSIX doesn't have birthtime */ +#endif +#endif + if (recent) { + /* Check that requested time is up-to-date. */ + time_t now = time(NULL); + if (filet < now - 10 || filet > now + 1) { + failure_start(file, line, + "File %s has %ctime %ld, %ld seconds ago\n", + pathname, type, filet, now - filet); + failure_finish(NULL); + return (0); + } + } else if (filet != t || filet_nsec != nsec) { + failure_start(file, line, + "File %s has %ctime %ld.%09ld, expected %ld.%09ld", + pathname, type, filet, filet_nsec, t, nsec); + failure_finish(NULL); + return (0); + } + return (1); +} + +/* Verify atime of 'pathname'. */ +int +assertion_file_atime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'a', 0); +} + +/* Verify atime of 'pathname' is up-to-date. */ +int +assertion_file_atime_recent(const char *file, int line, const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'a', 1); +} + +/* Verify birthtime of 'pathname'. */ +int +assertion_file_birthtime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'b', 0); +} + +/* Verify birthtime of 'pathname' is up-to-date. */ +int +assertion_file_birthtime_recent(const char *file, int line, + const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'b', 1); +} + +/* Verify mtime of 'pathname'. */ +int +assertion_file_mtime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'm', 0); +} + +/* Verify mtime of 'pathname' is up-to-date. */ +int +assertion_file_mtime_recent(const char *file, int line, const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'm', 1); +} + +/* Verify number of links to 'pathname'. */ +int +assertion_file_nlinks(const char *file, int line, + const char *pathname, int nlinks) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + BY_HANDLE_FILE_INFORMATION bhfi; + int r; + + assertion_count(file, line); + r = my_GetFileInformationByName(pathname, &bhfi); + if (r != 0 && bhfi.nNumberOfLinks == nlinks) + return (1); + failure_start(file, line, "File %s has %d links, expected %d", + pathname, bhfi.nNumberOfLinks, nlinks); + failure_finish(NULL); + return (0); +#else + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r == 0 && st.st_nlink == nlinks) + return (1); + failure_start(file, line, "File %s has %d links, expected %d", + pathname, st.st_nlink, nlinks); + failure_finish(NULL); + return (0); +#endif +} + +/* Verify size of 'pathname'. */ +int +assertion_file_size(const char *file, int line, const char *pathname, long size) +{ + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r == 0 && st.st_size == size) + return (1); + failure_start(file, line, "File %s has size %ld, expected %ld", + pathname, (long)st.st_size, (long)size); + failure_finish(NULL); + return (0); +} + +/* Assert that 'pathname' is a dir. If mode >= 0, verify that too. */ +int +assertion_is_dir(const char *file, int line, const char *pathname, int mode) +{ + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, "Dir should exist: %s", pathname); + failure_finish(NULL); + return (0); + } + if (!S_ISDIR(st.st_mode)) { + failure_start(file, line, "%s is not a dir", pathname); + failure_finish(NULL); + return (0); + } +#if !defined(_WIN32) || defined(__CYGWIN__) + /* Windows doesn't handle permissions the same way as POSIX, + * so just ignore the mode tests. */ + /* TODO: Can we do better here? */ + if (mode >= 0 && mode != (st.st_mode & 07777)) { + failure_start(file, line, "Dir %s has wrong mode", pathname); + logprintf(" Expected: 0%3o\n", mode); + logprintf(" Found: 0%3o\n", st.st_mode & 07777); + failure_finish(NULL); + return (0); + } +#endif + return (1); +} + +/* Verify that 'pathname' is a regular file. If 'mode' is >= 0, + * verify that too. */ +int +assertion_is_reg(const char *file, int line, const char *pathname, int mode) +{ + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0 || !S_ISREG(st.st_mode)) { + failure_start(file, line, "File should exist: %s", pathname); + failure_finish(NULL); + return (0); + } +#if !defined(_WIN32) || defined(__CYGWIN__) + /* Windows doesn't handle permissions the same way as POSIX, + * so just ignore the mode tests. */ + /* TODO: Can we do better here? */ + if (mode >= 0 && mode != (st.st_mode & 07777)) { + failure_start(file, line, "File %s has wrong mode", pathname); + logprintf(" Expected: 0%3o\n", mode); + logprintf(" Found: 0%3o\n", st.st_mode & 07777); + failure_finish(NULL); + return (0); + } +#endif + return (1); +} + +/* Check whether 'pathname' is a symbolic link. If 'contents' is + * non-NULL, verify that the symlink has those contents. */ +static int +is_symlink(const char *file, int line, + const char *pathname, const char *contents) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + assertion_count(file, line); + return (0); +#else + char buff[300]; + struct stat st; + ssize_t linklen; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, + "Symlink should exist: %s", pathname); + failure_finish(NULL); + return (0); + } + if (!S_ISLNK(st.st_mode)) + return (0); + if (contents == NULL) + return (1); + linklen = readlink(pathname, buff, sizeof(buff)); + if (linklen < 0) { + failure_start(file, line, "Can't read symlink %s", pathname); + failure_finish(NULL); + return (0); + } + buff[linklen] = '\0'; + if (strcmp(buff, contents) != 0) + return (0); + return (1); +#endif +} + +/* Assert that path is a symlink that (optionally) contains contents. */ +int +assertion_is_symlink(const char *file, int line, + const char *path, const char *contents) +{ + if (is_symlink(file, line, path, contents)) + return (1); + if (contents) + failure_start(file, line, "File %s is not a symlink to %s", + path, contents); + else + failure_start(file, line, "File %s is not a symlink", path); + failure_finish(NULL); + return (0); +} + + +/* Create a directory and report any errors. */ +int +assertion_make_dir(const char *file, int line, const char *dirname, int mode) +{ + assertion_count(file, line); +#if defined(_WIN32) && !defined(__CYGWIN__) + if (0 == _mkdir(dirname)) + return (1); +#else + if (0 == mkdir(dirname, mode)) + return (1); +#endif + failure_start(file, line, "Could not create directory %s", dirname); + failure_finish(NULL); + return(0); +} + +/* Create a file with the specified contents and report any failures. */ +int +assertion_make_file(const char *file, int line, + const char *path, int mode, const char *contents) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* TODO: Rework this to set file mode as well. */ + FILE *f; + assertion_count(file, line); + f = fopen(path, "wb"); + if (f == NULL) { + failure_start(file, line, "Could not create file %s", path); + failure_finish(NULL); + return (0); + } + if (contents != NULL) { + if (strlen(contents) + != fwrite(contents, 1, strlen(contents), f)) { + fclose(f); + failure_start(file, line, + "Could not write file %s", path); + failure_finish(NULL); + return (0); + } + } + fclose(f); + return (1); +#else + int fd; + assertion_count(file, line); + fd = open(path, O_CREAT | O_WRONLY, mode >= 0 ? mode : 0644); + if (fd < 0) { + failure_start(file, line, "Could not create %s", path); + failure_finish(NULL); + return (0); + } + if (contents != NULL) { + if ((ssize_t)strlen(contents) + != write(fd, contents, strlen(contents))) { + close(fd); + failure_start(file, line, "Could not write to %s", path); + failure_finish(NULL); + return (0); + } + } + close(fd); + return (1); +#endif +} + +/* Create a hardlink and report any failures. */ +int +assertion_make_hardlink(const char *file, int line, + const char *newpath, const char *linkto) +{ + int succeeded; + + assertion_count(file, line); +#if defined(_WIN32) && !defined(__CYGWIN__) + succeeded = my_CreateHardLinkA(newpath, linkto); +#elif HAVE_LINK + succeeded = !link(linkto, newpath); +#else + succeeded = 0; +#endif + if (succeeded) + return (1); + failure_start(file, line, "Could not create hardlink"); + logprintf(" New link: %s\n", newpath); + logprintf(" Old name: %s\n", linkto); + failure_finish(NULL); + return(0); +} + +/* Create a symlink and report any failures. */ +int +assertion_make_symlink(const char *file, int line, + const char *newpath, const char *linkto) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + int targetIsDir = 0; /* TODO: Fix this */ + assertion_count(file, line); + if (my_CreateSymbolicLinkA(newpath, linkto, targetIsDir)) + return (1); +#elif HAVE_SYMLINK + assertion_count(file, line); + if (0 == symlink(linkto, newpath)) + return (1); +#endif + failure_start(file, line, "Could not create symlink"); + logprintf(" New link: %s\n", newpath); + logprintf(" Old name: %s\n", linkto); + failure_finish(NULL); + return(0); +} + +/* Set umask, report failures. */ +int +assertion_umask(const char *file, int line, int mask) +{ + assertion_count(file, line); + (void)file; /* UNUSED */ + (void)line; /* UNUSED */ + umask(mask); + return (1); +} + +/* + * + * UTILITIES for use by tests. + * + */ + +/* + * Check whether platform supports symlinks. This is intended + * for tests to use in deciding whether to bother testing symlink + * support; if the platform doesn't support symlinks, there's no point + * in checking whether the program being tested can create them. + */ +int +canSymlink(void) +{ + /* Remember the test result */ + static int value = 0, tested = 0; + if (tested) + return (value); + + ++tested; + assertion_make_file(__FILE__, __LINE__, "canSymlink.0", 0644, "a"); +#if defined(_WIN32) && !defined(__CYGWIN__) + value = my_CreateSymbolicLinkA("canSymlink.1", "canSymlink.0", 0) + && is_symlink(__FILE__, __LINE__, "canSymlink.1", "canSymlink.0"); +#elif HAVE_SYMLINK + value = (0 == symlink("canSymlink.0", "canSymlink.1")) + && is_symlink(__FILE__, __LINE__, "canSymlink.1","canSymlink.0"); +#endif + return (value); +} + +/* + * Can this platform run the gzip program? + */ +/* Platform-dependent options for hiding the output of a subcommand. */ +#if defined(_WIN32) && !defined(__CYGWIN__) +static const char *redirectArgs = ">NUL 2>NUL"; /* Win32 cmd.exe */ +#else +static const char *redirectArgs = ">/dev/null 2>/dev/null"; /* POSIX 'sh' */ +#endif +int +canGzip(void) +{ + static int tested = 0, value = 0; + if (!tested) { + tested = 1; + if (systemf("gzip -V %s", redirectArgs) == 0) + value = 1; + } + return (value); +} + +/* + * Can this platform run the gunzip program? + */ +int +canGunzip(void) +{ + static int tested = 0, value = 0; + if (!tested) { + tested = 1; + if (systemf("gunzip -V %s", redirectArgs) == 0) + value = 1; + } + return (value); +} + +/* + * Sleep as needed; useful for verifying disk timestamp changes by + * ensuring that the wall-clock time has actually changed before we + * go back to re-read something from disk. + */ +void +sleepUntilAfter(time_t t) +{ + while (t >= time(NULL)) +#if defined(_WIN32) && !defined(__CYGWIN__) + Sleep(500); +#else + sleep(1); +#endif +} + +/* + * Call standard system() call, but build up the command line using + * sprintf() conventions. + */ +int +systemf(const char *fmt, ...) +{ + char buff[8192]; + va_list ap; + int r; + + va_start(ap, fmt); + vsprintf(buff, fmt, ap); + if (verbosity > VERBOSITY_FULL) + logprintf("Cmd: %s\n", buff); + r = system(buff); + va_end(ap); + return (r); +} + +/* + * Slurp a file into memory for ease of comparison and testing. + * Returns size of file in 'sizep' if non-NULL, null-terminates + * data in memory for ease of use. + */ +char * +slurpfile(size_t * sizep, const char *fmt, ...) +{ + char filename[8192]; + struct stat st; + va_list ap; + char *p; + ssize_t bytes_read; + FILE *f; + int r; + + va_start(ap, fmt); + vsprintf(filename, fmt, ap); + va_end(ap); + + f = fopen(filename, "rb"); + if (f == NULL) { + /* Note: No error; non-existent file is okay here. */ + return (NULL); + } + r = fstat(fileno(f), &st); + if (r != 0) { + logprintf("Can't stat file %s\n", filename); + fclose(f); + return (NULL); + } + p = malloc((size_t)st.st_size + 1); + if (p == NULL) { + logprintf("Can't allocate %ld bytes of memory to read file %s\n", + (long int)st.st_size, filename); + fclose(f); + return (NULL); + } + bytes_read = fread(p, 1, (size_t)st.st_size, f); + if (bytes_read < st.st_size) { + logprintf("Can't read file %s\n", filename); + fclose(f); + free(p); + return (NULL); + } + p[st.st_size] = '\0'; + if (sizep != NULL) + *sizep = (size_t)st.st_size; + fclose(f); + return (p); +} + +/* Read a uuencoded file from the reference directory, decode, and + * write the result into the current directory. */ +#define UUDECODE(c) (((c) - 0x20) & 0x3f) +void +extract_reference_file(const char *name) +{ + char buff[1024]; + FILE *in, *out; + + sprintf(buff, "%s/%s.uu", refdir, name); + in = fopen(buff, "r"); + failure("Couldn't open reference file %s", buff); + assert(in != NULL); + if (in == NULL) + return; + /* Read up to and including the 'begin' line. */ + for (;;) { + if (fgets(buff, sizeof(buff), in) == NULL) { + /* TODO: This is a failure. */ + return; + } + if (memcmp(buff, "begin ", 6) == 0) + break; + } + /* Now, decode the rest and write it. */ + /* Not a lot of error checking here; the input better be right. */ + out = fopen(name, "wb"); + while (fgets(buff, sizeof(buff), in) != NULL) { + char *p = buff; + int bytes; + + if (memcmp(buff, "end", 3) == 0) + break; + + bytes = UUDECODE(*p++); + while (bytes > 0) { + int n = 0; + /* Write out 1-3 bytes from that. */ + if (bytes > 0) { + n = UUDECODE(*p++) << 18; + n |= UUDECODE(*p++) << 12; + fputc(n >> 16, out); + --bytes; + } + if (bytes > 0) { + n |= UUDECODE(*p++) << 6; + fputc((n >> 8) & 0xFF, out); + --bytes; + } + if (bytes > 0) { + n |= UUDECODE(*p++); + fputc(n & 0xFF, out); + --bytes; + } + } + } + fclose(out); + fclose(in); +} + +/* + * + * TEST management + * + */ + +/* + * "list.h" is simply created by "grep DEFINE_TEST test_*.c"; it has + * a line like + * DEFINE_TEST(test_function) + * for each test. + */ + +/* Use "list.h" to declare all of the test functions. */ +#undef DEFINE_TEST +#define DEFINE_TEST(name) void name(void); +#include "list.h" + +/* Use "list.h" to create a list of all tests (functions and names). */ +#undef DEFINE_TEST +#define DEFINE_TEST(n) { n, #n, 0 }, +struct { void (*func)(void); const char *name; int failures; } tests[] = { + #include "list.h" +}; + +/* + * Summarize repeated failures in the just-completed test. + */ +static void +test_summarize(const char *filename, int failed) +{ + unsigned int i; + + switch (verbosity) { + case VERBOSITY_SUMMARY_ONLY: + printf(failed ? "E" : "."); + fflush(stdout); + break; + case VERBOSITY_PASSFAIL: + printf(failed ? "FAIL\n" : "ok\n"); + break; + } + + log_console = (verbosity == VERBOSITY_LIGHT_REPORT); + + for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) { + if (failed_lines[i].count > 1 && !failed_lines[i].skip) + logprintf("%s:%d: Summary: Failed %d times\n", + filename, i, failed_lines[i].count); + } + /* Clear the failure history for the next file. */ + memset(failed_lines, 0, sizeof(failed_lines)); +} + +/* + * Actually run a single test, with appropriate setup and cleanup. + */ +static int +test_run(int i, const char *tmpdir) +{ + char logfilename[64]; + int failures_before = failures; + int oldumask; + + switch (verbosity) { + case VERBOSITY_SUMMARY_ONLY: /* No per-test reports at all */ + break; + case VERBOSITY_PASSFAIL: /* rest of line will include ok/FAIL marker */ + printf("%3d: %-50s", i, tests[i].name); + fflush(stdout); + break; + default: /* Title of test, details will follow */ + printf("%3d: %s\n", i, tests[i].name); + } + + /* Chdir to the top-level work directory. */ + if (!assertChdir(tmpdir)) { + fprintf(stderr, + "ERROR: Can't chdir to top work dir %s\n", tmpdir); + exit(1); + } + /* Create a log file for this test. */ + sprintf(logfilename, "%s.log", tests[i].name); + logfile = fopen(logfilename, "w"); + fprintf(logfile, "%s\n\n", tests[i].name); + /* Chdir() to a work dir for this specific test. */ + if (!assertMakeDir(tests[i].name, 0755) + || !assertChdir(tests[i].name)) { + fprintf(stderr, + "ERROR: Can't chdir to work dir %s/%s\n", + tmpdir, tests[i].name); + exit(1); + } + /* Explicitly reset the locale before each test. */ + setlocale(LC_ALL, "C"); + /* Record the umask before we run the test. */ + umask(oldumask = umask(0)); + /* + * Run the actual test. + */ + (*tests[i].func)(); + /* + * Clean up and report afterwards. + */ + /* Restore umask */ + umask(oldumask); + /* Reset locale. */ + setlocale(LC_ALL, "C"); + /* Reset directory. */ + if (!assertChdir(tmpdir)) { + fprintf(stderr, "ERROR: Couldn't chdir to temp dir %s\n", + tmpdir); + exit(1); + } + /* Report per-test summaries. */ + tests[i].failures = failures - failures_before; + test_summarize(test_filename, tests[i].failures); + /* Close the per-test log file. */ + fclose(logfile); + logfile = NULL; + /* If there were no failures, we can remove the work dir and logfile. */ + if (tests[i].failures == 0) { + if (!keep_temp_files && assertChdir(tmpdir)) { +#if defined(_WIN32) && !defined(__CYGWIN__) + systemf("rmdir /S /Q %s", tests[i].name); + systemf("del %s", logfilename); +#else + systemf("rm -rf %s", tests[i].name); + systemf("rm %s", logfilename); +#endif + } + } + /* Return appropriate status. */ + return (tests[i].failures); +} + +/* + * + * + * MAIN and support routines. + * + * + */ + +static void +usage(const char *program) +{ + static const int limit = sizeof(tests) / sizeof(tests[0]); + int i; + + printf("Usage: %s [options] ...\n", program); + printf("Default is to run all tests.\n"); + printf("Otherwise, specify the numbers of the tests you wish to run.\n"); + printf("Options:\n"); + printf(" -d Dump core after any failure, for debugging.\n"); + printf(" -k Keep all temp files.\n"); + printf(" Default: temp files for successful tests deleted.\n"); +#ifdef PROGRAM + printf(" -p Path to executable to be tested.\n"); + printf(" Default: path taken from " ENVBASE " environment variable.\n"); +#endif + printf(" -q Quiet.\n"); + printf(" -r Path to dir containing reference files.\n"); + printf(" Default: Current directory.\n"); + printf(" -v Verbose.\n"); + printf("Available tests:\n"); + for (i = 0; i < limit; i++) + printf(" %d: %s\n", i, tests[i].name); + exit(1); +} + +static char * +get_refdir(const char *d) +{ + char tried[512] = { '\0' }; + char buff[128]; + char *pwd, *p; + + /* If a dir was specified, try that */ + if (d != NULL) { + pwd = NULL; + snprintf(buff, sizeof(buff), "%s", d); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + goto failure; + } + + /* Get the current dir. */ + pwd = getcwd(NULL, 0); + while (pwd[strlen(pwd) - 1] == '\n') + pwd[strlen(pwd) - 1] = '\0'; + + /* Look for a known file. */ + snprintf(buff, sizeof(buff), "%s", pwd); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + snprintf(buff, sizeof(buff), "%s/test", pwd); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + +#if defined(LIBRARY) + snprintf(buff, sizeof(buff), "%s/%s/test", pwd, LIBRARY); +#else + snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM); +#endif + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + if (memcmp(pwd, "/usr/obj", 8) == 0) { + snprintf(buff, sizeof(buff), "%s", pwd + 8); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + snprintf(buff, sizeof(buff), "%s/test", pwd + 8); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + } + +failure: + printf("Unable to locate known reference file %s\n", KNOWNREF); + printf(" Checked following directories:\n%s\n", tried); +#if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG) + DebugBreak(); +#endif + exit(1); + +success: + free(p); + free(pwd); + return strdup(buff); +} + +int +main(int argc, char **argv) +{ + static const int limit = sizeof(tests) / sizeof(tests[0]); + int i, tests_run = 0, tests_failed = 0, option; + time_t now; + char *refdir_alloc = NULL; + const char *progname; + const char *tmp, *option_arg, *p; + char tmpdir[256]; + char tmpdir_timestamp[256]; + + (void)argc; /* UNUSED */ + +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__) + /* To stop to run the default invalid parameter handler. */ + _set_invalid_parameter_handler(invalid_parameter_handler); + /* Disable annoying assertion message box. */ + _CrtSetReportMode(_CRT_ASSERT, 0); +#endif + + /* + * Name of this program, used to build root of our temp directory + * tree. + */ + progname = p = argv[0]; + while (*p != '\0') { + /* Support \ or / dir separators for Windows compat. */ + if (*p == '/' || *p == '\\') + progname = p + 1; + ++p; + } + +#ifdef PROGRAM + /* Get the target program from environment, if available. */ + testprogfile = getenv(ENVBASE); +#endif + + if (getenv("TMPDIR") != NULL) + tmp = getenv("TMPDIR"); + else if (getenv("TMP") != NULL) + tmp = getenv("TMP"); + else if (getenv("TEMP") != NULL) + tmp = getenv("TEMP"); + else if (getenv("TEMPDIR") != NULL) + tmp = getenv("TEMPDIR"); + else + tmp = "/tmp"; + + /* Allow -d to be controlled through the environment. */ + if (getenv(ENVBASE "_DEBUG") != NULL) + dump_on_failure = 1; + + /* Get the directory holding test files from environment. */ + refdir = getenv(ENVBASE "_TEST_FILES"); + + /* + * Parse options, without using getopt(), which isn't available + * on all platforms. + */ + ++argv; /* Skip program name */ + while (*argv != NULL) { + if (**argv != '-') + break; + p = *argv++; + ++p; /* Skip '-' */ + while (*p != '\0') { + option = *p++; + option_arg = NULL; + /* If 'opt' takes an argument, parse that. */ + if (option == 'p' || option == 'r') { + if (*p != '\0') + option_arg = p; + else if (*argv == NULL) { + fprintf(stderr, + "Option -%c requires argument.\n", + option); + usage(progname); + } else + option_arg = *argv++; + p = ""; /* End of this option word. */ + } + + /* Now, handle the option. */ + switch (option) { + case 'd': + dump_on_failure = 1; + break; + case 'k': + keep_temp_files = 1; + break; + case 'p': +#ifdef PROGRAM + testprogfile = option_arg; +#else + usage(progname); +#endif + break; + case 'q': + verbosity--; + break; + case 'r': + refdir = option_arg; + break; + case 'v': + verbosity++; + break; + default: + usage(progname); + } + } + } + + /* + * Sanity-check that our options make sense. + */ +#ifdef PROGRAM + if (testprogfile == NULL) + usage(progname); + { + char *testprg; +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Command.com sometimes rejects '/' separators. */ + testprg = strdup(testprogfile); + for (i = 0; testprg[i] != '\0'; i++) { + if (testprg[i] == '/') + testprg[i] = '\\'; + } + testprogfile = testprg; +#endif + /* Quote the name that gets put into shell command lines. */ + testprg = malloc(strlen(testprogfile) + 3); + strcpy(testprg, "\""); + strcat(testprg, testprogfile); + strcat(testprg, "\""); + testprog = testprg; + } +#endif + + /* + * Create a temp directory for the following tests. + * Include the time the tests started as part of the name, + * to make it easier to track the results of multiple tests. + */ + now = time(NULL); + for (i = 0; ; i++) { + strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp), + "%Y-%m-%dT%H.%M.%S", + localtime(&now)); + sprintf(tmpdir, "%s/%s.%s-%03d", tmp, progname, + tmpdir_timestamp, i); + if (assertMakeDir(tmpdir,0755)) + break; + if (i >= 999) { + fprintf(stderr, + "ERROR: Unable to create temp directory %s\n", + tmpdir); + exit(1); + } + } + + /* + * If the user didn't specify a directory for locating + * reference files, try to find the reference files in + * the "usual places." + */ + refdir = refdir_alloc = get_refdir(refdir); + + /* + * Banner with basic information. + */ + printf("\n"); + printf("If tests fail or crash, details will be in:\n"); + printf(" %s\n", tmpdir); + printf("\n"); + if (verbosity > VERBOSITY_SUMMARY_ONLY) { + printf("Reference files will be read from: %s\n", refdir); +#ifdef PROGRAM + printf("Running tests on: %s\n", testprog); +#endif + printf("Exercising: "); + fflush(stdout); + printf("%s\n", EXTRA_VERSION); + } else { + printf("Running "); + fflush(stdout); + } + + /* + * Run some or all of the individual tests. + */ + if (*argv == NULL) { + /* Default: Run all tests. */ + for (i = 0; i < limit; i++) { + if (test_run(i, tmpdir)) + tests_failed++; + tests_run++; + } + } else { + while (*(argv) != NULL) { + if (**argv >= '0' && **argv <= '9') { + i = atoi(*argv); + if (i < 0 || i >= limit) { + printf("*** INVALID Test %s\n", *argv); + free(refdir_alloc); + usage(progname); + /* usage() never returns */ + } + } else { + for (i = 0; i < limit; ++i) { + if (strcmp(*argv, tests[i].name) == 0) + break; + } + if (i >= limit) { + printf("*** INVALID Test ``%s''\n", + *argv); + free(refdir_alloc); + usage(progname); + /* usage() never returns */ + } + } + if (test_run(i, tmpdir)) + tests_failed++; + tests_run++; + argv++; + } + } + + /* + * Report summary statistics. + */ + if (verbosity > VERBOSITY_SUMMARY_ONLY) { + printf("\n"); + printf("Totals:\n"); + printf(" Tests run: %8d\n", tests_run); + printf(" Tests failed: %8d\n", tests_failed); + printf(" Assertions checked:%8d\n", assertions); + printf(" Assertions failed: %8d\n", failures); + printf(" Skips reported: %8d\n", skips); + } + if (failures) { + printf("\n"); + printf("Failing tests:\n"); + for (i = 0; i < limit; ++i) { + if (tests[i].failures) + printf(" %d: %s (%d failures)\n", i, + tests[i].name, tests[i].failures); + } + printf("\n"); + printf("Details for failing tests: %s\n", tmpdir); + printf("\n"); + } else { + if (verbosity == VERBOSITY_SUMMARY_ONLY) + printf("\n"); + printf("%d tests passed, no failures\n", tests_run); + } + + free(refdir_alloc); + + /* If the final tmpdir is empty, we can remove it. */ + /* This should be the usual case when all tests succeed. */ + assertChdir(".."); + rmdir(tmpdir); + + return (tests_failed ? 1 : 0); +} diff --git a/Utilities/cmlibarchive/libarchive/test/read_open_memory.c b/Utilities/cmlibarchive/libarchive/test/read_open_memory.c new file mode 100644 index 000000000..ac889adab --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/read_open_memory.c @@ -0,0 +1,172 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/read_open_memory.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); + +#include +#include +#include + +/* + * Read an archive from a block of memory. + * + * This is identical to archive_read_open_memory(), except + * that it goes out of its way to be a little bit unpleasant, + * in order to better test the libarchive internals. + */ + +struct read_memory_data { + unsigned char *buffer; + unsigned char *end; + size_t read_size; + size_t copy_buff_size; + char *copy_buff; +}; + +static int memory_read_close(struct archive *, void *); +static int memory_read_open(struct archive *, void *); +#if ARCHIVE_VERSION_NUMBER < 2000000 +static ssize_t memory_read_skip(struct archive *, void *, size_t request); +#else +static off_t memory_read_skip(struct archive *, void *, off_t request); +#endif +static ssize_t memory_read(struct archive *, void *, const void **buff); +static int read_open_memory_internal(struct archive *a, void *buff, + size_t size, size_t read_size, int fullapi); + + +int +read_open_memory(struct archive *a, void *buff, size_t size, size_t read_size) +{ + return read_open_memory_internal(a, buff, size, read_size, 1); +} + +/* + * As above, but don't register any optional part of the API, to verify + * that internals work correctly with just the minimal entry points. + */ +int +read_open_memory2(struct archive *a, void *buff, size_t size, size_t read_size) +{ + return read_open_memory_internal(a, buff, size, read_size, 0); +} + +static int +read_open_memory_internal(struct archive *a, void *buff, + size_t size, size_t read_size, int fullapi) +{ + struct read_memory_data *mine; + + mine = (struct read_memory_data *)malloc(sizeof(*mine)); + if (mine == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); + } + memset(mine, 0, sizeof(*mine)); + mine->buffer = (unsigned char *)buff; + mine->end = mine->buffer + size; + mine->read_size = read_size; + mine->copy_buff_size = read_size + 64; + mine->copy_buff = malloc(mine->copy_buff_size); + if (fullapi) + return (archive_read_open2(a, mine, memory_read_open, + memory_read, memory_read_skip, memory_read_close)); + else + return (archive_read_open2(a, mine, NULL, + memory_read, NULL, memory_read_close)); +} + +/* + * There's nothing to open. + */ +static int +memory_read_open(struct archive *a, void *client_data) +{ + (void)a; /* UNUSED */ + (void)client_data; /* UNUSED */ + return (ARCHIVE_OK); +} + +/* + * In order to exercise libarchive's internal read-combining logic, + * we deliberately copy data for each read to a separate buffer. + * That way, code that runs off the end of the provided data + * will screw up. + */ +static ssize_t +memory_read(struct archive *a, void *client_data, const void **buff) +{ + struct read_memory_data *mine = (struct read_memory_data *)client_data; + size_t size; + + (void)a; /* UNUSED */ + size = mine->end - mine->buffer; + if (size > mine->read_size) + size = mine->read_size; + memset(mine->copy_buff, 0xA5, mine->copy_buff_size); + memcpy(mine->copy_buff, mine->buffer, size); + *buff = mine->copy_buff; + + mine->buffer += size; + return ((ssize_t)size); +} + +/* + * How mean can a skip() routine be? Let's try to find out. + */ +#if ARCHIVE_VERSION_NUMBER < 2000000 +static ssize_t +memory_read_skip(struct archive *a, void *client_data, size_t skip) +#else +static off_t +memory_read_skip(struct archive *a, void *client_data, off_t skip) +#endif +{ + struct read_memory_data *mine = (struct read_memory_data *)client_data; + + (void)a; /* UNUSED */ + /* We can't skip by more than is available. */ + if ((off_t)skip > (off_t)(mine->end - mine->buffer)) + skip = mine->end - mine->buffer; + /* Always do small skips by prime amounts. */ + if (skip > 71) + skip = 71; + mine->buffer += skip; + return (skip); +} + +/* + * Close is just cleaning up our one small bit of data. + */ +static int +memory_read_close(struct archive *a, void *client_data) +{ + struct read_memory_data *mine = (struct read_memory_data *)client_data; + (void)a; /* UNUSED */ + free(mine->copy_buff); + free(mine); + return (ARCHIVE_OK); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test.h b/Utilities/cmlibarchive/libarchive/test/test.h new file mode 100644 index 000000000..6022f7e3d --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test.h @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2003-2006 Tim Kientzle + * 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. + * + * $FreeBSD: src/lib/libarchive/test/test.h,v 1.10 2008/06/15 10:35:22 kientzle Exp $ + */ + +/* Every test program should #include "test.h" as the first thing. */ + +/* + * The goal of this file (and the matching test.c) is to + * simplify the very repetitive test-*.c test programs. + */ +#if defined(HAVE_CONFIG_H) +/* Most POSIX platforms use the 'configure' script to build config.h */ +#include "config.h" +#elif defined(__FreeBSD__) +/* Building as part of FreeBSD system requires a pre-built config.h. */ +#include "config_freebsd.h" +#elif defined(_WIN32) && !defined(__CYGWIN__) +/* Win32 can't run the 'configure' script. */ +#include "config_windows.h" +#else +/* Warn if the library hasn't been (automatically or manually) configured. */ +#error Oops: No config.h and no pre-built configuration in test.h. +#endif + +#include /* Windows requires this before sys/stat.h */ +#include + +#ifdef USE_DMALLOC +#include +#endif +#if HAVE_DIRENT_H +#include +#else +#include +#define dirent direct +#endif +#include +#include +#ifdef HAVE_IO_H +#include +#endif +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#ifdef HAVE_WINDOWS_H +#include +#endif + +/* + * System-specific tweaks. We really want to minimize these + * as much as possible, since they make it harder to understand + * the mainline code. + */ + +/* Windows (including Visual Studio and MinGW but not Cygwin) */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#define strdup _strdup +#define LOCALE_DE "deu" +#else +#define LOCALE_DE "de_DE.UTF-8" +#endif + +/* Visual Studio */ +#ifdef _MSC_VER +#define snprintf sprintf_s +#endif + +/* Cygwin */ +#if defined(__CYGWIN__) +/* Cygwin-1.7.x is lazy about populating nlinks, so don't + * expect it to be accurate. */ +# define NLINKS_INACCURATE_FOR_DIRS +#endif + +/* FreeBSD */ +#ifdef __FreeBSD__ +#include /* For __FBSDID */ +#else +/* Surprisingly, some non-FreeBSD platforms define __FBSDID. */ +#ifndef __FBSDID +#define __FBSDID(a) struct _undefined_hack +#endif +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +/* + * Redefine DEFINE_TEST for use in defining the test functions. + */ +#undef DEFINE_TEST +#define DEFINE_TEST(name) void name(void); void name(void) + +/* An implementation of the standard assert() macro */ +#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL) +/* chdir() and error if it fails */ +#define assertChdir(path) \ + assertion_chdir(__FILE__, __LINE__, path) +/* 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) +/* 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) +/* As above, but v1 and v2 are wchar_t * */ +#define assertEqualWString(v1,v2) \ + assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) +/* As above, but raw blocks of bytes. */ +#define assertEqualMem(v1, v2, l) \ + assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL) +/* Assert two files are the same; allow printf-style expansion of second name. + * See below for comments about variable arguments here... + */ +#define assertEqualFile \ + assertion_setup(__FILE__, __LINE__);assertion_equal_file +/* Assert that a file is empty; supports printf-style arguments. */ +#define assertEmptyFile \ + assertion_setup(__FILE__, __LINE__);assertion_empty_file +/* Assert that a file is not empty; supports printf-style arguments. */ +#define assertNonEmptyFile \ + assertion_setup(__FILE__, __LINE__);assertion_non_empty_file +#define assertFileAtime(pathname, sec, nsec) \ + assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileAtimeRecent(pathname) \ + assertion_file_atime_recent(__FILE__, __LINE__, pathname) +#define assertFileBirthtime(pathname, sec, nsec) \ + assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileBirthtimeRecent(pathname) \ + assertion_file_birthtime_recent(__FILE__, __LINE__, pathname) +/* Assert that a file exists; supports printf-style arguments. */ +#define assertFileExists \ + assertion_setup(__FILE__, __LINE__);assertion_file_exists +/* Assert that a file exists; supports printf-style arguments. */ +#define assertFileNotExists \ + assertion_setup(__FILE__, __LINE__);assertion_file_not_exists +/* Assert that file contents match a string; supports printf-style arguments. */ +#define assertFileContents \ + assertion_setup(__FILE__, __LINE__);assertion_file_contents +#define assertFileMtime(pathname, sec, nsec) \ + assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileMtimeRecent(pathname) \ + assertion_file_mtime_recent(__FILE__, __LINE__, pathname) +#define assertFileNLinks(pathname, nlinks) \ + assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks) +#define assertFileSize(pathname, size) \ + assertion_file_size(__FILE__, __LINE__, pathname, size) +#define assertTextFileContents \ + assertion_setup(__FILE__, __LINE__);assertion_text_file_contents +#define assertIsDir(pathname, mode) \ + assertion_is_dir(__FILE__, __LINE__, pathname, mode) +#define assertIsHardlink(path1, path2) \ + assertion_is_hardlink(__FILE__, __LINE__, path1, path2) +#define assertIsNotHardlink(path1, path2) \ + assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2) +#define assertIsReg(pathname, mode) \ + assertion_is_reg(__FILE__, __LINE__, pathname, mode) +#define assertIsSymlink(pathname, contents) \ + assertion_is_symlink(__FILE__, __LINE__, pathname, contents) +/* Create a directory, report error if it fails. */ +#define assertMakeDir(dirname, mode) \ + assertion_make_dir(__FILE__, __LINE__, dirname, mode) +#define assertMakeFile(path, mode, contents) \ + assertion_make_file(__FILE__, __LINE__, path, mode, contents) +#define assertMakeHardlink(newfile, oldfile) \ + assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile) +#define assertMakeSymlink(newfile, linkto) \ + assertion_make_symlink(__FILE__, __LINE__, newfile, linkto) +#define assertUmask(mask) \ + assertion_umask(__FILE__, __LINE__, mask) + +/* + * This would be simple with C99 variadic macros, but I don't want to + * require that. Instead, I insert a function call before each + * skipping() call to pass the file and line information down. Crude, + * but effective. + */ +#define skipping \ + assertion_setup(__FILE__, __LINE__);test_skipping + +/* Function declarations. These are defined in test_utility.c. */ +void failure(const char *fmt, ...); +int assertion_assert(const char *, int, int, const char *, void *); +int assertion_chdir(const char *, int, const char *); +int assertion_empty_file(const char *, ...); +int assertion_equal_file(const char *, const char *, ...); +int assertion_equal_int(const char *, int, long long, const char *, long long, 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_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *); +int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *); +int assertion_file_atime(const char *, int, const char *, long, long); +int assertion_file_atime_recent(const char *, int, const char *); +int assertion_file_birthtime(const char *, int, const char *, long, long); +int assertion_file_birthtime_recent(const char *, int, const char *); +int assertion_file_contents(const void *, int, const char *, ...); +int assertion_file_exists(const char *, ...); +int assertion_file_mtime(const char *, int, const char *, long, long); +int assertion_file_mtime_recent(const char *, int, const char *); +int assertion_file_nlinks(const char *, int, const char *, int); +int assertion_file_not_exists(const char *, ...); +int assertion_file_size(const char *, int, const char *, long); +int assertion_is_dir(const char *, int, const char *, int); +int assertion_is_hardlink(const char *, int, const char *, const char *); +int assertion_is_not_hardlink(const char *, int, const char *, const char *); +int assertion_is_reg(const char *, int, const char *, int); +int assertion_is_symlink(const char *, int, const char *, const char *); +int assertion_make_dir(const char *, int, const char *, int); +int assertion_make_file(const char *, int, const char *, int, const char *); +int assertion_make_hardlink(const char *, int, const char *newpath, const char *); +int assertion_make_symlink(const char *, int, const char *newpath, const char *); +int assertion_non_empty_file(const char *, ...); +int assertion_text_file_contents(const char *buff, const char *f); +int assertion_umask(const char *, int, int); +void assertion_setup(const char *, int); + +void test_skipping(const char *fmt, ...); + +/* Like sprintf, then system() */ +int systemf(const char * fmt, ...); + +/* Delay until time() returns a value after this. */ +void sleepUntilAfter(time_t); + +/* Return true if this platform can create symlinks. */ +int canSymlink(void); + +/* Return true if this platform can run the "gzip" program. */ +int canGzip(void); + +/* Return true if this platform can run the "gunzip" program. */ +int canGunzip(void); + +/* Suck file into string allocated via malloc(). Call free() when done. */ +/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */ +char *slurpfile(size_t *, const char *fmt, ...); + +/* Extracts named reference file to the current directory. */ +void extract_reference_file(const char *); + +/* + * Special interfaces for libarchive test harness. + */ + +#include "archive.h" +#include "archive_entry.h" + +/* Special customized read-from-memory interface. */ +int read_open_memory(struct archive *, void *, size_t, size_t); +/* "2" version exercises a slightly different set of libarchive APIs. */ +int read_open_memory2(struct archive *, void *, size_t, size_t); + +/* Versions of above that accept an archive argument for additional info. */ +#define assertA(e) assertion_assert(__FILE__, __LINE__, (e), #e, (a)) +#define assertEqualIntA(a,v1,v2) \ + assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a)) +#define assertEqualStringA(a,v1,v2) \ + assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a)) diff --git a/Utilities/cmlibarchive/libarchive/test/test_acl_basic.c b/Utilities/cmlibarchive/libarchive/test/test_acl_basic.c new file mode 100644 index 000000000..ba82f113e --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_acl_basic.c @@ -0,0 +1,229 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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. + * Check that archive_entry objects can save and restore ACL data. + * + * This should work on all systems, regardless of whether local + * filesystems support ACLs or not. + */ + +struct acl_t { + int type; /* Type of ACL: "access" or "default" */ + int permset; /* Permissions for this class of users. */ + int tag; /* Owner, User, Owning group, group, other, etc. */ + int qual; /* GID or UID of user/group, depending on tag. */ + const char *name; /* Name of user/group, depending on tag. */ +}; + +static struct acl_t acls0[] = { + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE, + ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE, + ARCHIVE_ENTRY_ACL_OTHER, 0, "" }, +}; + +static struct acl_t acls1[] = { + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE, + ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE, + ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, +}; + +static struct acl_t acls2[] = { + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE | ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0, + ARCHIVE_ENTRY_ACL_USER, 78, "user78" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0007, + ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_EXECUTE, + ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, +}; + +static void +set_acls(struct archive_entry *ae, struct acl_t *acls, int n) +{ + int i; + + archive_entry_acl_clear(ae); + for (i = 0; i < n; i++) { + archive_entry_acl_add_entry(ae, + acls[i].type, acls[i].permset, acls[i].tag, acls[i].qual, + acls[i].name); + } +} + +static int +acl_match(struct acl_t *acl, int type, int permset, int tag, int qual, const char *name) +{ + if (type != acl->type) + return (0); + if (permset != acl->permset) + return (0); + if (tag != acl->tag) + return (0); + if (tag == ARCHIVE_ENTRY_ACL_USER_OBJ) + return (1); + if (tag == ARCHIVE_ENTRY_ACL_GROUP_OBJ) + return (1); + if (tag == ARCHIVE_ENTRY_ACL_OTHER) + return (1); + if (qual != acl->qual) + return (0); + if (name == NULL) { + if (acl->name == NULL || acl->name[0] == '\0') + return (1); + } + if (acl->name == NULL) { + if (name[0] == '\0') + return (1); + } + return (0 == strcmp(name, acl->name)); +} + +static void +compare_acls(struct archive_entry *ae, struct acl_t *acls, int n, int mode) +{ + int *marker = malloc(sizeof(marker[0]) * n); + int i; + int r; + int type, permset, tag, qual; + int matched; + const char *name; + + for (i = 0; i < n; i++) + marker[i] = i; + + while (0 == (r = archive_entry_acl_next(ae, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name))) { + for (i = 0, matched = 0; i < n && !matched; i++) { + if (acl_match(&acls[marker[i]], type, permset, + tag, qual, name)) { + /* We found a match; remove it. */ + marker[i] = marker[n - 1]; + n--; + matched = 1; + } + } + if (tag == ARCHIVE_ENTRY_ACL_USER_OBJ) { + if (!matched) printf("No match for user_obj perm\n"); + failure("USER_OBJ permset (%02o) != user mode (%02o)", + permset, 07 & (mode >> 6)); + assert((permset << 6) == (mode & 0700)); + } else if (tag == ARCHIVE_ENTRY_ACL_GROUP_OBJ) { + if (!matched) printf("No match for group_obj perm\n"); + failure("GROUP_OBJ permset %02o != group mode %02o", + permset, 07 & (mode >> 3)); + assert((permset << 3) == (mode & 0070)); + } else if (tag == ARCHIVE_ENTRY_ACL_OTHER) { + if (!matched) printf("No match for other perm\n"); + failure("OTHER permset (%02o) != other mode (%02o)", + permset, mode & 07); + assert((permset << 0) == (mode & 0007)); + } else { + failure("Could not find match for ACL " + "(type=%d,permset=%d,tag=%d,qual=%d,name=``%s'')", + type, permset, tag, qual, name); + assert(matched == 1); + } + } +#if ARCHIVE_VERSION_NUMBER < 1009000 + /* Known broken before 1.9.0. */ + skipping("archive_entry_acl_next() exits with ARCHIVE_EOF"); +#else + assertEqualInt(ARCHIVE_EOF, r); +#endif + assert((mode & 0777) == (archive_entry_mode(ae) & 0777)); + failure("Could not find match for ACL " + "(type=%d,permset=%d,tag=%d,qual=%d,name=``%s'')", + acls[marker[0]].type, acls[marker[0]].permset, + acls[marker[0]].tag, acls[marker[0]].qual, acls[marker[0]].name); + assert(n == 0); /* Number of ACLs not matched should == 0 */ + free(marker); +} + +DEFINE_TEST(test_acl_basic) +{ + struct archive_entry *ae; + + /* Create a simple archive_entry. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0777); + + /* Basic owner/owning group should just update mode bits. */ + set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0])); + failure("Basic ACLs shouldn't be stored as extended ACLs"); + assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + failure("Basic ACLs should set mode to 0142, not %04o", + archive_entry_mode(ae)&0777); + assert((archive_entry_mode(ae) & 0777) == 0142); + + + /* With any extended ACL entry, we should read back a full set. */ + set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0])); + failure("One extended ACL should flag all ACLs to be returned."); + assert(4 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), 0142); + failure("Basic ACLs should set mode to 0142, not %04o", + archive_entry_mode(ae)&0777); + assert((archive_entry_mode(ae) & 0777) == 0142); + + + /* A more extensive set of ACLs. */ + set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0])); + assertEqualInt(6, archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]), 0543); + failure("Basic ACLs should set mode to 0543, not %04o", + archive_entry_mode(ae)&0777); + assert((archive_entry_mode(ae) & 0777) == 0543); + + /* + * Check that clearing ACLs gets rid of them all by repeating + * the first test. + */ + set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0])); + failure("Basic ACLs shouldn't be stored as extended ACLs"); + assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + failure("Basic ACLs should set mode to 0142, not %04o", + archive_entry_mode(ae)&0777); + assert((archive_entry_mode(ae) & 0777) == 0142); + archive_entry_free(ae); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_acl_freebsd.c b/Utilities/cmlibarchive/libarchive/test/test_acl_freebsd.c new file mode 100644 index 000000000..2a84d8f55 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_acl_freebsd.c @@ -0,0 +1,255 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_acl_freebsd.c,v 1.2 2008/11/17 21:06:17 kientzle Exp $"); + +#if defined(__FreeBSD__) && __FreeBSD__ > 4 +#include + +struct myacl_t { + int type; /* Type of ACL: "access" or "default" */ + int permset; /* Permissions for this class of users. */ + int tag; /* Owner, User, Owning group, group, other, etc. */ + int qual; /* GID or UID of user/group, depending on tag. */ + const char *name; /* Name of user/group, depending on tag. */ +}; + +static struct myacl_t acls2[] = { + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE | ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0, + ARCHIVE_ENTRY_ACL_USER, 78, "user78" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0007, + ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_EXECUTE, + ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_READ | ARCHIVE_ENTRY_ACL_EXECUTE, + ARCHIVE_ENTRY_ACL_MASK, -1, "" }, + { 0, 0, 0, 0, NULL } +}; + +static void +set_acls(struct archive_entry *ae, struct myacl_t *acls) +{ + int i; + + archive_entry_acl_clear(ae); + for (i = 0; acls[i].name != NULL; i++) { + archive_entry_acl_add_entry(ae, + acls[i].type, acls[i].permset, acls[i].tag, acls[i].qual, + acls[i].name); + } +} + +static int +acl_match(acl_entry_t aclent, struct myacl_t *myacl) +{ + gid_t g, *gp; + uid_t u, *up; + acl_tag_t tag_type; + acl_permset_t opaque_ps; + int permset = 0; + + acl_get_tag_type(aclent, &tag_type); + + /* translate the silly opaque permset to a bitmap */ + acl_get_permset(aclent, &opaque_ps); + if (acl_get_perm_np(opaque_ps, ACL_EXECUTE)) + permset |= ARCHIVE_ENTRY_ACL_EXECUTE; + if (acl_get_perm_np(opaque_ps, ACL_WRITE)) + permset |= ARCHIVE_ENTRY_ACL_WRITE; + if (acl_get_perm_np(opaque_ps, ACL_READ)) + permset |= ARCHIVE_ENTRY_ACL_READ; + + if (permset != myacl->permset) + return (0); + + switch (tag_type) { + case ACL_USER_OBJ: + if (myacl->tag != ARCHIVE_ENTRY_ACL_USER_OBJ) return (0); + break; + case ACL_USER: + if (myacl->tag != ARCHIVE_ENTRY_ACL_USER) + return (0); + up = acl_get_qualifier(aclent); + u = *up; + acl_free(up); + if ((uid_t)myacl->qual != u) + return (0); + break; + case ACL_GROUP_OBJ: + if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP_OBJ) return (0); + break; + case ACL_GROUP: + if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP) + return (0); + gp = acl_get_qualifier(aclent); + g = *gp; + acl_free(gp); + if ((gid_t)myacl->qual != g) + return (0); + break; + case ACL_MASK: + if (myacl->tag != ARCHIVE_ENTRY_ACL_MASK) return (0); + break; + case ACL_OTHER: + if (myacl->tag != ARCHIVE_ENTRY_ACL_OTHER) return (0); + break; + } + return (1); +} + +static void +compare_acls(acl_t acl, struct myacl_t *myacls) +{ + int *marker; + int entry_id = ACL_FIRST_ENTRY; + int matched; + int i, n; + acl_entry_t acl_entry; + + /* Count ACL entries in myacls array and allocate an indirect array. */ + for (n = 0; myacls[n].name != NULL; ++n) + continue; + marker = malloc(sizeof(marker[0]) * n); + for (i = 0; i < n; i++) + marker[i] = i; + + /* + * Iterate over acls in system acl object, try to match each + * one with an item in the myacls array. + */ + while (1 == acl_get_entry(acl, entry_id, &acl_entry)) { + /* After the first time... */ + entry_id = ACL_NEXT_ENTRY; + + /* Search for a matching entry (tag and qualifier) */ + for (i = 0, matched = 0; i < n && !matched; i++) { + if (acl_match(acl_entry, &myacls[marker[i]])) { + /* We found a match; remove it. */ + marker[i] = marker[n - 1]; + n--; + matched = 1; + } + } + + /* TODO: Print out more details in this case. */ + failure("ACL entry on file that shouldn't be there"); + assert(matched == 1); + } + + /* Dump entries in the myacls array that weren't in the system acl. */ + for (i = 0; i < n; ++i) { + failure(" ACL entry missing from file: " + "type=%d,permset=%d,tag=%d,qual=%d,name=``%s''\n", + myacls[marker[i]].type, myacls[marker[i]].permset, + myacls[marker[i]].tag, myacls[marker[i]].qual, + myacls[marker[i]].name); + assert(0); /* Record this as a failure. */ + } + free(marker); +} + +#endif + + +/* + * Verify ACL restore-to-disk. This test is FreeBSD-specific. + */ + +DEFINE_TEST(test_acl_freebsd) +{ +#if !defined(__FreeBSD__) + skipping("FreeBSD-specific ACL restore test"); +#elif __FreeBSD__ < 5 + skipping("ACL restore supported only on FreeBSD 5.0 and later"); +#else + struct stat st; + struct archive *a; + struct archive_entry *ae; + int n, fd; + acl_t acl; + + /* + * First, do a quick manual set/read of ACL data to + * verify that the local filesystem does support ACLs. + * If it doesn't, we'll simply skip the remaining tests. + */ + acl = acl_from_text("u::rwx,u:1:rw,g::rwx,g:15:rx,o::rwx,m::rwx"); + assert((void *)acl != NULL); + /* Create a test file and try to set an ACL on it. */ + fd = open("pretest", O_WRONLY | O_CREAT | O_EXCL, 0777); + failure("Could not create test file?!"); + if (!assert(fd >= 0)) { + acl_free(acl); + return; + } + + n = acl_set_fd(fd, acl); + acl_free(acl); + if (n != 0 && errno == EOPNOTSUPP) { + close(fd); + skipping("ACL tests require that ACL support be enabled on the filesystem"); + return; + } + failure("acl_set_fd(): errno = %d (%s)", + errno, strerror(errno)); + assertEqualInt(0, n); + close(fd); + + /* Create a write-to-disk object. */ + assert(NULL != (a = archive_write_disk_new())); + archive_write_disk_set_options(a, + ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_ACL); + + /* Populate an archive entry with some metadata, including ACL info */ + ae = archive_entry_new(); + assert(ae != NULL); + archive_entry_set_pathname(ae, "test0"); + archive_entry_set_mtime(ae, 123456, 7890); + archive_entry_set_size(ae, 0); + set_acls(ae, acls2); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Close the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* Verify the data on disk. */ + assertEqualInt(0, stat("test0", &st)); + assertEqualInt(st.st_mtime, 123456); + acl = acl_get_file("test0", ACL_TYPE_ACCESS); + assert(acl != (acl_t)NULL); + compare_acls(acl, acls2); + acl_free(acl); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_acl_pax.c b/Utilities/cmlibarchive/libarchive/test/test_acl_pax.c new file mode 100644 index 000000000..1377c21db --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_acl_pax.c @@ -0,0 +1,517 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_acl_pax.c,v 1.6 2008/09/01 05:38:33 kientzle Exp $"); + +/* + * Exercise the system-independent portion of the ACL support. + * Check that pax archive can save and restore ACL data. + * + * This should work on all systems, regardless of whether local + * filesystems support ACLs or not. + */ + +static unsigned char buff[16384]; + +static unsigned char reference[] = { +'P','a','x','H','e','a','d','e','r','/','f','i','l','e',0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',0,'0','0', +'0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','6','2',' ','0', +'0','0','0','0','0','0','0','0','0','0',' ','0','1','1','7','6','7',0,' ', +'x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r', +0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0', +'0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,'1','6',' ','S','C','H','I','L','Y','.','d','e','v','=','0',10, +'1','6',' ','S','C','H','I','L','Y','.','i','n','o','=','0',10,'1','8',' ', +'S','C','H','I','L','Y','.','n','l','i','n','k','=','0',10,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,'f','i','l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',0,'0','0', +'0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','0', +'0','0','0','0','0','0','0','0','0','0',' ','0','1','0','0','0','6',0,' ', +'0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r', +0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0', +'0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,'P','a','x','H','e','a','d','e','r','/','f','i','l','e',0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ', +0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','1','7','2', +' ','0','0','0','0','0','0','0','0','0','0','0',' ','0','1','1','7','7','1', +0,' ','x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t', +'a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0', +'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,'7','2',' ','S','C','H','I','L','Y','.','a','c','l','.', +'a','c','c','e','s','s','=','u','s','e','r',':',':','-','-','x',',','g','r', +'o','u','p',':',':','r','-','-',',','o','t','h','e','r',':',':','-','w','-', +',','u','s','e','r',':','u','s','e','r','7','7',':','r','-','-',':','7','7', +10,'1','6',' ','S','C','H','I','L','Y','.','d','e','v','=','0',10,'1','6', +' ','S','C','H','I','L','Y','.','i','n','o','=','0',10,'1','8',' ','S','C', +'H','I','L','Y','.','n','l','i','n','k','=','0',10,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,'f','i','l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',0,'0','0','0', +'0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','0','0', +'0','0','0','0','0','0','0','0','0',' ','0','1','0','0','0','6',0,' ','0', +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0, +'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0', +'0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,'P','a','x','H','e','a','d','e','r','/','f','i','l','e',0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,'0','0','0','5','4','3',' ',0,'0','0','0','0','0','0',' ', +0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','2','4','3', +' ','0','0','0','0','0','0','0','0','0','0','0',' ','0','1','1','7','7','5', +0,' ','x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t', +'a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0', +'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,'1','1','3',' ','S','C','H','I','L','Y','.','a','c','l', +'.','a','c','c','e','s','s','=','u','s','e','r',':',':','r','-','x',',','g', +'r','o','u','p',':',':','r','-','-',',','o','t','h','e','r',':',':','-','w', +'x',',','u','s','e','r',':','u','s','e','r','7','7',':','r','-','-',':','7', +'7',',','u','s','e','r',':','u','s','e','r','7','8',':','-','-','-',':','7', +'8',',','g','r','o','u','p',':','g','r','o','u','p','7','8',':','r','w','x', +':','7','8',10,'1','6',' ','S','C','H','I','L','Y','.','d','e','v','=','0', +10,'1','6',' ','S','C','H','I','L','Y','.','i','n','o','=','0',10,'1','8', +' ','S','C','H','I','L','Y','.','n','l','i','n','k','=','0',10,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,'f','i','l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,'0','0','0','5','4','3',' ',0,'0','0','0','0','0','0',' ',0,'0','0', +'0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','0', +'0','0','0','0','0','0','0','0','0','0',' ','0','1','0','0','1','3',0,' ', +'0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r', +0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0', +'0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,'P','a','x','H','e','a','d','e','r','/','f','i','l','e',0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ', +0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','6','2', +' ','0','0','0','0','0','0','0','0','0','0','0',' ','0','1','1','7','6','7', +0,' ','x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t', +'a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0', +'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,'1','6',' ','S','C','H','I','L','Y','.','d','e','v','=', +'0',10,'1','6',' ','S','C','H','I','L','Y','.','i','n','o','=','0',10,'1', +'8',' ','S','C','H','I','L','Y','.','n','l','i','n','k','=','0',10,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'f','i','l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ', +0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','0','0', +' ','0','0','0','0','0','0','0','0','0','0','0',' ','0','1','0','0','0','6', +0,' ','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t', +'a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0', +'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + + +struct acl_t { + int type; /* Type of ACL: "access" or "default" */ + int permset; /* Permissions for this class of users. */ + int tag; /* Owner, User, Owning group, group, other, etc. */ + int qual; /* GID or UID of user/group, depending on tag. */ + const char *name; /* Name of user/group, depending on tag. */ +}; + +static struct acl_t acls0[] = { + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE, + ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE, + ARCHIVE_ENTRY_ACL_OTHER, 0, "" }, +}; + +static struct acl_t acls1[] = { + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE, + ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE, + ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, +}; + +static struct acl_t acls2[] = { + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE | ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0, + ARCHIVE_ENTRY_ACL_USER, 78, "user78" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, + ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0007, + ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" }, + { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_EXECUTE, + ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, +}; + +static void +set_acls(struct archive_entry *ae, struct acl_t *acls, int n) +{ + int i; + + archive_entry_acl_clear(ae); + for (i = 0; i < n; i++) { + archive_entry_acl_add_entry(ae, + acls[i].type, acls[i].permset, acls[i].tag, acls[i].qual, + acls[i].name); + } +} + +static int +acl_match(struct acl_t *acl, int type, int permset, int tag, int qual, const char *name) +{ + if (type != acl->type) + return (0); + if (permset != acl->permset) + return (0); + if (tag != acl->tag) + return (0); + if (tag == ARCHIVE_ENTRY_ACL_USER_OBJ) + return (1); + if (tag == ARCHIVE_ENTRY_ACL_GROUP_OBJ) + return (1); + if (tag == ARCHIVE_ENTRY_ACL_OTHER) + return (1); + if (qual != acl->qual) + return (0); + if (name == NULL) + return (acl->name == NULL || acl->name[0] == '\0'); + if (acl->name == NULL) + return (name == NULL || name[0] == '\0'); + return (0 == strcmp(name, acl->name)); +} + +static void +compare_acls(struct archive_entry *ae, struct acl_t *acls, int n, int mode) +{ + int *marker = malloc(sizeof(marker[0]) * n); + int i; + int r; + int type, permset, tag, qual; + int matched; + const char *name; + + for (i = 0; i < n; i++) + marker[i] = i; + + while (0 == (r = archive_entry_acl_next(ae, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name))) { + for (i = 0, matched = 0; i < n && !matched; i++) { + if (acl_match(&acls[marker[i]], type, permset, + tag, qual, name)) { + /* We found a match; remove it. */ + marker[i] = marker[n - 1]; + n--; + matched = 1; + } + } + if (tag == ARCHIVE_ENTRY_ACL_USER_OBJ) { + if (!matched) printf("No match for user_obj perm\n"); + failure("USER_OBJ permset (%02o) != user mode (%02o)", + permset, 07 & (mode >> 6)); + assert((permset << 6) == (mode & 0700)); + } else if (tag == ARCHIVE_ENTRY_ACL_GROUP_OBJ) { + if (!matched) printf("No match for group_obj perm\n"); + failure("GROUP_OBJ permset %02o != group mode %02o", + permset, 07 & (mode >> 3)); + assert((permset << 3) == (mode & 0070)); + } else if (tag == ARCHIVE_ENTRY_ACL_OTHER) { + if (!matched) printf("No match for other perm\n"); + failure("OTHER permset (%02o) != other mode (%02o)", + permset, mode & 07); + assert((permset << 0) == (mode & 0007)); + } else { + failure("Could not find match for ACL " + "(type=%d,permset=%d,tag=%d,qual=%d,name=``%s'')", + type, permset, tag, qual, name); + assert(matched == 1); + } + } +#if ARCHIVE_VERSION_NUMBER < 1009000 + /* Known broken before 1.9.0. */ + skipping("archive_entry_acl_next() exits with ARCHIVE_EOF"); +#else + assertEqualInt(ARCHIVE_EOF, r); +#endif + assert((mode & 0777) == (archive_entry_mode(ae) & 0777)); + failure("Could not find match for ACL " + "(type=%d,permset=%d,tag=%d,qual=%d,name=``%s'')", + acls[marker[0]].type, acls[marker[0]].permset, + acls[marker[0]].tag, acls[marker[0]].qual, acls[marker[0]].name); + assert(n == 0); /* Number of ACLs not matched should == 0 */ + free(marker); +} + +DEFINE_TEST(test_acl_pax) +{ + struct archive *a; + struct archive_entry *ae; + size_t used; + FILE *f; + + /* Write an archive to memory. */ + assert(NULL != (a = archive_write_new())); + assertA(0 == archive_write_set_format_pax(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_set_bytes_per_block(a, 1)); + assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* Write a series of files to the archive with different ACL info. */ + + /* Create a simple archive_entry. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0777); + + /* Basic owner/owning group should just update mode bits. */ + set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0])); + assertA(0 == archive_write_header(a, ae)); + + /* With any extended ACL entry, we should read back a full set. */ + set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0])); + assertA(0 == archive_write_header(a, ae)); + + + /* A more extensive set of ACLs. */ + set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0])); + assertA(0 == archive_write_header(a, ae)); + + /* + * Check that clearing ACLs gets rid of them all by repeating + * the first test. + */ + set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0])); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + + /* Write out the data we generated to a file for manual inspection. */ + assert(NULL != (f = fopen("testout", "wb"))); + assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f)); + fclose(f); + + /* Write out the reference data to a file for manual inspection. */ + assert(NULL != (f = fopen("reference", "wb"))); + assert(sizeof(reference) == fwrite(reference, 1, sizeof(reference), f)); + fclose(f); + + /* Assert that the generated data matches the built-in reference data.*/ + failure("Generated pax archive does not match reference; check 'testout' and 'reference' files."); + assertEqualMem(buff, reference, sizeof(reference)); + failure("Generated pax archive does not match reference; check 'testout' and 'reference' files."); + assertEqualInt((int)used, sizeof(reference)); + + /* Read back each entry and check that the ACL data is right. */ + assert(NULL != (a = archive_read_new())); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used)); + + /* First item has no ACLs */ + assertA(0 == archive_read_next_header(a, &ae)); + failure("Basic ACLs shouldn't be stored as extended ACLs"); + assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + failure("Basic ACLs should set mode to 0142, not %04o", + archive_entry_mode(ae)&0777); + assert((archive_entry_mode(ae) & 0777) == 0142); + + /* Second item has a few ACLs */ + assertA(0 == archive_read_next_header(a, &ae)); + failure("One extended ACL should flag all ACLs to be returned."); + assert(4 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), 0142); + failure("Basic ACLs should set mode to 0142, not %04o", + archive_entry_mode(ae)&0777); + assert((archive_entry_mode(ae) & 0777) == 0142); + + /* Third item has pretty extensive ACLs */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(6, archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]), 0543); + failure("Basic ACLs should set mode to 0543, not %04o", + archive_entry_mode(ae)&0777); + assert((archive_entry_mode(ae) & 0777) == 0543); + + /* Fourth item has no ACLs */ + assertA(0 == archive_read_next_header(a, &ae)); + failure("Basic ACLs shouldn't be stored as extended ACLs"); + assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + failure("Basic ACLs should set mode to 0142, not %04o", + archive_entry_mode(ae)&0777); + assert((archive_entry_mode(ae) & 0777) == 0142); + + /* Close the archive. */ + assertA(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertA(0 == archive_read_finish(a)); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_archive_api_feature.c b/Utilities/cmlibarchive/libarchive/test/test_archive_api_feature.c new file mode 100644 index 000000000..ad842543e --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_archive_api_feature.c @@ -0,0 +1,76 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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) +{ + char buff[128]; + const char *p; + + /* This is the (hopefully) final versioning API. */ + assertEqualInt(ARCHIVE_VERSION_NUMBER, archive_version_number()); + sprintf(buff, "libarchive %d.%d.%d", + archive_version_number() / 1000000, + (archive_version_number() / 1000) % 1000, + archive_version_number() % 1000); + failure("Version string is: %s, computed is: %s", + archive_version_string(), buff); + assert(memcmp(buff, archive_version_string(), strlen(buff)) == 0); + if (strlen(buff) < strlen(archive_version_string())) { + p = archive_version_string() + strlen(buff); + failure("Version string is: %s", archive_version_string()); + assert(*p == 'a' || *p == 'b' || *p == 'c' || *p == 'd'); + ++p; + failure("Version string is: %s", archive_version_string()); + assert(*p == '\0'); + } + +/* This is all scheduled to disappear in libarchive 3.0 */ +#if ARCHIVE_VERSION_NUMBER < 3000000 + assertEqualInt(ARCHIVE_VERSION_STAMP, ARCHIVE_VERSION_NUMBER); + assertEqualInt(ARCHIVE_API_FEATURE, archive_api_feature()); + assertEqualInt(ARCHIVE_API_VERSION, archive_api_version()); + /* + * Even though ARCHIVE_VERSION_STAMP only appears in + * archive.h after 1.9.0 and 2.2.3, the macro is synthesized + * in test.h, so this test is always valid. + */ + assertEqualInt(ARCHIVE_VERSION_STAMP / 1000, ARCHIVE_API_VERSION * 1000 + ARCHIVE_API_FEATURE); + /* + * The function, however, isn't always available. It appeared + * sometime in the middle of 2.2.3, but the synthesized value + * never has a release version, so the following conditional + * exactly determines whether the current library has the + * function. + */ +#if ARCHIVE_VERSION_STAMP / 1000 == 1009 || ARCHIVE_VERSION_STAMP > 2002000 + assertEqualInt(ARCHIVE_VERSION_STAMP, archive_version_stamp()); +#else + skipping("archive_version_stamp()"); +#endif + assertEqualString(ARCHIVE_LIBRARY_VERSION, archive_version()); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_bad_fd.c b/Utilities/cmlibarchive/libarchive/test/test_bad_fd.c new file mode 100644 index 000000000..0bcfa6977 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_bad_fd.c @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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) +{ + struct archive *a; + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_compression_all(a)); + assertA(ARCHIVE_FATAL == archive_read_open_fd(a, -1, 1024)); + assertA(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertA(0 == archive_read_finish(a)); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2.c b/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2.c new file mode 100644 index 000000000..810b044fd --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2.c @@ -0,0 +1,85 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Verify our ability to read sample files compatibly with bunzip2. + * + * In particular: + * * bunzip2 will read multiple bzip2 streams, concatenating the output + * * bunzip2 will stop at the end of a stream if the following data + * doesn't start with a bzip2 signature. + */ + +/* + * All of the sample files have the same contents; they're just + * compressed in different ways. + */ +static void +compat_bzip2(const char *name) +{ + const char *n[7] = { "f1", "f2", "f3", "d1/f1", "d1/f2", "d1/f3", NULL }; + struct archive_entry *ae; + struct archive *a; + int i; + + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_compression_bzip2(a)) { + skipping("Unsupported bzip2"); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2)); + + /* Read entries, match up names with list above. */ + for (i = 0; i < 6; ++i) { + failure("Could not read file %d (%s) from %s", i, n[i], name); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualString(n[i], archive_entry_pathname(ae)); + } + + /* Verify the end-of-archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + assertEqualString(archive_compression_name(a), "bzip2"); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + +DEFINE_TEST(test_compat_bzip2) +{ + compat_bzip2("test_compat_bzip2_1.tbz"); + compat_bzip2("test_compat_bzip2_2.tbz"); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2_1.tbz.uu b/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2_1.tbz.uu new file mode 100644 index 000000000..ffdce8867 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2_1.tbz.uu @@ -0,0 +1,24 @@ +$FreeBSD: src/lib/libarchive/test/test_compat_bzip2_1.tbz.uu,v 1.1 2008/12/06 07:08:08 kientzle Exp $ + +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+*\GV#JF<`PK29-8'OPDG36S\7HR&C(T:/U0:$U'I +MJ!ZC0`#VECO\[$10H'-Z@F*:6A1$H$V("2G0Q(U0(8=(7AK$S04#!)RXOAP% +MP:D%#Q;NO)\4UL23'2[\7````6YC1 +M$$`$?X```6,M'A`$`!````@@`'4-4S*,U!HT!HT?J@T)E-I--!H`![60EIH.3%!629364RNM^,```#?L-$00`#_@`0```AG +M+1X0`!`$```((`!U#5-,:1IH`TT,1^J#)&H]3U`T``!CX[_.[`F40.64EC"D +M()+?KX6,VP?6Y;F%5$XR[Y/D#*9),K3^+N2*<*$@9@ +MX6(`0EIH.3%!62936>ZM4*4```);D-$00`#O@``(9ST>$`0```@@`'0:IFC2 +M&F@!B:/U0:$R&H:&@`"KS^U=Y`BC`#FY2*9-8%%&13E$@%8ZF(&J!##]!#E` +MKVL'2LUW2.*C08`$)::#DQ05DF +?4UDI/)=P````0!!```0`(``A`(*#%W)%.%"0*3R7<``` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2_2.tbz.uu b/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2_2.tbz.uu new file mode 100644 index 000000000..e307e4e61 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_compat_bzip2_2.tbz.uu @@ -0,0 +1,11 @@ +$FreeBSD: src/lib/libarchive/test/test_compat_bzip2_2.tbz.uu,v 1.1 2008/12/06 07:08:08 kientzle Exp $ + +begin 644 test_compat_bzip2_2.tbz +M0EIH.3%!629361HI1P<``4#;D-$00`#_@``)9RT>$`0``!@P`/@#&$Q,F`F` +M`,83$R8"8``1133"1/2-J-#$/U3@;XVF9V'`Y3882XA$*KO6\WTL`]QU&J"8 +M$-=*Q$\@=`=QJ,TQ;3UH,NPT$-(!"HV&!ZO5D&@P-1D&1@'L<8&209QV9'G` +MW&PRZ0Q(-BT%&DG*DE.!U*#J.P]*#%-P9G`W9+34:#S&M`;@^1R^![C]:Y)U +MDF9/(\AR/@?P@^@I_B[DBG"A(#12C@X!3;VUE(&UOV=QL!06ER26`1T2G9F:EY)54XJ +MN>9`/*(`IX<(2#/D&F@GC`(Z``#S57',@'E&`TT,$I!EQ +M#;031@$5`0`Q!<\4Z`,``!^+"`B8OB))``-T97-T+7-P;&ET+G1A$0!3@\1D&;,-=!.&`5D``#7L]HO +MZ`,``!^+"`B8OB))``-T97-T+7-P;&ET+G1A57',@'E&`TT,$I!ER#;031@$>``"Y*#OBZ`,``!^+"`B8 +MOB))``-T97-T+7-P;&ET+G1A@ALXPP`]CXF=Q&A<:-UX>EN)C5M,AL;P +MO@V[0A=_.E39F2.B'*.?5QX2?Z\?XGE&27)F]L0)V>E_'7YY07\>OZ)Y1W6Q\!-J3!?H^Z_J7TG]%_"QK0?\]4[/>HZS^_^T\! +M_;>@@OY[=N2]6E\!JOH/P])_2OC^-X'YOV]+_]97@*K^A4K_C/Y;P/S?MZ5_ +MZRM`7?]<^L?_OR8P_P,`].D%,XR2*0`<``!4:&ES(&ES('5N#HW,2QU#HQ,#`P+&=R;W5P.CIR+2TL;6%S:SIR+69I;&4M=VET:"UP +M;W-I>"UA8VQS```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````P +M,#`P-C0T`#`P,#$W-3``,#`P,#`P,``P,#`P,#`P,#`P,``Q,3$W-#8P-#$U +M-P`P,#$U,30T`#`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````=7-T87(`,#!T@`````````````` +M`````````````````````')O;W0````````````````````````````````` +M````,#`P,#(Q,``P,#`P,#$P```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +H```````````````````````````````````````````````````````` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_compat_tar_hardlink.c b/Utilities/cmlibarchive/libarchive/test/test_compat_tar_hardlink.c new file mode 100644 index 000000000..1975b5513 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_compat_tar_hardlink.c @@ -0,0 +1,108 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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. + * The first is the POSIX 1988 "ustar" format, the second is the 2001 + * "pax extended" format that builds on the "ustar" format by adding + * support for generic additional attributes. Buried in the details + * is one frustrating incompatibility: The 1988 standard says that + * tar readers MUST ignore the size field on hardlink entries; the + * 2001 standard says that tar readers MUST obey the size field on + * hardlink entries. libarchive tries to navigate this particular + * minefield by using auto-detect logic to guess whether it should + * or should not obey the size field. + * + * This test tries to probe the boundaries of such handling; the test + * archives here were adapted from real archives created by real + * tar implementations that are (as of early 2008) apparently still + * in use. + */ + +static void +test_compat_tar_hardlink_1(void) +{ + char name[] = "test_compat_tar_hardlink_1.tar"; + struct archive_entry *ae; + struct archive *a; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240)); + + /* Read first entry, which is a regular file. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("xmcd-3.3.2/docs_d/READMf", + archive_entry_pathname(ae)); + assertEqualString(NULL, archive_entry_hardlink(ae)); + assertEqualInt(321, archive_entry_size(ae)); + assertEqualInt(1082575645, archive_entry_mtime(ae)); + assertEqualInt(1851, archive_entry_uid(ae)); + assertEqualInt(3, archive_entry_gid(ae)); + assertEqualInt(0100444, archive_entry_mode(ae)); + + /* Read second entry, which is a hard link at the end of archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("xmcd-3.3.2/README", + archive_entry_pathname(ae)); + assertEqualString( + "xmcd-3.3.2/docs_d/READMf", + archive_entry_hardlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1082575645, archive_entry_mtime(ae)); + assertEqualInt(1851, archive_entry_uid(ae)); + assertEqualInt(3, archive_entry_gid(ae)); + assertEqualInt(0100444, archive_entry_mode(ae)); + + /* Verify the end-of-archive. */ + /* + * This failed in libarchive 2.4.12 because the tar reader + * tried to obey the size field for the hard link and ended + * up running past the end of the file. + */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} + +DEFINE_TEST(test_compat_tar_hardlink) +{ + test_compat_tar_hardlink_1(); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_compat_tar_hardlink_1.tar.uu b/Utilities/cmlibarchive/libarchive/test/test_compat_tar_hardlink_1.tar.uu new file mode 100644 index 000000000..95dba54c2 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_compat_tar_hardlink_1.tar.uu @@ -0,0 +1,39 @@ +$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```````````````````````````````````````````````````````````` +M`````````````"`@(#0T-"``("`S-#'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX +M>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX +M>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX +M>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX +M>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX +M>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX +M>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX +M>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'@````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````'AM8V0M,RXS+C(O +M4D5!1$U%```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````@ +M("`T-#0@`"`@,S0W,R``("`@("`S(``@("`@("`@(#4P,2`Q,#`T,34T-30S +M-2`@,3(R,#<`(#%X;6-D+3,N,RXR+V1O8W-?9"]214%$368````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +&```````` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_compat_xz.c b/Utilities/cmlibarchive/libarchive/test/test_compat_xz.c new file mode 100644 index 000000000..3475007ac --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_compat_xz.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2008 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Verify our ability to read sample files compatibly with unxz. + * + * In particular: + * * unxz will read multiple xz streams, concatenating the output + */ + +/* + * All of the sample files have the same contents; they're just + * compressed in different ways. + */ +static void +compat_xz(const char *name) +{ + const char *n[7] = { "f1", "f2", "f3", "d1/f1", "d1/f2", "d1/f3", NULL }; + struct archive_entry *ae; + struct archive *a; + int i, r; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("xz reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2)); + + /* Read entries, match up names with list above. */ + for (i = 0; i < 6; ++i) { + failure("Could not read file %d (%s) from %s", i, n[i], name); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualString(n[i], archive_entry_pathname(ae)); + } + + /* Verify the end-of-archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_XZ); + assertEqualString(archive_compression_name(a), "xz"); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + +DEFINE_TEST(test_compat_xz) +{ + compat_xz("test_compat_xz_1.txz"); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_compat_xz_1.txz.uu b/Utilities/cmlibarchive/libarchive/test/test_compat_xz_1.txz.uu new file mode 100644 index 000000000..ea5d1e54d --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_compat_xz_1.txz.uu @@ -0,0 +1,12 @@ +begin 644 test_compat_gzip_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 +M-$G]+L[\,B<7%8&$NO5K31*Y>"D^*ZG,Z=H```"KU50H$1^1S``!GP&@'P`` +MLZ042+'$9_L"``````196OTW>EA:```$YM:T1@(`(0$6````="_EH^`,7P!I +M70``;IBIKOMK%/A?-TZV0266G?2,[/?\,JE6` +M__C/SA[W1?*2J9Z!O$&YKI)!H8*&L&E>0J^FIJ\7+Q<`%!+!PAHTY\490```'$```!02P,$%``(``@`"(2# +M-P````````````````D```!T;7`N8VQA"%3```%!+!P@+ +M(*8V:````'8```!02P$"%``4``@`"``(A(,W:-.?%&4```!Q````%``````` +M````````````````345402U)3D8O34%.249%4U0N34902P$"%``4``@`"``( +MA(,W"R"F-F@```!V````"0````````````````"G````=&UP+F-L87-S4$L% +J!@`````"``(`>0```$8!```7`%!R;T=U87)D+"!V97)S:6]N(#0N,"XQ +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_empty_write.c b/Utilities/cmlibarchive/libarchive/test/test_empty_write.c new file mode 100644 index 000000000..8a0069ca8 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_empty_write.c @@ -0,0 +1,120 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_empty_write.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); + +DEFINE_TEST(test_empty_write) +{ + char buff[32768]; + struct archive_entry *ae; + struct archive *a; + size_t used; + int r; + + /* + * Exercise a zero-byte write to a gzip-compressed archive. + */ + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + r = archive_write_set_compression_gzip(a); + if (r == ARCHIVE_FATAL) { + skipping("Empty write to gzip-compressed archive"); + } else { + assertEqualIntA(a, ARCHIVE_OK, r); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, sizeof(buff), &used)); + /* Write a file to it. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 0); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + /* THE TEST: write zero bytes to this entry. */ + /* This used to crash. */ + assertEqualIntA(a, 0, archive_write_data(a, "", 0)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); + assertA(0 == archive_write_finish(a)); + } + + /* + * Again, with bzip2 compression. + */ + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + r = archive_write_set_compression_bzip2(a); + if (r == ARCHIVE_FATAL) { + skipping("Empty write to bzip2-compressed archive"); + } else { + assertEqualIntA(a, ARCHIVE_OK, r); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, sizeof(buff), &used)); + /* Write a file to it. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 0); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + /* THE TEST: write zero bytes to this entry. */ + assertEqualIntA(a, 0, archive_write_data(a, "", 0)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); + assertA(0 == archive_write_finish(a)); + } + + /* + * For good measure, one more time with no compression. + */ + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + /* Write a file to it. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 0); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + /* THE TEST: write zero bytes to this entry. */ + assertEqualIntA(a, 0, archive_write_data(a, "", 0)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); + assertA(0 == archive_write_finish(a)); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_entry.c b/Utilities/cmlibarchive/libarchive/test/test_entry.c new file mode 100644 index 000000000..d8361bae8 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_entry.c @@ -0,0 +1,890 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_entry.c,v 1.10 2008/09/30 04:13:21 kientzle Exp $"); + +#include + +/* + * Most of these tests are system-independent, though a few depend on + * features of the local system. Such tests are conditionalized on + * the platform name. On unsupported platforms, only the + * system-independent features will be tested. + * + * No, I don't want to use config.h in the test files because I want + * the tests to also serve as a check on the correctness of config.h. + * A mis-configured library build should cause tests to fail. + */ + +DEFINE_TEST(test_entry) +{ + char buff[128]; + wchar_t wbuff[128]; + struct stat st; + struct archive_entry *e, *e2; + const struct stat *pst; + unsigned long set, clear; /* For fflag testing. */ + int type, permset, tag, qual; /* For ACL testing. */ + const char *name; /* For ACL testing. */ + const char *xname; /* For xattr tests. */ + const void *xval; /* For xattr tests. */ + size_t xsize; /* For xattr tests. */ + int c; + wchar_t wc; + long l; + + assert((e = archive_entry_new()) != NULL); + + /* + * Verify that the AE_IF* defines match S_IF* defines + * on this platform. See comments in archive_entry.h. + */ +#ifdef S_IFREG + assertEqualInt(S_IFREG, AE_IFREG); +#endif +#ifdef S_IFLNK + assertEqualInt(S_IFLNK, AE_IFLNK); +#endif +#ifdef S_IFSOCK + assertEqualInt(S_IFSOCK, AE_IFSOCK); +#endif +#ifdef S_IFCHR + assertEqualInt(S_IFCHR, AE_IFCHR); +#endif +#ifdef S_IFBLK + assertEqualInt(S_IFBLK, AE_IFBLK); +#endif +#ifdef S_IFDIR + assertEqualInt(S_IFDIR, AE_IFDIR); +#endif +#ifdef S_IFIFO + assertEqualInt(S_IFIFO, AE_IFIFO); +#endif + + /* + * Basic set/read tests for all fields. + * We should be able to set any field and read + * back the same value. + * + * For methods that "copy" a string, we should be able + * to overwrite the original passed-in string without + * changing the value in the entry. + * + * The following tests are ordered alphabetically by the + * name of the field. + */ + + /* atime */ + archive_entry_set_atime(e, 13579, 24680); + assertEqualInt(archive_entry_atime(e), 13579); + assertEqualInt(archive_entry_atime_nsec(e), 24680); + archive_entry_unset_atime(e); + assertEqualInt(archive_entry_atime(e), 0); + assertEqualInt(archive_entry_atime_nsec(e), 0); + assert(!archive_entry_atime_is_set(e)); + + /* birthtime */ + archive_entry_set_birthtime(e, 17579, 24990); + assertEqualInt(archive_entry_birthtime(e), 17579); + assertEqualInt(archive_entry_birthtime_nsec(e), 24990); + archive_entry_unset_birthtime(e); + assertEqualInt(archive_entry_birthtime(e), 0); + assertEqualInt(archive_entry_birthtime_nsec(e), 0); + assert(!archive_entry_birthtime_is_set(e)); + + /* ctime */ + archive_entry_set_ctime(e, 13580, 24681); + assertEqualInt(archive_entry_ctime(e), 13580); + assertEqualInt(archive_entry_ctime_nsec(e), 24681); + archive_entry_unset_ctime(e); + assertEqualInt(archive_entry_ctime(e), 0); + assertEqualInt(archive_entry_ctime_nsec(e), 0); + assert(!archive_entry_ctime_is_set(e)); + +#if ARCHIVE_VERSION_NUMBER >= 1009000 + /* dev */ + archive_entry_set_dev(e, 235); + assertEqualInt(archive_entry_dev(e), 235); +#else + skipping("archive_entry_dev()"); +#endif + /* devmajor/devminor are tested specially below. */ + +#if ARCHIVE_VERSION_NUMBER >= 1009000 + /* filetype */ + archive_entry_set_filetype(e, AE_IFREG); + assertEqualInt(archive_entry_filetype(e), AE_IFREG); +#else + skipping("archive_entry_filetype()"); +#endif + + /* fflags are tested specially below */ + + /* gid */ + archive_entry_set_gid(e, 204); + assertEqualInt(archive_entry_gid(e), 204); + + /* gname */ + archive_entry_set_gname(e, "group"); + assertEqualString(archive_entry_gname(e), "group"); + wcscpy(wbuff, L"wgroup"); + archive_entry_copy_gname_w(e, wbuff); + assertEqualWString(archive_entry_gname_w(e), L"wgroup"); + memset(wbuff, 0, sizeof(wbuff)); + assertEqualWString(archive_entry_gname_w(e), L"wgroup"); + + /* hardlink */ + archive_entry_set_hardlink(e, "hardlinkname"); + assertEqualString(archive_entry_hardlink(e), "hardlinkname"); + strcpy(buff, "hardlinkname2"); + archive_entry_copy_hardlink(e, buff); + assertEqualString(archive_entry_hardlink(e), "hardlinkname2"); + memset(buff, 0, sizeof(buff)); + assertEqualString(archive_entry_hardlink(e), "hardlinkname2"); + archive_entry_copy_hardlink(e, NULL); + assertEqualString(archive_entry_hardlink(e), NULL); + assertEqualWString(archive_entry_hardlink_w(e), NULL); + wcscpy(wbuff, L"whardlink"); + archive_entry_copy_hardlink_w(e, wbuff); + assertEqualWString(archive_entry_hardlink_w(e), L"whardlink"); + memset(wbuff, 0, sizeof(wbuff)); + assertEqualWString(archive_entry_hardlink_w(e), L"whardlink"); + archive_entry_copy_hardlink_w(e, NULL); + assertEqualString(archive_entry_hardlink(e), NULL); + assertEqualWString(archive_entry_hardlink_w(e), NULL); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + /* ino */ + archive_entry_set_ino(e, 8593); + assertEqualInt(archive_entry_ino(e), 8593); +#else + skipping("archive_entry_ino()"); +#endif + + /* link */ + archive_entry_set_hardlink(e, "hardlinkname"); + archive_entry_set_symlink(e, NULL); + archive_entry_set_link(e, "link"); + assertEqualString(archive_entry_hardlink(e), "link"); + assertEqualString(archive_entry_symlink(e), NULL); + archive_entry_copy_link(e, "link2"); + assertEqualString(archive_entry_hardlink(e), "link2"); + assertEqualString(archive_entry_symlink(e), NULL); + archive_entry_copy_link_w(e, L"link3"); + assertEqualString(archive_entry_hardlink(e), "link3"); + assertEqualString(archive_entry_symlink(e), NULL); + archive_entry_set_hardlink(e, NULL); + archive_entry_set_symlink(e, "symlink"); + archive_entry_set_link(e, "link"); + assertEqualString(archive_entry_hardlink(e), NULL); + assertEqualString(archive_entry_symlink(e), "link"); + archive_entry_copy_link(e, "link2"); + assertEqualString(archive_entry_hardlink(e), NULL); + assertEqualString(archive_entry_symlink(e), "link2"); + archive_entry_copy_link_w(e, L"link3"); + assertEqualString(archive_entry_hardlink(e), NULL); + assertEqualString(archive_entry_symlink(e), "link3"); + /* Arbitrarily override symlink if both hardlink and symlink set. */ + archive_entry_set_hardlink(e, "hardlink"); + archive_entry_set_symlink(e, "symlink"); + archive_entry_set_link(e, "link"); + assertEqualString(archive_entry_hardlink(e), "hardlink"); + assertEqualString(archive_entry_symlink(e), "link"); + + /* mode */ + archive_entry_set_mode(e, 0123456); + assertEqualInt(archive_entry_mode(e), 0123456); + + /* mtime */ + archive_entry_set_mtime(e, 13581, 24682); + assertEqualInt(archive_entry_mtime(e), 13581); + assertEqualInt(archive_entry_mtime_nsec(e), 24682); + archive_entry_unset_mtime(e); + assertEqualInt(archive_entry_mtime(e), 0); + assertEqualInt(archive_entry_mtime_nsec(e), 0); + assert(!archive_entry_mtime_is_set(e)); + +#if ARCHIVE_VERSION_NUMBER >= 1009000 + /* nlink */ + archive_entry_set_nlink(e, 736); + assertEqualInt(archive_entry_nlink(e), 736); +#else + skipping("archive_entry_nlink()"); +#endif + + /* pathname */ + archive_entry_set_pathname(e, "path"); + assertEqualString(archive_entry_pathname(e), "path"); + archive_entry_set_pathname(e, "path"); + assertEqualString(archive_entry_pathname(e), "path"); + strcpy(buff, "path2"); + archive_entry_copy_pathname(e, buff); + assertEqualString(archive_entry_pathname(e), "path2"); + memset(buff, 0, sizeof(buff)); + assertEqualString(archive_entry_pathname(e), "path2"); + wcscpy(wbuff, L"wpath"); + archive_entry_copy_pathname_w(e, wbuff); + assertEqualWString(archive_entry_pathname_w(e), L"wpath"); + memset(wbuff, 0, sizeof(wbuff)); + assertEqualWString(archive_entry_pathname_w(e), L"wpath"); + +#if ARCHIVE_VERSION_NUMBER >= 1009000 + /* rdev */ + archive_entry_set_rdev(e, 532); + assertEqualInt(archive_entry_rdev(e), 532); +#else + skipping("archive_entry_rdev()"); +#endif + /* rdevmajor/rdevminor are tested specially below. */ + + /* size */ + archive_entry_set_size(e, 987654321); + assertEqualInt(archive_entry_size(e), 987654321); + archive_entry_unset_size(e); + assertEqualInt(archive_entry_size(e), 0); + assert(!archive_entry_size_is_set(e)); + + /* sourcepath */ + archive_entry_copy_sourcepath(e, "path1"); + assertEqualString(archive_entry_sourcepath(e), "path1"); + + /* symlink */ + archive_entry_set_symlink(e, "symlinkname"); + assertEqualString(archive_entry_symlink(e), "symlinkname"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + strcpy(buff, "symlinkname2"); + archive_entry_copy_symlink(e, buff); + assertEqualString(archive_entry_symlink(e), "symlinkname2"); + memset(buff, 0, sizeof(buff)); + assertEqualString(archive_entry_symlink(e), "symlinkname2"); +#endif + archive_entry_copy_symlink_w(e, NULL); + assertEqualWString(archive_entry_symlink_w(e), NULL); + assertEqualString(archive_entry_symlink(e), NULL); + archive_entry_copy_symlink_w(e, L"wsymlink"); + assertEqualWString(archive_entry_symlink_w(e), L"wsymlink"); + archive_entry_copy_symlink(e, NULL); + assertEqualWString(archive_entry_symlink_w(e), NULL); + assertEqualString(archive_entry_symlink(e), NULL); + + /* uid */ + archive_entry_set_uid(e, 83); + assertEqualInt(archive_entry_uid(e), 83); + + /* uname */ + archive_entry_set_uname(e, "user"); + assertEqualString(archive_entry_uname(e), "user"); + wcscpy(wbuff, L"wuser"); + archive_entry_copy_gname_w(e, wbuff); + assertEqualWString(archive_entry_gname_w(e), L"wuser"); + memset(wbuff, 0, sizeof(wbuff)); + assertEqualWString(archive_entry_gname_w(e), L"wuser"); + + /* Test fflags interface. */ + archive_entry_set_fflags(e, 0x55, 0xAA); + archive_entry_fflags(e, &set, &clear); + failure("Testing set/get of fflags data."); + assertEqualInt(set, 0x55); + failure("Testing set/get of fflags data."); + assertEqualInt(clear, 0xAA); +#ifdef __FreeBSD__ + /* Converting fflags bitmap to string is currently system-dependent. */ + /* TODO: Make this system-independent. */ + assertEqualString(archive_entry_fflags_text(e), + "uappnd,nouchg,nodump,noopaque,uunlnk"); + /* Test archive_entry_copy_fflags_text_w() */ + archive_entry_copy_fflags_text_w(e, L" ,nouappnd, nouchg, dump,uunlnk"); + archive_entry_fflags(e, &set, &clear); + assertEqualInt(16, set); + assertEqualInt(7, clear); + /* Test archive_entry_copy_fflags_text() */ + archive_entry_copy_fflags_text(e, " ,nouappnd, nouchg, dump,uunlnk"); + archive_entry_fflags(e, &set, &clear); + assertEqualInt(16, set); + assertEqualInt(7, clear); +#endif + + /* See test_acl_basic.c for tests of ACL set/get consistency. */ + + /* Test xattrs set/get consistency. */ + archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue1", 12); + assertEqualInt(1, archive_entry_xattr_reset(e)); + assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualString(xname, "xattr1"); + assertEqualString(xval, "xattrvalue1"); + assertEqualInt((int)xsize, 12); + assertEqualInt(1, archive_entry_xattr_count(e)); + assertEqualInt(ARCHIVE_WARN, + archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualString(xname, NULL); + assertEqualString(xval, NULL); + assertEqualInt((int)xsize, 0); + archive_entry_xattr_clear(e); + assertEqualInt(0, archive_entry_xattr_reset(e)); + assertEqualInt(ARCHIVE_WARN, + archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualString(xname, NULL); + assertEqualString(xval, NULL); + assertEqualInt((int)xsize, 0); + archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue1", 12); + assertEqualInt(1, archive_entry_xattr_reset(e)); + archive_entry_xattr_add_entry(e, "xattr2", "xattrvalue2", 12); + assertEqualInt(2, archive_entry_xattr_reset(e)); + assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualInt(ARCHIVE_WARN, + archive_entry_xattr_next(e, &xname, &xval, &xsize)); + assertEqualString(xname, NULL); + assertEqualString(xval, NULL); + assertEqualInt((int)xsize, 0); + + + /* + * Test clone() implementation. + */ + + /* Set values in 'e' */ + archive_entry_clear(e); + archive_entry_set_atime(e, 13579, 24680); + archive_entry_set_birthtime(e, 13779, 24990); + archive_entry_set_ctime(e, 13580, 24681); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_dev(e, 235); +#endif + archive_entry_set_fflags(e, 0x55, 0xAA); + archive_entry_set_gid(e, 204); + archive_entry_set_gname(e, "group"); + archive_entry_set_hardlink(e, "hardlinkname"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_ino(e, 8593); +#endif + archive_entry_set_mode(e, 0123456); + archive_entry_set_mtime(e, 13581, 24682); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_nlink(e, 736); +#endif + archive_entry_set_pathname(e, "path"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_rdev(e, 532); +#endif + archive_entry_set_size(e, 987654321); + archive_entry_copy_sourcepath(e, "source"); + archive_entry_set_symlink(e, "symlinkname"); + archive_entry_set_uid(e, 83); + archive_entry_set_uname(e, "user"); + /* Add an ACL entry. */ + archive_entry_acl_add_entry(e, ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + ARCHIVE_ENTRY_ACL_READ, ARCHIVE_ENTRY_ACL_USER, 77, "user77"); + /* Add an extended attribute. */ + archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue", 11); + + /* Make a clone. */ + e2 = archive_entry_clone(e); + + /* Clone should have same contents. */ + assertEqualInt(archive_entry_atime(e2), 13579); + assertEqualInt(archive_entry_atime_nsec(e2), 24680); + assertEqualInt(archive_entry_birthtime(e2), 13779); + assertEqualInt(archive_entry_birthtime_nsec(e2), 24990); + assertEqualInt(archive_entry_ctime(e2), 13580); + assertEqualInt(archive_entry_ctime_nsec(e2), 24681); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_dev(e2), 235); +#endif + archive_entry_fflags(e, &set, &clear); + assertEqualInt(clear, 0xAA); + assertEqualInt(set, 0x55); + assertEqualInt(archive_entry_gid(e2), 204); + assertEqualString(archive_entry_gname(e2), "group"); + assertEqualString(archive_entry_hardlink(e2), "hardlinkname"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_ino(e2), 8593); +#endif + assertEqualInt(archive_entry_mode(e2), 0123456); + assertEqualInt(archive_entry_mtime(e2), 13581); + assertEqualInt(archive_entry_mtime_nsec(e2), 24682); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_nlink(e2), 736); +#endif + assertEqualString(archive_entry_pathname(e2), "path"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_rdev(e2), 532); +#endif + assertEqualInt(archive_entry_size(e2), 987654321); + assertEqualString(archive_entry_sourcepath(e2), "source"); + assertEqualString(archive_entry_symlink(e2), "symlinkname"); + assertEqualInt(archive_entry_uid(e2), 83); + assertEqualString(archive_entry_uname(e2), "user"); +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("ACL preserved by archive_entry_clone()"); +#else + /* Verify ACL was copied. */ + assertEqualInt(4, c = archive_entry_acl_reset(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + /* First three are standard permission bits. */ + assertEqualInt(0, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + assertEqualInt(permset, 4); + assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER_OBJ); + assertEqualInt(qual, -1); + assertEqualString(name, NULL); + assertEqualInt(0, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + assertEqualInt(permset, 5); + assertEqualInt(tag, ARCHIVE_ENTRY_ACL_GROUP_OBJ); + assertEqualInt(qual, -1); + assertEqualString(name, NULL); + assertEqualInt(0, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + assertEqualInt(permset, 6); + assertEqualInt(tag, ARCHIVE_ENTRY_ACL_OTHER); + assertEqualInt(qual, -1); + assertEqualString(name, NULL); + /* Fourth is custom one. */ + assertEqualInt(0, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + assertEqualInt(permset, ARCHIVE_ENTRY_ACL_READ); + assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER); + assertEqualInt(qual, 77); + assertEqualString(name, "user77"); +#endif +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("xattr data preserved by archive_entry_clone"); +#else + /* Verify xattr was copied. */ + assertEqualInt(1, c = archive_entry_xattr_reset(e2)); + assertEqualInt(0, archive_entry_xattr_next(e2, &xname, &xval, &xsize)); + assertEqualString(xname, "xattr1"); + assertEqualString(xval, "xattrvalue"); + assertEqualInt((int)xsize, 11); + assertEqualInt(ARCHIVE_WARN, + archive_entry_xattr_next(e2, &xname, &xval, &xsize)); + assertEqualString(xname, NULL); + assertEqualString(xval, NULL); + assertEqualInt((int)xsize, 0); +#endif + + /* Change the original */ + archive_entry_set_atime(e, 13580, 24690); + archive_entry_set_birthtime(e, 13980, 24999); + archive_entry_set_ctime(e, 13590, 24691); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_dev(e, 245); +#endif + archive_entry_set_fflags(e, 0x85, 0xDA); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_filetype(e, AE_IFLNK); +#endif + archive_entry_set_gid(e, 214); + archive_entry_set_gname(e, "grouper"); + archive_entry_set_hardlink(e, "hardlinkpath"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_ino(e, 8763); +#endif + archive_entry_set_mode(e, 0123654); + archive_entry_set_mtime(e, 18351, 28642); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_nlink(e, 73); +#endif + archive_entry_set_pathname(e, "pathest"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_rdev(e, 132); +#endif + archive_entry_set_size(e, 987456321); + archive_entry_copy_sourcepath(e, "source2"); + archive_entry_set_symlink(e, "symlinkpath"); + archive_entry_set_uid(e, 93); + archive_entry_set_uname(e, "username"); + archive_entry_acl_clear(e); + archive_entry_xattr_clear(e); + + /* Clone should still have same contents. */ + assertEqualInt(archive_entry_atime(e2), 13579); + assertEqualInt(archive_entry_atime_nsec(e2), 24680); + assertEqualInt(archive_entry_birthtime(e2), 13779); + assertEqualInt(archive_entry_birthtime_nsec(e2), 24990); + assertEqualInt(archive_entry_ctime(e2), 13580); + assertEqualInt(archive_entry_ctime_nsec(e2), 24681); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_dev(e2), 235); +#endif + archive_entry_fflags(e2, &set, &clear); + assertEqualInt(clear, 0xAA); + assertEqualInt(set, 0x55); + assertEqualInt(archive_entry_gid(e2), 204); + assertEqualString(archive_entry_gname(e2), "group"); + assertEqualString(archive_entry_hardlink(e2), "hardlinkname"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_ino(e2), 8593); +#endif + assertEqualInt(archive_entry_mode(e2), 0123456); + assertEqualInt(archive_entry_mtime(e2), 13581); + assertEqualInt(archive_entry_mtime_nsec(e2), 24682); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_nlink(e2), 736); +#endif + assertEqualString(archive_entry_pathname(e2), "path"); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_rdev(e2), 532); +#endif + assertEqualInt(archive_entry_size(e2), 987654321); + assertEqualString(archive_entry_sourcepath(e2), "source"); + assertEqualString(archive_entry_symlink(e2), "symlinkname"); + assertEqualInt(archive_entry_uid(e2), 83); + assertEqualString(archive_entry_uname(e2), "user"); +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("ACL held by clone of archive_entry"); +#else + /* Verify ACL was unchanged. */ + assertEqualInt(4, c = archive_entry_acl_reset(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); + /* First three are standard permission bits. */ + assertEqualInt(0, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + assertEqualInt(permset, 4); + assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER_OBJ); + assertEqualInt(qual, -1); + assertEqualString(name, NULL); + assertEqualInt(0, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + assertEqualInt(permset, 5); + assertEqualInt(tag, ARCHIVE_ENTRY_ACL_GROUP_OBJ); + assertEqualInt(qual, -1); + assertEqualString(name, NULL); + assertEqualInt(0, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + assertEqualInt(permset, 6); + assertEqualInt(tag, ARCHIVE_ENTRY_ACL_OTHER); + assertEqualInt(qual, -1); + assertEqualString(name, NULL); + /* Fourth is custom one. */ + assertEqualInt(0, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS); + assertEqualInt(permset, ARCHIVE_ENTRY_ACL_READ); + assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER); + assertEqualInt(qual, 77); + assertEqualString(name, "user77"); + assertEqualInt(1, archive_entry_acl_next(e2, + ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + &type, &permset, &tag, &qual, &name)); + assertEqualInt(type, 0); + assertEqualInt(permset, 0); + assertEqualInt(tag, 0); + assertEqualInt(qual, -1); + assertEqualString(name, NULL); +#endif +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("xattr preserved in archive_entry copy"); +#else + /* Verify xattr was unchanged. */ + assertEqualInt(1, archive_entry_xattr_reset(e2)); +#endif + + /* Release clone. */ + archive_entry_free(e2); + + /* + * Test clear() implementation. + */ + archive_entry_clear(e); + assertEqualInt(archive_entry_atime(e), 0); + assertEqualInt(archive_entry_atime_nsec(e), 0); + assertEqualInt(archive_entry_birthtime(e), 0); + assertEqualInt(archive_entry_birthtime_nsec(e), 0); + assertEqualInt(archive_entry_ctime(e), 0); + assertEqualInt(archive_entry_ctime_nsec(e), 0); + assertEqualInt(archive_entry_dev(e), 0); + archive_entry_fflags(e, &set, &clear); + assertEqualInt(clear, 0); + assertEqualInt(set, 0); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_filetype(e), 0); +#endif + assertEqualInt(archive_entry_gid(e), 0); + assertEqualString(archive_entry_gname(e), NULL); + assertEqualString(archive_entry_hardlink(e), NULL); + assertEqualInt(archive_entry_ino(e), 0); + assertEqualInt(archive_entry_mode(e), 0); + assertEqualInt(archive_entry_mtime(e), 0); + assertEqualInt(archive_entry_mtime_nsec(e), 0); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_nlink(e), 0); +#endif + assertEqualString(archive_entry_pathname(e), NULL); + assertEqualInt(archive_entry_rdev(e), 0); + assertEqualInt(archive_entry_size(e), 0); + assertEqualString(archive_entry_symlink(e), NULL); + assertEqualInt(archive_entry_uid(e), 0); + assertEqualString(archive_entry_uname(e), NULL); + /* ACLs should be cleared. */ + assertEqualInt(archive_entry_acl_count(e, ARCHIVE_ENTRY_ACL_TYPE_ACCESS), 0); + assertEqualInt(archive_entry_acl_count(e, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT), 0); + /* Extended attributes should be cleared. */ + assertEqualInt(archive_entry_xattr_count(e), 0); + + /* + * Test archive_entry_copy_stat(). + */ + memset(&st, 0, sizeof(st)); + /* Set all of the standard 'struct stat' fields. */ + st.st_atime = 456789; + st.st_ctime = 345678; + st.st_dev = 123; + st.st_gid = 34; + st.st_ino = 234; + st.st_mode = 077777; + st.st_mtime = 234567; + st.st_nlink = 345; + st.st_size = 123456789; + st.st_uid = 23; +#ifdef __FreeBSD__ + /* On FreeBSD, high-res timestamp data should come through. */ + st.st_atimespec.tv_nsec = 6543210; + st.st_ctimespec.tv_nsec = 5432109; + st.st_mtimespec.tv_nsec = 3210987; + st.st_birthtimespec.tv_nsec = 7459386; +#endif + /* Copy them into the entry. */ + archive_entry_copy_stat(e, &st); + /* Read each one back separately and compare. */ + assertEqualInt(archive_entry_atime(e), 456789); + assertEqualInt(archive_entry_ctime(e), 345678); + assertEqualInt(archive_entry_dev(e), 123); + assertEqualInt(archive_entry_gid(e), 34); + assertEqualInt(archive_entry_ino(e), 234); + assertEqualInt(archive_entry_mode(e), 077777); + assertEqualInt(archive_entry_mtime(e), 234567); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(archive_entry_nlink(e), 345); +#endif + assertEqualInt(archive_entry_size(e), 123456789); + assertEqualInt(archive_entry_uid(e), 23); +#if __FreeBSD__ + /* On FreeBSD, high-res timestamp data should come through. */ + assertEqualInt(archive_entry_atime_nsec(e), 6543210); + assertEqualInt(archive_entry_ctime_nsec(e), 5432109); + assertEqualInt(archive_entry_mtime_nsec(e), 3210987); + assertEqualInt(archive_entry_birthtime_nsec(e), 7459386); +#endif + + /* + * Test archive_entry_stat(). + */ + /* First, clear out any existing stat data. */ + memset(&st, 0, sizeof(st)); + archive_entry_copy_stat(e, &st); + /* Set a bunch of fields individually. */ + archive_entry_set_atime(e, 456789, 321); + archive_entry_set_ctime(e, 345678, 432); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_dev(e, 123); +#endif + archive_entry_set_gid(e, 34); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_ino(e, 234); +#endif + archive_entry_set_mode(e, 012345); + archive_entry_set_mode(e, 012345); + archive_entry_set_mtime(e, 234567, 543); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_nlink(e, 345); +#endif + archive_entry_set_size(e, 123456789); + archive_entry_set_uid(e, 23); + /* Retrieve a stat structure. */ + assert((pst = archive_entry_stat(e)) != NULL); + /* Check that the values match. */ + assertEqualInt(pst->st_atime, 456789); + assertEqualInt(pst->st_ctime, 345678); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(pst->st_dev, 123); +#endif + assertEqualInt(pst->st_gid, 34); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(pst->st_ino, 234); +#endif + assertEqualInt(pst->st_mode, 012345); + assertEqualInt(pst->st_mtime, 234567); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + assertEqualInt(pst->st_nlink, 345); +#endif + assertEqualInt(pst->st_size, 123456789); + assertEqualInt(pst->st_uid, 23); +#ifdef __FreeBSD__ + /* On FreeBSD, high-res timestamp data should come through. */ + assertEqualInt(pst->st_atimespec.tv_nsec, 321); + assertEqualInt(pst->st_ctimespec.tv_nsec, 432); + assertEqualInt(pst->st_mtimespec.tv_nsec, 543); +#endif + + /* Changing any one value should update struct stat. */ + archive_entry_set_atime(e, 456788, 0); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_atime, 456788); + archive_entry_set_ctime(e, 345677, 431); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_ctime, 345677); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_dev(e, 122); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_dev, 122); +#endif + archive_entry_set_gid(e, 33); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_gid, 33); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_ino(e, 233); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_ino, 233); +#endif + archive_entry_set_mode(e, 012344); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_mode, 012344); + archive_entry_set_mtime(e, 234566, 542); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_mtime, 234566); +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_nlink(e, 344); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_nlink, 344); +#endif + archive_entry_set_size(e, 123456788); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_size, 123456788); + archive_entry_set_uid(e, 22); + assert((pst = archive_entry_stat(e)) != NULL); + assertEqualInt(pst->st_uid, 22); + /* We don't need to check high-res fields here. */ + + /* + * Test dev/major/minor interfaces. Setting 'dev' or 'rdev' + * should change the corresponding major/minor values, and + * vice versa. + * + * The test here is system-specific because it assumes that + * makedev(), major(), and minor() are defined in sys/stat.h. + * I'm not too worried about it, though, because the code is + * simple. If it works on FreeBSD, it's unlikely to be broken + * anywhere else. Note: The functionality is present on every + * platform even if these tests only run some places; + * libarchive's more extensive configuration logic should find + * the necessary definitions on every platform. + */ +#if __FreeBSD__ +#if ARCHIVE_VERSION_NUMBER >= 1009000 + archive_entry_set_dev(e, 0x12345678); + assertEqualInt(archive_entry_devmajor(e), major(0x12345678)); + assertEqualInt(archive_entry_devminor(e), minor(0x12345678)); + assertEqualInt(archive_entry_dev(e), 0x12345678); + archive_entry_set_devmajor(e, 0xfe); + archive_entry_set_devminor(e, 0xdcba98); + assertEqualInt(archive_entry_devmajor(e), 0xfe); + assertEqualInt(archive_entry_devminor(e), 0xdcba98); + assertEqualInt(archive_entry_dev(e), makedev(0xfe, 0xdcba98)); + archive_entry_set_rdev(e, 0x12345678); + assertEqualInt(archive_entry_rdevmajor(e), major(0x12345678)); + assertEqualInt(archive_entry_rdevminor(e), minor(0x12345678)); + assertEqualInt(archive_entry_rdev(e), 0x12345678); + archive_entry_set_rdevmajor(e, 0xfe); + archive_entry_set_rdevminor(e, 0xdcba98); + assertEqualInt(archive_entry_rdevmajor(e), 0xfe); + assertEqualInt(archive_entry_rdevminor(e), 0xdcba98); + assertEqualInt(archive_entry_rdev(e), makedev(0xfe, 0xdcba98)); +#endif +#endif + + /* + * Exercise the character-conversion logic, if we can. + */ + if (NULL == setlocale(LC_ALL, LOCALE_DE)) { + skipping("Can't exercise charset-conversion logic without" + " a suitable locale."); + } else { + /* A filename that cannot be converted to wide characters. */ + archive_entry_copy_pathname(e, "abc\314\214mno\374xyz"); + failure("Converting invalid chars to Unicode should fail."); + assert(NULL == archive_entry_pathname_w(e)); + //failure("Converting invalid chars to UTF-8 should fail."); + //assert(NULL == archive_entry_pathname_utf8(e)); + + /* A group name that cannot be converted. */ + archive_entry_copy_gname(e, "abc\314\214mno\374xyz"); + failure("Converting invalid chars to Unicode should fail."); + assert(NULL == archive_entry_gname_w(e)); + + /* A user name that cannot be converted. */ + archive_entry_copy_uname(e, "abc\314\214mno\374xyz"); + failure("Converting invalid chars to Unicode should fail."); + assert(NULL == archive_entry_uname_w(e)); + + /* A hardlink target that cannot be converted. */ + archive_entry_copy_hardlink(e, "abc\314\214mno\374xyz"); + failure("Converting invalid chars to Unicode should fail."); + assert(NULL == archive_entry_hardlink_w(e)); + + /* A symlink target that cannot be converted. */ + archive_entry_copy_symlink(e, "abc\314\214mno\374xyz"); + failure("Converting invalid chars to Unicode should fail."); + assert(NULL == archive_entry_symlink_w(e)); + } + + l = 0x12345678L; + wc = (wchar_t)l; /* Wide character too big for UTF-8. */ + if (NULL == setlocale(LC_ALL, "C") || (long)wc != l) { + skipping("Testing charset conversion failure requires 32-bit wchar_t and support for \"C\" locale."); + } else { + /* + * Build the string L"xxx\U12345678yyy\u5678zzz" without + * using C99 \u#### syntax, which isn't uniformly + * supported. (GCC 3.4.6, for instance, defaults to + * "c89 plus GNU extensions.") + */ + wcscpy(wbuff, L"xxxAyyyBzzz"); + wbuff[3] = (wchar_t)0x12345678; + wbuff[7] = (wchar_t)0x5678; + /* A wide filename that cannot be converted to narrow. */ + archive_entry_copy_pathname_w(e, wbuff); + failure("Converting wide characters from Unicode should fail."); + assertEqualString(NULL, archive_entry_pathname(e)); + } + + /* Release the experimental entry. */ + archive_entry_free(e); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_entry_strmode.c b/Utilities/cmlibarchive/libarchive/test/test_entry_strmode.c new file mode 100644 index 000000000..d262ce25a --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_entry_strmode.c @@ -0,0 +1,71 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_entry_strmode.c,v 1.1 2008/01/01 22:28:04 kientzle Exp $"); + +DEFINE_TEST(test_entry_strmode) +{ + struct archive_entry *entry; + + assert((entry = archive_entry_new()) != NULL); + + archive_entry_set_mode(entry, AE_IFREG | 0642); + assertEqualString(archive_entry_strmode(entry), "-rw-r---w- "); + + /* Regular file + hardlink still shows as regular file. */ + archive_entry_set_mode(entry, AE_IFREG | 0644); + archive_entry_set_hardlink(entry, "link"); + assertEqualString(archive_entry_strmode(entry), "-rw-r--r-- "); + + archive_entry_set_mode(entry, 0640); + archive_entry_set_hardlink(entry, "link"); + assertEqualString(archive_entry_strmode(entry), "hrw-r----- "); + archive_entry_set_hardlink(entry, NULL); + + archive_entry_set_mode(entry, AE_IFDIR | 0777); + assertEqualString(archive_entry_strmode(entry), "drwxrwxrwx "); + + archive_entry_set_mode(entry, AE_IFBLK | 03642); + assertEqualString(archive_entry_strmode(entry), "brw-r-S-wT "); + + archive_entry_set_mode(entry, AE_IFCHR | 05777); + assertEqualString(archive_entry_strmode(entry), "crwsrwxrwt "); + + archive_entry_set_mode(entry, AE_IFSOCK | 0222); + assertEqualString(archive_entry_strmode(entry), "s-w--w--w- "); + + archive_entry_set_mode(entry, AE_IFIFO | 0444); + assertEqualString(archive_entry_strmode(entry), "pr--r--r-- "); + + archive_entry_set_mode(entry, AE_IFLNK | 04000); + assertEqualString(archive_entry_strmode(entry), "l--S------ "); + + archive_entry_acl_add_entry(entry, ARCHIVE_ENTRY_ACL_TYPE_ACCESS, + 0007, ARCHIVE_ENTRY_ACL_GROUP, 78, "group78"); + assertEqualString(archive_entry_strmode(entry), "l--S------+"); + + /* Release the experimental entry. */ + archive_entry_free(entry); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_extattr_freebsd.c b/Utilities/cmlibarchive/libarchive/test/test_extattr_freebsd.c new file mode 100644 index 000000000..023c9fc88 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_extattr_freebsd.c @@ -0,0 +1,174 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +#if defined(__FreeBSD__) && __FreeBSD__ > 4 +#include +#endif + +/* + * Verify extended attribute restore-to-disk. This test is FreeBSD-specific. + */ + +DEFINE_TEST(test_extattr_freebsd) +{ +#if !defined(__FreeBSD__) + skipping("FreeBSD-specific extattr restore test"); +#elif __FreeBSD__ < 5 + skipping("extattr restore supported only on FreeBSD 5.0 and later"); +#else + char buff[64]; + const char *xname; + const void *xval; + size_t xsize; + struct stat st; + struct archive *a; + struct archive_entry *ae; + int n, fd; + int extattr_privilege_bug = 0; + + /* + * First, do a quick manual set/read of an extended attribute + * to verify that the local filesystem does support it. If it + * doesn't, we'll simply skip the remaining tests. + */ + /* Create a test file and try to set an ACL on it. */ + fd = open("pretest", O_RDWR | O_CREAT, 0777); + failure("Could not create test file?!"); + if (!assert(fd >= 0)) + return; + + errno = 0; + n = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, "testattr", "1234", 4); + if (n != 4 && errno == EOPNOTSUPP) { + close(fd); + skipping("extattr tests require that extattr support be enabled on the filesystem"); + return; + } + failure("extattr_set_fd(): errno=%d (%s)", errno, strerror(errno)); + assertEqualInt(4, n); + close(fd); + + /* + * Repeat the above, but with file permissions set to 0000. + * This should work (extattr_set_fd() should follow fd + * permissions, not file permissions), but is known broken on + * some versions of FreeBSD. + */ + fd = open("pretest2", O_RDWR | O_CREAT, 00000); + failure("Could not create test file?!"); + if (!assert(fd >= 0)) + return; + + n = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, "testattr", "1234", 4); + if (n != 4) { + skipping("Restoring xattr to an unwritable file seems to be broken on this platform"); + extattr_privilege_bug = 1; + } + close(fd); + + /* Create a write-to-disk object. */ + assert(NULL != (a = archive_write_disk_new())); + archive_write_disk_set_options(a, + ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_XATTR); + + /* Populate an archive entry with an extended attribute. */ + ae = archive_entry_new(); + assert(ae != NULL); + archive_entry_set_pathname(ae, "test0"); + archive_entry_set_mtime(ae, 123456, 7890); + archive_entry_set_size(ae, 0); + archive_entry_set_mode(ae, 0755); + archive_entry_xattr_add_entry(ae, "user.foo", "12345", 5); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Another entry; similar but with mode = 0. */ + ae = archive_entry_new(); + assert(ae != NULL); + archive_entry_set_pathname(ae, "test1"); + archive_entry_set_mtime(ae, 12345678, 7890); + archive_entry_set_size(ae, 0); + archive_entry_set_mode(ae, 0); + archive_entry_xattr_add_entry(ae, "user.bar", "123456", 6); + if (extattr_privilege_bug) + /* If the bug is here, write_header will return warning. */ + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_header(a, ae)); + else + assertEqualIntA(a, ARCHIVE_OK, + archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Close the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* Verify the data on disk. */ + assertEqualInt(0, stat("test0", &st)); + assertEqualInt(st.st_mtime, 123456); + /* Verify extattr */ + n = extattr_get_file("test0", EXTATTR_NAMESPACE_USER, + "foo", buff, sizeof(buff)); + if (assertEqualInt(n, 5)) { + buff[n] = '\0'; + assertEqualString(buff, "12345"); + } + + /* Verify the data on disk. */ + assertEqualInt(0, stat("test1", &st)); + assertEqualInt(st.st_mtime, 12345678); + /* Verify extattr */ + n = extattr_get_file("test1", EXTATTR_NAMESPACE_USER, + "bar", buff, sizeof(buff)); + if (extattr_privilege_bug) { + /* If we have the bug, the extattr won't have been written. */ + assertEqualInt(n, -1); + } else { + if (assertEqualInt(n, 6)) { + buff[n] = '\0'; + assertEqualString(buff, "123456"); + } + } + + /* Use libarchive APIs to read the file back into an entry and + * verify that the extattr was read correctly. */ + assert((a = archive_read_disk_new()) != NULL); + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_pathname(ae, "test0"); + assertEqualInt(ARCHIVE_OK, + archive_read_disk_entry_from_file(a, ae, -1, NULL)); + assertEqualInt(1, archive_entry_xattr_reset(ae)); + assertEqualInt(ARCHIVE_OK, + archive_entry_xattr_next(ae, &xname, &xval, &xsize)); + assertEqualString(xname, "user.foo"); + assertEqualInt(xsize, 5); + assertEqualMem(xval, "12345", xsize); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + archive_entry_free(ae); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_fuzz.c b/Utilities/cmlibarchive/libarchive/test/test_fuzz.c new file mode 100644 index 000000000..1860b4deb --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_fuzz.c @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_fuzz.c,v 1.1 2008/12/06 07:08:08 kientzle Exp $"); + +/* + * This was inspired by an ISO fuzz tester written by Michal Zalewski + * and posted to the "vulnwatch" mailing list on March 17, 2005: + * http://seclists.org/vulnwatch/2005/q1/0088.html + * + * This test simply reads each archive image into memory, pokes + * random values into it and runs it through libarchive. It tries + * to damage about 1% of each file and repeats the exercise 100 times + * with each file. + * + * Unlike most other tests, this test does not verify libarchive's + * responses other than to ensure that libarchive doesn't crash. + * + * Due to the deliberately random nature of this test, it may be hard + * to reproduce failures. Because this test deliberately attempts to + * induce crashes, there's little that can be done in the way of + * post-failure diagnostics. + */ + +/* Because this works for any archive, I can just re-use the archives + * developed for other tests. I've not included all of the compressed + * archives here, though; I don't want to spend all of my test time + * testing zlib and bzlib. */ +static const char * +files[] = { + "test_fuzz_1.iso", + "test_compat_bzip2_1.tbz", + "test_compat_gtar_1.tar", + "test_compat_tar_hardlink_1.tar", + "test_compat_zip_1.zip", + "test_read_format_gtar_sparse_1_17_posix10_modified.tar", + "test_read_format_tar_empty_filename.tar", + "test_read_format_zip.zip", + NULL +}; + +#define UnsupportedCompress(r, a) \ + (r != ARCHIVE_OK && \ + (strcmp(archive_error_string(a), \ + "Unrecognized archive format") == 0 && \ + archive_compression(a) == ARCHIVE_COMPRESSION_NONE)) + +DEFINE_TEST(test_fuzz) +{ + const char **filep; + const void *blk; + size_t blk_size; + off_t blk_offset; + + for (filep = files; *filep != NULL; ++filep) { + struct archive_entry *ae; + struct archive *a; + char *rawimage, *image; + size_t size; + int i; + + extract_reference_file(*filep); + rawimage = slurpfile(&size, *filep); + assert(rawimage != NULL); + image = malloc(size); + assert(image != NULL); + srand((unsigned)time(NULL)); + + for (i = 0; i < 100; ++i) { + FILE *f; + int j, numbytes; + + /* Fuzz < 1% of the bytes in the archive. */ + memcpy(image, rawimage, size); + numbytes = (int)(rand() % (size / 100)); + for (j = 0; j < numbytes; ++j) + image[rand() % size] = (char)rand(); + + /* Save the messed-up image to a file. + * If we crash, that file will be useful. */ + f = fopen("after.test.failure.send.this.file." + "to.libarchive.maintainers.with.system.details", "wb"); + fwrite(image, 1, (size_t)size, f); + fclose(f); + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_format_all(a)); + + if (0 == archive_read_open_memory(a, image, size)) { + while(0 == archive_read_next_header(a, &ae)) { + while (0 == archive_read_data_block(a, + &blk, &blk_size, &blk_offset)) + continue; + } + archive_read_close(a); + archive_read_finish(a); + } + } + free(image); + free(rawimage); + } +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_fuzz_1.iso.uu b/Utilities/cmlibarchive/libarchive/test/test_fuzz_1.iso.uu new file mode 100644 index 000000000..c7a7edb8c --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_fuzz_1.iso.uu @@ -0,0 +1,26993 @@ +$FreeBSD: src/lib/libarchive/test/test_fuzz_1.iso.uu,v 1.1 2008/12/06 07:08:08 kientzle Exp $ +begin 644 test_fuzz_1.iso +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````!0T0P,#$!`$9R965"4T0@("`@("`@("`@("`@("`@("`@("`@ +M("`@0T123TT@("`@("`@("`@("`@("`@("`@("`@("`@("```````````%$" +M``````)1```````````````````````````````````````````!```!`0`` +M`0`("`"B"``````(HA0`````````````%@`````B`!P````````<``@````` +M"`!L"Q8)#`W@`@```0```0$`("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@34M) +M4T]&4R!)4T\@.38V,"](1E,@1DE,15-94U1%32!"54E,1$52("8@0T1214-/ +M4D0@0T0M4B]$5D0@0U)%051/4B`H0RD@,3DY,R!%+EE/54Y'1$%,12`H0RD@ +M,3DY-R!*+E!%05)33TXO2BY30TA)3$Q)3D<@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`R,#`X,3$R,C`Y,3(Q,S`PX#(P,#@Q,3(R,#DQ,C$S,##@ +M,#`P,#`P,#`P,#`P,#`P,``R,#`X,3$R,C`Y,3(Q,S`PX`$`("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````)#1#`P,0$``$8`<@!E +M`&4`0@!3`$0`(``@`"``(``@`"``(``@`"``0P!$`%(`3P!-`"``(``@`"`` +M(``@`"``(``@`"``(```````````40(``````E$E+T4````````````````` +M``````````````````````$```$!```!``@(`'()``````ER&``````````` +M```:`````"(`[@```````.X`"``````(`&P+%@D,#>`"```!```!`0``(``@ +M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"`` +M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@ +M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"`` +M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@ +M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"`` +M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@ +M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"`` +M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@ +M`"``(``@`"``(``@`"``(``@`"``30!+`$D`4P!/`$8`4P`@`$D`4P!/`"`` +M.0`V`#8`,`!?`$@`1@!3`"``1@!)`$P`10!3`%D`4P!4`$4`30`@`$(`50!) +M`$P`1`!%`%(`(``F`"``0P!$`%(`10!#`$\`4@!$`"``0P!$`"T`4@!?`$0` +M5@!$`"``0P!2`$4`00`@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@ +M`"``(```(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"```"`` +M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`#(P,#@Q,3(R,#DQ +M,C$S,##@,C`P.#$Q,C(P.3$R,3,P,.`P,#`P,#`P,#`P,#`P,#`P`#(P,#@Q +M,3(R,#DQ,C$S,##@`0`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(``````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````_T-$,#`Q`0`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!-2TD@4V%T($YO=B`R +M,B`P.3HQ,CHQ,R`R,#`X"FUK:7-O9G,@,BXP,2`M52`M4B`M2B`M;R!C9"YI +M`$$` +M`0!8````'P!!``$`4@```"``00`!`$P````A`$$``0!&````(@!!``$`0``` +M`",`00`!`#H````D`$$``0`T````)0!!``$`+@```"8`00`!`"@````G`$$` +M`0#E````*`!!``$`(P```"H`00`!`-T````K`$$``0#7````+`!!``$`T0`` +M`"T`00`!`,L````N`$$``0#%````+P!!``$`OP```#``00`!`+D````Q`$$` +M`0"S````,@!!``$`K0```#,`00`!`*<````T`$$``0"A````-0!!``$`FP`` +M`#8`00`!`)4````W`$$``0"/````.`!!``$`B0```#D`00`!`(,````Z`$$` +M`0!]````.P!!``$`=P```#P`00`!`'$````]`$$``0!K````/@!!``$`90`` +M`#\`00`!`%\```!``$$``0!9````00!!``$`4P```$(`00`!`$T```!#`$$` +M`0!'````1`!!``$`00```$4`00`!`#L```!&`$$``0`U````1P!!``$`+P`` +M`$@`00`!`"D```!)`$$``0#F````2@!!``$`)````$L`00`!`-X```!,`$$` +M`0#8````30!!``$`T@```$X`00`!`,P```!/`$$``0#&````4`!!``$`P``` +M`%$`00`!`+H```!2`$$``0"T````4P!!``$`K@```%0`00`!`*@```!5`$$` +M`0"B````5@!!``$`G````%<`00`!`)8```!8`$$``0"0````60!!``$`B@`` +M`%H`00`!`(0```!;`$$``0!^````7`!!``$`>````%T`00`!`'(```!>`$$` +M`0!L````7P!!``$`9@```&``00`!`&````!A`$$``0!:````8@!!``$`5``` +M`&,`00`!`$X```!D`$$``0!(````90!!``$`0@```&8`00`!`#P```!G`$$` +M`0`V````:`!!``$`,````&D`00`!`"H```!J`$$``0#G````:P!!``$`)0`` +M`&P`00`!`-\```!M`$$``0#9````;@!!``$`TP```&\`00`!`,T```!P`$$` +M`0#'````<0!!``$`P0```'(`00`!`+L```!S`$$``0"U````=`!!``$`KP`` +M`'4`00`!`*D```!V`$$``0"C````=P!!``$`G0```'@`00`!`)<```!Y`$$` +M`0"1````>@!!``$`BP```'L`00`!`(4```!\`$$``0!_````?0!!``$`>0`` +M`'X`00`!`',```!_`$$``0!M````@`!!``$`9P```($`00`!`&$```""`$$` +M`0!;````@P!!``$`50```(0`00`!`$\```"%`$$``0!)````A@!!``$`0P`` +M`(<`00`!`#T```"(`$$``0`W````B0!!``$`,0```(H`00`!`"L```"+`$$` +M`0#H````C`!!``$`)@```(T`00`!`.````".`$$``0#:````CP!!``$`U``` +M`)``00`!`,X```"1`$$``0#(````D@!!``$`P@```),`00`!`+P```"4`$$` +M`0"V````E0!!``$`L````)8`00`!`*H```"7`$$``0"D````F`!!``$`G@`` +M`)D`00`!`)@```":`$$``0"2````FP!!``$`C````)P`00`!`(8```"=`$$` +M`0"`````G@!!``$`>@```)\`00`!`'0```"@`$$``0!N````H0!!``$`:``` +M`*(`00`!`&(```"C`$$``0!<````I`!!``$`5@```*4`00`!`%````"F`$$` +M`0!*````IP!!``$`1````*@`00`!`#X```"I`$$``0`X````J@!!``$`,@`` +M`*L`00`!`"P```"L`$$````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````!`````!P``0```0````#B``%!`!\`````Z0`!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!00`(`````!X``7)R7VUO=F5D`0`` +M``#C``)!`!\`````ZP`#04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M00`!`````"$`!$$`!`````#A``1!,#`P!`````#;``1!,#`Q!`````#5``1! +M,#`R!`````#/``1!,#`S!`````#)``1!,#`T!`````##``1!,#`U!`````"] +M``1!,#`V!`````"W``1!,#`W!`````"Q``1!,#`X!`````"K``1!,#`Y!``` +M``"E``1!,#!!!`````"?``1!,#!"!`````"9``1!,#!#!`````"3``1!,#!$ +M!`````"-``1!,#!%!`````"'``1!,#!&!`````"!``1!,#!'!`````![``1! +M,#!(!`````!U``1!,#!)!`````!O``1!,#!*!`````!I``1!,#!+!`````!C +M``1!,#!,!`````!=``1!,#!-!`````!7``1!,#!.!`````!1``1!,#!/!``` +M``!+``1!,#!0!`````!%``1!,#!1!``````_``1!,#!2!``````Y``1!,#!3 +M!``````S``1!,#!4!``````M``1!,#!5!``````G``1!,#!6`0````#D``5! +M`!\`````[0`&04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!00`!```` +M`"(`!T$``0````#<``E!``$`````U@`*00`!`````-``"T$``0````#*``Q! +M``$`````Q``-00`!`````+X`#D$``0````"X``]!``$`````L@`000`!```` +M`*P`$4$``0````"F`!)!``$`````H``300`!`````)H`%$$``0````"4`!5! +M``$`````C@`600`!`````(@`%T$``0````""`!A!``$`````?``900`!```` +M`'8`&D$``0````!P`!M!``$`````:@`<00`!`````&0`'4$``0````!>`!Y! +M``$`````6``?00`!`````%(`($$``0````!,`"%!``$`````1@`B00`!```` +M`$``(T$``0`````Z`"1!``$`````-``E00`!`````"X`)D$``0`````H`"=! +M``$`````Y0`H00`!`````",`*D$``0````#=`"M!``$`````UP`L00`!```` +M`-$`+4$``0````#+`"Y!``$`````Q0`O00`!`````+\`,$$``0````"Y`#%! +M``$`````LP`R00`!`````*T`,T$``0````"G`#1!``$`````H0`U00`!```` +M`)L`-D$``0````"5`#=!``$`````CP`X00`!`````(D`.4$``0````"#`#I! +M``$`````?0`[00`!`````'<`/$$``0````!Q`#U!``$`````:P`^00`!```` +M`&4`/T$``0````!?`$!!``$`````60!!00`!`````%,`0D$``0````!-`$-! +M``$`````1P!$00`!`````$$`14$``0`````[`$9!``$`````-0!'00`!```` +M`"\`2$$``0`````I`$E!``$`````Y@!*00`!`````"0`2T$``0````#>`$Q! +M``$`````V`!-00`!`````-(`3D$``0````#,`$]!``$`````Q@!000`!```` +M`,``44$``0````"Z`%)!``$`````M`!300`!`````*X`5$$``0````"H`%5! +M``$`````H@!600`!`````)P`5T$``0````"6`%A!``$`````D`!900`!```` +M`(H`6D$``0````"$`%M!``$`````?@!<00`!`````'@`74$``0````!R`%Y! +M``$`````;`!?00`!`````&8`8$$``0````!@`&%!``$`````6@!B00`!```` +M`%0`8T$``0````!.`&1!``$`````2`!E00`!`````$(`9D$``0`````\`&=! +M``$`````-@!H00`!`````#``:4$``0`````J`&I!``$`````YP!K00`!```` +M`"4`;$$``0````#?`&U!``$`````V0!N00`!`````-,`;T$``0````#-`'!! +M``$`````QP!Q00`!`````,$`$$``0````"7`'E! +M``$`````D0!Z00`!`````(L`>T$``0````"%`'Q!``$`````?P!]00`!```` +M`'D`?D$``0````!S`']!``$`````;0"`00`!`````&<`@4$``0````!A`()! +M``$`````6P"#00`!`````%4`A$$``0````!/`(5!``$`````20"&00`!```` +M`$,`AT$``0`````]`(A!``$`````-P")00`!`````#$`BD$``0`````K`(M! +M``$`````Z`",00`!`````"8`C4$``0````#@`(Y!``$`````V@"/00`!```` +M`-0`D$$``0````#.`)%!``$`````R`"200`!`````,(`DT$``0````"\`)1! +M``$`````M@"500`!`````+``ED$``0````"J`)=!``$`````I`"800`!```` +M`)X`F4$``0````"8`)I!``$`````D@";00`!`````(P`G$$``0````"&`)U! +M``$`````@`">00`!`````'H`GT$``0````!T`*!!``$`````;@"A00`!```` +M`&@`HD$``0````!B`*-!``$`````7`"D00`!`````%8`I4$``0````!0`*9! +M``$`````2@"G00`!`````$0`J$$``0`````^`*E!``$`````.`"J00`!```` +M`#(`JT$``0`````L`*Q!```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````0#N`````0````(`L`$```$``$&``+```00(`70$``'D``$$"`%X!``!Z``!! +M`@!?`0``>P``00(`8`$``'P``$$"`&$!``!]``!!`@!B`0``?@``00(`8P$` +M`'\``$$"`&0!``"```!!`@!E`0``@0``00(`9@$``((``$$"`&`$``)0``$$"`'D!``"5``!! +M`@!Z`0``E@``00(`>P$``)<``$$"`'P!``"8``!!`@!]`0``F0``00(`?@$` +M`)H``$$"`'\!``";``!!`@"``0``G```00(`@0$``)T``$$"`((!``">``!! +M`@"#`0``GP``00(`A`$``*```$$"`(4!``"A``!!`@"&`0``H@``00(`AP$` +M`*,``$$"`(@!``"D``!!`@")`0``I0``00(`B@$``*8``$$"`(L!``"G``!! +M`@",`0``J```00(`C0$``*D``$$"`(X!``"J``!!`@"/`0``JP``00(`D`$` +M`*P``$$"`)$!``"M``!!`@"2`0``K@``00(`DP$``*\``$$"`)0!``"P``!! +M`@"5`0``L0``00(`E@$``+(``$$"`)`0``N@``00(`GP$``+L``$$"`*`!``"\``!!`@"A`0``O0``00(`H@$` +M`+X``$$"`*,!``"_``!!`@"D`0``P```00(`I0$``,$``$$"`*8!``#"``!! +M`@"G`0``PP``00(`J`$``,0``$$"`*D!``#%``!!`@"J`0``Q@``00(`JP$` +M`,<``$$"`*P!``#(``!!`@"M`0``R0``00(`K@$``,H``$$"`*\!``#+``!! +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````$`````[@`!```"`````;```0!!@`````&W``$`00!! +M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$` +M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!! +M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00(````!L0`"`$&` +M`````;@``P!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!! +M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$` +M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!! +M`@````&R``0`08`````!N0`%`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$` +M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!! +M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$` +M00!!`$$`00!!`$$"`````;,`!@!!`@````&T``@`00(````!M0`)`$$"```` +M`;8`"@!!`@````#O``L`00(`````\``,`$$"`````/$`#0!!`@````#R``X` +M00(`````\P`/`$$"`````/0`$`!!`@````#U`!$`00(`````]@`2`$$"```` +M`/<`$P!!`@````#X`!0`00(`````^0`5`$$"`````/H`%@!!`@````#[`!<` +M00(`````_``8`$$"`````/T`&0!!`@````#^`!H`00(`````_P`;`$$"```` +M`0``'`!!`@````$!`!T`00(````!`@`>`$$"`````0,`'P!!`@````$$`"`` +M00(````!!0`A`$$"`````08`(@!!`@````$'`",`00(````!"``D`$$"```` +M`0D`)0!!`@````$*`"8`00(````!"P`G`$$"`````0P`*`!!`@````$-`"D` +M00(````!#@`J`$$"`````0\`*P!!`@````$0`"P`00(````!$0`M`$$"```` +M`1(`+@!!`@````$3`"\`00(````!%``P`$$"`````14`,0!!`@````$6`#(` +M00(````!%P`S`$$"`````1@`-`!!`@````$9`#4`00(````!&@`V`$$"```` +M`1L`-P!!`@````$<`#@`00(````!'0`Y`$$"`````1X`.@!!`@````$?`#L` +M00(````!(``\`$$"`````2$`/0!!`@````$B`#X`00(````!(P`_`$$"```` +M`20`0`!!`@````$E`$$`00(````!)@!"`$$"`````2<`0P!!`@````$H`$0` +M00(````!*0!%`$$"`````2H`1@!!`@````$K`$<`00(````!+`!(`$$"```` +M`2T`20!!`@````$N`$H`00(````!+P!+`$$"`````3``3`!!`@````$Q`$T` +M00(````!,@!.`$$"`````3,`3P!!`@````$T`%``00(````!-0!1`$$"```` +M`38`4@!!`@````$W`%,`00(````!.`!4`$$"`````3D`50!!`@````$Z`%8` +M00(````!.P!7`$$"`````3P`6`!!`@````$]`%D`00(````!/@!:`$$"```` +M`3\`6P!!`@````%``%P`00(````!00!=`$$"`````4(`7@!!`@````%#`%\` +M00(````!1`!@`$$"`````44`80!!`@````%&`&(`00(````!1P!C`$$"```` +M`4@`9`!!`@````%)`&4`00(````!2@!F`$$"`````4L`9P!!`@````%,`&@` +M00(````!30!I`$$"`````4X`:@!!`@````%/`&L`00(````!4`!L`$$"```` +M`5$`;0!!`@````%2`&X`00(````!4P!O`$$"`````50`<`!!`@````%5`'$` +M00(````!5@!R`$$"`````5<`0!!`@````%>`'H` +M00(````!7P![`$$"`````6``?`!!`@````%A`'T`00(````!8@!^`$$"```` +M`6,`?P!!`@````%D`(``00(````!90"!`$$"`````68`@@!!`@````%G`(,` +M00(````!:`"$`$$"`````6D`A0!!`@````%J`(8`00(````!:P"'`$$"```` +M`6P`B`!!`@````%M`(D`00(````!;@"*`$$"`````6\`BP!!`@````%P`(P` +M00(````!<0"-`$$"`````7(`C@!!`@````%S`(\`00(````!=`"0`$$"```` +M`74`D0!!`@````%V`)(`00(````!=P"3`$$"`````7@`E`!!`@````%Y`)4` +M00(````!>@"6`$$"`````7L`EP!!`@````%\`)@`00(````!?0"9`$$"```` +M`7X`F@!!`@````%_`)L`00(````!@`"<`$$"`````8$`G0!!`@````&"`)X` +M00(````!@P"?`$$"`````80`H`!!`@````&%`*$`00(````!A@"B`$$"```` +M`8<`HP!!`@````&(`*0`00(````!B0"E`$$"`````8H`I@!!`@````&+`*<` +M00(````!C`"H`$$"`````8T`J0!!`@````&.`*H`00(````!CP"K`$$"```` +M`9``K`!!`@````&1`*T`00(````!D@"N`$$"`````9,`KP!!`@````&4`+`` +M00(````!E0"Q`$$"`````98`L@!!`@````&7`+,`00(````!F`"T`$$"```` +M`9D`M0!!`@````&:`+8`00(````!FP"W`$$"`````9P`N`!!`@````&=`+D` +M00(````!G@"Z`$$"`````9\`NP!!`@````&@`+P`00(````!H0"]`$$"```` +M`:(`O@!!`@````&C`+\`00(````!I`#``$$"`````:4`P0!!`@````&F`,(` +M00(````!IP##`$$"`````:@`Q`!!`@````&I`,4`00(````!J@#&`$$"```` +M`:L`QP!!`@````&L`,@`00(````!K0#)`$$"`````:X`R@!!`@````&O`,L` +M00`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````"(`!P````````<``@`````"`!L"Q8)#`W@`@```0`` +M`0$`4U`'`;[O`%)2!0&!4%@D`>U!`````$'M!0````````7H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!#11P!N@$``````;H` +M`````````.T```````#M9@`<````````'``(``````@`;`L6"0P-X`(```$` +M``$!`5)2!0&!4%@D`>U!`````$'M!0````````7H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#B````````X@`(``````@` +M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M^`#I````````Z0`(``````@`;`L6"0P-X`(```$```$?04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!05)2!0&)3DV7`0%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04-%'`$= +M````````'0``````````L````````+!Z`!X````````>`!@`````&`!L"Q8) +M#`W@`@```0```0AR!L"Q8) +M#`W@;`L6"0P-X``````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````$Y-<@$`04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!05!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````9@`>````````'@`8`````!@`;`L6"0P-X`(```$` +M``$!`%)2!0&!4%@D`6U!`````$%M(P```````"/H`P`````#Z.@#``````/H +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`<````````'``(``````@` +M;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M!0````````7H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<``A```` +M````(0`(``````@`;`L6"0P-X`(```$```$!05)2!0')3DT&`0!!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>!2100!`'0`X0```````.$`"``````(`&P+%@D,#>`"```! +M```!!$$P,#``4E(%`T"`````````N@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`#; +M````````VP`(``````@`;`L6"0P-X`(```$```$$03`P,0!24@4!R4Y-!@$` +M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`-4```````#5``@`````"`!L"Q8) +M#`W@`@```0```01!,#`R`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2 +M100!`'0`SP```````,\`"``````(`&P+%@D,#>`"```!```!!$$P,#,`4E(% +M`T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`#)````````R0`(```` +M``@`;`L6"0P-X`(```$```$$03`P-`!24@4!R4Y-!@$`05!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@4D4$`0!T`,,```````##``@`````"`!L"Q8)#`W@`@```0```01! +M,#`U`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2100!`'0`O0`````` +M`+T`"``````(`&P+%@D,#>`"```!```!!$$P,#8`4E(%`T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X%)%!`$`=`"W````````MP`(``````@`;`L6"0P-X`(` +M``$```$$03`P-P!24@4!R4Y-!@$`05!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T +M`+$```````"Q``@`````"`!L"Q8)#`W@`@```0```01!,#`X`%)2!0')3DT& +M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>!2100!`'0`JP```````*L`"``````(`&P+ +M%@D,#>`"```!```!!$$P,#D`4E(%`T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX%)%!`$`=`"E````````I0`(``````@`;`L6"0P-X`(```$```$$03`P00!2 +M4@4!R4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`)\```````"?``@` +M````"`!L"Q8)#`W@`@```0```01!,#!"`%)2!0')3DT&`0!!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>!2100!`'0`F0```````)D`"``````(`&P+%@D,#>`"```!```! +M!$$P,$,`4E(%`T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`"3```` +M````DP`(``````@`;`L6"0P-X`(```$```$$03`P1`!24@4!R4Y-!@$`05!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@4D4$`0`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````!T`(T````` +M``"-``@`````"`!L"Q8)#`W@`@```0```01!,#!%`%)2!0')3DT&`0!!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>!2100!`'0`AP```````(<`"``````(`&P+%@D,#>`" +M```!```!!$$P,$8`4E(%`T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$` +M=`"!````````@0`(``````@`;`L6"0P-X`(```$```$$03`P1P!24@4!R4Y- +M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`'L```````![``@`````"`!L +M"Q8)#`W@`@```0```01!,#!(`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>!2100!`'0`=0```````'4`"``````(`&P+%@D,#>`"```!```!!$$P,$D` +M4E(%`T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`!O````````;P`( +M``````@`;`L6"0P-X`(```$```$$03`P2@!24@4!R4Y-!@$`05!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@4D4$`0!T`&D```````!I``@`````"`!L"Q8)#`W@`@```0`` +M`01!,#!+`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2100!`'0`8P`` +M`````&,`"``````(`&P+%@D,#>`"```!```!!$$P,$P`4E(%`T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`!=````````70`(``````@`;`L6"0P- +MX`(```$```$$03`P30!24@4!R4Y-!@$`05!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$ +M`0!T`%<```````!7``@`````"`!L"Q8)#`W@`@```0```01!,#!.`%)2!0') +M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2100!`'0`40```````%$`"``````( +M`&P+%@D,#>`"```!```!!$$P,$\`4E(%`T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X%)%!`$`=`!+````````2P`(``````@`;`L6"0P-X`(```$```$$03`P +M4`!24@4!R4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`$4```````!% +M``@`````"`!L"Q8)#`W@`@```0```01!,#!1`%)2!0')3DT&`0!!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>!2100!`'0`/P```````#\`"``````(`&P+%@D,#>`"```! +M```!!$$P,%(`4E(%`T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=``Y +M````````.0`(``````@`;`L6"0P-X`(```$```$$03`P4P!24@4!R4Y-!@$` +M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`#,````````S``@`````"`!L"Q8) +M#`W@`@```0```01!,#!4`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2 +M100!`'0`+0```````"T`"``````(`&P+%@D,#>`"```!```!!$$P,%4`4E(% +M`T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````'0`)P```````"<`"``````(`&P+%@D,#>`"```! +M```!!$$P,%8`4E(%`T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````9@`A```` +M````(0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A +M4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>!03`P!Z````````.@`;``B````````(@`(```` +M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!F`"(````````B``@`````"`!L"Q8)#`W@`@`` +M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`"$````````A``@````` +M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`",` +M```````C``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X``````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````&8`(P`` +M`````",`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`&8`(@```````"(`"``````(`&P+%@D,#>`"```!```!`0%24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`&P`)````````"0`"``````(`&P+%@D,#>`" +M```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````9@`D````````)``(``````@`;`L6"0P-X`(` +M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`C````````(P`(```` +M``@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;``E +M````````)0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````!F`"4` +M```````E``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!F`"0````````D``@`````"`!L"Q8)#`W@`@```0```0$!4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`"8````````F``@`````"`!L"Q8)#`W@ +M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````&8`)@```````"8`"``````(`&P+%@D,#>`" +M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`)0```````"4`"``` +M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@` +MNP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@0TP,`2<````````G```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````9@`G +M````````)P`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2 +M!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!)@```````"8`;``H````````*``( +M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````!F`"@````````H``@`````"`!L"Q8)#`W@ +M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`"<````````G``@` +M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L +M`"D````````I``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````&8` +M*0```````"D`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`&8`*````````"@`"``````(`&P+%@D,#>`"```!```!`0%2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`*@```````"H`"``````(`&P+%@D, +M#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````9@`J````````*@`(``````@`;`L6"0P- +MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`I````````*0`( +M``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M;``K````````*P`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!F +M`"L````````K``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!F`"H````````J``@`````"`!L"Q8)#`W@`@```0```0$! +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`"P````````L``@`````"`!L"Q8) +M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````&8`+````````"P`"``````(`&P+%@D, +M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`*P```````"L` +M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$` +M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`2T````````M```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M9@`M````````+0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$! +M`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!+````````"P`;``N```````` +M+@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````!F`"X````````N``@`````"`!L"Q8) +M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`"T````````M +M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!L`"\````````O``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308! +M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`&8`+P```````"\`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`&8`+@```````"X`"``````(`&P+%@D,#>`"```!```! +M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`,````````#``"``````(`&P+ +M%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````9@`P````````,``(``````@`;`L6 +M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`O```````` +M+P`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>``;``Q````````,0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT& +M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``!F`#$````````Q``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!F`#`````````P``@`````"`!L"Q8)#`W@`@```0`` +M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`#(````````R``@`````"`!L +M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````&8`,@```````#(`"``````(`&P+ +M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`,0`````` +M`#$`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y- +M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`3,````````S```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````9@`S````````,P`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$` +M``$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!,@```````#(`;``T```` +M````-``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````!F`#0````````T``@`````"`!L +M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`#,````` +M```S``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!L`#4````````U``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E. +M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````&8`-0```````#4`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`&8`-````````#0`"``````(`&P+%@D,#>`"```! +M```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`-@```````#8`"``````( +M`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````9@`V````````-@`(``````@` +M;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`U```` +M````-0`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>``;``W````````-P`(``````@`;`L6"0P-X`(```$```$!05)2!0&) +M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````!F`#<````````W``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!F`#8````````V``@`````"`!L"Q8)#`W@`@`` +M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`#@````````X``@````` +M"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX``````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````&8`.````````#@`"``````( +M`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`-P`` +M`````#<`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4! +MF4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`3D````````Y```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````9@`Y````````.0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(` +M``$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!.````````#@`;``Z +M````````.@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````!F`#H````````Z``@````` +M"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`#D` +M```````Y``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!L`#L````````[``@`````"`!L"Q8)#`W@`@```0```0%!4E(% +M`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````&8`.P```````#L`"``````(`&P+%@D,#>`"```!```!`0!24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`&8`.@```````#H`"``````(`&P+%@D,#>`" +M```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`/````````#P`"``` +M```(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````9@`\````````/``(```` +M``@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`[ +M````````.P`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>``;``]````````/0`(``````@`;`L6"0P-X`(```$```$!05)2 +M!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````!F`#T````````]``@`````"`!L"Q8)#`W@`@```0```0$`4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`#P````````\``@`````"`!L"Q8)#`W@ +M`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`#X````````^``@` +M````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X``````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````&8`/@```````#X`"``` +M```(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8` +M/0```````#T`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%2 +M4@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`3\````````_```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````9@`_````````/P`(``````@`;`L6"0P-X`(```$```$!`%)2 +M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P- +MX`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!/@```````#X` +M;`!`````````0``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!F`$````````!```@` +M````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F +M`#\````````_``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!L`$$```````!!``@`````"`!L"Q8)#`W@`@```0```0%! +M4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````&8`00```````$$`"``````(`&P+%@D,#>`"```!```!`0!2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`0````````$``"``````(`&P+%@D, +M#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`0@```````$(` +M"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````9@!"````````0@`( +M``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M9@!!````````00`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>``;`!#````````0P`(``````@`;`L6"0P-X`(```$```$! +M05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````!F`$,```````!#``@`````"`!L"Q8)#`W@`@```0```0$` +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`$(```````!"``@`````"`!L"Q8) +M#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`$0```````!$ +M``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X``````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````&8`1````````$0` +M"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`&8`0P```````$,`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```! +M`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`44```````!%```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````9@!%````````10`(``````@`;`L6"0P-X`(```$```$! +M`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6 +M"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!1``````` +M`$0`;`!&````````1@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT& +M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````!F`$8```````!& +M``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!F`$4```````!%``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!L`$<```````!'``@`````"`!L"Q8)#`W@`@```0`` +M`0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````&8`1P```````$<`"``````(`&P+%@D,#>`"```!```! +M`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`1@```````$8`"``````(`&P+ +M%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`2``````` +M`$@`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````9@!(```````` +M2``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>``9@!'````````1P`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>``;`!)````````20`(``````@`;`L6"0P-X`(```$` +M``$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````!F`$D```````!)``@`````"`!L"Q8)#`W@`@```0`` +M`0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`$@```````!(``@`````"`!L +M"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`$H````` +M``!*``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X``````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````&8`2@`````` +M`$H`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`&8`20```````$D`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````! +M```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`4L```````!+ +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````9@!+````````2P`(``````@`;`L6"0P-X`(```$` +M``$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@` +M;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!2@`` +M`````$H`;`!,````````3``(``````@`;`L6"0P-X`(```$```$!05)2!0&) +M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````!F`$P````` +M``!,``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!F`$L```````!+``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!L`$T```````!-``@`````"`!L"Q8)#`W@`@`` +M`0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````&8`30```````$T`"``````(`&P+%@D,#>`"```! +M```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`3````````$P`"``````( +M`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`3@`` +M`````$X`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````9@!.```` +M````3@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>``9@!-````````30`(``````@`;`L6"0P-X`(```$```$!`5)2!0&! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>``;`!/````````3P`(``````@`;`L6"0P-X`(` +M``$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!F`$\```````!/``@`````"`!L"Q8)#`W@`@`` +M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`$X```````!.``@````` +M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`%`` +M``````!0``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X``````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````&8`4``` +M`````%``"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`&8`3P```````$\`"``````(`&P+%@D,#>`"```!```!`0%24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`` +M```!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`5$````` +M``!1```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````9@!1````````40`(``````@`;`L6"0P-X`(` +M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8```` +M`!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P! +M4````````%``;`!2````````4@`(``````@`;`L6"0P-X`(```$```$!05)2 +M!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````!F`%(` +M``````!2``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!F`%$```````!1``@`````"`!L"Q8)#`W@`@```0```0$!4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`%,```````!3``@`````"`!L"Q8)#`W@ +M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````&8`4P```````%,`"``````(`&P+%@D,#>`" +M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`4@```````%(`"``` +M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P` +M5````````%0`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````9@!4 +M````````5``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>``9@!3````````4P`(``````@`;`L6"0P-X`(```$```$!`5)2 +M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!5````````50`(``````@`;`L6"0P- +MX`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````!F`%4```````!5``@`````"`!L"Q8)#`W@ +M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`%0```````!4``@` +M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L +M`%8```````!6``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````&8` +M5@```````%8`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`&8`50```````%4`"``````(`&P+%@D,#>`"```!```!`0%2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D, +M#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`5<` +M``````!7```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````9@!7````````5P`(``````@`;`L6"0P- +MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8 +M`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P`````` +M`"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!0 +M3`P!5@```````%8`;`!8````````6``(``````@`;`L6"0P-X`(```$```$! +M05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!F +M`%@```````!8``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!F`%<```````!7``@`````"`!L"Q8)#`W@`@```0```0$! +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`%D```````!9``@`````"`!L"Q8) +M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````&8`60```````%D`"``````(`&P+%@D, +M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`6````````%@` +M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`&P`6@```````%H`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$` +M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M9@!:````````6@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>``9@!9````````60`(``````@`;`L6"0P-X`(```$```$! +M`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!;````````6P`(``````@`;`L6 +M"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````!F`%L```````!;``@`````"`!L"Q8) +M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`%H```````!: +M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!L`%P```````!<``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308! +M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`&8`7````````%P`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`&8`6P```````%L`"``````(`&P+%@D,#>`"```!```! +M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+ +M%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP, +M`5T```````!=```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````9@!=````````70`(``````@`;`L6 +M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>```````` +M'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P`` +M`````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>!03`P!7````````%P`;`!>````````7@`(``````@`;`L6"0P-X`(```$` +M``$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``!F`%X```````!>``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!F`%T```````!=``@`````"`!L"Q8)#`W@`@```0`` +M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`%\```````!?``@`````"`!L +M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````&8`7P```````%\`"``````(`&P+ +M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`7@`````` +M`%X`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`&P`8````````&``"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y- +M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````9@!@````````8``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>``9@!?````````7P`(``````@`;`L6"0P-X`(```$` +M``$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!A````````80`(``````@` +M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````!F`&$```````!A``@`````"`!L +M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`&`````` +M``!@``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!L`&(```````!B``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E. +M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````&8`8@```````&(`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`&8`80```````&$`"``````(`&P+%@D,#>`"```! +M```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L````````` +M`&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M0TP,`6,```````!C```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````9@!C````````8P`(``````@` +M;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>```` +M````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M +M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>!03`P!8@```````&(`;`!D````````9``(``````@`;`L6"0P-X`(` +M``$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````!F`&0```````!D``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!F`&,```````!C``@`````"`!L"Q8)#`W@`@`` +M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`&4```````!E``@````` +M"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX``````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````&8`90```````&4`"``````( +M`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`9``` +M`````&0`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`&P`9@```````&8`"``````(`&P+%@D,#>`"```!```!`4%24@4! +MB4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````9@!F````````9@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>``9@!E````````90`(``````@`;`L6"0P-X`(` +M``$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!G````````9P`(```` +M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````!F`&<```````!G``@````` +M"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`&8` +M``````!F``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!L`&@```````!H``@`````"`!L"Q8)#`W@`@```0```0%!4E(% +M`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````&8`:````````&@`"``````(`&P+%@D,#>`"```!```!`0!24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`&8`9P```````&<`"``````(`&P+%@D,#>`" +M```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L````` +M`````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@0TP,`6D```````!I```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````9@!I````````:0`(```` +M``@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`> +M````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!```` +M`$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>!03`P!:````````&@`;`!J````````:@`(``````@`;`L6"0P- +MX`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````!F`&H```````!J``@`````"`!L"Q8)#`W@`@```0```0$`4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`&D```````!I``@`````"`!L"Q8)#`W@ +M`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`&L```````!K``@` +M````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X``````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````&8`:P```````&L`"``` +M```(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8` +M:@```````&H`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`&P`;````````&P`"``````(`&P+%@D,#>`"```!```!`4%2 +M4@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````9@!L````````;``(``````@`;`L6"0P-X`(```$```$!`%)2 +M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@!K````````:P`(``````@`;`L6"0P- +MX`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!M````````;0`( +M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!F`&T```````!M``@` +M````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F +M`&P```````!L``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!L`&X```````!N``@`````"`!L"Q8)#`W@`@```0```0%! +M4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````&8`;@```````&X`"``````(`&P+%@D,#>`"```!```!`0!2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`;0```````&T`"``````(`&P+%@D, +M#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L` +M`````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@0TP,`6\```````!O```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````9@!O````````;P`( +M``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U! +M`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>!03`P!;@```````&X`;`!P````````<``(``````@`;`L6 +M"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````!F`'````````!P``@`````"`!L"Q8)#`W@`@```0```0$` +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`&\```````!O``@`````"`!L"Q8) +M#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`'$```````!Q +M``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X``````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````&8`<0```````'$` +M"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`&8`<````````'``"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`&P`<@```````'(`"``````(`&P+%@D,#>`"```!```! +M`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````9@!R````````<@`(``````@`;`L6"0P-X`(```$```$! +M`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@!Q````````<0`(``````@`;`L6 +M"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!S```````` +MU!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````!F`',```````!S +M``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!F`'(```````!R``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!L`'0```````!T``@`````"`!L"Q8)#`W@`@```0`` +M`0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````&8`=````````'0`"``````(`&P+%@D,#>`"```!```! +M`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8``"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$````` +M`;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@0TP,`74```````!U```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````9@!U```````` +M=0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D +M`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>!03`P!=````````'0`;`!V````````=@`(``````@` +M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````!F`'8```````!V``@`````"`!L"Q8)#`W@`@```0`` +M`0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`'4```````!U``@`````"`!L +M"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`'<````` +M``!W``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X``````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````&8`=P`````` +M`'<`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`&8`=@```````'8`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`&P`>````````'@`"``````(`&P+%@D,#>`"```! +M```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````9@!X````````>``(``````@`;`L6"0P-X`(```$` +M``$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@!W````````=P`(``````@` +M;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!Y```` +M````>0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````!F`'D````` +M``!Y``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!F`'@```````!X``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!L`'H```````!Z``@`````"`!L"Q8)#`W@`@`` +M`0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````&8`>@```````'H`"``````(`&P+%@D,#>`"```! +M```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`>0```````'D`"``````( +M`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$` +M`````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@0TP,`7L```````![```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````9@![```` +M````>P`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A +M4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>!03`P!>@```````'H`;`!\````````?``(```` +M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!F`'P```````!\``@`````"`!L"Q8)#`W@`@`` +M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`'L```````![``@````` +M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`'T` +M``````!]``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X``````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````&8`?0`` +M`````'T`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`&8`?````````'P`"``````(`&P+%@D,#>`"```!```!`0%24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`&P`?@```````'X`"``````(`&P+%@D,#>`" +M```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````9@!^````````?@`(``````@`;`L6"0P-X`(` +M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@!]````````?0`(```` +M``@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!_ +M````````?P`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````!F`'\` +M``````!_``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!F`'X```````!^``@`````"`!L"Q8)#`W@`@```0```0$!4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`(````````"```@`````"`!L"Q8)#`W@ +M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````&8`@````````(``"``````(`&P+%@D,#>`" +M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`?P```````'\`"``` +M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@` +MNP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@0TP,`8$```````"!```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````9@"! +M````````@0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2 +M!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!@````````(``;`""````````@@`( +M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````!F`((```````""``@`````"`!L"Q8)#`W@ +M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`($```````"!``@` +M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L +M`(,```````"#``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````&8` +M@P```````(,`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`&8`@@```````((`"``````(`&P+%@D,#>`"```!```!`0%2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`A````````(0`"``````(`&P+%@D, +M#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````9@"$````````A``(``````@`;`L6"0P- +MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@"#````````@P`( +M``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M;`"%````````A0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!F +M`(4```````"%``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!F`(0```````"$``@`````"`!L"Q8)#`W@`@```0```0$! +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`(8```````"&``@`````"`!L"Q8) +M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````&8`A@```````(8`"``````(`&P+%@D, +M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`A0```````(4` +M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$` +M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`8<```````"'```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M9@"'````````AP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$! +M`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!A@```````(8`;`"(```````` +MB``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````!F`(@```````"(``@`````"`!L"Q8) +M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`(<```````"' +M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!L`(D```````")``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308! +M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`&8`B0```````(D`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`&8`B````````(@`"``````(`&P+%@D,#>`"```!```! +M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`B@```````(H`"``````(`&P+ +M%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````9@"*````````B@`(``````@`;`L6 +M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@")```````` +MB0`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>``;`"+````````BP`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT& +M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``!F`(L```````"+``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!F`(H```````"*``@`````"`!L"Q8)#`W@`@```0`` +M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`(P```````",``@`````"`!L +M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````&8`C````````(P`"``````(`&P+ +M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`BP`````` +M`(L`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y- +M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`8T```````"-```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````9@"-````````C0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$` +M``$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!C````````(P`;`".```` +M````C@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````!F`(X```````".``@`````"`!L +M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`(T````` +M``"-``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!L`(\```````"/``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E. +M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````&8`CP```````(\`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`&8`C@```````(X`"``````(`&P+%@D,#>`"```! +M```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`D````````)``"``````( +M`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````9@"0````````D``(``````@` +M;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@"/```` +M````CP`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>``;`"1````````D0`(``````@`;`L6"0P-X`(```$```$!05)2!0&) +M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````!F`)$```````"1``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!F`)````````"0``@`````"`!L"Q8)#`W@`@`` +M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`)(```````"2``@````` +M"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX``````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````&8`D@```````)(`"``````( +M`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`D0`` +M`````)$`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4! +MF4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`9,```````"3```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````9@"3````````DP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(` +M``$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!D@```````)(`;`"4 +M````````E``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````!F`)0```````"4``@````` +M"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`),` +M``````"3``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!L`)4```````"5``@`````"`!L"Q8)#`W@`@```0```0%!4E(% +M`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````&8`E0```````)4`"``````(`&P+%@D,#>`"```!```!`0!24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`&8`E````````)0`"``````(`&P+%@D,#>`" +M```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`E@```````)8`"``` +M```(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````9@"6````````E@`(```` +M``@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@"5 +M````````E0`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>``;`"7````````EP`(``````@`;`L6"0P-X`(```$```$!05)2 +M!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````!F`)<```````"7``@`````"`!L"Q8)#`W@`@```0```0$`4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`)8```````"6``@`````"`!L"Q8)#`W@ +M`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`)@```````"8``@` +M````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X``````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````&8`F````````)@`"``` +M```(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8` +MEP```````)<`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%2 +M4@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`9D```````"9```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````9@"9````````F0`(``````@`;`L6"0P-X`(```$```$!`%)2 +M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P- +MX`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!F````````)@` +M;`":````````F@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!F`)H```````":``@` +M````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F +M`)D```````"9``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!L`)L```````";``@`````"`!L"Q8)#`W@`@```0```0%! +M4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````&8`FP```````)L`"``````(`&P+%@D,#>`"```!```!`0!2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`F@```````)H`"``````(`&P+%@D, +M#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`G````````)P` +M"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````9@"<````````G``( +M``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M9@";````````FP`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>``;`"=````````G0`(``````@`;`L6"0P-X`(```$```$! +M05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````!F`)T```````"=``@`````"`!L"Q8)#`W@`@```0```0$` +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`)P```````"<``@`````"`!L"Q8) +M#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`)X```````"> +M``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X``````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````&8`G@```````)X` +M"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`&8`G0```````)T`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```! +M`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`9\```````"?```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````9@"?````````GP`(``````@`;`L6"0P-X`(```$```$! +M`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6 +M"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!G@`````` +M`)X`;`"@````````H``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT& +M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````!F`*````````"@ +M``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!F`)\```````"?``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!L`*$```````"A``@`````"`!L"Q8)#`W@`@```0`` +M`0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````&8`H0```````*$`"``````(`&P+%@D,#>`"```!```! +M`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`H````````*``"``````(`&P+ +M%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`H@`````` +M`*(`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````9@"B```````` +MH@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>``9@"A````````H0`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>``;`"C````````HP`(``````@`;`L6"0P-X`(```$` +M``$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````!F`*,```````"C``@`````"`!L"Q8)#`W@`@```0`` +M`0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`*(```````"B``@`````"`!L +M"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`*0````` +M``"D``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X``````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````&8`I``````` +M`*0`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`&8`HP```````*,`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````! +M```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`:4```````"E +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````9@"E````````I0`(``````@`;`L6"0P-X`(```$` +M``$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@` +M;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!I``` +M`````*0`;`"F````````I@`(``````@`;`L6"0P-X`(```$```$!05)2!0&) +M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````!F`*8````` +M``"F``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!F`*4```````"E``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!L`*<```````"G``@`````"`!L"Q8)#`W@`@`` +M`0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````&8`IP```````*<`"``````(`&P+%@D,#>`"```! +M```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`I@```````*8`"``````( +M`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`J``` +M`````*@`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````9@"H```` +M````J``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>``9@"G````````IP`(``````@`;`L6"0P-X`(```$```$!`5)2!0&! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>``;`"I````````J0`(``````@`;`L6"0P-X`(` +M``$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!F`*D```````"I``@`````"`!L"Q8)#`W@`@`` +M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`*@```````"H``@````` +M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`*H` +M``````"J``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X``````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````&8`J@`` +M`````*H`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`&8`J0```````*D`"``````(`&P+%@D,#>`"```!```!`0%24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`` +M```!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`:L````` +M``"K```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````9@"K````````JP`(``````@`;`L6"0P-X`(` +M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8```` +M`!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P! +MJ@```````*H`;`"L````````K``(``````@`;`L6"0P-X`(```$```$!05)2 +M!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````!F`*P` +M``````"L``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!F`*L```````"K``@`````"`!L"Q8)#`W@`@```0```0$!4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`*T```````"M``@`````"`!L"Q8)#`W@ +M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````&8`K0```````*T`"``````(`&P+%@D,#>`" +M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`K````````*P`"``` +M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P` +MK@```````*X`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````9@"N +M````````K@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>``9@"M````````K0`(``````@`;`L6"0P-X`(```$```$!`5)2 +M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`"O````````KP`(``````@`;`L6"0P- +MX`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````!F`*\```````"O``@`````"`!L"Q8)#`W@ +M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`*X```````"N``@` +M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L +M`+````````"P``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````&8` +ML````````+``"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`&8`KP```````*\`"``````(`&P+%@D,#>`"```!```!`0%2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D, +M#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`;$` +M``````"Q```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````9@"Q````````L0`(``````@`;`L6"0P- +MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8 +M`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P`````` +M`"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!0 +M3`P!L````````+``;`"R````````L@`(``````@`;`L6"0P-X`(```$```$! +M05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!F +M`+(```````"R``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!F`+$```````"Q``@`````"`!L"Q8)#`W@`@```0```0$! +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`+,```````"S``@`````"`!L"Q8) +M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````&8`LP```````+,`"``````(`&P+%@D, +M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`L@```````+(` +M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`&P`M````````+0`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$` +M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M9@"T````````M``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>``9@"S````````LP`(``````@`;`L6"0P-X`(```$```$! +M`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`"U````````M0`(``````@`;`L6 +M"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````!F`+4```````"U``@`````"`!L"Q8) +M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`+0```````"T +M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!L`+8```````"V``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308! +M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`&8`M@```````+8`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`&8`M0```````+4`"``````(`&P+%@D,#>`"```!```! +M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+ +M%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP, +M`;<```````"W```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````9@"W````````MP`(``````@`;`L6 +M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>```````` +M'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P`` +M`````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>!03`P!M@```````+8`;`"X````````N``(``````@`;`L6"0P-X`(```$` +M``$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``!F`+@```````"X``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!F`+<```````"W``@`````"`!L"Q8)#`W@`@```0`` +M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`+D```````"Y``@`````"`!L +M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````&8`N0```````+D`"``````(`&P+ +M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`N``````` +M`+@`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`&P`N@```````+H`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y- +M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````9@"Z````````N@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>``9@"Y````````N0`(``````@`;`L6"0P-X`(```$` +M``$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`"[````````NP`(``````@` +M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````!F`+L```````"[``@`````"`!L +M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`+H````` +M``"Z``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!L`+P```````"\``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E. +M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````&8`O````````+P`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`&8`NP```````+L`"``````(`&P+%@D,#>`"```! +M```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L````````` +M`&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M0TP,`;T```````"]```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````9@"]````````O0`(``````@` +M;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>```` +M````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M +M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>!03`P!O````````+P`;`"^````````O@`(``````@`;`L6"0P-X`(` +M``$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````!F`+X```````"^``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!F`+T```````"]``@`````"`!L"Q8)#`W@`@`` +M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`+\```````"_``@````` +M"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX``````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````&8`OP```````+\`"``````( +M`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`O@`` +M`````+X`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`&P`P````````,``"``````(`&P+%@D,#>`"```!```!`4%24@4! +MB4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````9@#`````````P``(``````@`;`L6"0P-X`(```$```$!`%)2!0&! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>``9@"_````````OP`(``````@`;`L6"0P-X`(` +M``$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#!````````P0`(```` +M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````!F`,$```````#!``@````` +M"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`,`` +M``````#```@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!L`,(```````#"``@`````"`!L"Q8)#`W@`@```0```0%!4E(% +M`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````&8`P@```````,(`"``````(`&P+%@D,#>`"```!```!`0!24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`&8`P0```````,$`"``````(`&P+%@D,#>`" +M```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L````` +M`````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@0TP,`<,```````##```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````9@##````````PP`(```` +M``@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`> +M````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!```` +M`$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>!03`P!P@```````,(`;`#$````````Q``(``````@`;`L6"0P- +MX`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````!F`,0```````#$``@`````"`!L"Q8)#`W@`@```0```0$`4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`,,```````##``@`````"`!L"Q8)#`W@ +M`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`,4```````#%``@` +M````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X``````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````&8`Q0```````,4`"``` +M```(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8` +MQ````````,0`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`&P`Q@```````,8`"``````(`&P+%@D,#>`"```!```!`4%2 +M4@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````9@#&````````Q@`(``````@`;`L6"0P-X`(```$```$!`%)2 +M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#%````````Q0`(``````@`;`L6"0P- +MX`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#'````````QP`( +M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!F`,<```````#'``@` +M````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F +M`,8```````#&``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!L`,@```````#(``@`````"`!L"Q8)#`W@`@```0```0%! +M4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````&8`R````````,@`"``````(`&P+%@D,#>`"```!```!`0!2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`QP```````,<`"``````(`&P+%@D, +M#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L` +M`````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@0TP,`U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U! +M`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>!03`P!R````````,@`;`#*````````R@`(``````@`;`L6 +M"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````!F`,H```````#*``@`````"`!L"Q8)#`W@`@```0```0$` +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`,D```````#)``@`````"`!L"Q8) +M#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`,L```````#+ +M``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X``````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````&8`RP```````,L` +M"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`&8`R@```````,H`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`&P`S````````,P`"``````(`&P+%@D,#>`"```!```! +M`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````9@#,````````S``(``````@`;`L6"0P-X`(```$```$! +M`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#+````````RP`(``````@`;`L6 +M"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#-```````` +MS0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````!F`,T```````#- +M``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#```` +M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!F`,P```````#,``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!L`,X```````#.``@`````"`!L"Q8)#`W@`@```0`` +M`0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````&8`S@```````,X`"``````(`&P+%@D,#>`"```!```! +M`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`S0```````,T`"``````(`&P+ +M%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$````` +M`;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@0TP,`<\```````#/```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````9@#/```````` +MSP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D +M`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>!03`P!S@```````,X`;`#0````````T``(``````@` +M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````!F`-````````#0``@`````"`!L"Q8)#`W@`@```0`` +M`0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`,\```````#/``@`````"`!L +M"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`-$````` +M``#1``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X``````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````&8`T0`````` +M`-$`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`&8`T````````-``"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`&P`T@```````-(`"``````(`&P+%@D,#>`"```! +M```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````9@#2````````T@`(``````@`;`L6"0P-X`(```$` +M``$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#1````````T0`(``````@` +M;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`` +M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#3```` +M````TP`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U! +M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````!F`-,````` +M``#3``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!F`-(```````#2``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!L`-0```````#4``@`````"`!L"Q8)#`W@`@`` +M`0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````&8`U````````-0`"``````(`&P+%@D,#>`"```! +M```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`TP```````-,`"``````( +M`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$` +M`````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@0TP,`=4```````#5```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````9@#5```` +M````U0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A +M4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>!03`P!U````````-0`;`#6````````U@`(```` +M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!F`-8```````#6``@`````"`!L"Q8)#`W@`@`` +M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`-4```````#5``@````` +M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`-<` +M``````#7``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X``````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````&8`UP`` +M`````-<`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!! +M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L +M"Q8)#`W@`&8`U@```````-8`"``````(`&P+%@D,#>`"```!```!`0%24@4! +M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@`&P`V````````-@`"``````(`&P+%@D,#>`" +M```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````9@#8````````V``(``````@`;`L6"0P-X`(` +M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#7````````UP`(```` +M``@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H +M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#9 +M````````V0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````!F`-D` +M``````#9``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$````` +M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@ +M;`L6"0P-X`!F`-@```````#8``@`````"`!L"Q8)#`W@`@```0```0$!4E(% +M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`-H```````#:``@`````"`!L"Q8)#`W@ +M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````&8`V@```````-H`"``````(`&P+%@D,#>`" +M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@````` +M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`V0```````-D`"``` +M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@` +MNP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@0TP,`=L```````#;```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````9@#; +M````````VP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!```` +M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P- +MX&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2 +M!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!V@```````-H`;`#<````````W``( +M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M +M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+ +M%@D,#>`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````!F`-P```````#<``@`````"`!L"Q8)#`W@ +M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```` +M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`-L```````#;``@` +M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L +M`-T```````#=``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````&8` +MW0```````-T`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00`` +M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D, +M#>!L"Q8)#`W@`&8`W````````-P`"``````(`&P+%@D,#>`"```!```!`0%2 +M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`W@```````-X`"``````(`&P+%@D, +M#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,` +M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````9@#>````````W@`(``````@`;`L6"0P- +MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``` +M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#=````````W0`( +M``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M;`#?````````WP`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!! +M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!F +M`-\```````#?``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$` +M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8) +M#`W@;`L6"0P-X`!F`-X```````#>``@`````"`!L"Q8)#`W@`@```0```0$! +M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`.````````#@``@`````"`!L"Q8) +M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@# +M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````&8`X````````.``"``````(`&P+%@D, +M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@` +M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`WP```````-\` +M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````` +M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@ +M`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$` +M05!8)`'M00````!![0(````````"Z`,``````^@``````````%1&&@$.;`L6 +M"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`>$```````#A```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M9@#A````````X0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U! +M`````$'M`@````````+H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6 +M"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$! +M`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!X````````.`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````!F`.(```````#B``@`````"`!L"Q8) +M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H +M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`!P````````< +M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T%```` +M````!>@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P- +MX`!L`.,```````#C``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308! +M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+ +M%@D,#>!L"Q8)#`W@;`L6"0P-X``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`&8`XP```````.,`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M +M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+ +M%@D,#>!L"Q8)#`W@`&8`X@```````.(`"``````(`&P+%@D,#>`"```!```! +M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`Y````````.0`"``````(`&P+ +M%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````# +MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````9@#D````````Y``(``````@`;`L6 +M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````# +MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#C```````` +MXP`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P`` +M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D, +M#>``;`#E````````Y0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT& +M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL +M"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``!F`.4```````#E``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0! +M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L +M"Q8)#`W@;`L6"0P-X`!F`.0```````#D``@`````"`!L"Q8)#`W@`@```0`` +M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4 +M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`.8```````#F``@`````"`!L +M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#```````` +M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X``` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````&8`Y@```````.8`"``````(`&P+ +M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,````` +M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`Y0`````` +M`.4`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,` +M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8) +M#`W@`&P`YP```````.<`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y- +M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$. +M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````9@#G````````YP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D +M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@ +M;`L6"0P-X&P+%@D,#>``9@#F````````Y@`(``````@`;`L6"0P-X`(```$` +M``$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````````` +M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#H````````Z``(``````@` +M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P`````` +M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````!F`.@```````#H``@`````"`!L +M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#```` +M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`.<````` +M``#G``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T# +M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6 +M"0P-X`!X`+L!``````&[``````````!L"Q8)#`W@`````0```0%!4E(%`9E. +M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH! +M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X$-,#`$A````````(0`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````&8`Z0```````.D`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8 +M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P- +MX&P+%@D,#>!L"Q8)#`W@`&8`'````````!P`"``````(`&P+%@D,#>`"```! +M```!`0%24@4!@5!8)`'M00````!![04````````%Z`,``````^@````````` +M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`/@`ZP```````.L`"``````( +M`&P+%@D,#>`"```!```!'T%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%24@4!B4Y-EP$!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%#11P!Z@```````.H``````````+`` +M``````"P```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````3DUR`0!!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8: +M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````!F`.L```````#K``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0 +M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D, +M#>!L"Q8)#`W@;`L6"0P-X`!F`.D```````#I``@`````"`!L"Q8)#`W@`@`` +M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H```````` +M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`#X`.T```````#M``@````` +M"`!L"Q8)#`W@`@```0```1]!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!4E(%`8E.39P```````#L``````````"P +M````````L``````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````$Y-<@$`04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%! +M04%!04%!05!8)`'M00````!![0(````````"Z`,``````^@``````````%1& +M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````9@#M````````[0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&! +M4%@D`>U!`````$'M`@````````+H`P`````#Z```````````5$8:`0YL"Q8) +M#`W@;`L6"0P-X&P+%@D,#>``9@#K````````ZP`(``````@`;`L6"0P-X`(` +M``$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z``````` +M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````B`.X```````#N``@````` +M"`!L"Q8)#`W@`@```0```0$`(@#N````````[@`(``````@`;`L6"0P-X`(` +M``$```$!`20`L`$``````;``"``````(`&P+%@D,#>`"```!```!`@!!`*(` +MMP$``````;<`"``````(`&P+%@D,#>`"```!```!@`!!`$$`00!!`$$`00!! +M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$` +M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!! +M`$$`00!!`$$`00!!`$$`00!!`$$`00!!```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````"(`[P```````.\`"``````(`&P+%@D,#>`"```!```!`0`B`+8! +M``````&V``@`````"`!L"Q8)#`W@`@```0```0$!)`#P````````\``(```` +M``@`;`L6"0P-X`(```$```$"`$$````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````(@#P````````\``(```` +M``@`;`L6"0P-X`(```$```$!`"(`[P```````.\`"``````(`&P+%@D,#>`" +M```!```!`0$D`/$```````#Q``@`````"`!L"Q8)#`W@`@```0```0(`00`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````B`/$```````#Q``@`````"`!L"Q8)#`W@`@```0```0$`(@#P +M````````\``(``````@`;`L6"0P-X`(```$```$!`20`\@```````/(`"``` +M```(`&P+%@D,#>`"```!```!`@!!```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````"(`\@```````/(`"``` +M```(`&P+%@D,#>`"```!```!`0`B`/$```````#Q``@`````"`!L"Q8)#`W@ +M`@```0```0$!)`#S````````\P`(``````@`;`L6"0P-X`(```$```$"`$$` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````(@#S````````\P`(``````@`;`L6"0P-X`(```$```$!`"(` +M\@```````/(`"``````(`&P+%@D,#>`"```!```!`0$D`/0```````#T``@` +M````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````B`/0```````#T``@` +M````"`!L"Q8)#`W@`@```0```0$`(@#S````````\P`(``````@`;`L6"0P- +MX`(```$```$!`20`]0```````/4`"``````(`&P+%@D,#>`"```!```!`@!! +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````"(`]0```````/4`"``````(`&P+%@D,#>`"```!```!`0`B +M`/0```````#T``@`````"`!L"Q8)#`W@`@```0```0$!)`#V````````]@`( +M``````@`;`L6"0P-X`(```$```$"`$$````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````(@#V````````]@`( +M``````@`;`L6"0P-X`(```$```$!`"(`]0```````/4`"``````(`&P+%@D, +M#>`"```!```!`0$D`/<```````#W``@`````"`!L"Q8)#`W@`@```0```0(` +M00`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````B`/<```````#W``@`````"`!L"Q8)#`W@`@```0```0$` +M(@#V````````]@`(``````@`;`L6"0P-X`(```$```$!`20`^````````/@` +M"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````"(`^````````/@` +M"``````(`&P+%@D,#>`"```!```!`0`B`/<```````#W``@`````"`!L"Q8) +M#`W@`@```0```0$!)`#Y````````^0`(``````@`;`L6"0P-X`(```$```$" +M`$$````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````(@#Y````````^0`(``````@`;`L6"0P-X`(```$```$! +M`"(`^````````/@`"``````(`&P+%@D,#>`"```!```!`0$D`/H```````#Z +M``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````B`/H```````#Z +M``@`````"`!L"Q8)#`W@`@```0```0$`(@#Y````````^0`(``````@`;`L6 +M"0P-X`(```$```$!`20`^P```````/L`"``````(`&P+%@D,#>`"```!```! +M`@!!```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````"(`^P```````/L`"``````(`&P+%@D,#>`"```!```! +M`0`B`/H```````#Z``@`````"`!L"Q8)#`W@`@```0```0$!)`#\```````` +M_``(``````@`;`L6"0P-X`(```$```$"`$$````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````(@#\```````` +M_``(``````@`;`L6"0P-X`(```$```$!`"(`^P```````/L`"``````(`&P+ +M%@D,#>`"```!```!`0$D`/T```````#]``@`````"`!L"Q8)#`W@`@```0`` +M`0(`00`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````B`/T```````#]``@`````"`!L"Q8)#`W@`@```0`` +M`0$`(@#\````````_``(``````@`;`L6"0P-X`(```$```$!`20`_@`````` +M`/X`"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````"(`_@`````` +M`/X`"``````(`&P+%@D,#>`"```!```!`0`B`/T```````#]``@`````"`!L +M"Q8)#`W@`@```0```0$!)`#_````````_P`(``````@`;`L6"0P-X`(```$` +M``$"`$$````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````(@#_````````_P`(``````@`;`L6"0P-X`(```$` +M``$!`"(`_@```````/X`"``````(`&P+%@D,#>`"```!```!`0$D```!```` +M``$```@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````B```!```` +M``$```@`````"`!L"Q8)#`W@`@```0```0$`(@#_````````_P`(``````@` +M;`L6"0P-X`(```$```$!`20``0$``````0$`"``````(`&P+%@D,#>`"```! +M```!`@!!```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````"(``0$``````0$`"``````(`&P+%@D,#>`"```! +M```!`0`B```!``````$```@`````"`!L"Q8)#`W@`@```0```0$!)``"`0`` +M```!`@`(``````@`;`L6"0P-X`(```$```$"`$$````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````(@`"`0`` +M```!`@`(``````@`;`L6"0P-X`(```$```$!`"(``0$``````0$`"``````( +M`&P+%@D,#>`"```!```!`0$D``,!``````$#``@`````"`!L"Q8)#`W@`@`` +M`0```0(`00`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````B``,!``````$#``@`````"`!L"Q8)#`W@`@`` +M`0```0$`(@`"`0`````!`@`(``````@`;`L6"0P-X`(```$```$!`20`!`$` +M`````00`"``````(`&P+%@D,#>`"```!```!`@!!```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````"(`!`$` +M`````00`"``````(`&P+%@D,#>`"```!```!`0`B``,!``````$#``@````` +M"`!L"Q8)#`W@`@```0```0$!)``%`0`````!!0`(``````@`;`L6"0P-X`(` +M``$```$"`$$````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````(@`%`0`````!!0`(``````@`;`L6"0P-X`(` +M``$```$!`"(`!`$``````00`"``````(`&P+%@D,#>`"```!```!`0$D``8! +M``````$&``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````B``8! +M``````$&``@`````"`!L"Q8)#`W@`@```0```0$`(@`%`0`````!!0`(```` +M``@`;`L6"0P-X`(```$```$!`20`!P$``````0<`"``````(`&P+%@D,#>`" +M```!```!`@!!```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````"(`!P$``````0<`"``````(`&P+%@D,#>`" +M```!```!`0`B``8!``````$&``@`````"`!L"Q8)#`W@`@```0```0$!)``( +M`0`````!"``(``````@`;`L6"0P-X`(```$```$"`$$````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````(@`( +M`0`````!"``(``````@`;`L6"0P-X`(```$```$!`"(`!P$``````0<`"``` +M```(`&P+%@D,#>`"```!```!`0$D``D!``````$)``@`````"`!L"Q8)#`W@ +M`@```0```0(`00`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````B``D!``````$)``@`````"`!L"Q8)#`W@ +M`@```0```0$`(@`(`0`````!"``(``````@`;`L6"0P-X`(```$```$!`20` +M"@$``````0H`"``````(`&P+%@D,#>`"```!```!`@!!```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````"(` +M"@$``````0H`"``````(`&P+%@D,#>`"```!```!`0`B``D!``````$)``@` +M````"`!L"Q8)#`W@`@```0```0$!)``+`0`````!"P`(``````@`;`L6"0P- +MX`(```$```$"`$$````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````(@`+`0`````!"P`(``````@`;`L6"0P- +MX`(```$```$!`"(`"@$``````0H`"``````(`&P+%@D,#>`"```!```!`0$D +M``P!``````$,``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````B +M``P!``````$,``@`````"`!L"Q8)#`W@`@```0```0$`(@`+`0`````!"P`( +M``````@`;`L6"0P-X`(```$```$!`20`#0$``````0T`"``````(`&P+%@D, +M#>`"```!```!`@!!```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````"(`#0$``````0T`"``````(`&P+%@D, +M#>`"```!```!`0`B``P!``````$,``@`````"`!L"Q8)#`W@`@```0```0$! +M)``.`0`````!#@`(``````@`;`L6"0P-X`(```$```$"`$$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M(@`.`0`````!#@`(``````@`;`L6"0P-X`(```$```$!`"(`#0$``````0T` +M"``````(`&P+%@D,#>`"```!```!`0$D``\!``````$/``@`````"`!L"Q8) +M#`W@`@```0```0(`00`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````B``\!``````$/``@`````"`!L"Q8) +M#`W@`@```0```0$`(@`.`0`````!#@`(``````@`;`L6"0P-X`(```$```$! +M`20`$`$``````1``"``````(`&P+%@D,#>`"```!```!`@!!```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`"(`$`$``````1``"``````(`&P+%@D,#>`"```!```!`0`B``\!``````$/ +M``@`````"`!L"Q8)#`W@`@```0```0$!)``1`0`````!$0`(``````@`;`L6 +M"0P-X`(```$```$"`$$````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````(@`1`0`````!$0`(``````@`;`L6 +M"0P-X`(```$```$!`"(`$`$``````1``"``````(`&P+%@D,#>`"```!```! +M`0$D`!(!``````$2``@`````"`!L"Q8)#`W@`@```0```0(`00`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```B`!(!``````$2``@`````"`!L"Q8)#`W@`@```0```0$`(@`1`0`````! +M$0`(``````@`;`L6"0P-X`(```$```$!`20`$P$``````1,`"``````(`&P+ +M%@D,#>`"```!```!`@!!```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````"(`$P$``````1,`"``````(`&P+ +M%@D,#>`"```!```!`0`B`!(!``````$2``@`````"`!L"Q8)#`W@`@```0`` +M`0$!)``4`0`````!%``(``````@`;`L6"0P-X`(```$```$"`$$````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````(@`4`0`````!%``(``````@`;`L6"0P-X`(```$```$!`"(`$P$````` +M`1,`"``````(`&P+%@D,#>`"```!```!`0$D`!4!``````$5``@`````"`!L +M"Q8)#`W@`@```0```0(`00`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````B`!4!``````$5``@`````"`!L +M"Q8)#`W@`@```0```0$`(@`4`0`````!%``(``````@`;`L6"0P-X`(```$` +M``$!`20`%@$``````18`"``````(`&P+%@D,#>`"```!```!`@!!```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````"(`%@$``````18`"``````(`&P+%@D,#>`"```!```!`0`B`!4!```` +M``$5``@`````"`!L"Q8)#`W@`@```0```0$!)``7`0`````!%P`(``````@` +M;`L6"0P-X`(```$```$"`$$````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````(@`7`0`````!%P`(``````@` +M;`L6"0P-X`(```$```$!`"(`%@$``````18`"``````(`&P+%@D,#>`"```! +M```!`0$D`!@!``````$8``@`````"`!L"Q8)#`W@`@```0```0(`00`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````B`!@!``````$8``@`````"`!L"Q8)#`W@`@```0```0$`(@`7`0`` +M```!%P`(``````@`;`L6"0P-X`(```$```$!`20`&0$``````1D`"``````( +M`&P+%@D,#>`"```!```!`@!!```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````"(`&0$``````1D`"``````( +M`&P+%@D,#>`"```!```!`0`B`!@!``````$8``@`````"`!L"Q8)#`W@`@`` +M`0```0$!)``:`0`````!&@`(``````@`;`L6"0P-X`(```$```$"`$$````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````(@`:`0`````!&@`(``````@`;`L6"0P-X`(```$```$!`"(`&0$` +M`````1D`"``````(`&P+%@D,#>`"```!```!`0$D`!L!``````$;``@````` +M"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````B`!L!``````$;``@````` +M"`!L"Q8)#`W@`@```0```0$`(@`:`0`````!&@`(``````@`;`L6"0P-X`(` +M``$```$!`20`'`$``````1P`"``````(`&P+%@D,#>`"```!```!`@!!```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````"(`'`$``````1P`"``````(`&P+%@D,#>`"```!```!`0`B`!L! +M``````$;``@`````"`!L"Q8)#`W@`@```0```0$!)``=`0`````!'0`(```` +M``@`;`L6"0P-X`(```$```$"`$$````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````(@`=`0`````!'0`(```` +M``@`;`L6"0P-X`(```$```$!`"(`'`$``````1P`"``````(`&P+%@D,#>`" +M```!```!`0$D`!X!``````$>``@`````"`!L"Q8)#`W@`@```0```0(`00`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````B`!X!``````$>``@`````"`!L"Q8)#`W@`@```0```0$`(@`= +M`0`````!'0`(``````@`;`L6"0P-X`(```$```$!`20`'P$``````1\`"``` +M```(`&P+%@D,#>`"```!```!`@!!```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````"(`'P$``````1\`"``` +M```(`&P+%@D,#>`"```!```!`0`B`!X!``````$>``@`````"`!L"Q8)#`W@ +M`@```0```0$!)``@`0`````!(``(``````@`;`L6"0P-X`(```$```$"`$$` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````(@`@`0`````!(``(``````@`;`L6"0P-X`(```$```$!`"(` +M'P$``````1\`"``````(`&P+%@D,#>`"```!```!`0$D`"$!``````$A``@` +M````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````B`"$!``````$A``@` +M````"`!L"Q8)#`W@`@```0```0$`(@`@`0`````!(``(``````@`;`L6"0P- +MX`(```$```$!`20`(@$``````2(`"``````(`&P+%@D,#>`"```!```!`@!! +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````"(`(@$``````2(`"``````(`&P+%@D,#>`"```!```!`0`B +M`"$!``````$A``@`````"`!L"Q8)#`W@`@```0```0$!)``C`0`````!(P`( +M``````@`;`L6"0P-X`(```$```$"`$$````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````(@`C`0`````!(P`( +M``````@`;`L6"0P-X`(```$```$!`"(`(@$``````2(`"``````(`&P+%@D, +M#>`"```!```!`0$D`"0!``````$D``@`````"`!L"Q8)#`W@`@```0```0(` +M00`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````B`"0!``````$D``@`````"`!L"Q8)#`W@`@```0```0$` +M(@`C`0`````!(P`(``````@`;`L6"0P-X`(```$```$!`20`)0$``````24` +M"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````"(`)0$``````24` +M"``````(`&P+%@D,#>`"```!```!`0`B`"0!``````$D``@`````"`!L"Q8) +M#`W@`@```0```0$!)``F`0`````!)@`(``````@`;`L6"0P-X`(```$```$" +M`$$````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````(@`F`0`````!)@`(``````@`;`L6"0P-X`(```$```$! +M`"(`)0$``````24`"``````(`&P+%@D,#>`"```!```!`0$D`"`"```!```! +M`@!!```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````"(`*`$``````2@`"``````(`&P+%@D,#>`"```!```! +M`0`B`"`"```!```!`0$D`"H!``````$J``@`````"`!L"Q8)#`W@`@```0`` +M`0(`00`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````B`"H!``````$J``@`````"`!L"Q8)#`W@`@```0`` +M`0$`(@`I`0`````!*0`(``````@`;`L6"0P-X`(```$```$!`20`*P$````` +M`2L`"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````"(`*P$````` +M`2L`"``````(`&P+%@D,#>`"```!```!`0`B`"H!``````$J``@`````"`!L +M"Q8)#`W@`@```0```0$!)``L`0`````!+``(``````@`;`L6"0P-X`(```$` +M``$"`$$````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````(@`L`0`````!+``(``````@`;`L6"0P-X`(```$` +M``$!`"(`*P$``````2L`"``````(`&P+%@D,#>`"```!```!`0$D`"T!```` +M``$M``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````B`"T!```` +M``$M``@`````"`!L"Q8)#`W@`@```0```0$`(@`L`0`````!+``(``````@` +M;`L6"0P-X`(```$```$!`20`+@$``````2X`"``````(`&P+%@D,#>`"```! +M```!`@!!```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````"(`+@$``````2X`"``````(`&P+%@D,#>`"```! +M```!`0`B`"T!``````$M``@`````"`!L"Q8)#`W@`@```0```0$!)``O`0`` +M```!+P`(``````@`;`L6"0P-X`(```$```$"`$$````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````(@`O`0`` +M```!+P`(``````@`;`L6"0P-X`(```$```$!`"(`+@$``````2X`"``````( +M`&P+%@D,#>`"```!```!`0$D`#`!``````$P``@`````"`!L"Q8)#`W@`@`` +M`0```0(`00`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````B`#`!``````$P``@`````"`!L"Q8)#`W@`@`` +M`0```0$`(@`O`0`````!+P`(``````@`;`L6"0P-X`(```$```$!`20`,0$` +M`````3$`"``````(`&P+%@D,#>`"```!```!`@!!```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````"(`,0$` +M`````3$`"``````(`&P+%@D,#>`"```!```!`0`B`#`!``````$P``@````` +M"`!L"Q8)#`W@`@```0```0$!)``R`0`````!,@`(``````@`;`L6"0P-X`(` +M``$```$"`$$````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````(@`R`0`````!,@`(``````@`;`L6"0P-X`(` +M``$```$!`"(`,0$``````3$`"``````(`&P+%@D,#>`"```!```!`0$D`#,! +M``````$S``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````B`#,! +M``````$S``@`````"`!L"Q8)#`W@`@```0```0$`(@`R`0`````!,@`(```` +M``@`;`L6"0P-X`(```$```$!`20`-`$``````30`"``````(`&P+%@D,#>`" +M```!```!`@!!```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````"(`-`$``````30`"``````(`&P+%@D,#>`" +M```!```!`0`B`#,!``````$S``@`````"`!L"Q8)#`W@`@```0```0$!)``U +M`0`````!-0`(``````@`;`L6"0P-X`(```$```$"`$$````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````(@`U +M`0`````!-0`(``````@`;`L6"0P-X`(```$```$!`"(`-`$``````30`"``` +M```(`&P+%@D,#>`"```!```!`0$D`#8!``````$V``@`````"`!L"Q8)#`W@ +M`@```0```0(`00`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````B`#8!``````$V``@`````"`!L"Q8)#`W@ +M`@```0```0$`(@`U`0`````!-0`(``````@`;`L6"0P-X`(```$```$!`20` +M-P$``````3<`"``````(`&P+%@D,#>`"```!```!`@!!```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````"(` +M-P$``````3<`"``````(`&P+%@D,#>`"```!```!`0`B`#8!``````$V``@` +M````"`!L"Q8)#`W@`@```0```0$!)``X`0`````!.``(``````@`;`L6"0P- +MX`(```$```$"`$$````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````(@`X`0`````!.``(``````@`;`L6"0P- +MX`(```$```$!`"(`-P$``````3<`"``````(`&P+%@D,#>`"```!```!`0$D +M`#D!``````$Y``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````B +M`#D!``````$Y``@`````"`!L"Q8)#`W@`@```0```0$`(@`X`0`````!.``( +M``````@`;`L6"0P-X`(```$```$!`20`.@$``````3H`"``````(`&P+%@D, +M#>`"```!```!`@!!```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````"(`.@$``````3H`"``````(`&P+%@D, +M#>`"```!```!`0`B`#D!``````$Y``@`````"`!L"Q8)#`W@`@```0```0$! +M)``[`0`````!.P`(``````@`;`L6"0P-X`(```$```$"`$$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M(@`[`0`````!.P`(``````@`;`L6"0P-X`(```$```$!`"(`.@$``````3H` +M"``````(`&P+%@D,#>`"```!```!`0$D`#P!``````$\``@`````"`!L"Q8) +M#`W@`@```0```0(`00`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````B`#P!``````$\``@`````"`!L"Q8) +M#`W@`@```0```0$`(@`[`0`````!.P`(``````@`;`L6"0P-X`(```$```$! +M`20`/0$``````3T`"``````(`&P+%@D,#>`"```!```!`@!!```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`"(`/0$``````3T`"``````(`&P+%@D,#>`"```!```!`0`B`#P!``````$\ +M``@`````"`!L"Q8)#`W@`@```0```0$!)``^`0`````!/@`(``````@`;`L6 +M"0P-X`(```$```$"`$$````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````(@`^`0`````!/@`(``````@`;`L6 +M"0P-X`(```$```$!`"(`/0$``````3T`"``````(`&P+%@D,#>`"```!```! +M`0$D`#\!``````$_``@`````"`!L"Q8)#`W@`@```0```0(`00`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```B`#\!``````$_``@`````"`!L"Q8)#`W@`@```0```0$`(@`^`0`````! +M/@`(``````@`;`L6"0P-X`(```$```$!`20`0`$``````4``"``````(`&P+ +M%@D,#>`"```!```!`@!!```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````"(`0`$``````4``"``````(`&P+ +M%@D,#>`"```!```!`0`B`#\!``````$_``@`````"`!L"Q8)#`W@`@```0`` +M`0$!)`!!`0`````!00`(``````@`;`L6"0P-X`(```$```$"`$$````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````(@!!`0`````!00`(``````@`;`L6"0P-X`(```$```$!`"(`0`$````` +M`4``"``````(`&P+%@D,#>`"```!```!`0$D`$(!``````%"``@`````"`!L +M"Q8)#`W@`@```0```0(`00`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````B`$(!``````%"``@`````"`!L +M"Q8)#`W@`@```0```0$`(@!!`0`````!00`(``````@`;`L6"0P-X`(```$` +M``$!`20`0P$``````4,`"``````(`&P+%@D,#>`"```!```!`@!!```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````"(`0P$``````4,`"``````(`&P+%@D,#>`"```!```!`0`B`$(!```` +M``%"``@`````"`!L"Q8)#`W@`@```0```0$!)`!$`0`````!1``(``````@` +M;`L6"0P-X`(```$```$"`$$````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````(@!$`0`````!1``(``````@` +M;`L6"0P-X`(```$```$!`"(`0P$``````4,`"``````(`&P+%@D,#>`"```! +M```!`0$D`$4!``````%%``@`````"`!L"Q8)#`W@`@```0```0(`00`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````B`$4!``````%%``@`````"`!L"Q8)#`W@`@```0```0$`(@!$`0`` +M```!1``(``````@`;`L6"0P-X`(```$```$!`20`1@$``````48`"``````( +M`&P+%@D,#>`"```!```!`@!!```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````"(`1@$``````48`"``````( +M`&P+%@D,#>`"```!```!`0`B`$4!``````%%``@`````"`!L"Q8)#`W@`@`` +M`0```0$!)`!'`0`````!1P`(``````@`;`L6"0P-X`(```$```$"`$$````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````(@!'`0`````!1P`(``````@`;`L6"0P-X`(```$```$!`"(`1@$` +M`````48`"``````(`&P+%@D,#>`"```!```!`0$D`$@!``````%(``@````` +M"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````B`$@!``````%(``@````` +M"`!L"Q8)#`W@`@```0```0$`(@!'`0`````!1P`(``````@`;`L6"0P-X`(` +M``$```$!`20`20$``````4D`"``````(`&P+%@D,#>`"```!```!`@!!```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````"(`20$``````4D`"``````(`&P+%@D,#>`"```!```!`0`B`$@! +M``````%(``@`````"`!L"Q8)#`W@`@```0```0$!)`!*`0`````!2@`(```` +M``@`;`L6"0P-X`(```$```$"`$$````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````(@!*`0`````!2@`(```` +M``@`;`L6"0P-X`(```$```$!`"(`20$``````4D`"``````(`&P+%@D,#>`" +M```!```!`0$D`$L!``````%+``@`````"`!L"Q8)#`W@`@```0```0(`00`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````B`$L!``````%+``@`````"`!L"Q8)#`W@`@```0```0$`(@!* +M`0`````!2@`(``````@`;`L6"0P-X`(```$```$!`20`3`$``````4P`"``` +M```(`&P+%@D,#>`"```!```!`@!!```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````"(`3`$``````4P`"``` +M```(`&P+%@D,#>`"```!```!`0`B`$L!``````%+``@`````"`!L"Q8)#`W@ +M`@```0```0$!)`!-`0`````!30`(``````@`;`L6"0P-X`(```$```$"`$$` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````(@!-`0`````!30`(``````@`;`L6"0P-X`(```$```$!`"(` +M3`$``````4P`"``````(`&P+%@D,#>`"```!```!`0$D`$X!``````%.``@` +M````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````B`$X!``````%.``@` +M````"`!L"Q8)#`W@`@```0```0$`(@!-`0`````!30`(``````@`;`L6"0P- +MX`(```$```$!`20`3P$``````4\`"``````(`&P+%@D,#>`"```!```!`@!! +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````"(`3P$``````4\`"``````(`&P+%@D,#>`"```!```!`0`B +M`$X!``````%.``@`````"`!L"Q8)#`W@`@```0```0$!)`!0`0`````!4``( +M``````@`;`L6"0P-X`(```$```$"`$$````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````(@!0`0`````!4``( +M``````@`;`L6"0P-X`(```$```$!`"(`3P$``````4\`"``````(`&P+%@D, +M#>`"```!```!`0$D`%$!``````%1``@`````"`!L"Q8)#`W@`@```0```0(` +M00`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````B`%$!``````%1``@`````"`!L"Q8)#`W@`@```0```0$` +M(@!0`0`````!4``(``````@`;`L6"0P-X`(```$```$!`20`4@$``````5(` +M"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````"(`4@$``````5(` +M"``````(`&P+%@D,#>`"```!```!`0`B`%$!``````%1``@`````"`!L"Q8) +M#`W@`@```0```0$!)`!3`0`````!4P`(``````@`;`L6"0P-X`(```$```$" +M`$$````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````(@!3`0`````!4P`(``````@`;`L6"0P-X`(```$```$! +M`"(`4@$``````5(`"``````(`&P+%@D,#>`"```!```!`0$D`%0!``````%4 +M``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````B`%0!``````%4 +M``@`````"`!L"Q8)#`W@`@```0```0$`(@!3`0`````!4P`(``````@`;`L6 +M"0P-X`(```$```$!`20`50$``````54`"``````(`&P+%@D,#>`"```!```! +M`@!!```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````"(`50$``````54`"``````(`&P+%@D,#>`"```!```! +M`0`B`%0!``````%4``@`````"`!L"Q8)#`W@`@```0```0$!)`!6`0`````! +M5@`(``````@`;`L6"0P-X`(```$```$"`$$````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````(@!6`0`````! +M5@`(``````@`;`L6"0P-X`(```$```$!`"(`50$``````54`"``````(`&P+ +M%@D,#>`"```!```!`0$D`%`"```!```!`@!!```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````"(`6`$````` +M`5@`"``````(`&P+%@D,#>`"```!```!`0`B`%`"```!```!`0$D`%H!```` +M``%:``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````B`%H!```` +M``%:``@`````"`!L"Q8)#`W@`@```0```0$`(@!9`0`````!60`(``````@` +M;`L6"0P-X`(```$```$!`20`6P$``````5L`"``````(`&P+%@D,#>`"```! +M```!`@!!```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````"(`6P$``````5L`"``````(`&P+%@D,#>`"```! +M```!`0`B`%H!``````%:``@`````"`!L"Q8)#`W@`@```0```0$!)`!<`0`` +M```!7``(``````@`;`L6"0P-X`(```$```$"`$$````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````(@!<`0`` +M```!7``(``````@`;`L6"0P-X`(```$```$!`"(`6P$``````5L`"``````( +M`&P+%@D,#>`"```!```!`0$D`%T!``````%=``@`````"`!L"Q8)#`W@`@`` +M`0```0(`00`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````B`%T!``````%=``@`````"`!L"Q8)#`W@`@`` +M`0```0$`(@!<`0`````!7``(``````@`;`L6"0P-X`(```$```$!`20`7@$` +M`````5X`"``````(`&P+%@D,#>`"```!```!`@!!```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````"(`7@$` +M`````5X`"``````(`&P+%@D,#>`"```!```!`0`B`%T!``````%=``@````` +M"`!L"Q8)#`W@`@```0```0$!)`!?`0`````!7P`(``````@`;`L6"0P-X`(` +M``$```$"`$$````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````(@!?`0`````!7P`(``````@`;`L6"0P-X`(` +M``$```$!`"(`7@$``````5X`"``````(`&P+%@D,#>`"```!```!`0$D`&`! +M``````%@``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````B`&`! +M``````%@``@`````"`!L"Q8)#`W@`@```0```0$`(@!?`0`````!7P`(```` +M``@`;`L6"0P-X`(```$```$!`20`80$``````6$`"``````(`&P+%@D,#>`" +M```!```!`@!!```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````"(`80$``````6$`"``````(`&P+%@D,#>`" +M```!```!`0`B`&`!``````%@``@`````"`!L"Q8)#`W@`@```0```0$!)`!B +M`0`````!8@`(``````@`;`L6"0P-X`(```$```$"`$$````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````(@!B +M`0`````!8@`(``````@`;`L6"0P-X`(```$```$!`"(`80$``````6$`"``` +M```(`&P+%@D,#>`"```!```!`0$D`&,!``````%C``@`````"`!L"Q8)#`W@ +M`@```0```0(`00`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````B`&,!``````%C``@`````"`!L"Q8)#`W@ +M`@```0```0$`(@!B`0`````!8@`(``````@`;`L6"0P-X`(```$```$!`20` +M9`$``````60`"``````(`&P+%@D,#>`"```!```!`@!!```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````"(` +M9`$``````60`"``````(`&P+%@D,#>`"```!```!`0`B`&,!``````%C``@` +M````"`!L"Q8)#`W@`@```0```0$!)`!E`0`````!90`(``````@`;`L6"0P- +MX`(```$```$"`$$````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````(@!E`0`````!90`(``````@`;`L6"0P- +MX`(```$```$!`"(`9`$``````60`"``````(`&P+%@D,#>`"```!```!`0$D +M`&8!``````%F``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````B +M`&8!``````%F``@`````"`!L"Q8)#`W@`@```0```0$`(@!E`0`````!90`( +M``````@`;`L6"0P-X`(```$```$!`20`9P$``````6<`"``````(`&P+%@D, +M#>`"```!```!`@!!```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````"(`9P$``````6<`"``````(`&P+%@D, +M#>`"```!```!`0`B`&8!``````%F``@`````"`!L"Q8)#`W@`@```0```0$! +M)`!H`0`````!:``(``````@`;`L6"0P-X`(```$```$"`$$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M(@!H`0`````!:``(``````@`;`L6"0P-X`(```$```$!`"(`9P$``````6<` +M"``````(`&P+%@D,#>`"```!```!`0$D`&D!``````%I``@`````"`!L"Q8) +M#`W@`@```0```0(`00`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````B`&D!``````%I``@`````"`!L"Q8) +M#`W@`@```0```0$`(@!H`0`````!:``(``````@`;`L6"0P-X`(```$```$! +M`20`:@$``````6H`"``````(`&P+%@D,#>`"```!```!`@!!```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`"(`:@$``````6H`"``````(`&P+%@D,#>`"```!```!`0`B`&D!``````%I +M``@`````"`!L"Q8)#`W@`@```0```0$!)`!K`0`````!:P`(``````@`;`L6 +M"0P-X`(```$```$"`$$````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````(@!K`0`````!:P`(``````@`;`L6 +M"0P-X`(```$```$!`"(`:@$``````6H`"``````(`&P+%@D,#>`"```!```! +M`0$D`&P!``````%L``@`````"`!L"Q8)#`W@`@```0```0(`00`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```B`&P!``````%L``@`````"`!L"Q8)#`W@`@```0```0$`(@!K`0`````! +M:P`(``````@`;`L6"0P-X`(```$```$!`20`;0$``````6T`"``````(`&P+ +M%@D,#>`"```!```!`@!!```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````"(`;0$``````6T`"``````(`&P+ +M%@D,#>`"```!```!`0`B`&P!``````%L``@`````"`!L"Q8)#`W@`@```0`` +M`0$!)`!N`0`````!;@`(``````@`;`L6"0P-X`(```$```$"`$$````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````(@!N`0`````!;@`(``````@`;`L6"0P-X`(```$```$!`"(`;0$````` +M`6T`"``````(`&P+%@D,#>`"```!```!`0$D`&\!``````%O``@`````"`!L +M"Q8)#`W@`@```0```0(`00`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````B`&\!``````%O``@`````"`!L +M"Q8)#`W@`@```0```0$`(@!N`0`````!;@`(``````@`;`L6"0P-X`(```$` +M``$!`20`<`$``````7``"``````(`&P+%@D,#>`"```!```!`@!!```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````"(`<`$``````7``"``````(`&P+%@D,#>`"```!```!`0`B`&\!```` +M``%O``@`````"`!L"Q8)#`W@`@```0```0$!)`!Q`0`````!<0`(``````@` +M;`L6"0P-X`(```$```$"`$$````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````(@!Q`0`````!<0`(``````@` +M;`L6"0P-X`(```$```$!`"(`<`$``````7``"``````(`&P+%@D,#>`"```! +M```!`0$D`'(!``````%R``@`````"`!L"Q8)#`W@`@```0```0(`00`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````B`'(!``````%R``@`````"`!L"Q8)#`W@`@```0```0$`(@!Q`0`` +M```!<0`(``````@`;`L6"0P-X`(```$```$!`20``"```!```!`@!!```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````"(``"```!```!`0`B`'(!``````%R``@`````"`!L"Q8)#`W@`@`` +M`0```0$!)`!T`0`````!=``(``````@`;`L6"0P-X`(```$```$"`$$````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````(@!T`0`````!=``(``````@`;`L6"0P-X`(```$```$!`"(``"```!```!`0$D`'4!``````%U``@````` +M"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````B`'4!``````%U``@````` +M"`!L"Q8)#`W@`@```0```0$`(@!T`0`````!=``(``````@`;`L6"0P-X`(` +M``$```$!`20`=@$``````78`"``````(`&P+%@D,#>`"```!```!`@!!```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````"(`=@$``````78`"``````(`&P+%@D,#>`"```!```!`0`B`'4! +M``````%U``@`````"`!L"Q8)#`W@`@```0```0$!)`!W`0`````!=P`(```` +M``@`;`L6"0P-X`(```$```$"`$$````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````(@!W`0`````!=P`(```` +M``@`;`L6"0P-X`(```$```$!`"(`=@$``````78`"``````(`&P+%@D,#>`" +M```!```!`0$D`'@!``````%X``@`````"`!L"Q8)#`W@`@```0```0(`00`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````B`'@!``````%X``@`````"`!L"Q8)#`W@`@```0```0$`(@!W +M`0`````!=P`(``````@`;`L6"0P-X`(```$```$!`20`>0$``````7D`"``` +M```(`&P+%@D,#>`"```!```!`@!!```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````"(`>0$``````7D`"``` +M```(`&P+%@D,#>`"```!```!`0`B`'@!``````%X``@`````"`!L"Q8)#`W@ +M`@```0```0$!)`!Z`0`````!>@`(``````@`;`L6"0P-X`(```$```$"`$$` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````(@!Z`0`````!>@`(``````@`;`L6"0P-X`(```$```$!`"(` +M>0$``````7D`"``````(`&P+%@D,#>`"```!```!`0$D`'L!``````%[``@` +M````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````B`'L!``````%[``@` +M````"`!L"Q8)#`W@`@```0```0$`(@!Z`0`````!>@`(``````@`;`L6"0P- +MX`(```$```$!`20`?`$``````7P`"``````(`&P+%@D,#>`"```!```!`@!! +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````"(`?`$``````7P`"``````(`&P+%@D,#>`"```!```!`0`B +M`'L!``````%[``@`````"`!L"Q8)#`W@`@```0```0$!)`!]`0`````!?0`( +M``````@`;`L6"0P-X`(```$```$"`$$````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````(@!]`0`````!?0`( +M``````@`;`L6"0P-X`(```$```$!`"(`?`$``````7P`"``````(`&P+%@D, +M#>`"```!```!`0$D`'X!``````%^``@`````"`!L"Q8)#`W@`@```0```0(` +M00`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````B`'X!``````%^``@`````"`!L"Q8)#`W@`@```0```0$` +M(@!]`0`````!?0`(``````@`;`L6"0P-X`(```$```$!`20`?P$``````7\` +M"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````"(`?P$``````7\` +M"``````(`&P+%@D,#>`"```!```!`0`B`'X!``````%^``@`````"`!L"Q8) +M#`W@`@```0```0$!)`"``0`````!@``(``````@`;`L6"0P-X`(```$```$" +M`$$````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````(@"``0`````!@``(``````@`;`L6"0P-X`(```$```$! +M`"(`?P$``````7\`"``````(`&P+%@D,#>`"```!```!`0$D`($!``````&! +M``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````B`($!``````&! +M``@`````"`!L"Q8)#`W@`@```0```0$`(@"``0`````!@``(``````@`;`L6 +M"0P-X`(```$```$!`20`@@$``````8(`"``````(`&P+%@D,#>`"```!```! +M`@!!```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````"(`@@$``````8(`"``````(`&P+%@D,#>`"```!```! +M`0`B`($!``````&!``@`````"`!L"Q8)#`W@`@```0```0$!)`"#`0`````! +M@P`(``````@`;`L6"0P-X`(```$```$"`$$````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````(@"#`0`````! +M@P`(``````@`;`L6"0P-X`(```$```$!`"(`@@$``````8(`"``````(`&P+ +M%@D,#>`"```!```!`0$D`(0!``````&$``@`````"`!L"Q8)#`W@`@```0`` +M`0(`00`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````B`(0!``````&$``@`````"`!L"Q8)#`W@`@```0`` +M`0$`(@"#`0`````!@P`(``````@`;`L6"0P-X`(```$```$!`20`A0$````` +M`84`"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````"(`A0$````` +M`84`"``````(`&P+%@D,#>`"```!```!`0`B`(0!``````&$``@`````"`!L +M"Q8)#`W@`@```0```0$!)`"&`0`````!A@`(``````@`;`L6"0P-X`(```$` +M``$"`$$````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````(@"&`0`````!A@`(``````@`;`L6"0P-X`(```$` +M``$!`"(`A0$``````84`"``````(`&P+%@D,#>`"```!```!`0$D`(`"```! +M```!`@!!```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````"(`B`$``````8@`"``````(`&P+%@D,#>`"```! +M```!`0`B`(`"```!```!`0$D`(H!``````&*``@`````"`!L"Q8)#`W@`@`` +M`0```0(`00`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````B`(H!``````&*``@`````"`!L"Q8)#`W@`@`` +M`0```0$`(@")`0`````!B0`(``````@`;`L6"0P-X`(```$```$!`20`BP$` +M`````8L`"``````(`&P+%@D,#>`"```!```!`@!!```````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````"(`BP$` +M`````8L`"``````(`&P+%@D,#>`"```!```!`0`B`(H!``````&*``@````` +M"`!L"Q8)#`W@`@```0```0$!)`",`0`````!C``(``````@`;`L6"0P-X`(` +M``$```$"`$$````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````(@",`0`````!C``(``````@`;`L6"0P-X`(` +M``$```$!`"(`BP$``````8L`"``````(`&P+%@D,#>`"```!```!`0$D`(T! +M``````&-``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````B`(T! +M``````&-``@`````"`!L"Q8)#`W@`@```0```0$`(@",`0`````!C``(```` +M``@`;`L6"0P-X`(```$```$!`20`C@$``````8X`"``````(`&P+%@D,#>`" +M```!```!`@!!```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````"(`C@$``````8X`"``````(`&P+%@D,#>`" +M```!```!`0`B`(T!``````&-``@`````"`!L"Q8)#`W@`@```0```0$!)`"/ +M`0`````!CP`(``````@`;`L6"0P-X`(```$```$"`$$````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````(@"/ +M`0`````!CP`(``````@`;`L6"0P-X`(```$```$!`"(`C@$``````8X`"``` +M```(`&P+%@D,#>`"```!```!`0$D`)`!``````&0``@`````"`!L"Q8)#`W@ +M`@```0```0(`00`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````B`)`!``````&0``@`````"`!L"Q8)#`W@ +M`@```0```0$`(@"/`0`````!CP`(``````@`;`L6"0P-X`(```$```$!`20` +MD0$``````9$`"``````(`&P+%@D,#>`"```!```!`@!!```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````"(` +MD0$``````9$`"``````(`&P+%@D,#>`"```!```!`0`B`)`!``````&0``@` +M````"`!L"Q8)#`W@`@```0```0$!)`"2`0`````!D@`(``````@`;`L6"0P- +MX`(```$```$"`$$````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````(@"2`0`````!D@`(``````@`;`L6"0P- +MX`(```$```$!`"(`D0$``````9$`"``````(`&P+%@D,#>`"```!```!`0$D +M`),!``````&3``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````B +M`),!``````&3``@`````"`!L"Q8)#`W@`@```0```0$`(@"2`0`````!D@`( +M``````@`;`L6"0P-X`(```$```$!`20`E`$``````90`"``````(`&P+%@D, +M#>`"```!```!`@!!```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````"(`E`$``````90`"``````(`&P+%@D, +M#>`"```!```!`0`B`),!``````&3``@`````"`!L"Q8)#`W@`@```0```0$! +M)`"5`0`````!E0`(``````@`;`L6"0P-X`(```$```$"`$$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M(@"5`0`````!E0`(``````@`;`L6"0P-X`(```$```$!`"(`E`$``````90` +M"``````(`&P+%@D,#>`"```!```!`0$D`)8!``````&6``@`````"`!L"Q8) +M#`W@`@```0```0(`00`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````B`)8!``````&6``@`````"`!L"Q8) +M#`W@`@```0```0$`(@"5`0`````!E0`(``````@`;`L6"0P-X`(```$```$! +M`20`EP$``````9<`"``````(`&P+%@D,#>`"```!```!`@!!```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`"(`EP$``````9<`"``````(`&P+%@D,#>`"```!```!`0`B`)8!``````&6 +M``@`````"`!L"Q8)#`W@`@```0```0$!)`"8`0`````!F``(``````@`;`L6 +M"0P-X`(```$```$"`$$````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````(@"8`0`````!F``(``````@`;`L6 +M"0P-X`(```$```$!`"(`EP$``````9<`"``````(`&P+%@D,#>`"```!```! +M`0$D`)D!``````&9``@`````"`!L"Q8)#`W@`@```0```0(`00`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```B`)D!``````&9``@`````"`!L"Q8)#`W@`@```0```0$`(@"8`0`````! +MF``(``````@`;`L6"0P-X`(```$```$!`20`F@$``````9H`"``````(`&P+ +M%@D,#>`"```!```!`@!!```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````"(`F@$``````9H`"``````(`&P+ +M%@D,#>`"```!```!`0`B`)D!``````&9``@`````"`!L"Q8)#`W@`@```0`` +M`0$!)`";`0`````!FP`(``````@`;`L6"0P-X`(```$```$"`$$````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````(@";`0`````!FP`(``````@`;`L6"0P-X`(```$```$!`"(`F@$````` +M`9H`"``````(`&P+%@D,#>`"```!```!`0$D`)P!``````&<``@`````"`!L +M"Q8)#`W@`@```0```0(`00`````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````B`)P!``````&<``@`````"`!L +M"Q8)#`W@`@```0```0$`(@";`0`````!FP`(``````@`;`L6"0P-X`(```$` +M``$!`20`G0$``````9T`"``````(`&P+%@D,#>`"```!```!`@!!```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````"(`G0$``````9T`"``````(`&P+%@D,#>`"```!```!`0`B`)P!```` +M``&<``@`````"`!L"Q8)#`W@`@```0```0$!)`">`0`````!G@`(``````@` +M;`L6"0P-X`(```$```$"`$$````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````(@">`0`````!G@`(``````@` +M;`L6"0P-X`(```$```$!`"(`G0$``````9T`"``````(`&P+%@D,#>`"```! +M```!`0$D`)\!``````&?``@`````"`!L"Q8)#`W@`@```0```0(`00`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````B`)\!``````&?``@`````"`!L"Q8)#`W@`@```0```0$`(@">`0`` +M```!G@`(``````@`;`L6"0P-X`(```$```$!`20`H`$``````:``"``````( +M`&P+%@D,#>`"```!```!`@!!```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````"(`H`$``````:``"``````( +M`&P+%@D,#>`"```!```!`0`B`)\!``````&?``@`````"`!L"Q8)#`W@`@`` +M`0```0$!)`"A`0`````!H0`(``````@`;`L6"0P-X`(```$```$"`$$````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````(@"A`0`````!H0`(``````@`;`L6"0P-X`(```$```$!`"(`H`$` +M`````:``"``````(`&P+%@D,#>`"```!```!`0$D`*(!``````&B``@````` +M"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````B`*(!``````&B``@````` +M"`!L"Q8)#`W@`@```0```0$`(@"A`0`````!H0`(``````@`;`L6"0P-X`(` +M``$```$!`20`HP$``````:,`"``````(`&P+%@D,#>`"```!```!`@!!```` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````"(`HP$``````:,`"``````(`&P+%@D,#>`"```!```!`0`B`*(! +M``````&B``@`````"`!L"Q8)#`W@`@```0```0$!)`"D`0`````!I``(```` +M``@`;`L6"0P-X`(```$```$"`$$````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````(@"D`0`````!I``(```` +M``@`;`L6"0P-X`(```$```$!`"(`HP$``````:,`"``````(`&P+%@D,#>`" +M```!```!`0$D`*4!``````&E``@`````"`!L"Q8)#`W@`@```0```0(`00`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````B`*4!``````&E``@`````"`!L"Q8)#`W@`@```0```0$`(@"D +M`0`````!I``(``````@`;`L6"0P-X`(```$```$!`20`I@$``````:8`"``` +M```(`&P+%@D,#>`"```!```!`@!!```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````"(`I@$``````:8`"``` +M```(`&P+%@D,#>`"```!```!`0`B`*4!``````&E``@`````"`!L"Q8)#`W@ +M`@```0```0$!)`"G`0`````!IP`(``````@`;`L6"0P-X`(```$```$"`$$` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````(@"G`0`````!IP`(``````@`;`L6"0P-X`(```$```$!`"(` +MI@$``````:8`"``````(`&P+%@D,#>`"```!```!`0$D`*@!``````&H``@` +M````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````B`*@!``````&H``@` +M````"`!L"Q8)#`W@`@```0```0$`(@"G`0`````!IP`(``````@`;`L6"0P- +MX`(```$```$!`20`J0$``````:D`"``````(`&P+%@D,#>`"```!```!`@!! +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````"(`J0$``````:D`"``````(`&P+%@D,#>`"```!```!`0`B +M`*@!``````&H``@`````"`!L"Q8)#`W@`@```0```0$!)`"J`0`````!J@`( +M``````@`;`L6"0P-X`(```$```$"`$$````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````(@"J`0`````!J@`( +M``````@`;`L6"0P-X`(```$```$!`"(`J0$``````:D`"``````(`&P+%@D, +M#>`"```!```!`0$D`*L!``````&K``@`````"`!L"Q8)#`W@`@```0```0(` +M00`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````B`*L!``````&K``@`````"`!L"Q8)#`W@`@```0```0$` +M(@"J`0`````!J@`(``````@`;`L6"0P-X`(```$```$!`20`K`$``````:P` +M"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````"(`K`$``````:P` +M"``````(`&P+%@D,#>`"```!```!`0`B`*L!``````&K``@`````"`!L"Q8) +M#`W@`@```0```0$!)`"M`0`````!K0`(``````@`;`L6"0P-X`(```$```$" +M`$$````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````(@"M`0`````!K0`(``````@`;`L6"0P-X`(```$```$! +M`"(`K`$``````:P`"``````(`&P+%@D,#>`"```!```!`0$D`*X!``````&N +M``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````B`*X!``````&N +M``@`````"`!L"Q8)#`W@`@```0```0$`(@"M`0`````!K0`(``````@`;`L6 +M"0P-X`(```$```$!`20`KP$``````:\`"``````(`&P+%@D,#>`"```!```! +M`@!!```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````"(`KP$``````:\`"``````(`&P+%@D,#>`"```!```! +M`0`B`*X!``````&N``@`````"`!L"Q8)#`W@`@```0```0$!```````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````(@"P`0`````! +ML``(``````@`;`L6"0P-X`(```$```$!`"(`[@```````.X`"``````(`&P+ +M%@D,#>`"```!```!`0$D`+$!``````&Q``@`````"`!L"Q8)#`W@`@```0`` +M`0(`00`````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````B`+$!``````&Q``@`````"`!L"Q8)#`W@`@```0`` +M`0$`(@"P`0`````!L``(``````@`;`L6"0P-X`(```$```$!`20`L@$````` +M`;(`"``````(`&P+%@D,#>`"```!```!`@!!```````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````"(`L@$````` +M`;(`"``````(`&P+%@D,#>`"```!```!`0`B`+$!``````&Q``@`````"`!L +M"Q8)#`W@`@```0```0$!)`"S`0`````!LP`(``````@`;`L6"0P-X`(```$` +M``$"`$$````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````(@"S`0`````!LP`(``````@`;`L6"0P-X`(```$` +M``$!`"(`L@$``````;(`"``````(`&P+%@D,#>`"```!```!`0$D`+0!```` +M``&T``@`````"`!L"Q8)#`W@`@```0```0(`00`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````B`+0!```` +M``&T``@`````"`!L"Q8)#`W@`@```0```0$`(@"S`0`````!LP`(``````@` +M;`L6"0P-X`(```$```$!`20`M0$``````;4`"``````(`&P+%@D,#>`"```! +M```!`@!!```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````"(`M0$``````;4`"``````(`&P+%@D,#>`"```! +M```!`0`B`+0!``````&T``@`````"`!L"Q8)#`W@`@```0```0$!)`"V`0`` +M```!M@`(``````@`;`L6"0P-X`(```$```$"`$$````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````(@"V`0`` +M```!M@`(``````@`;`L6"0P-X`(```$```$!`"(`M0$``````;4`"``````( +M`&P+%@D,#>`"```!```!`0$D`.\```````#O``@`````"`!L"Q8)#`W@`@`` +M`0```0(`00`````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````B`+`"```!```!@`!!`$$`00!!`$$`00!!`$$` +M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!! +M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$` +M00!!`$$`00!!`$$`00!!`$$`00!!```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````"(`N`$` +M`````;@`"``````(`&P+%@D,#>`"```!```!`0`B`+`"```!```!`0$````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````!%4NT! +M"E2'`5)225!?,3DY,4%42$4@4D]#2R!2241'12!)3E1%4D-(04Y'12!04D]4 +M3T-/3"!04D]6241%4R!355!03U)4($9/4B!03U-)6"!&24Q%(%-94U1%32!3 +M14U!3E1)0U-03$5!4T4@0T].5$%#5"!$25-#(%!50DQ)4TA%4B!&3U(@4U!% +M0TE&24-!5$E/3B!33U520T4N("!3144@4%5"3$E32$52($E$14Y4249)15(@ +M24X@4%))34%262!63TQ5344@1$530U))4%1/4B!&3U(@0T].5$%#5"!)3D9/ +M4DU!5$E/3BX````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +$```````` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_link_resolver.c b/Utilities/cmlibarchive/libarchive/test/test_link_resolver.c new file mode 100644 index 000000000..4976fecc9 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_link_resolver.c @@ -0,0 +1,205 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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) +{ + struct archive_entry *entry, *e2; + struct archive_entry_linkresolver *resolver; + + /* Initialize the resolver. */ + assert(NULL != (resolver = archive_entry_linkresolver_new())); + archive_entry_linkresolver_set_strategy(resolver, + ARCHIVE_FORMAT_TAR_USTAR); + + /* Create an entry with only 1 link and try to linkify it. */ + assert(NULL != (entry = archive_entry_new())); + archive_entry_set_pathname(entry, "test1"); + archive_entry_set_ino(entry, 1); + archive_entry_set_dev(entry, 2); + archive_entry_set_nlink(entry, 1); + archive_entry_set_size(entry, 10); + archive_entry_linkify(resolver, &entry, &e2); + + /* Shouldn't have been changed. */ + assert(e2 == NULL); + assertEqualInt(10, archive_entry_size(entry)); + assertEqualString("test1", archive_entry_pathname(entry)); + + /* Now, try again with an entry that has 2 links. */ + archive_entry_set_pathname(entry, "test2"); + archive_entry_set_nlink(entry, 2); + archive_entry_set_ino(entry, 2); + archive_entry_linkify(resolver, &entry, &e2); + /* Shouldn't be altered, since it wasn't seen before. */ + assert(e2 == NULL); + assertEqualString("test2", archive_entry_pathname(entry)); + assertEqualString(NULL, archive_entry_hardlink(entry)); + assertEqualInt(10, archive_entry_size(entry)); + + /* Match again and make sure it does get altered. */ + archive_entry_linkify(resolver, &entry, &e2); + assert(e2 == NULL); + assertEqualString("test2", archive_entry_pathname(entry)); + assertEqualString("test2", archive_entry_hardlink(entry)); + assertEqualInt(0, archive_entry_size(entry)); + + + /* Dirs should never be matched as hardlinks, regardless. */ + archive_entry_set_pathname(entry, "test3"); + archive_entry_set_nlink(entry, 2); + archive_entry_set_filetype(entry, AE_IFDIR); + archive_entry_set_ino(entry, 3); + archive_entry_set_hardlink(entry, NULL); + archive_entry_linkify(resolver, &entry, &e2); + /* Shouldn't be altered, since it wasn't seen before. */ + assert(e2 == NULL); + assertEqualString("test3", archive_entry_pathname(entry)); + assertEqualString(NULL, archive_entry_hardlink(entry)); + + /* Dir, so it shouldn't get matched. */ + archive_entry_linkify(resolver, &entry, &e2); + assert(e2 == NULL); + assertEqualString("test3", archive_entry_pathname(entry)); + assertEqualString(NULL, archive_entry_hardlink(entry)); + + archive_entry_free(entry); + archive_entry_linkresolver_free(resolver); +} + +static void test_linkify_old_cpio(void) +{ + struct archive_entry *entry, *e2; + struct archive_entry_linkresolver *resolver; + + /* Initialize the resolver. */ + assert(NULL != (resolver = archive_entry_linkresolver_new())); + archive_entry_linkresolver_set_strategy(resolver, + ARCHIVE_FORMAT_CPIO_POSIX); + + /* Create an entry with 2 link and try to linkify it. */ + assert(NULL != (entry = archive_entry_new())); + archive_entry_set_pathname(entry, "test1"); + archive_entry_set_ino(entry, 1); + archive_entry_set_dev(entry, 2); + archive_entry_set_nlink(entry, 2); + archive_entry_set_size(entry, 10); + archive_entry_linkify(resolver, &entry, &e2); + + /* Shouldn't have been changed. */ + assert(e2 == NULL); + assertEqualInt(10, archive_entry_size(entry)); + assertEqualString("test1", archive_entry_pathname(entry)); + + /* Still shouldn't be matched. */ + archive_entry_linkify(resolver, &entry, &e2); + assert(e2 == NULL); + assertEqualString("test1", archive_entry_pathname(entry)); + assertEqualString(NULL, archive_entry_hardlink(entry)); + assertEqualInt(10, archive_entry_size(entry)); + + archive_entry_free(entry); + archive_entry_linkresolver_free(resolver); +} + +static void test_linkify_new_cpio(void) +{ + struct archive_entry *entry, *e2; + struct archive_entry_linkresolver *resolver; + + /* Initialize the resolver. */ + assert(NULL != (resolver = archive_entry_linkresolver_new())); + archive_entry_linkresolver_set_strategy(resolver, + ARCHIVE_FORMAT_CPIO_SVR4_NOCRC); + + /* Create an entry with only 1 link and try to linkify it. */ + assert(NULL != (entry = archive_entry_new())); + archive_entry_set_pathname(entry, "test1"); + archive_entry_set_ino(entry, 1); + archive_entry_set_dev(entry, 2); + archive_entry_set_nlink(entry, 1); + archive_entry_set_size(entry, 10); + archive_entry_linkify(resolver, &entry, &e2); + + /* Shouldn't have been changed. */ + assert(e2 == NULL); + assertEqualInt(10, archive_entry_size(entry)); + assertEqualString("test1", archive_entry_pathname(entry)); + + /* Now, try again with an entry that has 3 links. */ + archive_entry_set_pathname(entry, "test2"); + archive_entry_set_nlink(entry, 3); + archive_entry_set_ino(entry, 2); + archive_entry_linkify(resolver, &entry, &e2); + + /* First time, it just gets swallowed. */ + assert(entry == NULL); + assert(e2 == NULL); + + /* Match again. */ + assert(NULL != (entry = archive_entry_new())); + archive_entry_set_pathname(entry, "test3"); + archive_entry_set_ino(entry, 2); + archive_entry_set_dev(entry, 2); + archive_entry_set_nlink(entry, 2); + archive_entry_set_size(entry, 10); + archive_entry_linkify(resolver, &entry, &e2); + + /* Should get back "test2" and nothing else. */ + assertEqualString("test2", archive_entry_pathname(entry)); + assertEqualInt(0, archive_entry_size(entry)); + archive_entry_free(entry); + assert(NULL == e2); + archive_entry_free(e2); /* This should be a no-op. */ + + /* Match a third time. */ + assert(NULL != (entry = archive_entry_new())); + archive_entry_set_pathname(entry, "test4"); + archive_entry_set_ino(entry, 2); + archive_entry_set_dev(entry, 2); + archive_entry_set_nlink(entry, 3); + archive_entry_set_size(entry, 10); + archive_entry_linkify(resolver, &entry, &e2); + + /* Should get back "test3". */ + assertEqualString("test3", archive_entry_pathname(entry)); + assertEqualInt(0, archive_entry_size(entry)); + + /* Since "test4" was the last link, should get it back also. */ + assertEqualString("test4", archive_entry_pathname(e2)); + assertEqualInt(10, archive_entry_size(e2)); + + archive_entry_free(entry); + archive_entry_free(e2); + archive_entry_linkresolver_free(resolver); +} + +DEFINE_TEST(test_link_resolver) +{ + test_linkify_tar(); + test_linkify_old_cpio(); + test_linkify_new_cpio(); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_open_fd.c b/Utilities/cmlibarchive/libarchive/test/test_open_fd.c new file mode 100644 index 000000000..b44756bf7 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_open_fd.c @@ -0,0 +1,122 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +#if defined(_WIN32) && !defined(__CYGWIN__) +#define open _open +#define lseek _lseek +#define close _close +#endif + +DEFINE_TEST(test_open_fd) +{ + char buff[64]; + struct archive_entry *ae; + struct archive *a; + int fd; + + fd = open("test.tar", O_RDWR | O_CREAT | O_BINARY, 0777); + assert(fd >= 0); + if (fd < 0) + return; + + /* Write an archive through this fd. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_fd(a, fd)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 0); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 8); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9)); + + /* + * Write a second file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file2"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 819200); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Close out the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* + * Now, read the data back. + */ + assert(lseek(fd, 0, SEEK_SET) == 0); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_fd(a, fd, 512)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(0, archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_ctime(ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff, 10)); + assertEqualMem(buff, "12345678", 8); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("file2", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(819200, archive_entry_size(ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a)); + + /* Verify the end of the archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + close(fd); + + + /* + * Verify some of the error handling. + */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + /* FD 100 shouldn't be open. */ + assertEqualIntA(a, ARCHIVE_FATAL, + archive_read_open_fd(a, 100, 512)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_open_file.c b/Utilities/cmlibarchive/libarchive/test/test_open_file.c new file mode 100644 index 000000000..47c93466e --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_open_file.c @@ -0,0 +1,108 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_open_file) +{ + char buff[64]; + struct archive_entry *ae; + struct archive *a; + FILE *f; + + f = fopen("test.tar", "wb"); + assert(f != NULL); + if (f == NULL) + return; + + /* Write an archive through this FILE *. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_FILE(a, f)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 0); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 8); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9)); + + /* + * Write a second file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file2"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 819200); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Close out the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + fclose(f); + + /* + * Now, read the data back. + */ + f = fopen("test.tar", "rb"); + assert(f != NULL); + if (f == NULL) + return; + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_FILE(a, f)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(0, archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_ctime(ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff, 10)); + assertEqualMem(buff, "12345678", 8); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("file2", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(819200, archive_entry_size(ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a)); + + /* Verify the end of the archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + fclose(f); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_open_filename.c b/Utilities/cmlibarchive/libarchive/test/test_open_filename.c new file mode 100644 index 000000000..1f1290d65 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_open_filename.c @@ -0,0 +1,109 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_open_filename) +{ + char buff[64]; + struct archive_entry *ae; + struct archive *a; + + /* Write an archive through this FILE *. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_none(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_filename(a, "test.tar")); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 0); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 8); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9)); + + /* + * Write a second file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file2"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 819200); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Close out the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* + * Now, read the data back. + */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, "test.tar", 512)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(0, archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_ctime(ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff, 10)); + assertEqualMem(buff, "12345678", 8); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("file2", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(819200, archive_entry_size(ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a)); + + /* Verify the end of the archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Verify some of the error handling. + */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_FATAL, + archive_read_open_filename(a, "nonexistent.tar", 512)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_pax_filename_encoding.c b/Utilities/cmlibarchive/libarchive/test/test_pax_filename_encoding.c new file mode 100644 index 000000000..14d955359 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_pax_filename_encoding.c @@ -0,0 +1,337 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_pax_filename_encoding.c,v 1.3 2008/08/11 01:19:36 kientzle Exp $"); + +#include + +/* + * Pax interchange is supposed to encode filenames into + * UTF-8. Of course, that's not always possible. This + * test is intended to verify that filenames always get + * stored and restored correctly, regardless of the encodings. + */ + +/* + * Read a manually-created archive that has filenames that are + * stored in binary instead of UTF-8 and verify that we get + * the right filename returned and that we get a warning only + * if the header isn't marked as binary. + */ +static void +test_pax_filename_encoding_1(void) +{ + static const char testname[] = "test_pax_filename_encoding.tar"; + /* + * \314\214 is a valid 2-byte UTF-8 sequence. + * \374 is invalid in UTF-8. + */ + char filename[] = "abc\314\214mno\374xyz"; + struct archive *a; + struct archive_entry *entry; + + /* + * Read an archive that has non-UTF8 pax filenames in it. + */ + extract_reference_file(testname); + a = archive_read_new(); + assertEqualInt(ARCHIVE_OK, archive_read_support_format_tar(a)); + assertEqualInt(ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_filename(a, testname, 10240)); + /* + * First entry in this test archive has an invalid UTF-8 sequence + * in it, but the header is not marked as hdrcharset=BINARY, so that + * requires a warning. + */ + failure("Invalid UTF8 in a pax archive pathname should cause a warning"); + assertEqualInt(ARCHIVE_WARN, archive_read_next_header(a, &entry)); + assertEqualString(filename, archive_entry_pathname(entry)); + /* + * Second entry is identical except that it does have + * hdrcharset=BINARY, so no warning should be generated. + */ + failure("A pathname with hdrcharset=BINARY can have invalid UTF8\n" + " characters in it without generating a warning"); + assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &entry)); + assertEqualString(filename, archive_entry_pathname(entry)); + archive_read_finish(a); +} + +/* + * Set the locale and write a pathname containing invalid characters. + * This should work; the underlying implementation should automatically + * fall back to storing the pathname in binary. + */ +static void +test_pax_filename_encoding_2(void) +{ + char filename[] = "abc\314\214mno\374xyz"; + struct archive *a; + struct archive_entry *entry; + char buff[65536]; + char longname[] = "abc\314\214mno\374xyz" + "/abc\314\214mno\374xyz/abcdefghijklmnopqrstuvwxyz" + "/abc\314\214mno\374xyz/abcdefghijklmnopqrstuvwxyz" + "/abc\314\214mno\374xyz/abcdefghijklmnopqrstuvwxyz" + "/abc\314\214mno\374xyz/abcdefghijklmnopqrstuvwxyz" + "/abc\314\214mno\374xyz/abcdefghijklmnopqrstuvwxyz" + "/abc\314\214mno\374xyz/abcdefghijklmnopqrstuvwxyz" + ; + size_t used; + + /* + * We need a starting locale which has invalid sequences. + * de_DE.UTF-8 seems to be commonly supported. + */ + /* If it doesn't exist, just warn and return. */ + if (NULL == setlocale(LC_ALL, LOCALE_DE)) { + skipping("invalid encoding tests require a suitable locale;" + " %s not available on this system", LOCALE_DE); + return; + } + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, 0, archive_write_set_format_pax(a)); + assertEqualIntA(a, 0, archive_write_set_compression_none(a)); + assertEqualIntA(a, 0, archive_write_set_bytes_per_block(a, 0)); + assertEqualInt(0, + archive_write_open_memory(a, buff, sizeof(buff), &used)); + + assert((entry = archive_entry_new()) != NULL); + /* Set pathname, gname, uname, hardlink to nonconvertible values. */ + archive_entry_copy_pathname(entry, filename); + archive_entry_copy_gname(entry, filename); + archive_entry_copy_uname(entry, filename); + archive_entry_copy_hardlink(entry, filename); + archive_entry_set_filetype(entry, AE_IFREG); + failure("This should generate a warning for nonconvertible names."); + assertEqualInt(ARCHIVE_WARN, archive_write_header(a, entry)); + archive_entry_free(entry); + + assert((entry = archive_entry_new()) != NULL); + /* Set path, gname, uname, and symlink to nonconvertible values. */ + archive_entry_copy_pathname(entry, filename); + archive_entry_copy_gname(entry, filename); + archive_entry_copy_uname(entry, filename); + archive_entry_copy_symlink(entry, filename); + archive_entry_set_filetype(entry, AE_IFLNK); + failure("This should generate a warning for nonconvertible names."); + assertEqualInt(ARCHIVE_WARN, archive_write_header(a, entry)); + archive_entry_free(entry); + + assert((entry = archive_entry_new()) != NULL); + /* Set pathname to a very long nonconvertible value. */ + archive_entry_copy_pathname(entry, longname); + archive_entry_set_filetype(entry, AE_IFREG); + failure("This should generate a warning for nonconvertible names."); + assertEqualInt(ARCHIVE_WARN, archive_write_header(a, entry)); + archive_entry_free(entry); + + assertEqualInt(0, archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertEqualInt(0, archive_write_finish(a)); +#endif + + /* + * Now read the entries back. + */ + + assert((a = archive_read_new()) != NULL); + assertEqualInt(0, archive_read_support_format_tar(a)); + assertEqualInt(0, archive_read_open_memory(a, buff, used)); + + assertEqualInt(0, archive_read_next_header(a, &entry)); + assertEqualString(filename, archive_entry_pathname(entry)); + assertEqualString(filename, archive_entry_gname(entry)); + assertEqualString(filename, archive_entry_uname(entry)); + assertEqualString(filename, archive_entry_hardlink(entry)); + + assertEqualInt(0, archive_read_next_header(a, &entry)); + assertEqualString(filename, archive_entry_pathname(entry)); + assertEqualString(filename, archive_entry_gname(entry)); + assertEqualString(filename, archive_entry_uname(entry)); + assertEqualString(filename, archive_entry_symlink(entry)); + + assertEqualInt(0, archive_read_next_header(a, &entry)); + assertEqualString(longname, archive_entry_pathname(entry)); + + assertEqualInt(0, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(0, archive_read_finish(a)); +#endif +} + +/* + * Create an entry starting from a wide-character Unicode pathname, + * read it back into "C" locale, which doesn't support the name. + * TODO: Figure out the "right" behavior here. + */ +static void +test_pax_filename_encoding_3(void) +{ + wchar_t badname[] = L"xxxAyyyBzzz"; + const char badname_utf8[] = "xxx\xE1\x88\xB4yyy\xE5\x99\xB8zzz"; + struct archive *a; + struct archive_entry *entry; + char buff[65536]; + size_t used; + + badname[3] = 0x1234; + badname[7] = 0x5678; + + /* If it doesn't exist, just warn and return. */ + if (NULL == setlocale(LC_ALL, "C")) { + skipping("Can't set \"C\" locale, so can't exercise " + "certain character-conversion failures"); + return; + } + + /* If wctomb is broken, warn and return. */ + if (wctomb(buff, 0x1234) > 0) { + skipping("Cannot test conversion failures because \"C\" " + "locale on this system has no invalid characters."); + return; + } + + /* If wctomb is broken, warn and return. */ + if (wctomb(buff, 0x1234) > 0) { + skipping("Cannot test conversion failures because \"C\" " + "locale on this system has no invalid characters."); + return; + } + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, 0, archive_write_set_format_pax(a)); + assertEqualIntA(a, 0, archive_write_set_compression_none(a)); + assertEqualIntA(a, 0, archive_write_set_bytes_per_block(a, 0)); + assertEqualInt(0, + archive_write_open_memory(a, buff, sizeof(buff), &used)); + + assert((entry = archive_entry_new()) != NULL); + /* Set pathname to non-convertible wide value. */ + archive_entry_copy_pathname_w(entry, badname); + archive_entry_set_filetype(entry, AE_IFREG); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + + assert((entry = archive_entry_new()) != NULL); + archive_entry_copy_pathname_w(entry, L"abc"); + /* Set gname to non-convertible wide value. */ + archive_entry_copy_gname_w(entry, badname); + archive_entry_set_filetype(entry, AE_IFREG); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + + assert((entry = archive_entry_new()) != NULL); + archive_entry_copy_pathname_w(entry, L"abc"); + /* Set uname to non-convertible wide value. */ + archive_entry_copy_uname_w(entry, badname); + archive_entry_set_filetype(entry, AE_IFREG); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + + assert((entry = archive_entry_new()) != NULL); + archive_entry_copy_pathname_w(entry, L"abc"); + /* Set hardlink to non-convertible wide value. */ + archive_entry_copy_hardlink_w(entry, badname); + archive_entry_set_filetype(entry, AE_IFREG); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + + assert((entry = archive_entry_new()) != NULL); + archive_entry_copy_pathname_w(entry, L"abc"); + /* Set symlink to non-convertible wide value. */ + archive_entry_copy_symlink_w(entry, badname); + archive_entry_set_filetype(entry, AE_IFLNK); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + + assertEqualInt(0, archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertEqualInt(0, archive_write_finish(a)); +#endif + + /* + * Now read the entries back. + */ + + assert((a = archive_read_new()) != NULL); + assertEqualInt(0, archive_read_support_format_tar(a)); + assertEqualInt(0, archive_read_open_memory(a, buff, used)); + + failure("A non-convertible pathname should cause a warning."); + assertEqualInt(ARCHIVE_WARN, archive_read_next_header(a, &entry)); + assertEqualWString(badname, archive_entry_pathname_w(entry)); + failure("If native locale can't convert, we should get UTF-8 back."); + assertEqualString(badname_utf8, archive_entry_pathname(entry)); + + failure("A non-convertible gname should cause a warning."); + assertEqualInt(ARCHIVE_WARN, archive_read_next_header(a, &entry)); + assertEqualWString(badname, archive_entry_gname_w(entry)); + failure("If native locale can't convert, we should get UTF-8 back."); + assertEqualString(badname_utf8, archive_entry_gname(entry)); + + failure("A non-convertible uname should cause a warning."); + assertEqualInt(ARCHIVE_WARN, archive_read_next_header(a, &entry)); + assertEqualWString(badname, archive_entry_uname_w(entry)); + failure("If native locale can't convert, we should get UTF-8 back."); + assertEqualString(badname_utf8, archive_entry_uname(entry)); + + failure("A non-convertible hardlink should cause a warning."); + assertEqualInt(ARCHIVE_WARN, archive_read_next_header(a, &entry)); + assertEqualWString(badname, archive_entry_hardlink_w(entry)); + failure("If native locale can't convert, we should get UTF-8 back."); + assertEqualString(badname_utf8, archive_entry_hardlink(entry)); + + failure("A non-convertible symlink should cause a warning."); + assertEqualInt(ARCHIVE_WARN, archive_read_next_header(a, &entry)); + assertEqualWString(badname, archive_entry_symlink_w(entry)); + assertEqualWString(NULL, archive_entry_hardlink_w(entry)); + failure("If native locale can't convert, we should get UTF-8 back."); + assertEqualString(badname_utf8, archive_entry_symlink(entry)); + + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &entry)); + + assertEqualInt(0, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(0, archive_read_finish(a)); +#endif +} + +DEFINE_TEST(test_pax_filename_encoding) +{ + test_pax_filename_encoding_1(); + test_pax_filename_encoding_2(); + test_pax_filename_encoding_3(); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_pax_filename_encoding.tar.uu b/Utilities/cmlibarchive/libarchive/test/test_pax_filename_encoding.tar.uu new file mode 100644 index 000000000..1c221fd6b --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_pax_filename_encoding.tar.uu @@ -0,0 +1,117 @@ +begin 644 test_pax_filename_encoding.tar +M4&%X2&5A9&5R+V%B8\R,;6YO6'AY>@`````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#8T-"``,#`Q-S4P(``P,#$W-3`@`#`P,#`P,#`P,38V +M(#$P-S8V-C`W,#,V(#`Q-3,P-@`@>``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U@HR,"!C=&EM +M93TQ,C`U-3,X-C@U"C(P(&%T:6UE/3$R,#4U,S@V,C8*,3<@4T-(24Q9+F1E +M=CTX.`HR,B!30TA)3%DN:6YO/30S,34T-#D*,3@@4T-(24Q9+FYL:6YK/3$* +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````&%B8\R,;6YO6'AY +M>@`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````P +M,#`V-#0@`#`P,3'EZ +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````,#`P-C0T(``P,#$W +M-3`@`#`P,3'EZ"C(P(&-T:6UE +M/3$R,#4U-#$W,S4*,C`@871I;64],3(P-34S.#8R-@HQ-R!30TA)3%DN9&5V +M/3@X"C(R(%-#2$E,62YI;F\]-#,Q-3$R-@HQ."!30TA)3%DN;FQI;FL],0H` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````86)CS(QM;F_\>'EZ```````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````#`P,#8T-"``,#`Q-S4P(``P,#$W-3`@ +M`#`P,#`P,#`P,#`U(#$P-S8V-C`W,#,V(#`Q,S4W,0`@,``````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!U +M= 1009000 +/* + * This "archive" is created by "GNU ar". Here we try to verify + * our GNU format handling functionality. + */ +static unsigned char archive[] = { +'!','<','a','r','c','h','>',10,'/','/',' ',' ',' ',' ',' ',' ',' ', +' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', +' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', +' ',' ',' ',' ',' ','4','0',' ',' ',' ',' ',' ',' ',' ',' ','`',10, +'y','y','y','t','t','t','s','s','s','a','a','a','f','f','f','.','o', +'/',10,'h','h','h','h','j','j','j','j','k','k','k','k','l','l','l', +'l','.','o','/',10,10,'/','0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', +' ',' ',' ',' ','1','1','7','5','4','6','5','6','5','2',' ',' ','1', +'0','0','1',' ',' ','0',' ',' ',' ',' ',' ','1','0','0','6','4','4', +' ',' ','8',' ',' ',' ',' ',' ',' ',' ',' ',' ','`',10,'5','5','6', +'6','7','7','8','8','g','g','h','h','.','o','/',' ',' ',' ',' ',' ', +' ',' ',' ',' ','1','1','7','5','4','6','5','6','6','8',' ',' ','1', +'0','0','1',' ',' ','0',' ',' ',' ',' ',' ','1','0','0','6','4','4', +' ',' ','4',' ',' ',' ',' ',' ',' ',' ',' ',' ','`',10,'3','3','3', +'3','/','1','9',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', +'1','1','7','5','4','6','5','7','1','3',' ',' ','1','0','0','1',' ', +' ','0',' ',' ',' ',' ',' ','1','0','0','6','4','4',' ',' ','9',' ', +' ',' ',' ',' ',' ',' ',' ',' ','`',10,'9','8','7','6','5','4','3', +'2','1',10}; + +char buff[64]; +#endif + +DEFINE_TEST(test_read_format_ar) +{ +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("test_read_support_format_ar()"); +#else + struct archive_entry *ae; + struct archive *a; + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_memory(a, archive, sizeof(archive))); + + /* Filename table. */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("//", archive_entry_pathname(ae)); + assertEqualInt(0, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_uid(ae)); + assertEqualInt(0, archive_entry_gid(ae)); + assertEqualInt(0, archive_entry_size(ae)); + + /* First Entry */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("yyytttsssaaafff.o", archive_entry_pathname(ae)); + assertEqualInt(1175465652, archive_entry_mtime(ae)); + assertEqualInt(1001, archive_entry_uid(ae)); + assertEqualInt(0, archive_entry_gid(ae)); + assert(8 == archive_entry_size(ae)); + assertA(8 == archive_read_data(a, buff, 10)); + assert(0 == memcmp(buff, "55667788", 8)); + + /* Second Entry */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("gghh.o", archive_entry_pathname(ae)); + assertEqualInt(1175465668, archive_entry_mtime(ae)); + assertEqualInt(1001, archive_entry_uid(ae)); + assertEqualInt(0, archive_entry_gid(ae)); + assert(4 == archive_entry_size(ae)); + assertA(4 == archive_read_data(a, buff, 10)); + assert(0 == memcmp(buff, "3333", 4)); + + /* Third Entry */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("hhhhjjjjkkkkllll.o", archive_entry_pathname(ae)); + assertEqualInt(1175465713, archive_entry_mtime(ae)); + assertEqualInt(1001, archive_entry_uid(ae)); + assertEqualInt(0, archive_entry_gid(ae)); + assert(9 == archive_entry_size(ae)); + assertA(9 == archive_read_data(a, buff, 9)); + assert(0 == memcmp(buff, "987654321", 9)); + + /* Test EOF */ + assertA(1 == archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin.c new file mode 100644 index 000000000..21e26ae7c --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin.c @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_bin.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +199,'q',21,4,177,'y',237,'A',232,3,232,3,2,0,0,0,'p','C',244,'M',2,0,0,0, +0,0,'.',0,199,'q',0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,11,0,0,0,0,0,'T','R', +'A','I','L','E','R','!','!','!',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + +DEFINE_TEST(test_read_format_cpio_bin) +{ + struct archive_entry *ae; + struct archive *a; + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_memory(a, archive, sizeof(archive))); + assertA(0 == archive_read_next_header(a, &ae)); + assertA(archive_compression(a) == ARCHIVE_COMPRESSION_NONE); + assertA(archive_format(a) == ARCHIVE_FORMAT_CPIO_BIN_LE); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_Z.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_Z.c new file mode 100644 index 000000000..515e45c34 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_Z.c @@ -0,0 +1,61 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_bin_Z.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +31,157,144,199,226,'T',' ',16,'+','O',187,' ',232,6,'$',20,0,160,'!',156, +'!',244,154,'0','l',216,208,5,128,128,20,'3','R',12,160,177,225,2,141,'T', +164,4,'I',194,164,136,148,16,'(',';',170,'\\',201,178,165,203,151,'0','c', +202,156,'I',179,166,205,155,'8','s',234,220,201,179,167,207,159,'@',127,2}; + +DEFINE_TEST(test_read_format_cpio_bin_Z) +{ + struct archive_entry *ae; + struct archive *a; + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + failure("archive_compression_name(a)=\"%s\"", + archive_compression_name(a)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS); + assertEqualString(archive_compression_name(a), "compress (.Z)"); + failure("archive_format_name(a)=\"%s\"", + archive_format_name(a)); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_BIN_LE); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_be.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_be.c new file mode 100644 index 000000000..9f14eb98c --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_be.c @@ -0,0 +1,55 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_read_format_cpio_bin_be) +{ + struct archive_entry *ae; + struct archive *a; + const char *reference = "test_read_format_cpio_bin_be.cpio"; + + extract_reference_file(reference); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, reference, 10)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "file1111222233334444"); + assertEqualInt(archive_entry_size(ae), 5); + assertEqualInt(archive_entry_mtime(ae), 1240664175); + assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 0); + + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_BIN_BE); + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_be.cpio.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_be.cpio.uu new file mode 100644 index 000000000..999f1e0d9 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_be.cpio.uu @@ -0,0 +1,8 @@ +$FreeBSD$ +begin 644 test_read_format_cpio_bin_be.cpio +M<<<`"#P\@:0#Z`````$``$GS"&\`%0````5F:6QE,3$Q,3(R,C(S,S,S-#0T +M-```86)C9&4`<<<```````````````$`````````"P````!44D%)3$52(2$A +M```````````````````````````````````````````````````````````` +3```````````````````````````` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_bz2.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_bz2.c new file mode 100644 index 000000000..aa7dfe877 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_bz2.c @@ -0,0 +1,58 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_bin_bz2.c,v 1.3 2008/12/06 06:00:52 kientzle Exp $"); + +static unsigned char archive[] = { +'B','Z','h','9','1','A','Y','&','S','Y',134,'J',208,'4',0,0,30,246,141,253, +8,2,0,' ',1,'*','&',20,0,'`',' ',' ',2,0,128,0,'B',4,8,' ',0,'T','P',0,'4', +0,13,6,137,168,245,27,'Q',160,'a',25,169,5,'I',187,'(',10,'d','E',177,177, +142,218,232,'r',130,'4','D',247,'<','Z',190,'U',237,236,'d',227,31,' ','z', +192,'E','_',23,'r','E','8','P',144,134,'J',208,'4'}; + +DEFINE_TEST(test_read_format_cpio_bin_bz2) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r != ARCHIVE_OK) { + skipping("bzip2 support unavailable"); + archive_read_close(a); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assert(archive_compression(a) == ARCHIVE_COMPRESSION_BZIP2); + assert(archive_format(a) == ARCHIVE_FORMAT_CPIO_BIN_LE); + assert(0 == archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_gz.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_gz.c new file mode 100644 index 000000000..bb49d9422 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_gz.c @@ -0,0 +1,61 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_bin_gz.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +31,139,8,0,244,'M','p','C',0,3,';','^','(',202,178,177,242,173,227,11,230, +23,204,'L',12,12,12,5,206,'_','|','A','4',3,131,30,195,241,'B',6,'8','`', +132,210,220,'`','2','$',200,209,211,199,'5','H','Q','Q',145,'a',20,12,'i', +0,0,170,199,228,195,0,2,0,0}; + +DEFINE_TEST(test_read_format_cpio_bin_gz) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + assertEqualInt(ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_gzip(a); + if (r == ARCHIVE_WARN) { + skipping("gzip reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + failure("archive_read_support_compression_gzip"); + assertEqualInt(ARCHIVE_OK, r); + assertEqualInt(ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), + ARCHIVE_COMPRESSION_GZIP); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_BIN_LE); + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_xz.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_xz.c new file mode 100644 index 000000000..99d44c15e --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_bin_xz.c @@ -0,0 +1,70 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +static unsigned char archive[] = { + 0xfd, 0x37, 0x7a, 0x58, 0x5a, 0x00, 0x00, 0x04, + 0xe6, 0xd6, 0xb4, 0x46, 0x02, 0x00, 0x21, 0x01, + 0x16, 0x00, 0x00, 0x00, 0x74, 0x2f, 0xe5, 0xa3, + 0xe0, 0x01, 0xff, 0x00, 0x33, 0x5d, 0x00, 0x63, + 0x9c, 0x3e, 0xa0, 0x43, 0x7c, 0xe6, 0x5d, 0xdc, + 0xeb, 0x76, 0x1d, 0x4b, 0x1b, 0xe2, 0x9e, 0x43, + 0x95, 0x97, 0x60, 0x16, 0x36, 0xc6, 0xd1, 0x3f, + 0x68, 0xd1, 0x94, 0xf9, 0xee, 0x47, 0xbb, 0xc9, + 0xf3, 0xa2, 0x01, 0x2a, 0x2f, 0x2b, 0xb2, 0x23, + 0x5a, 0x06, 0x9c, 0xd0, 0x4a, 0x6b, 0x5b, 0x14, + 0xb4, 0x00, 0x00, 0x00, 0x91, 0x62, 0x1e, 0x15, + 0x04, 0x46, 0x6b, 0x4d, 0x00, 0x01, 0x4f, 0x80, + 0x04, 0x00, 0x00, 0x00, 0xa1, 0x4b, 0xdf, 0x03, + 0xb1, 0xc4, 0x67, 0xfb, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x59, 0x5a +}; + +DEFINE_TEST(test_read_format_cpio_bin_xz) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("xz reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_XZ); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_BIN_LE); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_odc.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_odc.c new file mode 100644 index 000000000..349309140 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_odc.c @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_odc.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +'0','7','0','7','0','7','0','0','2','0','2','5','0','7','4','6','6','1','0', +'4','0','7','5','5','0','0','1','7','5','0','0','0','1','7','5','0','0','0', +'0','0','0','2','0','0','0','0','0','0','1','0','3','3','4','0','5','0','0', +'5','3','0','0','0','0','0','2','0','0','0','0','0','0','0','0','0','0','0', +'.',0,'0','7','0','7','0','7','0','0','0','0','0','0','0','0','0','0','0', +'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', +'0','0','0','0','0','1','0','0','0','0','0','0','0','0','0','0','0','0','0', +'0','0','0','0','0','0','0','0','1','3','0','0','0','0','0','0','0','0','0', +'0','0','T','R','A','I','L','E','R','!','!','!',0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0}; + +DEFINE_TEST(test_read_format_cpio_odc) +{ + struct archive_entry *ae; + struct archive *a; + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + assertA(archive_compression(a) == ARCHIVE_COMPRESSION_NONE); + assertA(archive_format(a) == ARCHIVE_FORMAT_CPIO_POSIX); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_svr4_gzip.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_svr4_gzip.c new file mode 100644 index 000000000..bc8fefdc0 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_svr4_gzip.c @@ -0,0 +1,61 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_svr4_gzip.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +31,139,8,0,236,'c',217,'D',0,3,'3','0','7','0','7','0','4','0','0',181,'0', +183,'L',2,210,6,6,'&',134,169,')',' ',218,192,'8',213,2,133,'6','0','0','2', +'1','6','7','0','5','0','N','6','@',5,'&',16,202,208,212,0,';','0',130,'1', +244,24,12,160,246,17,5,136,'U',135,14,146,'`',140,144,' ','G','O',31,215, +' ','E','E','E',134,'Q',128,21,0,0,'%',215,202,221,0,2,0,0}; + +DEFINE_TEST(test_read_format_cpio_svr4_gzip) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + assertEqualInt(ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_gzip(a); + if (r == ARCHIVE_WARN) { + skipping("gzip reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + assertEqualInt(ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), + ARCHIVE_COMPRESSION_GZIP); + assertEqualInt(archive_format(a), + ARCHIVE_FORMAT_CPIO_SVR4_NOCRC); + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_svr4c_Z.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_svr4c_Z.c new file mode 100644 index 000000000..c77fb85c1 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_cpio_svr4c_Z.c @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_svr4c_Z.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +31,157,144,'0','n',4,132,'!',3,6,140,26,'8','n',228,16,19,195,160,'A',26, +'1',202,144,'q','h','p','F',25,28,20,'a','X',196,152,145,' ',141,25,2,'k', +192,160,'A',163,163,201,135,29,'c',136,'<',201,'2','c','A',147,'.',0,12,20, +248,178,165,205,155,20,27,226,220,201,243,166,152,147,'T',164,4,'I',194,164, +136,148,16,'H',1,'(',']',202,180,169,211,167,'P',163,'J',157,'J',181,170, +213,171,'X',179,'j',221,202,181,171,215,175,'L',1}; + +DEFINE_TEST(test_read_format_cpio_svr4c_Z) +{ + struct archive_entry *ae; + struct archive *a; +/* printf("Archive address: start=%X, end=%X\n", archive, archive+sizeof(archive)); */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + failure("archive_compression_name(a)=\"%s\"", + archive_compression_name(a)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS); + failure("archive_format_name(a)=\"%s\"", archive_format_name(a)); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_SVR4_CRC); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_empty.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_empty.c new file mode 100644 index 000000000..2b5480488 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_empty.c @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_empty.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { 0 }; + +DEFINE_TEST(test_read_format_empty) +{ + struct archive_entry *ae; + struct archive *a; + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_memory(a, archive, 0)); + assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae)); + assertA(archive_compression(a) == ARCHIVE_COMPRESSION_NONE); + assertA(archive_format(a) == ARCHIVE_FORMAT_EMPTY); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_gz.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_gz.c new file mode 100644 index 000000000..e504be9b0 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_gz.c @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_gtar_gz.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +31,139,8,0,'+','e',217,'D',0,3,211,211,'g',160,'9','0',0,2,'s','S','S',16, +'m','h','n','j',128,'L',195,0,131,161,129,177,177,137,129,137,185,185,161, +'!',131,129,161,129,153,161,'9',131,130,')',237,157,198,192,'P','Z','\\', +146,'X',164,160,192,'P',146,153,139,'W',29,'!','y',152,'G','`',244,'(',24, +5,163,'`',20,12,'r',0,0,226,234,'6',162,0,6,0,0}; + +DEFINE_TEST(test_read_format_gtar_gz) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + assertEqualInt(ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_gzip(a); + if (r == ARCHIVE_WARN) { + skipping("gzip reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + assertEqualInt(ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), + ARCHIVE_COMPRESSION_GZIP); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_GNUTAR); + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_lzma.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_lzma.c new file mode 100644 index 000000000..53de903a2 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_lzma.c @@ -0,0 +1,78 @@ +/*- + * Copyright (c) 2008 Miklos Vajna + * 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" +__FBSDID("$FreeBSD$"); + +static unsigned char archive[] = { +0x5d, 0x0, 0x0, 0x80, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x17, 0xb, 0xbc, 0x1c, 0x7d, 0x1, 0x95, 0xc0, 0x1d, 0x4a, 0x46, 0x9c, +0x1c, 0xc5, 0x8, 0x82, 0x10, 0xed, 0x84, 0xf6, 0xea, 0x7a, 0xfe, 0x63, +0x5a, 0x34, 0x5e, 0xf7, 0xc, 0x60, 0xd6, 0x8b, 0xc1, 0x47, 0xaf, 0x11, +0x6f, 0x18, 0x94, 0x81, 0x74, 0x8a, 0xf8, 0x47, 0xcc, 0xdd, 0xc0, 0xd9, +0x40, 0xa, 0xc3, 0xac, 0x43, 0x47, 0xb5, 0xac, 0x2b, 0x31, 0xd3, 0x6, +0xa4, 0x2c, 0x44, 0x80, 0x24, 0x4b, 0xfe, 0x43, 0x22, 0x4e, 0x14, 0x30, +0x7a, 0xef, 0x99, 0x6e, 0xf, 0x8b, 0xc1, 0x79, 0x93, 0x88, 0x54, 0x73, +0x59, 0x3f, 0xc, 0xfb, 0xee, 0x9c, 0x83, 0x49, 0x93, 0x33, 0xad, 0x44, +0xbe, 0x0}; + +DEFINE_TEST(test_read_format_gtar_lzma) +{ + int r; + + struct archive_entry *ae; + struct archive *a; + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + r = archive_read_support_compression_lzma(a); + if (r == ARCHIVE_WARN) { + skipping("lzma reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + + assertEqualIntA(a, ARCHIVE_OK, r); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_format_all(a)); + r = archive_read_open_memory2(a, archive, sizeof(archive), 3); + if (r != ARCHIVE_OK) { + skipping("Skipping LZMA compression check: %s", + archive_error_string(a)); + goto finish; + } + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_LZMA); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_GNUTAR); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); +finish: +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse.c new file mode 100644 index 000000000..c3f086a29 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse.c @@ -0,0 +1,318 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_gtar_sparse.c,v 1.11 2008/12/06 05:58:24 kientzle Exp $"); + + +struct contents { + off_t o; + size_t s; + const char *d; +}; + +struct contents archive_contents_sparse[] = { + { 1000000, 1, "a" }, + { 2000000, 1, "a" }, + { 3145728, 0, NULL } +}; + +struct contents archive_contents_sparse2[] = { + { 1000000, 1, "a" }, + { 2000000, 1, "a" }, + { 3000000, 1, "a" }, + { 4000000, 1, "a" }, + { 5000000, 1, "a" }, + { 6000000, 1, "a" }, + { 7000000, 1, "a" }, + { 8000000, 1, "a" }, + { 9000000, 1, "a" }, + { 10000000, 1, "a" }, + { 11000000, 1, "a" }, + { 12000000, 1, "a" }, + { 13000000, 1, "a" }, + { 14000000, 1, "a" }, + { 15000000, 1, "a" }, + { 16000000, 1, "a" }, + { 17000000, 1, "a" }, + { 18000000, 1, "a" }, + { 19000000, 1, "a" }, + { 20000000, 1, "a" }, + { 21000000, 1, "a" }, + { 22000000, 1, "a" }, + { 23000000, 1, "a" }, + { 24000000, 1, "a" }, + { 25000000, 1, "a" }, + { 26000000, 1, "a" }, + { 27000000, 1, "a" }, + { 28000000, 1, "a" }, + { 29000000, 1, "a" }, + { 30000000, 1, "a" }, + { 31000000, 1, "a" }, + { 32000000, 1, "a" }, + { 33000000, 1, "a" }, + { 34000000, 1, "a" }, + { 35000000, 1, "a" }, + { 36000000, 1, "a" }, + { 37000000, 1, "a" }, + { 38000000, 1, "a" }, + { 39000000, 1, "a" }, + { 40000000, 1, "a" }, + { 41000000, 1, "a" }, + { 42000000, 1, "a" }, + { 43000000, 1, "a" }, + { 44000000, 1, "a" }, + { 45000000, 1, "a" }, + { 46000000, 1, "a" }, + { 47000000, 1, "a" }, + { 48000000, 1, "a" }, + { 49000000, 1, "a" }, + { 50000000, 1, "a" }, + { 51000000, 1, "a" }, + { 52000000, 1, "a" }, + { 53000000, 1, "a" }, + { 54000000, 1, "a" }, + { 55000000, 1, "a" }, + { 56000000, 1, "a" }, + { 57000000, 1, "a" }, + { 58000000, 1, "a" }, + { 59000000, 1, "a" }, + { 60000000, 1, "a" }, + { 61000000, 1, "a" }, + { 62000000, 1, "a" }, + { 63000000, 1, "a" }, + { 64000000, 1, "a" }, + { 65000000, 1, "a" }, + { 66000000, 1, "a" }, + { 67000000, 1, "a" }, + { 68000000, 1, "a" }, + { 69000000, 1, "a" }, + { 70000000, 1, "a" }, + { 71000000, 1, "a" }, + { 72000000, 1, "a" }, + { 73000000, 1, "a" }, + { 74000000, 1, "a" }, + { 75000000, 1, "a" }, + { 76000000, 1, "a" }, + { 77000000, 1, "a" }, + { 78000000, 1, "a" }, + { 79000000, 1, "a" }, + { 80000000, 1, "a" }, + { 81000000, 1, "a" }, + { 82000000, 1, "a" }, + { 83000000, 1, "a" }, + { 84000000, 1, "a" }, + { 85000000, 1, "a" }, + { 86000000, 1, "a" }, + { 87000000, 1, "a" }, + { 88000000, 1, "a" }, + { 89000000, 1, "a" }, + { 90000000, 1, "a" }, + { 91000000, 1, "a" }, + { 92000000, 1, "a" }, + { 93000000, 1, "a" }, + { 94000000, 1, "a" }, + { 95000000, 1, "a" }, + { 96000000, 1, "a" }, + { 97000000, 1, "a" }, + { 98000000, 1, "a" }, + { 99000000, 1, "a" }, + { 99000001, 0, NULL } +}; + +struct contents archive_contents_nonsparse[] = { + { 0, 1, "a" }, + { 1, 0, NULL } +}; + +/* + * Describe an archive with three entries: + * + * File 1: named "sparse" + * * a length of 3145728 bytes (3MiB) + * * a single 'a' byte at offset 1000000 + * * a single 'a' byte at offset 2000000 + * File 2: named "sparse2" + * * a single 'a' byte at offset 1,000,000, 2,000,000, ..., 99,000,000 + * * length of 99,000,001 + * File 3: named 'non-sparse' + * * length of 1 byte + * * contains a single byte 'a' + */ + +struct archive_contents { + const char *filename; + struct contents *contents; +} files[] = { + { "sparse", archive_contents_sparse }, + { "sparse2", archive_contents_sparse2 }, + { "non-sparse", archive_contents_nonsparse }, + { NULL, NULL } +}; + +static void +verify_archive_file(const char *name, struct archive_contents *ac) +{ + struct archive_entry *ae; + int err; + /* data, size, offset of next expected block. */ + struct contents expect; + /* data, size, offset of block read from archive. */ + struct contents actual; + const void *p; + struct archive *a; + + extract_reference_file(name); + + assert((a = archive_read_new()) != NULL); + assert(0 == archive_read_support_compression_all(a)); + assert(0 == archive_read_support_format_tar(a)); + failure("Can't open %s", name); + assert(0 == archive_read_open_filename(a, name, 3)); + + while (ac->filename != NULL) { + struct contents *cts = ac->contents; + + if (!assertEqualIntA(a, 0, archive_read_next_header(a, &ae))) { + assert(0 == archive_read_finish(a)); + return; + } + failure("Name mismatch in archive %s", name); + assertEqualString(ac->filename, archive_entry_pathname(ae)); + + expect = *cts++; + while (0 == (err = archive_read_data_block(a, + &p, &actual.s, &actual.o))) { + actual.d = p; + while (actual.s > 0) { + char c = *actual.d; + if(actual.o < expect.o) { + /* + * Any byte before the expected + * data must be NULL. + */ + failure("%s: pad at offset %d " + "should be zero", name, actual.o); + assertEqualInt(c, 0); + } else if (actual.o == expect.o) { + /* + * Data at matching offsets must match. + */ + assertEqualInt(c, *expect.d); + expect.d++; + expect.o++; + expect.s--; + /* End of expected? step to next expected. */ + if (expect.s <= 0) + expect = *cts++; + } else { + /* + * We found data beyond that expected. + */ + failure("%s: Unexpected trailing data", + name); + assert(actual.o <= expect.o); + archive_read_finish(a); + return; + } + actual.d++; + actual.o++; + actual.s--; + } + } + failure("%s: should be end of entry", name); + assertEqualIntA(a, err, ARCHIVE_EOF); + failure("%s: Size returned at EOF must be zero", name); + assertEqualInt((int)actual.s, 0); +#if ARCHIVE_VERSION_NUMBER < 1009000 + /* libarchive < 1.9 doesn't get this right */ + skipping("offset of final sparse chunk"); +#else + failure("%s: Offset of final empty chunk must be same as file size", name); + assertEqualInt(actual.o, expect.o); +#endif + /* Step to next file description. */ + ++ac; + } + + err = archive_read_next_header(a, &ae); + assertEqualIntA(a, ARCHIVE_EOF, err); + + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif +} + + +DEFINE_TEST(test_read_format_gtar_sparse) +{ + /* Two archives that use the "GNU tar sparse format". */ + verify_archive_file("test_read_format_gtar_sparse_1_13.tar", files); + verify_archive_file("test_read_format_gtar_sparse_1_17.tar", files); + + /* + * libarchive < 1.9 doesn't support the newer --posix sparse formats + * from GNU tar 1.15 and later. + */ +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("read support for GNUtar --posix sparse formats"); +#else + /* + * An archive created by GNU tar 1.17 using --posix --sparse-format=0.1 + */ + verify_archive_file( + "test_read_format_gtar_sparse_1_17_posix00.tar", + files); + /* + * An archive created by GNU tar 1.17 using --posix --sparse-format=0.1 + */ + verify_archive_file( + "test_read_format_gtar_sparse_1_17_posix01.tar", + files); + /* + * An archive created by GNU tar 1.17 using --posix --sparse-format=1.0 + */ + verify_archive_file( + "test_read_format_gtar_sparse_1_17_posix10.tar", + files); + /* + * The last test archive here is a little odd. First, it's + * uncompressed, because that exercises some of the block + * reassembly code a little harder. Second, it includes some + * leading comments prior to the sparse block description. + * GNU tar doesn't do this, but I think it should, so I want + * to ensure that libarchive correctly ignores such comments. + * Dump the file, looking for "#!gnu-sparse-format" starting + * at byte 0x600. + */ + verify_archive_file( + "test_read_format_gtar_sparse_1_17_posix10_modified.tar", + files); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu new file mode 100644 index 000000000..5ab519036 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu @@ -0,0 +1,1369 @@ +begin 644 test_read_format_gtar_sparse_1_13.tar +M``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!UF4],S$T-371E71E71E71E$AE861E``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!UF4],S$T-3$AE861E``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U``````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!U +MF4].3DP,#`P,#$*,C`@ +M871I;64],3$Y.#(Y,S8P,PHR,"!C=&EM93TQ,3DX,CDS-C`Q"@`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`"XO1TY54W!A``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````!U``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U``````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!U +MF4].3DP,#`P,#$*,C`@ +M871I;64],3$Y.#(Y,S8P,PHR,"!C=&EM93TQ,3DX,CDS-C`Q"@`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`"XO1TY54W!A``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````!UDDV&5W;&L+J>O%OV0WW+;;E'I7+4>6RJO+\5_.+9?(J +MJEX>5:/R,BM'Q\^>5E^^.W^R.O^&`?$7C-X/\DD_#T4:NAL;<7VW..@/AFE^ +MF.^GH[!],!@F:19>+Y^?M#?)DJ*PEM63CT4A2[?V)UEXTWL;&MUN*Z2UP\G! +M>"?9&J:KRD[8JWU(M[)\,J[OU?+>[F`X'(QW'FJZS3AN-QIQI]EJKK<[<7Q^ +MI2+^0W2E1REZJ-'S;[B/US;+^=$B-&MQK176YN%LMCA;.YU-/W\ZFI^>3,]J17N8/O0<`("[ +M*5VLL8O_`0``X#&[B/RK%@````#@,;O]'[M;>U@[```````````````````` +M`````````````````````````````````````````````.#.?@")(\.V`(`! +!```` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_bz2.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_bz2.c new file mode 100644 index 000000000..e73de8f91 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_bz2.c @@ -0,0 +1,139 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * All rights reserved. + * + * Based on libarchive/test/test_read_format_isorr_bz2.c with + * bugs introduced by Andreas Henriksson for + * testing ISO9660 image with Joliet extension. + * + * 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" + +/* +Execute the following to rebuild the data for this program: + tail -n +35 test_read_format_isojoliet_bz2.c | /bin/sh + +rm -rf /tmp/iso +mkdir /tmp/iso +mkdir /tmp/iso/dir +echo "hello" >/tmp/iso/long-joliet-file-name.textfile +ln /tmp/iso/long-joliet-file-name.textfile /tmp/iso/hardlink +(cd /tmp/iso; ln -s long-joliet-file-name.textfile symlink) +if [ "$(uname -s)" = "Linux" ]; then # gnu coreutils touch doesn't have -h +TZ=utc touch -afm -t 197001020000.01 /tmp/iso /tmp/iso/long-joliet-file-name.textfile /tmp/iso/dir +TZ=utc touch -afm -t 197001030000.02 /tmp/iso/symlink +else +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/long-joliet-file-name.textfile /tmp/iso/dir +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink +fi +mkhybrid -J -uid 1 -gid 2 /tmp/iso | bzip2 > test_read_format_isojoliet_bz2.iso.bz2 +F=test_read_format_isojoliet_bz2.iso.bz2 +uuencode $F $F > $F.uu +exit 1 + */ + +DEFINE_TEST(test_read_format_isojoliet_bz2) +{ + const char *refname = "test_read_format_isojoliet_bz2.iso.bz2"; + struct archive_entry *ae; + struct archive *a; + const void *p; + size_t size; + off_t offset; + int r; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r == ARCHIVE_WARN) { + skipping("bzip2 reading not fully supported on this platform"); + assertEqualInt(0, archive_read_finish(a)); + return; + } + assertEqualInt(0, r); + assertEqualInt(0, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_set_options(a, "iso9660:!rock-ridge")); + assertEqualInt(ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* First entry is '.' root directory. */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString(".", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(86401, archive_entry_ctime(ae)); + assertEqualInt(0, archive_entry_stat(ae)->st_nlink); + assertEqualInt(0, archive_entry_uid(ae)); + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt((int)size, 0); + + /* A directory. */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("dir", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + + /* A regular file with two names ("hardlink" gets returned + * first, so it's not marked as a hardlink). */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(6, archive_entry_size(ae)); + assertEqualInt(0, archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt(6, (int)size); + assertEqualInt(0, offset); + assertEqualInt(0, memcmp(p, "hello\n", 6)); + + /* Second name for the same regular file (this happens to be + * returned second, so does get marked as a hardlink). */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("long-joliet-file-name.textfile", + archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("hardlink", archive_entry_hardlink(ae)); + assert(!archive_entry_size_is_set(ae)); + + /* A symlink to the regular file. */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("symlink", archive_entry_pathname(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(172802, archive_entry_mtime(ae)); + assertEqualInt(172802, archive_entry_atime(ae)); + + /* End of archive. */ + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + + /* Close the archive. */ + assertEqualInt(0, archive_read_close(a)); + assertEqualInt(0, archive_read_finish(a)); +} + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_bz2.iso.bz2.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_bz2.iso.bz2.uu new file mode 100644 index 000000000..46601a845 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_bz2.iso.bz2.uu @@ -0,0 +1,29 @@ +begin 644 test_read_format_isojoliet_bz2.iso.bz2 +M0EIH.3%!62936??^FX(``/9_^__?1_?^8__L/__?8:?_W&8@Z@$`9``008"` +M``+)"-`$/@=NN!W8[`8#23*GY-3U$](,0:`:`&"`9``9``T-'J::>B/4``#0 +MIM$9&IA-!-0'I`>HT`&1Z@``T`!H`:#0'H(,E-(-3-$-&AB-`8C0`R9#1A`# +M1A/1`&@,@!H'``#0`-`&@``-&(`!H`````&@`D1)H0B-1O)&4V2:9#"9/4/2 +M`/4>H'J-#(83U/$R@WZJ#>J&CREP**.W2R[".$_:J#$"N5P7:?.#4-4/..?K +M!KG\G]P="PX^ADTP4^Y%[1+0V,;$*HTA&\V'@+*$<.M-0L@CLZ\Z(B=]`3`4%B"00B`FF@!-]HK<2. +M)?&IAD^/KKM>TRY#@+H5W781AM)P\\-4$&88^S$WX"2$=(X7(?,=$?H.A')A +M`%2T4:GEQRL:WS4Q=4SU(F>*JM1UEK\V`5P$L[9[D*;FBNEC^GPMAH8T>K&> +MQ)_.TSB;5G`P>)20L5V6':NL^M38\&.')5))BO/*5`\P%H!`D7B2](0T)?Y0"`M3A6)'=($UL$@I$0$RBA0F4.!DAM`/@ +M!V,L#/`+FC!;C.K58BA"1P\H1LVXG\@^"8IJ@0*0>TP@8F#0R^(M($"`"#I" +M`.FD45RN3EH2^8X6C/LKMKA;@K,T&ZZ%&PIJW%:>FG[.F=KGJ_O.(K`+0#!@ +MQK&-G6!">H`4_/.<\CK)K+S/I/"?`9JG,TS^C1FI[O3NN(`Q^:*`Z1WEO()6 +MZ*!0@MSD*1?AE*V5[='!>>O%XL8LXIOQB\@CIBM%\0JD'+MAR$"@T'8M;JFM +MLHN7HG1S:F]+B'BZ)SJ(=0,6*Z791QW+3RNI(7!E!)'@.B$(934!)D0=U#%# +MV21)DA=@4;RM?@RLG1[`,A:"YQF2!`P`2B)#APE)`^\F8V +M5_U]0O,4AE6?->8U4$<2N%TC-HD%($@9'E1DCQZ&B:X4\IUV83HQ7)A'8I511-P`;=!!).^8X*0NHMB+.&!W"009 +M,<;0G^>BA6F[;A;X2B!%?BP&(G7&@(,*O-QP;;1*`*6"F:X8D"Y$/T,(1JM' +M$>\,IQ&V6;/)!\)0C$,[;`O,`9A-HRHQ8@^PLT.?=7RL[2789J_J86!HF0T" +M3%@,A$VPC(:A@3(\&9-TZP2>KA*D>D;<^L4(H=EUT419R5`$A(R(Y-^O ++_B[DBG"A(>_]-P0` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_long.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_long.c new file mode 100644 index 000000000..8f8fbc079 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_long.c @@ -0,0 +1,146 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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" + +/* +Execute the following to rebuild the data for this program: + tail -n +35 test_read_format_isojoliet_long.c | /bin/sh + +rm -rf /tmp/iso +mkdir /tmp/iso +num=0 +file=""; +while [ $num -lt 100 ] +do + num=$((num+10)) + file="${file}1234567890" +done +dir="${file}dir" +mkdir /tmp/iso/${dir} +file="${file}123" +echo "hello" > /tmp/iso/${file} +ln /tmp/iso/${file} /tmp/iso/hardlink +if [ "$(uname -s)" = "Linux" ]; then # gnu coreutils touch doesn't have -h +TZ=utc touch -afm -t 197001020000.01 /tmp/iso /tmp/iso/${file} /tmp/iso/${dir} +else +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/${file} /tmp/iso/${dir} +fi +F=test_read_format_isojoliet_long.iso.bz2 +mkhybrid -J -joliet-long -uid 1 -gid 2 /tmp/iso | bzip2 > $F +uuencode $F $F > $F.uu +rm -rf /tmp/iso +exit 1 + */ + +DEFINE_TEST(test_read_format_isojoliet_long) +{ + const char *refname = "test_read_format_isojoliet_long.iso.bz2"; + char pathname[104]; + struct archive_entry *ae; + struct archive *a; + const void *p; + size_t size; + off_t offset; + int i, r; + + for (i = 0; i < 100; i++) + pathname[i] = '0' + ((i+1) % 10); + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r == ARCHIVE_WARN) { + skipping("bzip2 reading not fully supported on this platform"); + assertEqualInt(0, archive_read_finish(a)); + return; + } + assertEqualInt(0, r); + assertEqualInt(0, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_set_options(a, "iso9660:!rock-ridge")); + assertEqualInt(ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* First entry is '.' root directory. */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString(".", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(86401, archive_entry_ctime(ae)); + assertEqualInt(0, archive_entry_stat(ae)->st_nlink); + assertEqualInt(0, archive_entry_uid(ae)); + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt((int)size, 0); + + /* A directory. */ + pathname[100] = 'd'; + pathname[101] = 'i'; + pathname[102] = 'r'; + pathname[103] = '\0'; + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString(pathname, archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + + /* A regular file with two names ("hardlink" gets returned + * first, so it's not marked as a hardlink). */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(6, archive_entry_size(ae)); + assertEqualInt(0, archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt(6, (int)size); + assertEqualInt(0, offset); + assertEqualInt(0, memcmp(p, "hello\n", 6)); + + /* Second name for the same regular file (this happens to be + * returned second, so does get marked as a hardlink). */ + pathname[100] = '1'; + pathname[101] = '2'; + pathname[102] = '3'; + pathname[103] = '\0'; + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString(pathname, archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("hardlink", archive_entry_hardlink(ae)); + assert(!archive_entry_size_is_set(ae)); + + /* End of archive. */ + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + + /* Close the archive. */ + assertEqualInt(0, archive_read_close(a)); + assertEqualInt(0, archive_read_finish(a)); +} + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_long.iso.bz2.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_long.iso.bz2.uu new file mode 100644 index 000000000..78d53f9a7 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_long.iso.bz2.uu @@ -0,0 +1,29 @@ +begin 644 test_read_format_isojoliet_long.iso.bz2 +M0EIH.3%!629364L46LD``/?__?__1_?W;__X/__?8*[_GH8DJ$``!`04<8`! +M0`+@"-`$?@"[!;`NTZC4\H-&@>H#1H-# +MTADT'J9-#)H`>0GJ&3`&DG?T]7>3N%RX*8W*%^PO*-D.6'C'C^0/M/$?WQX^ +M9AAMU].DB%':^%!/8,F5!/B`3XP$RY=\!*`)TP$W0$PYV=.W +M4*S4WUZH%9:./' +M;*0L:1?4X)8&.1+$=[@7\#KWE$NQG&47.#HA>@U$91B$(I" +M#QQ;VK0-I>D%"H?M1'8B,A\JE%,=PCU.%3HV+E)N&]CJ!J[W8M3L4K.4NC0( +MP@3GM'`A4A"!!@1>A`%"$D@`*,P(!B-NM%A83\SU)LPW%OO/WVI.*Z"N/]&& +MW2@K.:A"\YR6"D*@^Q[H]$;-`U$L):67R)\]DA(\>*`40_B'^5'B;@AY90&! +M2C))&)VK\)#2*&HLKK0VYR<]-LVMO5YFV8M;^M/0R9D$J!UH0MG +M"]0E!S#GHMLB"4:RHV'BNU.?_-3$H:`];(4R;!=>(EWJ2AG-:F"#$$^[3R3@-1$Q;^'``V`2E@'S"H"3-,X,!)5!)>NH"4'$7S&VGB*:I. +M(&I@^%`>\Z[`T%NRFD +MGJ\C8QU.1*2;!V$34J`PX5O3IB6*KD"*I@F`EA`BI"77Z2(('XU0$"1#0*>3 +M\'*$+89IZ!DQY2_M@4PQ!3Q_PR0=#7`(791X],EP--!EHB!4KP\TWBV2QT#* +MB`A?(/:[Y/L!D`%LFN@E"@GQ$(DR)L$5#5I4H.V@*X!':PG4F-*!X))YRW@H +M.$'T-*"6#M)*5%3B8"V1X42(/I!!\H8F2\@1JICQ*EG for + * testing ISO9660 image with Joliet extension. + * + * 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" + +/* +Execute the following to rebuild the data for this program: + tail -n +35 test_read_format_isojoliet_rr.c | /bin/sh + +rm -rf /tmp/iso +mkdir /tmp/iso +mkdir /tmp/iso/dir +file="long-joliet-file-name.textfile" +echo "hello" >/tmp/iso/$file +ln /tmp/iso/$file /tmp/iso/hardlink +(cd /tmp/iso; ln -s $file symlink) +if [ "$(uname -s)" = "Linux" ]; then # gnu coreutils touch doesn't have -h +TZ=utc touch -afm -t 197001020000.01 /tmp/iso/hardlink /tmp/iso/$file /tmp/iso/dir +TZ=utc touch -afm -t 197001030000.02 /tmp/iso/symlink +TZ=utc touch -afm -t 197001020000.01 /tmp/iso +else +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso/hardlink /tmp/iso/$file /tmp/iso/dir +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso +fi +F=test_read_format_isojoliet_rr.iso.bz2 +mkhybrid -J -uid 1 -gid 2 /tmp/iso | bzip2 > $F +uuencode $F $F > $F.uu +exit 1 + */ + +DEFINE_TEST(test_read_format_isojoliet_rr) +{ + const char *refname = "test_read_format_isojoliet_rr.iso.bz2"; + struct archive_entry *ae; + struct archive *a; + const void *p; + size_t size; + off_t offset; + int r; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r == ARCHIVE_WARN) { + skipping("bzip2 reading not fully supported on this platform"); + assertEqualInt(0, archive_read_finish(a)); + return; + } + assertEqualInt(0, r); + assertEqualInt(0, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* First entry is '.' root directory. */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString(".", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(3, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt((int)size, 0); + + /* A directory. */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("dir", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + + /* A regular file with two names ("hardlink" gets returned + * first, so it's not marked as a hardlink). */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(6, archive_entry_size(ae)); + assertEqualInt(0, archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt(6, (int)size); + assertEqualInt(0, offset); + assertEqualInt(0, memcmp(p, "hello\n", 6)); + assertEqualInt(86401, archive_entry_mtime(ae)); + /* mkisofs records their access time. */ + /*assertEqualInt(86401, archive_entry_atime(ae));*/ + /* TODO: Actually, libarchive should be able to + * compute nlinks correctly even without RR + * extensions. See comments in libarchive source. */ + assertEqualInt(2, archive_entry_nlink(ae)); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + + /* Second name for the same regular file (this happens to be + * returned second, so does get marked as a hardlink). */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("long-joliet-file-name.textfile", + archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("hardlink", archive_entry_hardlink(ae)); + assert(!archive_entry_size_is_set(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + /* TODO: See above. */ + assertEqualInt(2, archive_entry_nlink(ae)); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + + /* A symlink to the regular file. */ + assertEqualInt(0, archive_read_next_header(a, &ae)); + assertEqualString("symlink", archive_entry_pathname(ae)); + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("long-joliet-file-name.textfile", + archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(172802, archive_entry_mtime(ae)); + assertEqualInt(172802, archive_entry_atime(ae)); + assertEqualInt(1, archive_entry_nlink(ae)); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + + /* End of archive. */ + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE); + + /* Close the archive. */ + assertEqualInt(0, archive_read_close(a)); + assertEqualInt(0, archive_read_finish(a)); +} + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_rr.iso.bz2.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_rr.iso.bz2.uu new file mode 100644 index 000000000..3eebaac72 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isojoliet_rr.iso.bz2.uu @@ -0,0 +1,31 @@ +begin 644 test_read_format_isojoliet_rr.iso.bz2 +M0EIH.3%!62936>6EH6P``/1_____Q_?_9__\/__?8:__GF8DJD`!)$`00>`` +M`(```LD(T`1^`B!(VM*0#1$T&HQ3R2:'J-I-/0&TDT`9-&-)DQ&:`]1DTTC3 +MU&C]$&@C"&&B:$,J>TI@1J>GJGI`R#0R:!B:,F"!B:&C3)@)D:&)@3)D'``` +M``````````````````#@`````````````````````D2$($&5/9%/34;*>GJA +MIDVIFH](-&TGI#T@:`TT;:2-/4/4V4/2;1-'I+`43=>#%["-XX:D%L%8K`LT +M-%+E!I!YQY_+%Q'C\AJ4-.YA!/G +M(`!+PL$D@#5JA+%AM"PXLM`E6T-@)"2-$$TH&P0T"38FT(;S(<`0-"0)(LL@ +M*VD&J"3L8D*!B4Z4BDH&1*8*HTX;Y_%O%)D;^G*H*01KZDLL2798ECD0A(0V +M(-MB1GOZ:I[$X^LBZN'P;/J8^L" +MA7A9[.K!&_*:=4M&.]L^3@[[D4 +M]$ED_&Q)A=TY6LXW(#$A-,AL9,J`O@KP6@2D"3(328TAC`\37E4HK3A44(Z(#R`Y,F +M'@@%A&"V6=L%0$M(YO0!=BVM0M$"+8)]W:Z=Z[O`HF\DXIDY8$@FF,'LPH&, +M8,3!H9;B+"$`@!C/!@4GK;!*)1%D^=!%-$JS%RQY/):".-=."&LZ\E$;_/I, +ML&1J3;_:NA56-&T=P^RTM4<;1%X0+P`&-\Q_Y5,3P1E$(!,(A5D*&Q,S<=EN +MD07S"!(.:"GH:I&0VR,5>=+&:N/1,9?KMG*Z^*]GL."Z9\90N.\EF7)2%QI69%$&YD0?*"89$@0VDZ2>B+ +M&"0=="KJ7!SJ.RZB)$1:@O($D*-`46,N*!/1.OPX[Z`R$&E?`'0`EJQ"!CM4 +M#<-MZDN2,<0:05&^J\0M6-=B(]1R5P=<1BS7S+$:0`XL(S)0%VUGL&-T`M&4 +MC6NZ%DBZR,WQ6LPPSH&OUJKNCG3KITT$S(A4(VA!,`L+=+?)"]FA0%L$%*0Z +M=@ZYPBFV0NM&XGDJ<*-E*T;R8+(R,,F1!R_TP@1;I`*+ZRJ>!.R0,J-*])LA +MXBO-KCS8Y[*2P-7&;_._;R!*BOBN`8,Y-,MWHE6C/"9)&K8P.[(-O=4$E=(; +MV$50*9358;*&"/D4+);CFM`KR/4QC3MQ6!PX,P?-1BVH-!B@=66:""ET8H&R +MU5'YE@&"K!9?9)4Z$&AOG!=F'Z#TVE^I]AB@G74;16:A!%LE!MXX`^3L7#O@ +MSZ.E5:&6QBNAVBK-S;57A9[(+XCORVN2`RBZ7C]YES@&0B=O6E)A_V6=?=-<)+2A0/@PYT^F4)RZYM^5TF$^3G=)%$5/RPJQL20A(RT?*OS8 +-NHO_%W)%.%"0Y:6A;``` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_bz2.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_bz2.c new file mode 100644 index 000000000..a23fb03c4 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_bz2.c @@ -0,0 +1,210 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_isorr_bz2.c,v 1.5 2008/09/01 05:38:33 kientzle Exp $"); + +/* +PLEASE use old cdrtools; mkisofs verion is 2.01. +This version mkisofs made wrong "SL" System Use Entry of RRIP. + +Execute the following command to rebuild the data for this program: + tail -n +32 test_read_format_isorr_bz2.c | /bin/sh + +rm -rf /tmp/iso +mkdir /tmp/iso +mkdir /tmp/iso/dir +echo "hello" >/tmp/iso/file +dd if=/dev/zero count=1 bs=12345678 >>/tmp/iso/file +ln /tmp/iso/file /tmp/iso/hardlink +(cd /tmp/iso; ln -s file symlink) +(cd /tmp/iso; ln -s /tmp/ symlink2) +(cd /tmp/iso; ln -s /tmp/../ symlink3) +(cd /tmp/iso; ln -s .././../tmp/ symlink4) +(cd /tmp/iso; ln -s .///file symlink5) +(cd /tmp/iso; ln -s /tmp//../ symlink6) +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink /tmp/iso/symlink5 +F=test_read_format_isorr_bz2.iso.bz2 +mkhybrid -R -uid 1 -gid 2 /tmp/iso | bzip2 > $F +uuencode $F $F > $F.uu +exit 1 + */ + +DEFINE_TEST(test_read_format_isorr_bz2) +{ + const char *refname = "test_read_format_isorr_bz2.iso.bz2"; + struct archive_entry *ae; + struct archive *a; + const void *p; + size_t size; + off_t offset; + int i; + int r; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r == ARCHIVE_WARN) { + skipping("bzip2 reading not fully supported on this platform"); + assertEqualInt(0, archive_read_finish(a)); + return; + } + assertEqualInt(0, r); + assertEqualInt(0, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* Retrieve each of the 8 files on the ISO image and + * verify that each one is what we expect. */ + for (i = 0; i < 10; ++i) { + assertEqualInt(0, archive_read_next_header(a, &ae)); + + if (strcmp(".", archive_entry_pathname(ae)) == 0) { + /* '.' root directory. */ + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + /* Now, we read timestamp recorded by RRIP "TF". */ + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + /* Now, we read links recorded by RRIP "PX". */ + assertEqualInt(3, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt((int)size, 0); + } else if (strcmp("dir", archive_entry_pathname(ae)) == 0) { + /* A directory. */ + assertEqualString("dir", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { + /* A regular file. */ + assertEqualString("file", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualInt(12345684, archive_entry_size(ae)); + assertEqualInt(0, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt(0, offset); + assertEqualMem(p, "hello\n", 6); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { + /* A hardlink to the regular file. */ + /* Note: If "hardlink" gets returned before "file", + * then "hardlink" will get returned as a regular file + * and "file" will get returned as the hardlink. + * This test should tolerate that, since it's a + * perfectly permissible thing for libarchive to do. */ + assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("file", archive_entry_hardlink(ae)); + assertEqualInt(0, archive_entry_size_is_set(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink", archive_entry_pathname(ae)) == 0) { + /* A symlink to the regular file. */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("file", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(172802, archive_entry_mtime(ae)); + assertEqualInt(172802, archive_entry_atime(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink2", archive_entry_pathname(ae)) == 0) { + /* A symlink to /tmp (an absolute path) */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("/tmp", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink3", archive_entry_pathname(ae)) == 0) { + /* A symlink to /tmp/.. (with a ".." component) */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("/tmp/..", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink4", archive_entry_pathname(ae)) == 0) { + /* A symlink to a path with ".." and "." components */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString(".././../tmp", + archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink5", archive_entry_pathname(ae)) == 0) { + /* A symlink to the regular file with "/" components. */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString(".///file", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(172802, archive_entry_mtime(ae)); + assertEqualInt(172802, archive_entry_atime(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink6", archive_entry_pathname(ae)) == 0) { + /* A symlink to /tmp//.. + * (with "/" and ".." components) */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("/tmp//..", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else { + failure("Saw a file that shouldn't have been there"); + assertEqualString(archive_entry_pathname(ae), ""); + } + } + + /* End of archive. */ + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE); + + /* Close the archive. */ + assertEqualInt(0, archive_read_close(a)); + assertEqualInt(0, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu new file mode 100644 index 000000000..35bd49911 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu @@ -0,0 +1,26 @@ +begin 644 test_read_format_isorr_bz2.iso.bz2 +M0EIH.3%!629361^[8GT``-I_W?__Z_Q5X__Z/__?8*?OWB8A_R2```4@`(`" +M@0C0`[X.@;"X4N!H13U3:3U,TTF30-`T:9!IH:`:`!H&@`T-,@T&AD`TU`@: +MFFDT](]$T3"&1@`",0`#3`$8`@TPFFF!HU%,IFHTV4TTT:`!HT`#0```#0`# +MU#0``!QH:`-``T````&@````&0``#$`12(F2:1Z:GHU&$,$#1IHTR:#0```T +M```-&F1B5C+"&F]A9Z?`U1J4+Y`J<.R%DQ,4_M&L-&]P!VH0THE"001`PKEQ +ME0`&9.7LA`.V0`"_Z$%$0`=]@R77`LU0AC! +M%@7\Q3`%DJ%=(0D"('\[&MK[J*15!$`=K+&R-YNQ!N+%&C)7.T-#E1>IVJ[L +M[Z9N]_H#7;&H;!)'O@,VY`YJ-R0)C14:^@C;.7"EG9(L(S&HOPA4)@D"R1@H +M8DS22Y,"9B-XEZJ9"4Q@P/HBL$Q0GJHO'K.]Z9#V)6%C-*$=%1F\SI*/1TK= +MN.<,!."80/-@)&42M3D9",BA1GJ5.?`:ESRT%@I33,AKD0*,&I02?X[HH)67 +M?]KD&>W9J3OH4Z3%F1O%/UTEWU%*2RH[CL6)ZPT:1!,462+PJ20)T"!&A"&% +M+,$`D@@*B@D()X4/A92B1'-B)DEJF7R\W/V!V6_2O$!Q8R+C1PP!@B*!@)"4 +MD,2&P3N:C7$0P+4%#64U!CJ>BNO5*-8JS@"8'&/E4>D`.HTHL96`+%?`$^AF +M()HE49JS"KT92H!#R%5R33$E7](2I&CAZW+#`AJ:J!&58)9S)AO3=?["VH1^ +M3#)/();9KC%[E1J,5<&N(1,S],$*[)-H$^"6Q`(((8@2$4OD0,1]$2P\U-F. +M85F>3TM?8G8YMVM*;8!.`"X+$H#`R-ZGR2HE<-"5*MDB@R.>4'[#((D`-A%T +MZM;_9X1L"$-E4B=@[24#0MD=22LJK0R`,8&T$A1G#I6(B>`/]A,S@1,:WV$RA5P'4C0:D\"`G6`HAA7 +ML/K"'V(4B'7)&-/-%:31TQU=%BQ6)LBX\S(XB*C"82F+M5LTR"!.@$(9&R/< +M#`M+J68NWY?P4YF=3=H)+D]8-YC6AN6+'O,\)E&/^)4,4$2&,<9CSR@V!F-P +>@G!B;(\/.2E,^!VZA%!$`/tmp/iso/file +dd if=/dev/zero count=1 bs=12345678 >>/tmp/iso/file +ln /tmp/iso/file /tmp/iso/hardlink +(cd /tmp/iso; ln -s file symlink) +(cd /tmp/iso; ln -s /tmp/ symlink2) +(cd /tmp/iso; ln -s /tmp/../ symlink3) +(cd /tmp/iso; ln -s .././../tmp/ symlink4) +(cd /tmp/iso; ln -s .///file symlink5) +(cd /tmp/iso; ln -s /tmp//../ symlink6) +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink +F=test_read_format_isorr_new_bz2.iso.bz2 +mkhybrid -R -uid 1 -gid 2 /tmp/iso | bzip2 > $F +uuencode $F $F > $F.uu +exit 1 + */ + +DEFINE_TEST(test_read_format_isorr_new_bz2) +{ + const char *refname = "test_read_format_isorr_new_bz2.iso.bz2"; + struct archive_entry *ae; + struct archive *a; + const void *p; + size_t size; + off_t offset; + int i; + int r; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r == ARCHIVE_WARN) { + skipping("bzip2 reading not fully supported on this platform"); + assertEqualInt(0, archive_read_finish(a)); + return; + } + assertEqualInt(0, r); + assertEqualInt(0, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* Retrieve each of the 8 files on the ISO image and + * verify that each one is what we expect. */ + for (i = 0; i < 10; ++i) { + assertEqualInt(0, archive_read_next_header(a, &ae)); + + if (strcmp(".", archive_entry_pathname(ae)) == 0) { + /* '.' root directory. */ + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + /* Now, we read timestamp recorded by RRIP "TF". */ + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + /* Now, we read links recorded by RRIP "PX". */ + assertEqualInt(3, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt((int)size, 0); + } else if (strcmp("dir", archive_entry_pathname(ae)) == 0) { + /* A directory. */ + assertEqualString("dir", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { + /* A regular file. */ + assertEqualString("file", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualInt(12345684, archive_entry_size(ae)); + assertEqualInt(0, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt(0, offset); + assertEqualMem(p, "hello\n", 6); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { + /* A hardlink to the regular file. */ + /* Note: If "hardlink" gets returned before "file", + * then "hardlink" will get returned as a regular file + * and "file" will get returned as the hardlink. + * This test should tolerate that, since it's a + * perfectly permissible thing for libarchive to do. */ + assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("file", archive_entry_hardlink(ae)); + assertEqualInt(0, archive_entry_size_is_set(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink", archive_entry_pathname(ae)) == 0) { + /* A symlink to the regular file. */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("file", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(172802, archive_entry_mtime(ae)); + assertEqualInt(172802, archive_entry_atime(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink2", archive_entry_pathname(ae)) == 0) { + /* A symlink to /tmp/ (an absolute path) */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("/tmp/", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink3", archive_entry_pathname(ae)) == 0) { + /* A symlink to /tmp/../ (with a ".." component) */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("/tmp/../", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink4", archive_entry_pathname(ae)) == 0) { + /* A symlink to a path with ".." and "." components */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString(".././../tmp/", + archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink5", archive_entry_pathname(ae)) == 0) { + /* A symlink to the regular file with "/" components. */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString(".///file", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(172802, archive_entry_mtime(ae)); + assertEqualInt(172802, archive_entry_atime(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink6", archive_entry_pathname(ae)) == 0) { + /* A symlink to /tmp//../ + * (with "/" and ".." components) */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("/tmp//../", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else { + failure("Saw a file that shouldn't have been there"); + assertEqualString(archive_entry_pathname(ae), ""); + } + } + + /* End of archive. */ + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE); + + /* Close the archive. */ + assertEqualInt(0, archive_read_close(a)); + assertEqualInt(0, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_new_bz2.iso.bz2.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_new_bz2.iso.bz2.uu new file mode 100644 index 000000000..8f71b2133 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isorr_new_bz2.iso.bz2.uu @@ -0,0 +1,27 @@ +begin 644 test_read_format_isorr_bz2.iso.bz2 +M0EIH.3%!629366".K#H``-A__?__>_QUY_^Z/__?X*?OWF8DJU4`)```A2`` +M@`_!"-`#[PZUHUSNPID``R`-#0```-``:`!ZAH`!B43U!!H````:``! +MH`````````!H<````````````````````R!%(D":GJ/4R:/4-/4/4T&FC1D! +MIDR9`!H:`R#0```>IDPZ"IJ"51(^XL`L)`>(`<*0^$EX#Q>,#L:MV;5JVQV= +M*'5(F$`SB``7_P@HB`#N;1`C(A33(41$0!K0@8()6IU:$%H"`*U$@ASD4\7@4H:M +M/;H$!]NVG>'?XLX(6*(:("IE4D=H`(;^!@D$0)=;MV[0(H(@#JX(V7;!>#$8 +MK(42:.-CC&QVZCLE;ZQ+F9`,,8%P%@40:8`*S)0.,C>R!,"*A_,='-,F%*QI +ME-&I>C%@(`28!"8HE!$((`2`R"09F"02"9Q3%\ADPX2<#B(VB6E3DAM8'S14 +M!+83_"+C9]4\\#VJ:XJC1BE)&05\OI8\]C"0RD2#IJ,.1,D008)*16AD7$9! +M0HST*KC0&A9T:"F4DRH3",`/4\1=/][@1O?OOM'D;EQ$6KD>_-5C2%&UQ&JK +M4RHJJDN*QQYO3Y/U52T@[C0-ZT:,2E,,*8P2DW"02E(D$,$I(/X`I)=,""-U +M*EVEF0UF2MZMQ>/R>7TDF*_;G8$%BB\&X3@T@*&GL$<13YU4-BQ*4BL9XO*#`22@]T)]S(Q0&1410C#$P`+O;PR(PG>R,J)2/S +MEKA(_@KQY]83UZ6(JM-P`[<40P*1;U8*97D')9[4=23%Y;HRGO66:_,45O@L +M>R+2=:M&U28';7DOGQ7W0 +M?D:EQ\A?`6`TH!PZU.R>:A$PCQ*KV-2Q9H3JA\!TD4!<2-N7L'XT!'R(H^AB +M)^3]JJ#QKK54V!EZQT@YP^Q5&+?#(K%)AH&H8Z%]!@T.OE`]>32]-%Q\QB#+ +M\',@44"HRUPP9+MYL8.>\Q[@6&<,5!MNU%9L(KK&9C[8\DR^CY9=]ED*HU+J +M,P9Q=RA4U'R+M#7B\,S_$=MBFS*`KD%*UQRE+"S-9!=DZ2419IV`S`/tmp/iso/file +dd if=/dev/zero count=1 bs=12345678 >>/tmp/iso/file +ln /tmp/iso/file /tmp/iso/hardlink +(cd /tmp/iso; ln -s file symlink) +(cd /tmp/iso; ln -s /tmp/ symlink2) +(cd /tmp/iso; ln -s /tmp/../ symlink3) +(cd /tmp/iso; ln -s .././../tmp/ symlink4) +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink +mkzftree /tmp/iso /tmp/ziso +TZ=utc touch -afhm -t 197001020000.01 /tmp/ziso /tmp/ziso/file /tmp/ziso/dir +TZ=utc touch -afhm -t 197001030000.02 /tmp/ziso/symlink +mkhybrid -R -uid 1 -gid 2 -z /tmp/ziso | bzip2 > test_read_format_isozisofs_bz2.iso.bz2 +F=test_read_format_isozisofs_bz2.iso.bz2 +uuencode $F $F > $F.uu +exit 1 + + */ + +DEFINE_TEST(test_read_format_isozisofs_bz2) +{ + const char *refname = "test_read_format_isozisofs_bz2.iso.bz2"; + struct archive_entry *ae; + struct archive *a; + const void *p; + size_t size; + off_t offset; + int i; + int r; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r == ARCHIVE_WARN) { + skipping("bzip2 reading not fully supported on this platform"); + assertEqualInt(0, archive_read_finish(a)); + return; + } + assertEqualInt(0, r); + assertEqualInt(0, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* Retrieve each of the 8 files on the ISO image and + * verify that each one is what we expect. */ + for (i = 0; i < 8; ++i) { + assertEqualInt(0, archive_read_next_header(a, &ae)); + + if (strcmp(".", archive_entry_pathname(ae)) == 0) { + /* '.' root directory. */ + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + /* Now, we read timestamp recorded by RRIP "TF". */ + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + /* Now, we read links recorded by RRIP "PX". */ + assertEqualInt(3, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt((int)size, 0); + } else if (strcmp("dir", archive_entry_pathname(ae)) == 0) { + /* A directory. */ + assertEqualString("dir", archive_entry_pathname(ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { + /* A regular file. */ + assertEqualString("file", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualInt(12345684, archive_entry_size(ae)); + assertEqualInt(0, + archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt(0, offset); + assertEqualMem(p, "hello\n", 6); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { + /* A hardlink to the regular file. */ + /* Note: If "hardlink" gets returned before "file", + * then "hardlink" will get returned as a regular file + * and "file" will get returned as the hardlink. + * This test should tolerate that, since it's a + * perfectly permissible thing for libarchive to do. */ + assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("file", archive_entry_hardlink(ae)); + assertEqualInt(0, archive_entry_size_is_set(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink", archive_entry_pathname(ae)) == 0) { + /* A symlink to the regular file. */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("file", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(172802, archive_entry_mtime(ae)); + assertEqualInt(172802, archive_entry_atime(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink2", archive_entry_pathname(ae)) == 0) { + /* A symlink to /tmp (an absolute path) */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("/tmp", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink3", archive_entry_pathname(ae)) == 0) { + /* A symlink to /tmp/.. (with a ".." component) */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString("/tmp/..", archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else if (strcmp("symlink4", archive_entry_pathname(ae)) == 0) { + /* A symlink to a path with ".." and "." components */ + assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); + assertEqualString(".././../tmp", + archive_entry_symlink(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); + } else { + failure("Saw a file that shouldn't have been there"); + assertEqualString(archive_entry_pathname(ae), ""); + } + } + + /* End of archive. */ + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE); + + /* Close the archive. */ + assertEqualInt(0, archive_read_close(a)); + assertEqualInt(0, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_isozisofs_bz2.iso.bz2.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_isozisofs_bz2.iso.bz2.uu new file mode 100644 index 000000000..dd56f6025 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_isozisofs_bz2.iso.bz2.uu @@ -0,0 +1,27 @@ +begin 644 test_read_format_isozisofs_bz2.iso.bz2 +M0EIH.3%!62936>PH7^L``--_____R_S78__XO__?\*?OWG8E_@$`)``H!V`@ +M`1@$`L%(T`/>"@4;0TV>#1$$1Z0T#$`:!ZAZ(`:#1H`!H-!Z@'J-`]30T!H` +M`::D](!/1&J>$RFTC(9'J`>ID!IH,@,`@!ID8@:#0`P0(-,3```````````` +M``!&$8````(5!&3)IA&1HP$&`1IH8`$PFFA@`1II@`AID8!,:")1!$8J>R)@ +M4]1M-3:CU!Z@](T&C0#0``TV4!B`/4T:#0Q&BXP#6W-XB=$X@M5PJW.GJ!JF +MMKFP'4Z]`NMVI5#T&N_:21$1$04?`C@G]1D+G4&7TH%$I$`!3 +M_?Y"P-0Q2$P76;]$?#W]_0LZU^.N&IEV=H,&,+QN**>N"5?`@;RFA00W)>?I +ME-Q>Q`RGC1#/ZTF!2HX<@1`,M@A`&@OXPL4C>S#5N:CMSJD7M;REW.452Q\O +MAP]FP#8@\$P"&T5_)!O/:X:!ZM+?*@4L4W6FTF6ZN;.PTNCOQ*/D8S/"PNWFD8ZG1HZ%S]U"EUJ5V84V(H6'6U4N(Q9P-WM!R`(B(*([H/^PVN1%$QI(XU0E]((1!"=:.L0;R& +ME-`0ZA-H8K(:336Z&8=F'C%V%@@TO>@(6]]-.@_=,)J.QEBA'N,,E60.KM?, +M779&PQ60;(A$ZZZB'@=0T!.\+`(0_$1(@C$V40+KK4;P<:/!'4%A>3CMEO:Z +MOMP'DF;`*X0OAX.`4+'*R61R#>AH%.B^(M&1^4I\`L$2(;U'IJ*WZZ8#8$(: +MYB#]C:)1H>6.G)691>+`%4-O"2DXQ=DNI._A9JZ$'"XVC0("Y$*18""8BA3K'G:%.$"G +ML4>@G)GU8^RB-X6J7/;U[@^(2F^5_28]$C;,FJ0@/-8F3;ZX>ZX4Z!;AUH;Y +MV+N\Y6E4P!R>"5\ZPNZ9C"KMG!Q:=K[]*775J'=<06AY@%01,]4B4A +K$N);0`$@!;IGD:NLCA.,W8@9$#WT00=$`$1$!!(,95L%W)%.%"0["A?ZP``` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_mtree.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_mtree.c new file mode 100644 index 000000000..f42f73aab --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_mtree.c @@ -0,0 +1,135 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_mtree.c,v 1.4 2008/09/18 04:13:36 kientzle Exp $"); + +/* Single entry with a hardlink. */ +static unsigned char archive[] = { + "#mtree\n" + "file type=file uid=18 mode=0123 size=3\n" + "dir type=dir\n" + " file\\040with\\040space type=file uid=18\n" + " ..\n" + "file\\040with\\040space type=file\n" + "dir2 type=dir\n" + " dir3a type=dir\n" + " indir3a type=file\n" + "dir2/fullindir2 type=file mode=0777\n" + " ..\n" + " indir2 type=file\n" + " dir3b type=dir\n" + " indir3b type=file\n" + " ..\n" + " ..\n" + "notindir type=file\n" + "dir2/fullindir2 mode=0644\n" +}; + +DEFINE_TEST(test_read_format_mtree) +{ + char buff[16]; + struct archive_entry *ae; + struct archive *a; + FILE *f; + + /* + * An access error occurred on some platform when mtree + * format handling open a directory. It is for through + * the routine which open a directory that we create + * "dir" and "dir2" directories. + */ + assertMakeDir("dir", 0775); + assertMakeDir("dir2", 0775); + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + + /* + * Read "file", whose data is available on disk. + */ + f = fopen("file", "wb"); + assert(f != NULL); + assertEqualInt(3, fwrite("hi\n", 1, 3, f)); + fclose(f); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); + assertEqualString(archive_entry_pathname(ae), "file"); + assertEqualInt(archive_entry_uid(ae), 18); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); + assertEqualInt(archive_entry_size(ae), 3); + assertEqualInt(3, archive_read_data(a, buff, 3)); + assertEqualMem(buff, "hi\n", 3); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir"); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir/file with space"); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "file with space"); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir2"); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir2/dir3a"); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir2/dir3a/indir3a"); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir2/fullindir2"); + assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir2/indir2"); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir2/dir3b"); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "dir2/dir3b/indir3b"); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "notindir"); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_pax_bz2.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_pax_bz2.c new file mode 100644 index 000000000..2f49b9881 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_pax_bz2.c @@ -0,0 +1,66 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_pax_bz2.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +'B','Z','h','9','1','A','Y','&','S','Y',152,180,30,185,0,0,140,127,176,212, +144,0,' ','@',1,255,226,8,'d','H',' ',238,'/',159,'@',0,16,4,'@',0,8,'0', +0,216,'A',164,167,147,'Q',147,'!',180,'#',0,'L',153,162,'i',181,'?','P',192, +26,'h','h',209,136,200,6,128,13,12,18,132,202,'5','O',209,'5','=',26,'2', +154,7,168,12,2,'d',252,13,254,29,'4',247,181,'l','T','i',130,5,195,1,'2', +'@',146,18,251,245,'c','J',130,224,172,'$','l','4',235,170,186,'c','1',255, +179,'K',188,136,18,208,152,192,149,153,10,'{','|','0','8',166,3,6,9,128,172, +'(',164,220,244,149,6,' ',243,212,'B',25,17,'6',237,13,'I',152,'L',129,209, +'G','J','<',137,'Y',16,'b',21,18,'a','Y','l','t','r',160,128,147,'l','f', +'~',219,206,'=','?','S',233,'3',251,'L','~',17,176,169,'%',23,'_',225,'M', +'C','u','k',218,8,'q',216,'(',22,235,'K',131,136,146,136,147,202,0,158,134, +'F',23,160,184,'s','0','a',246,'*','P',7,2,238,'H',167,10,18,19,22,131,215, +' '}; + +DEFINE_TEST(test_read_format_pax_bz2) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r != ARCHIVE_OK) { + archive_read_close(a); + skipping("Bzip2 unavailable"); + return; + } + assertEqualIntA(a,ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a,ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a,ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE); + assertEqualIntA(a,ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.c new file mode 100644 index 000000000..fbaf98d41 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.c @@ -0,0 +1,89 @@ +/*- + * Copyright (c) 2007 Kai Wang + * Copyright (c) 2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_read_format_raw) +{ + char buff[512]; + struct archive_entry *ae; + struct archive *a; + const char *reffile1 = "test_read_format_raw.data"; + const char *reffile2 = "test_read_format_raw.data.Z"; + + /* First, try pulling data out of an uninterpretable file. */ + extract_reference_file(reffile1); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, reffile1, 512)); + + /* First (and only!) Entry */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("data", archive_entry_pathname(ae)); + /* Most fields should be unset (unknown) */ + assert(!archive_entry_size_is_set(ae)); + assert(!archive_entry_atime_is_set(ae)); + assert(!archive_entry_ctime_is_set(ae)); + assert(!archive_entry_mtime_is_set(ae)); + assertEqualInt(4, archive_read_data(a, buff, 32)); + assertEqualMem(buff, "foo\n", 4); + + /* Test EOF */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + + /* Second, try the same with a compressed file. */ + extract_reference_file(reffile2); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, reffile2, 1)); + + /* First (and only!) Entry */ + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("data", archive_entry_pathname(ae)); + /* Most fields should be unset (unknown) */ + assert(!archive_entry_size_is_set(ae)); + assert(!archive_entry_atime_is_set(ae)); + assert(!archive_entry_ctime_is_set(ae)); + assert(!archive_entry_mtime_is_set(ae)); + assertEqualInt(4, archive_read_data(a, buff, 32)); + assertEqualMem(buff, "foo\n", 4); + + /* Test EOF */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.data.Z.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.data.Z.uu new file mode 100644 index 000000000..3fe4deaba --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.data.Z.uu @@ -0,0 +1,4 @@ +begin 644 test_read_format_raw.data.Z +('YV09MZ\40`` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.data.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.data.uu new file mode 100644 index 000000000..7c68a2caa --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_raw.data.uu @@ -0,0 +1,4 @@ +begin 644 test_read_format_raw.data +$9F]O"@`` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_tar.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_tar.c new file mode 100644 index 000000000..00eb76e5a --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_tar.c @@ -0,0 +1,480 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_tar.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); + +/* + * Each of these archives is a short archive with a single entry. The + * corresponding verify function verifies the entry structure returned + * from libarchive is what it should be. The support functions pad with + * lots of zeros, so we can trim trailing zero bytes from each hardcoded + * archive to save space. + * + * The naming here follows the tar file type flags. E.g. '1' is a hardlink, + * '2' is a symlink, '5' is a dir, etc. + */ + +/* Empty archive. */ +static unsigned char archiveEmpty[] = { + /* 512 zero bytes */ + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0 +}; + +static void verifyEmpty(void) +{ + struct archive_entry *ae; + struct archive *a; + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_memory(a, archiveEmpty, 512)); + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE); + assertEqualString(archive_compression_name(a), "none"); + failure("512 zero bytes should be recognized as a tar archive."); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR); + + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif +} + +/* Single entry with a hardlink. */ +static unsigned char archive1[] = { +'h','a','r','d','l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0', +'0','6','4','4',' ',0,'0','0','1','7','5','0',' ',0,'0','0','1','7','5','0', +' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4','6', +'0','5','2','6','6','2',' ','0','1','3','0','5','7',0,' ','1','f','i','l', +'e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0,'0', +'0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0', +'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' '}; + +static void verify1(struct archive_entry *ae) +{ + /* A hardlink is not a symlink. */ + assert(archive_entry_filetype(ae) != AE_IFLNK); + /* Nor is it a directory. */ + assert(archive_entry_filetype(ae) != AE_IFDIR); + assertEqualInt(archive_entry_mode(ae) & 0777, 0644); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 1000); + assertEqualString(archive_entry_uname(ae), "tim"); + assertEqualString(archive_entry_gname(ae), "tim"); + assertEqualString(archive_entry_pathname(ae), "hardlink"); + assertEqualString(archive_entry_hardlink(ae), "file"); + assert(archive_entry_symlink(ae) == NULL); + assertEqualInt(archive_entry_mtime(ae), 1184388530); +} + +/* Verify that symlinks are read correctly. */ +static unsigned char archive2[] = { +'s','y','m','l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0', +'0','0','7','5','5',' ','0','0','0','1','7','5','0',' ','0','0','0','1','7', +'5','0',' ','0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4', +'6','0','5','4','1','0','1',' ','0','0','1','3','3','2','3',' ','2','f','i', +'l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0, +'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +'0','0','0','0','0','0','0',' ','0','0','0','0','0','0','0',' '}; + +static void verify2(struct archive_entry *ae) +{ + assertEqualInt(archive_entry_filetype(ae), AE_IFLNK); + assertEqualInt(archive_entry_mode(ae) & 0777, 0755); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 1000); + assertEqualString(archive_entry_uname(ae), "tim"); + assertEqualString(archive_entry_gname(ae), "tim"); + assertEqualString(archive_entry_pathname(ae), "symlink"); + assertEqualString(archive_entry_symlink(ae), "file"); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(archive_entry_mtime(ae), 1184389185); +} + +/* Character device node. */ +static unsigned char archive3[] = { +'d','e','v','c','h','a','r',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0', +'0','0','7','5','5',' ','0','0','0','1','7','5','0',' ','0','0','0','1','7', +'5','0',' ','0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4', +'6','0','5','4','1','0','1',' ','0','0','1','2','4','1','2',' ','3',0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0, +'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +'0','0','0','0','0','0','0',' ','0','0','0','0','0','0','0',' '}; + +static void verify3(struct archive_entry *ae) +{ + assertEqualInt(archive_entry_filetype(ae), AE_IFCHR); + assertEqualInt(archive_entry_mode(ae) & 0777, 0755); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 1000); + assertEqualString(archive_entry_uname(ae), "tim"); + assertEqualString(archive_entry_gname(ae), "tim"); + assertEqualString(archive_entry_pathname(ae), "devchar"); + assert(archive_entry_symlink(ae) == NULL); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(archive_entry_mtime(ae), 1184389185); +} + +/* Block device node. */ +static unsigned char archive4[] = { +'d','e','v','b','l','o','c','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0', +'0','0','7','5','5',' ','0','0','0','1','7','5','0',' ','0','0','0','1','7', +'5','0',' ','0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4', +'6','0','5','4','1','0','1',' ','0','0','1','2','5','7','0',' ','4',0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0, +'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +'0','0','0','0','0','0','0',' ','0','0','0','0','0','0','0',' '}; + +static void verify4(struct archive_entry *ae) +{ + assertEqualInt(archive_entry_filetype(ae), AE_IFBLK); + assertEqualInt(archive_entry_mode(ae) & 0777, 0755); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 1000); + assertEqualString(archive_entry_uname(ae), "tim"); + assertEqualString(archive_entry_gname(ae), "tim"); + assertEqualString(archive_entry_pathname(ae), "devblock"); + assert(archive_entry_symlink(ae) == NULL); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(archive_entry_mtime(ae), 1184389185); +} + +/* Directory. */ +static unsigned char archive5[] = { +'.',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0', +'7','5','5',' ',0,'0','0','1','7','5','0',' ',0,'0','0','1','7','5','0', +' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','1','0','3','3', +'4','0','4','1','7','3','6',' ','0','1','0','5','6','1',0,' ','5',0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0, +'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0',' '}; + +static void verify5(struct archive_entry *ae) +{ + assertEqualInt(archive_entry_filetype(ae), AE_IFDIR); + assertEqualInt(archive_entry_mtime(ae), 1131430878); + assertEqualInt(archive_entry_mode(ae) & 0777, 0755); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 1000); + assertEqualString(archive_entry_uname(ae), "tim"); + assertEqualString(archive_entry_gname(ae), "tim"); +} + +/* fifo */ +static unsigned char archive6[] = { +'f','i','f','o',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0', +'0','0','7','5','5',' ','0','0','0','1','7','5','0',' ','0','0','0','1','7', +'5','0',' ','0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4', +'6','0','5','4','1','0','1',' ','0','0','1','1','7','2','4',' ','6',0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0, +'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +'0','0','0','0','0','0','0',' ','0','0','0','0','0','0','0',' '}; + +static void verify6(struct archive_entry *ae) +{ + assertEqualInt(archive_entry_filetype(ae), AE_IFIFO); + assertEqualInt(archive_entry_mode(ae) & 0777, 0755); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 1000); + assertEqualString(archive_entry_uname(ae), "tim"); + assertEqualString(archive_entry_gname(ae), "tim"); + assertEqualString(archive_entry_pathname(ae), "fifo"); + assert(archive_entry_symlink(ae) == NULL); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(archive_entry_mtime(ae), 1184389185); +} + +/* GNU long link name */ +static unsigned char archiveK[] = { +'.','/','.','/','@','L','o','n','g','L','i','n','k',0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,'0','0','0','0','0','0','0',0,'0','0','0','0','0','0','0',0,'0','0','0', +'0','0','0','0',0,'0','0','0','0','0','0','0','0','6','6','6',0,'0','0','0', +'0','0','0','0','0','0','0','0',0,'0','1','1','7','1','5',0,' ','K',0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',' ',' ', +0,'r','o','o','t',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +'w','h','e','e','l',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'t', +'h','i','s','_','i','s','_','a','_','v','e','r','y','_','l','o','n','g','_', +'s','y','m','l','i','n','k','_','b','o','d','y','_','a','b','c','d','e','f', +'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y', +'z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q', +'r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i', +'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a', +'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t', +'u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l', +'m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d', +'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w', +'x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', +'p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g', +'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', +'_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r', +'s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j', +'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b', +'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u', +'v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m', +'n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e', +'f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x', +'y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p', +'q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h', +'i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +'s','y','m','l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','1', +'2','0','7','5','5',0,'0','0','0','1','7','5','0',0,'0','0','0','1','7','5', +'0',0,'0','0','0','0','0','0','0','0','0','0','0',0,'1','0','6','4','6','0', +'5','6','7','7','0',0,'0','3','5','4','4','7',0,' ','2','t','h','i','s','_', +'i','s','_','a','_','v','e','r','y','_','l','o','n','g','_','s','y','m','l', +'i','n','k','_','b','o','d','y','_','a','b','c','d','e','f','g','h','i','j', +'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b', +'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u', +'v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l',0, +'u','s','t','a','r',' ',' ',0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,'t','i','m'}; + +static void verifyK(struct archive_entry *ae) +{ + assertEqualInt(archive_entry_filetype(ae), AE_IFLNK); + assertEqualInt(archive_entry_mode(ae) & 0777, 0755); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 1000); + assertEqualString(archive_entry_uname(ae), "tim"); + assertEqualString(archive_entry_gname(ae), "tim"); + assertEqualString(archive_entry_pathname(ae), "symlink"); + assertEqualString(archive_entry_symlink(ae), + "this_is_a_very_long_symlink_body_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz"); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(archive_entry_mtime(ae), 1184390648); +} + +/* TODO: GNU long name */ + +/* TODO: Solaris ACL */ + +/* Pax extended long link name */ +static unsigned char archivexL[] = { +'.','/','P','a','x','H','e','a','d','e','r','s','.','8','6','9','7','5','/', +'s','y','m','l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0','0','6','4','4',0,'0','0','0','1', +'7','5','0',0,'0','0','0','1','7','5','0',0,'0','0','0','0','0','0','0','0', +'7','5','3',0,'1','0','6','4','6','0','5','7','6','1','1',0,'0','1','3','7', +'1','4',0,' ','x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u', +'s','t','a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,'0','0','0','0','0','0','0',0,'0','0','0','0','0','0','0',0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'4','5','1',' ','l','i','n','k','p','a','t', +'h','=','t','h','i','s','_','i','s','_','a','_','v','e','r','y','_','l','o', +'n','g','_','s','y','m','l','i','n','k','_','b','o','d','y','_','a','b','c', +'d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', +'w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n', +'o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f', +'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y', +'z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q', +'r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i', +'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a', +'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t', +'u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l', +'m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d', +'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w', +'x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', +'p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g', +'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', +'_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r', +'s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j', +'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b', +'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u', +'v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m', +'n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e', +'f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x', +'y','z',10,'2','0',' ','a','t','i','m','e','=','1','1','8','4','3','9','1', +'0','2','5',10,'2','0',' ','c','t','i','m','e','=','1','1','8','4','3','9', +'0','6','4','8',10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'s','y','m', +'l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0','0','7', +'5','5',0,'0','0','0','1','7','5','0',0,'0','0','0','1','7','5','0',0,'0', +'0','0','0','0','0','0','0','0','0','0',0,'1','0','6','4','6','0','5','6', +'7','7','0',0,'0','3','7','1','2','1',0,' ','2','t','h','i','s','_','i','s', +'_','a','_','v','e','r','y','_','l','o','n','g','_','s','y','m','l','i','n', +'k','_','b','o','d','y','_','a','b','c','d','e','f','g','h','i','j','k','l', +'m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d', +'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w', +'x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','u','s', +'t','a','r',0,'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,'0','0','0','0','0','0','0',0,'0','0','0','0','0','0','0'}; + +static void verifyxL(struct archive_entry *ae) +{ + assertEqualInt(archive_entry_filetype(ae), AE_IFLNK); + assertEqualInt(archive_entry_mode(ae) & 0777, 0755); + assertEqualInt(archive_entry_uid(ae), 1000); + assertEqualInt(archive_entry_gid(ae), 1000); + assertEqualString(archive_entry_uname(ae), "tim"); + assertEqualString(archive_entry_gname(ae), "tim"); + assertEqualString(archive_entry_pathname(ae), "symlink"); + assertEqualString(archive_entry_symlink(ae), + "this_is_a_very_long_symlink_body_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_" + "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz"); + assert(archive_entry_hardlink(ae) == NULL); + assertEqualInt(archive_entry_mtime(ae), 1184390648); +} + + +/* TODO: Any other types of headers? */ + +static void verify(unsigned char *d, size_t s, + void (*f)(struct archive_entry *), + int compression, int format) +{ + struct archive_entry *ae; + struct archive *a; + unsigned char *buff = malloc(100000); + + memcpy(buff, d, s); + memset(buff + s, 0, 2048); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_memory(a, buff, s + 1024)); + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), compression); + assertEqualInt(archive_format(a), format); + + /* Verify the only entry. */ + f(ae); + + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + free(buff); +} + +DEFINE_TEST(test_read_format_tar) +{ + verifyEmpty(); + verify(archive1, sizeof(archive1), verify1, + ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR); + verify(archive2, sizeof(archive2), verify2, + ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR); + verify(archive3, sizeof(archive3), verify3, + ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR); + verify(archive4, sizeof(archive4), verify4, + ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR); + verify(archive5, sizeof(archive5), verify5, + ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR); + verify(archive6, sizeof(archive6), verify6, + ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR); + verify(archiveK, sizeof(archiveK), verifyK, + ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_GNUTAR); + verify(archivexL, sizeof(archivexL), verifyxL, + ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_tar_empty_filename.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_tar_empty_filename.c new file mode 100644 index 000000000..eddab4194 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_tar_empty_filename.c @@ -0,0 +1,66 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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. + */ +DEFINE_TEST(test_read_format_tar_empty_filename) +{ + char name[] = "test_read_format_tar_empty_filename.tar"; + struct archive_entry *ae; + struct archive *a; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240)); + + /* Read first entry. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("", archive_entry_pathname(ae)); + assertEqualInt(1208628157, archive_entry_mtime(ae)); + assertEqualInt(1000, archive_entry_uid(ae)); + assertEqualString("tim", archive_entry_uname(ae)); + assertEqualInt(0, archive_entry_gid(ae)); + assertEqualString("wheel", archive_entry_gname(ae)); + assertEqualInt(040775, archive_entry_mode(ae)); + + /* Verify the end-of-archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_tar_empty_filename.tar.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_tar_empty_filename.tar.uu new file mode 100644 index 000000000..f8a4f4f2f --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_tar_empty_filename.tar.uu @@ -0,0 +1,39 @@ +$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 +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#',205,'f',29,170,227,'[',179,139, +'\'','L','o',211,':',178,'0',162,134,'*','>','8',24,153,230,147,'R','?',23, +'r','E','8','P',144,237,7,140,'W'}; + +DEFINE_TEST(test_read_format_tbz) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + r = archive_read_support_compression_bzip2(a); + if (r != ARCHIVE_OK) { + skipping("Bzip2 support"); + archive_read_finish(a); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_tgz.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_tgz.c new file mode 100644 index 000000000..17a86f182 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_tgz.c @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_tgz.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', +0,210,134,230,166,6,200,'4',28,'(',24,26,24,27,155,24,152,24,154,27,155,')', +24,24,26,152,154,25,'2','(',152,210,193,'m',12,165,197,'%',137,'E','@',167, +148,'d',230,226,'U','G','H',30,234,15,'8','=',10,'F',193,'(',24,5,131,28, +0,0,29,172,5,240,0,6,0,0}; + +DEFINE_TEST(test_read_format_tgz) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + assertEqualInt(ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_gzip(a); + if (r == ARCHIVE_WARN) { + skipping("gzip reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + assertEqualInt(ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualInt(ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), + ARCHIVE_COMPRESSION_GZIP); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK,archive_read_finish(a)); +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_txz.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_txz.c new file mode 100644 index 000000000..1f3a159ef --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_txz.c @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +static unsigned char archive[] = { +253, 55,122, 88, 90, 0, 0, 4,230,214,180, 70, 2, 0, 33, 1, + 22, 0, 0, 0,116, 47,229,163,224, 5,255, 0, 73, 93, 0, 23, + 0, 51, 80, 24,164,204,238, 45, 77, 28,191, 13,144, 8, 10, 70, + 5,173,215, 47,132,237,145,162, 96, 6,131,168,152, 8,135,161, +189, 73,110,132, 27,195, 52,109,203, 22, 17,168,211, 18,181, 76, + 93,120, 88,154,155,244,141,193,206,170,224, 80,137,134, 67, 1, + 9,123,121,188,247, 28,139, 0, 0, 0, 0, 0,112,184, 17, 5, +103, 16, 8, 73, 0, 1,101,128, 12, 0, 0, 0, 30, 69, 92, 96, +177,196,103,251, 2, 0, 0, 0, 0, 4, 89, 90 +}; + +DEFINE_TEST(test_read_format_txz) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("xz reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_XZ); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_tz.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_tz.c new file mode 100644 index 000000000..3f7075c9d --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_tz.c @@ -0,0 +1,61 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_tz.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char archive[] = { +31,157,144,'.',0,8,28,'H',176,160,193,131,8,19,'*','\\',200,176,'!','B',24, +16,'o',212,168,1,2,0,196,24,18,'a','T',188,152,'q','#',196,143,' ','5',198, +128,'1','c',6,13,24,'4','0',206,176,1,2,198,200,26,'6','b',0,0,'Q',195,161, +205,155,'8','s',234,4,'P','g',14,157,'0','r',',',194,160,147,166,205,206, +132,'D',141,30,'=',24,'R',163,'P',144,21,151,'J',157,'J',181,170,213,171, +'X',179,'j',221,202,181,171,215,175,'`',195,138,29,'K',182,172,217,179,'h', +211,170,']',203,182,173,219,183,'g',1}; + +DEFINE_TEST(test_read_format_tz) +{ + struct archive_entry *ae; + struct archive *a; + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + failure("archive_compression_name(a)=\"%s\"", + archive_compression_name(a)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS); + failure("archive_format_name(a)=\"%s\"", archive_format_name(a)); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_zip.c b/Utilities/cmlibarchive/libarchive/test/test_read_format_zip.c new file mode 100644 index 000000000..8d4509d5b --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_zip.c @@ -0,0 +1,92 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_zip.c,v 1.8 2008/10/21 05:08:35 kientzle Exp $"); + +/* + * The reference file for this has been manually tweaked so that: + * * file2 has length-at-end but file1 does not + * * file2 has an invalid CRC + */ + +DEFINE_TEST(test_read_format_zip) +{ + const char *refname = "test_read_format_zip.zip"; + struct archive_entry *ae; + struct archive *a; + char *buff[128]; + const void *pv; + size_t s; + off_t o; + int r; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filename(a, refname, 10240)); + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("dir/", archive_entry_pathname(ae)); + assertEqualInt(1179604249, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_data_block(a, &pv, &s, &o)); + assertEqualInt((int)s, 0); + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("file1", archive_entry_pathname(ae)); + assertEqualInt(1179604289, archive_entry_mtime(ae)); + assertEqualInt(18, archive_entry_size(ae)); + failure("archive_read_data() returns number of bytes read"); + r = archive_read_data(a, buff, 19); + if (r < ARCHIVE_OK) { + if (strcmp(archive_error_string(a), + "libarchive compiled without deflate support (no libz)") == 0) { + skipping("Skipping ZIP compression check: %s", + archive_error_string(a)); + goto finish; + } + } + assertEqualInt(18, r); + assert(0 == memcmp(buff, "hello\nhello\nhello\n", 18)); + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("file2", archive_entry_pathname(ae)); + assertEqualInt(1179605932, archive_entry_mtime(ae)); + failure("file2 has length-at-end, so we shouldn't see a valid size"); + assertEqualInt(0, archive_entry_size_is_set(ae)); + failure("file2 has a bad CRC, so reading to end should fail"); + assertEqualInt(ARCHIVE_WARN, archive_read_data(a, buff, 19)); + assert(0 == memcmp(buff, "hello\nhello\nhello\n", 18)); + assertA(archive_compression(a) == ARCHIVE_COMPRESSION_NONE); + assertA(archive_format(a) == ARCHIVE_FORMAT_ZIP); + assert(0 == archive_read_close(a)); +finish: +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif +} + + diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_format_zip.zip.uu b/Utilities/cmlibarchive/libarchive/test/test_read_format_zip.zip.uu new file mode 100644 index 000000000..b1f04c4fe --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_format_zip.zip.uu @@ -0,0 +1,14 @@ +$FreeBSD: src/lib/libarchive/test/test_read_format_zip.zip.uu,v 1.3 2008/10/21 05:08:35 kientzle Exp $ +begin 644 test_read_format_zip.zip +M4$L#!`H`"````%EFLS8````````````````$`!4`9&ER+U54"0`#&55/1M19 +M_4A5>`0`Z`/H`U!+!P@```````````````!02P,$%`````@`;V:S-CHW9CT* +M````$@````4`%0!F:6QE,554"0`#055/1L!9_4A5>`0`Z`/H`\M(S`0`Z`/H`\M(S```4$L!`A<#%``(``@`;V:S-CHW9CT*````$@````4`#0`` +M`````0```.V!1P```&9I;&4Q550%``-!54]&57@``%!+`0(7`Q0`"``(`%IJ +MLS8Z-V8]"@```!(````%``T```````$```#M@8D```!F:6QE,E54!0`#K%M/ +;1E5X``!02P4&``````,``P"_````VP`````` +` +end diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_large.c b/Utilities/cmlibarchive/libarchive/test/test_read_large.c new file mode 100644 index 000000000..f9573951f --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_large.c @@ -0,0 +1,89 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_large.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char testdata[10 * 1024 * 1024]; +static unsigned char testdatacopy[10 * 1024 * 1024]; +static unsigned char buff[11 * 1024 * 1024]; + +#if defined(_WIN32) && !defined(__CYGWIN__) +#define open _open +#define close _close +#endif + +/* Check correct behavior on large reads. */ +DEFINE_TEST(test_read_large) +{ + unsigned int i; + int tmpfilefd; + char tmpfilename[] = "test-read_large.XXXXXX"; + size_t used; + struct archive *a; + struct archive_entry *entry; + FILE *f; + + for (i = 0; i < sizeof(testdata); i++) + testdata[i] = (unsigned char)(rand()); + + assert(NULL != (a = archive_write_new())); + assertA(0 == archive_write_set_format_ustar(a)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + assert(NULL != (entry = archive_entry_new())); + archive_entry_set_size(entry, sizeof(testdata)); + archive_entry_set_mode(entry, S_IFREG | 0777); + archive_entry_set_pathname(entry, "test"); + assertA(0 == archive_write_header(a, entry)); + archive_entry_free(entry); + assertA(sizeof(testdata) == archive_write_data(a, testdata, sizeof(testdata))); + assertA(0 == archive_write_finish(a)); + + assert(NULL != (a = archive_read_new())); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, sizeof(buff))); + assertA(0 == archive_read_next_header(a, &entry)); + assertA(0 == archive_read_data_into_buffer(a, testdatacopy, sizeof(testdatacopy))); + assertA(0 == archive_read_finish(a)); + assert(0 == memcmp(testdata, testdatacopy, sizeof(testdata))); + + + assert(NULL != (a = archive_read_new())); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, sizeof(buff))); + assertA(0 == archive_read_next_header(a, &entry)); + // TODO: Provide a Windows-friendly version of this? + assert(0 < (tmpfilefd = open(tmpfilename, + O_WRONLY | O_CREAT | O_BINARY, 0755))); + assertA(0 == archive_read_data_into_fd(a, tmpfilefd)); + close(tmpfilefd); + assertA(0 == archive_read_finish(a)); + + f = fopen(tmpfilename, "rb"); + fread(testdatacopy, 1, sizeof(testdatacopy), f); + fclose(f); + assert(0 == memcmp(testdata, testdatacopy, sizeof(testdata))); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_pax_truncated.c b/Utilities/cmlibarchive/libarchive/test/test_read_pax_truncated.c new file mode 100644 index 000000000..ed1570981 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_pax_truncated.c @@ -0,0 +1,288 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_pax_truncated.c,v 1.4 2008/12/06 05:59:46 kientzle Exp $"); + +DEFINE_TEST(test_read_pax_truncated) +{ + struct archive_entry *ae; + struct archive *a; + size_t used, i, buff_size = 1000000; + size_t filedata_size = 100000; + char *buff = malloc(buff_size); + char *buff2 = malloc(buff_size); + char *filedata = malloc(filedata_size); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_pax(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, buff_size, &used)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + for (i = 0; i < filedata_size; i++) + filedata[i] = (unsigned char)rand(); + archive_entry_set_atime(ae, 1, 2); + archive_entry_set_ctime(ae, 3, 4); + archive_entry_set_mtime(ae, 5, 6); + archive_entry_set_size(ae, filedata_size); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assertA((ssize_t)filedata_size + == archive_write_data(a, filedata, filedata_size)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + + /* Now, read back a truncated version of the archive and + * verify that we get an appropriate error. */ + for (i = 1; i < used + 100; i += 100) { + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == read_open_memory2(a, buff, i, 13)); + + if (i < 1536) { + assertEqualIntA(a, ARCHIVE_FATAL, archive_read_next_header(a, &ae)); + goto wrap_up; + } else { + failure("Archive truncated to %d bytes", i); + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + } + + if (i < 1536 + filedata_size) { + assertA(ARCHIVE_FATAL == archive_read_data(a, filedata, filedata_size)); + goto wrap_up; + } else { + failure("Archive truncated to %d bytes", i); + assertEqualIntA(a, filedata_size, + archive_read_data(a, filedata, filedata_size)); + } + + /* Verify the end of the archive. */ + /* Archive must be long enough to capture a 512-byte + * block of zeroes after the entry. (POSIX requires a + * second block of zeros to be written but libarchive + * does not return an error if it can't consume + * it.) */ + if (i < 1536 + 512*((filedata_size + 511)/512) + 512) { + failure("i=%d minsize=%d", i, + 1536 + 512*((filedata_size + 511)/512) + 512); + assertEqualIntA(a, ARCHIVE_FATAL, + archive_read_next_header(a, &ae)); + } else { + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_next_header(a, &ae)); + } + wrap_up: + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + } + + + + /* Same as above, except skip the body instead of reading it. */ + for (i = 1; i < used + 100; i += 100) { + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == read_open_memory(a, buff, i, 7)); + + if (i < 1536) { + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); + goto wrap_up2; + } else { + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + } + + if (i < 1536 + 512*((filedata_size+511)/512)) { + assertA(ARCHIVE_FATAL == archive_read_data_skip(a)); + goto wrap_up2; + } else { + assertA(ARCHIVE_OK == archive_read_data_skip(a)); + } + + /* Verify the end of the archive. */ + /* Archive must be long enough to capture a 512-byte + * block of zeroes after the entry. (POSIX requires a + * second block of zeros to be written but libarchive + * does not return an error if it can't consume + * it.) */ + if (i < 1536 + 512*((filedata_size + 511)/512) + 512) { + assertEqualIntA(a, ARCHIVE_FATAL, + archive_read_next_header(a, &ae)); + } else { + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_next_header(a, &ae)); + } + wrap_up2: + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + } + + /* Now, damage the archive in various ways and test the responses. */ + + /* Damage the first size field in the pax attributes. */ + memcpy(buff2, buff, buff_size); + buff2[512] = '9'; + buff2[513] = '9'; + buff2[514] = 'A'; /* Non-digit in size. */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff2, used)); + assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + /* Damage the size field in the pax attributes. */ + memcpy(buff2, buff, buff_size); + buff2[512] = 'A'; /* First character not a digit. */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff2, used)); + assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + /* Damage the size field in the pax attributes. */ + memcpy(buff2, buff, buff_size); + for (i = 512; i < 520; i++) /* Size over 999999. */ + buff2[i] = '9'; + buff2[i] = ' '; + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff2, used)); + assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + /* Damage the size field in the pax attributes. */ + memcpy(buff2, buff, buff_size); + buff2[512] = '9'; /* Valid format, but larger than attribute area. */ + buff2[513] = '9'; + buff2[514] = '9'; + buff2[515] = ' '; + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff2, used)); + assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + /* Damage the size field in the pax attributes. */ + memcpy(buff2, buff, buff_size); + buff2[512] = '1'; /* Too small. */ + buff2[513] = ' '; + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff2, used)); + assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + /* Damage the size field in the pax attributes. */ + memcpy(buff2, buff, buff_size); + buff2[512] = ' '; /* No size given. */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff2, used)); + assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + /* Damage the ustar header. */ + memcpy(buff2, buff, buff_size); + buff2[1024]++; /* Break the checksum. */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff2, used)); + assertEqualIntA(a, ARCHIVE_FATAL, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + /* + * TODO: Damage the ustar header in various ways and fixup the + * checksum in order to test boundary cases in the innermost + * ustar header parsing. + */ + + free(buff); + free(buff2); + free(filedata); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_position.c b/Utilities/cmlibarchive/libarchive/test/test_read_position.c new file mode 100644 index 000000000..3ee896fad --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_position.c @@ -0,0 +1,94 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_position.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); + +static unsigned char nulls[10000]; +static unsigned char buff[10000000]; + +/* Check that header_position tracks correctly on read. */ +DEFINE_TEST(test_read_position) +{ + struct archive *a; + struct archive_entry *ae; + size_t write_pos; + intmax_t read_position; + size_t i, j; + size_t data_sizes[] = {0, 5, 511, 512, 513}; + + /* Sanity test */ + assert(sizeof(nulls) + 512 + 1024 <= sizeof(buff)); + + /* Create an archive. */ + assert(NULL != (a = archive_write_new())); + assertA(0 == archive_write_set_format_pax_restricted(a)); + assertA(0 == archive_write_set_bytes_per_block(a, 512)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &write_pos)); + + for (i = 0; i < sizeof(data_sizes)/sizeof(data_sizes[0]); ++i) { + /* Create a simple archive_entry. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_pathname(ae, "testfile"); + archive_entry_set_mode(ae, S_IFREG); + archive_entry_set_size(ae, data_sizes[i]); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assertA(data_sizes[i] + == (size_t)archive_write_data(a, nulls, sizeof(nulls))); + } + assertA(0 == archive_write_close(a)); + assertA(0 == archive_write_finish(a)); + + /* Read the archive back. */ + assert(NULL != (a = archive_read_new())); + assertA(0 == archive_read_support_format_tar(a)); + assertA(0 == archive_read_open_memory2(a, buff, sizeof(buff), 512)); + + read_position = 0; + /* Initial header position is zero. */ + assert(read_position == (intmax_t)archive_read_header_position(a)); + for (j = 0; j < i; ++j) { + assertA(0 == archive_read_next_header(a, &ae)); + assert(read_position + == (intmax_t)archive_read_header_position(a)); + /* Every other entry: read, then skip */ + if (j & 1) + assertEqualInt(ARCHIVE_OK, + archive_read_data_into_buffer(a, buff, 1)); + assertA(0 == archive_read_data_skip(a)); + /* read_data_skip() doesn't change header_position */ + assert(read_position + == (intmax_t)archive_read_header_position(a)); + + read_position += 512; /* Size of header. */ + read_position += (data_sizes[j] + 511) & ~511; + } + + assertA(1 == archive_read_next_header(a, &ae)); + assert(read_position == (intmax_t)archive_read_header_position(a)); + assertA(0 == archive_read_close(a)); + assert(read_position == (intmax_t)archive_read_header_position(a)); + archive_read_finish(a); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_read_truncated.c b/Utilities/cmlibarchive/libarchive/test/test_read_truncated.c new file mode 100644 index 000000000..60ef983ae --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_read_truncated.c @@ -0,0 +1,149 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_truncated.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); + +char buff[1000000]; +char buff2[100000]; + +DEFINE_TEST(test_read_truncated) +{ + struct archive_entry *ae; + struct archive *a; + unsigned int i; + size_t used; + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + for (i = 0; i < sizeof(buff2); i++) + buff2[i] = (unsigned char)rand(); + archive_entry_set_size(ae, sizeof(buff2)); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assertA(sizeof(buff2) == archive_write_data(a, buff2, sizeof(buff2))); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + + /* Now, read back a truncated version of the archive and + * verify that we get an appropriate error. */ + for (i = 1; i < used + 100; i += 100) { + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, i)); + + if (i < 512) { + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); + goto wrap_up; + } else { + assertA(0 == archive_read_next_header(a, &ae)); + } + + if (i < 512 + sizeof(buff2)) { + assertA(ARCHIVE_FATAL == archive_read_data(a, buff2, sizeof(buff2))); + goto wrap_up; + } else { + assertA(sizeof(buff2) == archive_read_data(a, buff2, sizeof(buff2))); + } + + /* Verify the end of the archive. */ + /* Archive must be long enough to capture a 512-byte + * block of zeroes after the entry. (POSIX requires a + * second block of zeros to be written but libarchive + * does not return an error if it can't consume + * it.) */ + if (i < 512 + 512*((sizeof(buff2) + 511)/512) + 512) { + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); + } else { + assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae)); + } + wrap_up: + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + } + + + + /* Same as above, except skip the body instead of reading it. */ + for (i = 1; i < used + 100; i += 100) { + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, i)); + + if (i < 512) { + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); + goto wrap_up2; + } else { + assertA(0 == archive_read_next_header(a, &ae)); + } + + if (i < 512 + 512*((sizeof(buff2)+511)/512)) { + assertA(ARCHIVE_FATAL == archive_read_data_skip(a)); + goto wrap_up2; + } else { + assertA(ARCHIVE_OK == archive_read_data_skip(a)); + } + + /* Verify the end of the archive. */ + /* Archive must be long enough to capture a 512-byte + * block of zeroes after the entry. (POSIX requires a + * second block of zeros to be written but libarchive + * does not return an error if it can't consume + * it.) */ + if (i < 512 + 512*((sizeof(buff2) + 511)/512) + 512) { + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); + } else { + assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae)); + } + wrap_up2: + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + } +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_tar_filenames.c b/Utilities/cmlibarchive/libarchive/test/test_tar_filenames.c new file mode 100644 index 000000000..923995fc5 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_tar_filenames.c @@ -0,0 +1,186 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_tar_filenames.c,v 1.10 2008/09/01 05:38:33 kientzle Exp $"); + +/* + * Exercise various lengths of filenames in tar archives, + * especially around the magic sizes where ustar breaks + * filenames into prefix/suffix. + */ + +static void +test_filename(const char *prefix, int dlen, int flen) +{ + char buff[8192]; + char filename[400]; + char dirname[400]; + struct archive_entry *ae; + struct archive *a; + size_t used; + char *p; + int i; + + p = filename; + if (prefix) { + strcpy(filename, prefix); + p += strlen(p); + } + if (dlen > 0) { + for (i = 0; i < dlen; i++) + *p++ = 'a'; + *p++ = '/'; + } + for (i = 0; i < flen; i++) + *p++ = 'b'; + *p = '\0'; + + strcpy(dirname, filename); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_pax_restricted(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_set_bytes_per_block(a,0)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, filename); + archive_entry_set_mode(ae, S_IFREG | 0755); + failure("Pathname %d/%d", dlen, flen); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + /* + * Write a dir to it (without trailing '/'). + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, dirname); + archive_entry_set_mode(ae, S_IFDIR | 0755); + failure("Dirname %d/%d", dlen, flen); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Tar adds a '/' to directory names. */ + strcat(dirname, "/"); + + /* + * Write a dir to it (with trailing '/'). + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, dirname); + archive_entry_set_mode(ae, S_IFDIR | 0755); + failure("Dirname %d/%d", dlen, flen); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + + /* + * Now, read the data back. + */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used)); + + /* Read the file and check the filename. */ + assertA(0 == archive_read_next_header(a, &ae)); +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("Leading '/' preserved on long filenames"); +#else + assertEqualString(filename, archive_entry_pathname(ae)); +#endif + assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); + + /* + * Read the two dirs and check the names. + * + * Both dirs should read back with the same name, since + * tar should add a trailing '/' to any dir that doesn't + * already have one. We only report the first such failure + * here. + */ + assertA(0 == archive_read_next_header(a, &ae)); +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("Trailing '/' preserved on dirnames"); +#else + assertEqualString(dirname, archive_entry_pathname(ae)); +#endif + assert((S_IFDIR | 0755) == archive_entry_mode(ae)); + + assertA(0 == archive_read_next_header(a, &ae)); +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("Trailing '/' added to dir names"); +#else + assertEqualString(dirname, archive_entry_pathname(ae)); +#endif + assert((S_IFDIR | 0755) == archive_entry_mode(ae)); + + /* Verify the end of the archive. */ + assert(1 == archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif +} + +DEFINE_TEST(test_tar_filenames) +{ + int dlen, flen; + + /* Repeat the following for a variety of dir/file lengths. */ + for (dlen = 45; dlen < 55; dlen++) { + for (flen = 45; flen < 55; flen++) { + test_filename(NULL, dlen, flen); + test_filename("/", dlen, flen); + } + } + + for (dlen = 0; dlen < 140; dlen += 10) { + for (flen = 98; flen < 102; flen++) { + test_filename(NULL, dlen, flen); + test_filename("/", dlen, flen); + } + } + + for (dlen = 140; dlen < 160; dlen++) { + for (flen = 95; flen < 105; flen++) { + test_filename(NULL, dlen, flen); + test_filename("/", dlen, flen); + } + } +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_tar_large.c b/Utilities/cmlibarchive/libarchive/test/test_tar_large.c new file mode 100644 index 000000000..cca5f8d96 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_tar_large.c @@ -0,0 +1,312 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_tar_large.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); + +#include +#include +#include + +/* + * This is a somewhat tricky test that verifies the ability to + * write and read very large entries to tar archives. It + * writes entries from 2GB up to 1TB to an archive in memory. + * The memory storage here carefully avoids actually storing + * any part of the file bodies, so it runs very quickly and requires + * very little memory. If you're willing to wait a few minutes, + * you should be able to exercise petabyte entries with this code. + */ + +/* + * Each file is built up by duplicating the following block. + */ +static size_t filedatasize; +static void *filedata; + +/* + * We store the archive as blocks of data generated by libarchive, + * each possibly followed by bytes of file data. + */ +struct memblock { + struct memblock *next; + size_t size; + void *buff; + int64_t filebytes; +}; + +/* + * The total memory store is just a list of memblocks plus + * some accounting overhead. + */ +struct memdata { + int64_t filebytes; + void *buff; + struct memblock *first; + struct memblock *last; +}; + +/* The following size definitions simplify things below. */ +#define KB ((int64_t)1024) +#define MB ((int64_t)1024 * KB) +#define GB ((int64_t)1024 * MB) +#define TB ((int64_t)1024 * GB) + +#if ARCHIVE_VERSION_NUMBER < 2000000 +static ssize_t memory_read_skip(struct archive *, void *, size_t request); +#else +static off_t memory_read_skip(struct archive *, void *, off_t request); +#endif +static ssize_t memory_read(struct archive *, void *, const void **buff); +static ssize_t memory_write(struct archive *, void *, const void *, size_t); + + +static ssize_t +memory_write(struct archive *a, void *_private, const void *buff, size_t size) +{ + struct memdata *private = _private; + struct memblock *block; + + (void)a; + + /* + * Since libarchive tries to behave in a zero-copy manner, if + * you give a pointer to filedata to the library, a pointer + * into that data will (usually) pop out here. This way, we + * can tell the difference between filedata and library header + * and metadata. + */ + if ((const char *)filedata <= (const char *)buff + && (const char *)buff < (const char *)filedata + filedatasize) { + /* We don't need to store a block of file data. */ + private->last->filebytes += (int64_t)size; + } else { + /* Yes, we're assuming the very first write is metadata. */ + /* It's header or metadata, copy and save it. */ + block = (struct memblock *)malloc(sizeof(*block)); + memset(block, 0, sizeof(*block)); + block->size = size; + block->buff = malloc(size); + memcpy(block->buff, buff, size); + if (private->last == NULL) { + private->first = private->last = block; + } else { + private->last->next = block; + private->last = block; + } + block->next = NULL; + } + return ((long)size); +} + +static ssize_t +memory_read(struct archive *a, void *_private, const void **buff) +{ + struct memdata *private = _private; + struct memblock *block; + ssize_t size; + + (void)a; + + free(private->buff); + private->buff = NULL; + if (private->first == NULL) { + private->last = NULL; + return (ARCHIVE_EOF); + } + if (private->filebytes > 0) { + /* + * We're returning file bytes, simulate it by + * passing blocks from the template data. + */ + if (private->filebytes > (int64_t)filedatasize) + size = (ssize_t)filedatasize; + else + size = (ssize_t)private->filebytes; + private->filebytes -= size; + *buff = filedata; + } else { + /* + * We need to get some real data to return. + */ + block = private->first; + private->first = block->next; + size = (ssize_t)block->size; + if (block->buff != NULL) { + private->buff = block->buff; + *buff = block->buff; + } else { + private->buff = NULL; + *buff = filedata; + } + private->filebytes = block->filebytes; + free(block); + } + return (size); +} + + +#if ARCHIVE_VERSION_NUMBER < 2000000 +static ssize_t +memory_read_skip(struct archive *a, void *private, size_t skip) +{ + (void)a; /* UNUSED */ + (void)private; /* UNUSED */ + (void)skip; /* UNUSED */ + return (0); +} +#else +static off_t +memory_read_skip(struct archive *a, void *_private, off_t skip) +{ + struct memdata *private = _private; + + (void)a; + + if (private->first == NULL) { + private->last = NULL; + return (0); + } + if (private->filebytes > 0) { + if (private->filebytes < skip) + skip = (off_t)private->filebytes; + private->filebytes -= skip; + } else { + skip = 0; + } + return (skip); +} +#endif + +DEFINE_TEST(test_tar_large) +{ + /* The sizes of the entries we're going to generate. */ + static int64_t tests[] = { + /* Test for 32-bit signed overflow. */ + 2 * GB - 1, 2 * GB, 2 * GB + 1, + /* Test for 32-bit unsigned overflow. */ + 4 * GB - 1, 4 * GB, 4 * GB + 1, + /* 8GB is the "official" max for ustar. */ + 8 * GB - 1, 8 * GB, 8 * GB + 1, + /* Bend ustar a tad and you can get 64GB (12 octal digits). */ + 64 * GB - 1, 64 * GB, + /* And larger entries that require non-ustar extensions. */ + 256 * GB, 1 * TB, 0 }; + int i; + char namebuff[64]; + struct memdata memdata; + struct archive_entry *ae; + struct archive *a; + int64_t filesize; + size_t writesize; + + filedatasize = (size_t)(1 * MB); + filedata = malloc(filedatasize); + memset(filedata, 0xAA, filedatasize); + memset(&memdata, 0, sizeof(memdata)); + + /* + * Open an archive for writing. + */ + a = archive_write_new(); + archive_write_set_format_pax_restricted(a); + archive_write_set_bytes_per_block(a, 0); /* No buffering. */ + archive_write_open(a, &memdata, NULL, memory_write, NULL); + + /* + * Write a series of large files to it. + */ + for (i = 0; tests[i] != 0; i++) { + assert((ae = archive_entry_new()) != NULL); + sprintf(namebuff, "file_%d", i); + archive_entry_copy_pathname(ae, namebuff); + archive_entry_set_mode(ae, S_IFREG | 0755); + filesize = tests[i]; + + archive_entry_set_size(ae, filesize); + + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + /* + * Write the actual data to the archive. + */ + while (filesize > 0) { + writesize = filedatasize; + if ((int64_t)writesize > filesize) + writesize = (size_t)filesize; + assertA((int)writesize + == archive_write_data(a, filedata, writesize)); + filesize -= writesize; + } + } + + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "lastfile"); + archive_entry_set_mode(ae, S_IFREG | 0755); + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + + /* + * Open the same archive for reading. + */ + a = archive_read_new(); + archive_read_support_format_tar(a); + archive_read_open2(a, &memdata, NULL, + memory_read, memory_read_skip, NULL); + + /* + * Read entries back. + */ + for (i = 0; tests[i] > 0; i++) { + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + sprintf(namebuff, "file_%d", i); + assertEqualString(namebuff, archive_entry_pathname(ae)); + assert(tests[i] == archive_entry_size(ae)); + } + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + assertEqualString("lastfile", archive_entry_pathname(ae)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Close out the archive. */ + assertA(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertA(0 == archive_read_finish(a)); +#endif + + free(memdata.buff); + free(filedata); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_ustar_filenames.c b/Utilities/cmlibarchive/libarchive/test/test_ustar_filenames.c new file mode 100644 index 000000000..9cbe58c16 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_ustar_filenames.c @@ -0,0 +1,191 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_ustar_filenames.c,v 1.2 2008/08/11 01:19:36 kientzle Exp $"); + +/* + * Exercise various lengths of filenames in ustar archives. + */ + +static void +test_filename(const char *prefix, int dlen, int flen) +{ + char buff[8192]; + char filename[400]; + char dirname[400]; + struct archive_entry *ae; + struct archive *a; + size_t used; + int separator = 0; + int i = 0; + + if (prefix != NULL) { + strcpy(filename, prefix); + i = (int)strlen(prefix); + } + if (dlen > 0) { + for (; i < dlen; i++) + filename[i] = 'a'; + filename[i++] = '/'; + separator = 1; + } + for (; i < dlen + flen + separator; i++) + filename[i] = 'b'; + filename[i++] = '\0'; + + strcpy(dirname, filename); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_set_bytes_per_block(a,0)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, filename); + archive_entry_set_mode(ae, S_IFREG | 0755); + failure("dlen=%d, flen=%d", dlen, flen); + if (flen > 100) { + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); + } else { + assertEqualIntA(a, 0, archive_write_header(a, ae)); + } + archive_entry_free(ae); + + /* + * Write a dir to it (without trailing '/'). + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, dirname); + archive_entry_set_mode(ae, S_IFDIR | 0755); + failure("dlen=%d, flen=%d", dlen, flen); + if (flen >= 100) { + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); + } else { + assertEqualIntA(a, 0, archive_write_header(a, ae)); + } + archive_entry_free(ae); + + /* Tar adds a '/' to directory names. */ + strcat(dirname, "/"); + + /* + * Write a dir to it (with trailing '/'). + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, dirname); + archive_entry_set_mode(ae, S_IFDIR | 0755); + failure("dlen=%d, flen=%d", dlen, flen); + if (flen >= 100) { + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); + } else { + assertEqualIntA(a, 0, archive_write_header(a, ae)); + } + archive_entry_free(ae); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertEqualInt(0, archive_write_finish(a)); +#endif + + /* + * Now, read the data back. + */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used)); + + if (flen <= 100) { + /* Read the file and check the filename. */ + assertA(0 == archive_read_next_header(a, &ae)); + failure("dlen=%d, flen=%d", dlen, flen); + assertEqualString(filename, archive_entry_pathname(ae)); + assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); + } + + /* + * Read the two dirs and check the names. + * + * Both dirs should read back with the same name, since + * tar should add a trailing '/' to any dir that doesn't + * already have one. + */ + if (flen <= 99) { + assertA(0 == archive_read_next_header(a, &ae)); + assert((S_IFDIR | 0755) == archive_entry_mode(ae)); + failure("dlen=%d, flen=%d", dlen, flen); + assertEqualString(dirname, archive_entry_pathname(ae)); + } + + if (flen <= 99) { + assertA(0 == archive_read_next_header(a, &ae)); + assert((S_IFDIR | 0755) == archive_entry_mode(ae)); + assertEqualString(dirname, archive_entry_pathname(ae)); + } + + /* Verify the end of the archive. */ + failure("This fails if entries were written that should not have been written. dlen=%d, flen=%d", dlen, flen); + assertEqualInt(1, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(0, archive_read_finish(a)); +#endif +} + +DEFINE_TEST(test_ustar_filenames) +{ + int dlen, flen; + + /* Try a bunch of different file/dir lengths that add up + * to just a little less or a little more than 100 bytes. + * This exercises the code that splits paths between ustar + * filename and prefix fields. + */ + for (dlen = 5; dlen < 70; dlen += 5) { + for (flen = 100 - dlen - 5; flen < 100 - dlen + 5; flen++) { + test_filename(NULL, dlen, flen); + test_filename("/", dlen, flen); + } + } + + /* Probe the 100-char limit for paths with no '/'. */ + for (flen = 90; flen < 110; flen++) { + test_filename(NULL, 0, flen); + test_filename("/", dlen, flen); + } + + /* XXXX TODO Probe the 100-char limit with a dir prefix. */ + /* XXXX TODO Probe the 255-char total limit. */ +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_compress.c b/Utilities/cmlibarchive/libarchive/test/test_write_compress.c new file mode 100644 index 000000000..ca2406eb9 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_compress.c @@ -0,0 +1,102 @@ +/*- + * Copyright (c) 2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_compress.c,v 1.4 2008/12/17 19:05:25 kientzle Exp $"); + +/* + * A basic exercise of compress reading and writing. + * + * TODO: Add a reference file and make sure we can decompress that. + */ + +DEFINE_TEST(test_write_compress) +{ + struct archive_entry *ae; + struct archive* a; + char *buff, *data; + size_t buffsize, datasize; + char path[16]; + size_t used; + int i; + + buffsize = 1000000; + assert(NULL != (buff = (char *)malloc(buffsize))); + + datasize = 10000; + assert(NULL != (data = (char *)malloc(datasize))); + memset(data, 0, datasize); + + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertA(0 == archive_write_set_compression_compress(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used)); + + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize == (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + + + archive_write_close(a); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assert(0 == archive_write_finish(a)); +#endif + + /* + * Now, read the data back. + */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used)); + + + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(0, archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + free(data); + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_compress_bzip2.c b/Utilities/cmlibarchive/libarchive/test/test_write_compress_bzip2.c new file mode 100644 index 000000000..ad5f492d6 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_compress_bzip2.c @@ -0,0 +1,228 @@ +/*- + * Copyright (c) 2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * A basic exercise of bzip2 reading and writing. + * + * TODO: Add a reference file and make sure we can decompress that. + */ + +DEFINE_TEST(test_write_compress_bzip2) +{ + struct archive_entry *ae; + struct archive* a; + char *buff, *data; + size_t buffsize, datasize; + char path[16]; + size_t used1, used2; + int i, r; + + buffsize = 2000000; + assert(NULL != (buff = (char *)malloc(buffsize))); + + datasize = 10000; + assert(NULL != (data = (char *)malloc(datasize))); + memset(data, 0, datasize); + + /* + * Write a 100 files and read them all back. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + r = archive_write_set_compression_bzip2(a); + if (r == ARCHIVE_FATAL) { + skipping("bzip2 writing not supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertEqualInt(ARCHIVE_COMPRESSION_BZIP2, archive_compression(a)); + assertEqualString("bzip2", archive_compression_name(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used1)); + assertEqualInt(ARCHIVE_COMPRESSION_BZIP2, archive_compression(a)); + assertEqualString("bzip2", archive_compression_name(a)); + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_filetype(ae, AE_IFREG); + archive_entry_set_size(ae, datasize); + for (i = 0; i < 999; i++) { + sprintf(path, "file%03d", i); + archive_entry_copy_pathname(ae, path); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize + == (size_t)archive_write_data(a, data, datasize)); + } + archive_entry_free(ae); + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used1)); + for (i = 0; i < 999; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(0, archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assert(0 == archive_read_close(a)); + assert(0 == archive_read_finish(a)); + + /* + * Repeat the cycle again, this time setting some compression + * options. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertA(0 == archive_write_set_compression_bzip2(a)); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "nonexistent-option=0")); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "compression-level=abc")); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "compression-level=99")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_compressor_options(a, "compression-level=9")); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + for (i = 0; i < 999; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize == (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + /* Curiously, this test fails; the test data above compresses + * better at default compression than at level 9. */ + /* + failure("compression-level=9 wrote %d bytes, default wrote %d bytes", + (int)used2, (int)used1); + assert(used2 < used1); + */ + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used2)); + for (i = 0; i < 999; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(0, archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assert(0 == archive_read_close(a)); + assert(0 == archive_read_finish(a)); + + /* + * Repeat again, with much lower compression. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertA(0 == archive_write_set_compression_bzip2(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_compressor_options(a, "compression-level=1")); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + for (i = 0; i < 999; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + failure("Writing file %s", path); + assertEqualIntA(a, datasize, + (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + /* Level 0 really does result in larger data. */ + failure("Compression-level=0 wrote %d bytes; default wrote %d bytes", + (int)used2, (int)used1); + assert(used2 > used1); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used2)); + for (i = 0; i < 999; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(0, archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assert(0 == archive_read_close(a)); + assert(0 == archive_read_finish(a)); + + /* + * Test various premature shutdown scenarios to make sure we + * don't crash or leak memory. + */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_bzip2(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_bzip2(a)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_bzip2(a)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_bzip2(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* + * Clean up. + */ + free(data); + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_compress_gzip.c b/Utilities/cmlibarchive/libarchive/test/test_write_compress_gzip.c new file mode 100644 index 000000000..9a2ddcc87 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_compress_gzip.c @@ -0,0 +1,252 @@ +/*- + * Copyright (c) 2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * A basic exercise of gzip reading and writing. + * + * TODO: Add a reference file and make sure we can decompress that. + */ + +DEFINE_TEST(test_write_compress_gzip) +{ + struct archive_entry *ae; + struct archive* a; + char *buff, *data; + size_t buffsize, datasize; + char path[16]; + size_t used1, used2; + int i, r; + + buffsize = 2000000; + assert(NULL != (buff = (char *)malloc(buffsize))); + + datasize = 10000; + assert(NULL != (data = (char *)malloc(datasize))); + memset(data, 0, datasize); + + /* + * Write a 100 files and read them all back. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + r = archive_write_set_compression_gzip(a); + if (r == ARCHIVE_FATAL) { + skipping("gzip writing not supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertEqualInt(ARCHIVE_COMPRESSION_GZIP, archive_compression(a)); + assertEqualString("gzip", archive_compression_name(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used1)); + assertEqualInt(ARCHIVE_COMPRESSION_GZIP, archive_compression(a)); + assertEqualString("gzip", archive_compression_name(a)); + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_filetype(ae, AE_IFREG); + archive_entry_set_size(ae, datasize); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + archive_entry_copy_pathname(ae, path); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize + == (size_t)archive_write_data(a, data, datasize)); + } + archive_entry_free(ae); + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + r = archive_read_support_compression_gzip(a); + if (r == ARCHIVE_WARN) { + skipping("Can't verify gzip writing by reading back;" + " gzip reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used1)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Repeat the cycle again, this time setting some compression + * options. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertA(0 == archive_write_set_compression_gzip(a)); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "nonexistent-option=0")); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "compression-level=abc")); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "compression-level=99")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_compressor_options(a, "compression-level=9")); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize == (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + /* Curiously, this test fails; the test data above compresses + * better at default compression than at level 9. */ + /* + failure("compression-level=9 wrote %d bytes, default wrote %d bytes", + (int)used2, (int)used1); + assert(used2 < used1); + */ + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + r = archive_read_support_compression_gzip(a); + if (r == ARCHIVE_WARN) { + skipping("gzip reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Repeat again, with much lower compression. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertA(0 == archive_write_set_compression_gzip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_compressor_options(a, "compression-level=0")); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + failure("Writing file %s", path); + assertEqualIntA(a, datasize, + (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + /* Level 0 really does result in larger data. */ + failure("Compression-level=0 wrote %d bytes; default wrote %d bytes", + (int)used2, (int)used1); + assert(used2 > used1); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + r = archive_read_support_compression_gzip(a); + if (r == ARCHIVE_WARN) { + skipping("gzip reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Test various premature shutdown scenarios to make sure we + * don't crash or leak memory. + */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_gzip(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_gzip(a)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_gzip(a)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_gzip(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* + * Clean up. + */ + free(data); + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_compress_lzma.c b/Utilities/cmlibarchive/libarchive/test/test_write_compress_lzma.c new file mode 100644 index 000000000..9f6b4f5f9 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_compress_lzma.c @@ -0,0 +1,245 @@ +/*- + * Copyright (c) 2007-2009 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * A basic exercise of lzma reading and writing. + * + */ + +DEFINE_TEST(test_write_compress_lzma) +{ + struct archive_entry *ae; + struct archive* a; + char *buff, *data; + size_t buffsize, datasize; + char path[16]; + size_t used1, used2; + int i, r; + + buffsize = 2000000; + assert(NULL != (buff = (char *)malloc(buffsize))); + + datasize = 10000; + assert(NULL != (data = (char *)malloc(datasize))); + memset(data, 0, datasize); + + /* + * Write a 100 files and read them all back. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + r = archive_write_set_compression_lzma(a); + if (r == ARCHIVE_FATAL) { + skipping("lzma writing not supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertEqualInt(ARCHIVE_COMPRESSION_LZMA, archive_compression(a)); + assertEqualString("lzma", archive_compression_name(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used1)); + assertEqualInt(ARCHIVE_COMPRESSION_LZMA, archive_compression(a)); + assertEqualString("lzma", archive_compression_name(a)); + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_filetype(ae, AE_IFREG); + archive_entry_set_size(ae, datasize); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + archive_entry_copy_pathname(ae, path); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize + == (size_t)archive_write_data(a, data, datasize)); + } + archive_entry_free(ae); + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + r = archive_read_support_compression_lzma(a); + if (r == ARCHIVE_WARN) { + skipping("Can't verify lzma writing by reading back;" + " lzma reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used1)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Repeat the cycle again, this time setting some compression + * options. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertA(0 == archive_write_set_compression_lzma(a)); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "nonexistent-option=0")); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "compression-level=abc")); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "compression-level=99")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_compressor_options(a, "compression-level=9")); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize == (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + r = archive_read_support_compression_lzma(a); + if (r == ARCHIVE_WARN) { + skipping("lzma reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + failure("Trying to read %s", path); + if (!assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Repeat again, with much lower compression. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertA(0 == archive_write_set_compression_lzma(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_compressor_options(a, "compression-level=0")); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + failure("Writing file %s", path); + assertEqualIntA(a, datasize, + (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + /* Level 0 really does result in larger data. */ + failure("Compression-level=0 wrote %d bytes; default wrote %d bytes", + (int)used2, (int)used1); + assert(used2 > used1); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + r = archive_read_support_compression_lzma(a); + if (r == ARCHIVE_WARN) { + skipping("lzma reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Test various premature shutdown scenarios to make sure we + * don't crash or leak memory. + */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_lzma(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_lzma(a)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_lzma(a)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_lzma(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* + * Clean up. + */ + free(data); + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_compress_program.c b/Utilities/cmlibarchive/libarchive/test/test_write_compress_program.c new file mode 100644 index 000000000..a99300282 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_compress_program.c @@ -0,0 +1,118 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_compress_program.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); + +char buff[1000000]; +char buff2[64]; + +DEFINE_TEST(test_write_compress_program) +{ +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("archive_write_set_compress_program()"); +#else + struct archive_entry *ae; + struct archive *a; + size_t used; + int blocksize = 1024; + int r; + + if (!canGzip()) { + skipping("Cannot run 'gzip'"); + return; + } + + /* Create a new archive in memory. */ + /* Write it through an external "gzip" program. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + r = archive_write_set_compression_program(a, "gzip"); + if (r == ARCHIVE_FATAL) { + skipping("Write compression via external " + "program unsupported on this platform"); + archive_write_finish(a); + return; + } + assertA(0 == archive_write_set_bytes_per_block(a, blocksize)); + assertA(0 == archive_write_set_bytes_in_last_block(a, blocksize)); + assertA(blocksize == archive_write_get_bytes_in_last_block(a)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + assertA(blocksize == archive_write_get_bytes_in_last_block(a)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 10); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 8); + + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assertA(8 == archive_write_data(a, "12345678", 9)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); + assertA(0 == archive_write_finish(a)); + + /* + * Now, read the data back through the built-in gzip support. + */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_gzip(a); + /* The compression_gzip() handler will fall back to gunzip + * automatically, but if we know gunzip isn't available, then + * skip the rest. */ + if (r != ARCHIVE_OK && !canGunzip()) { + skipping("No libz and no gunzip program, " + "unable to verify gzip compression"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + + if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) { + archive_read_finish(a); + return; + } + + assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_ctime(ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff2, 10)); + assertEqualMem(buff2, "12345678", 8); + + /* Verify the end of the archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_compress_xz.c b/Utilities/cmlibarchive/libarchive/test/test_write_compress_xz.c new file mode 100644 index 000000000..abfc5e65b --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_compress_xz.c @@ -0,0 +1,253 @@ +/*- + * Copyright (c) 2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * A basic exercise of xz reading and writing. + * + * TODO: Add a reference file and make sure we can decompress that. + */ + +DEFINE_TEST(test_write_compress_xz) +{ + struct archive_entry *ae; + struct archive* a; + char *buff, *data; + size_t buffsize, datasize; + char path[16]; + size_t used1, used2; + int i, r; + + buffsize = 2000000; + assert(NULL != (buff = (char *)malloc(buffsize))); + + datasize = 10000; + assert(NULL != (data = (char *)malloc(datasize))); + memset(data, 0, datasize); + + /* + * Write a 100 files and read them all back. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + r = archive_write_set_compression_xz(a); + if (r == ARCHIVE_FATAL) { + skipping("xz writing not supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertEqualInt(ARCHIVE_COMPRESSION_XZ, archive_compression(a)); + assertEqualString("xz", archive_compression_name(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used1)); + assertEqualInt(ARCHIVE_COMPRESSION_XZ, archive_compression(a)); + assertEqualString("xz", archive_compression_name(a)); + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_filetype(ae, AE_IFREG); + archive_entry_set_size(ae, datasize); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + archive_entry_copy_pathname(ae, path); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize + == (size_t)archive_write_data(a, data, datasize)); + } + archive_entry_free(ae); + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("Can't verify xz writing by reading back;" + " xz reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used1)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Repeat the cycle again, this time setting some compression + * options. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertA(0 == archive_write_set_compression_xz(a)); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "nonexistent-option=0")); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "compression-level=abc")); + assertEqualIntA(a, ARCHIVE_WARN, + archive_write_set_compressor_options(a, "compression-level=99")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_compressor_options(a, "compression-level=9")); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + assertA(datasize == (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + /* Curiously, this test fails; the test data above compresses + * better at default compression than at level 9. */ + /* + failure("compression-level=9 wrote %d bytes, default wrote %d bytes", + (int)used2, (int)used1); + assert(used2 < used1); + */ + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("xz reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + failure("Trying to read %s", path); + if (!assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Repeat again, with much lower compression. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_bytes_per_block(a, 10)); + assertA(0 == archive_write_set_compression_xz(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_compressor_options(a, "compression-level=0")); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, path); + archive_entry_set_size(ae, datasize); + archive_entry_set_filetype(ae, AE_IFREG); + assertA(0 == archive_write_header(a, ae)); + failure("Writing file %s", path); + assertEqualIntA(a, datasize, + (size_t)archive_write_data(a, data, datasize)); + archive_entry_free(ae); + } + archive_write_close(a); + assert(0 == archive_write_finish(a)); + + /* Level 0 really does result in larger data. */ + failure("Compression-level=0 wrote %d bytes; default wrote %d bytes", + (int)used2, (int)used1); + assert(used2 > used1); + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("xz reading not fully supported on this platform"); + } else { + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used2)); + for (i = 0; i < 100; i++) { + sprintf(path, "file%03d", i); + if (!assertEqualInt(ARCHIVE_OK, + archive_read_next_header(a, &ae))) + break; + assertEqualString(path, archive_entry_pathname(ae)); + assertEqualInt((int)datasize, archive_entry_size(ae)); + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + } + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + /* + * Test various premature shutdown scenarios to make sure we + * don't crash or leak memory. + */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_xz(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_xz(a)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_xz(a)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_xz(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used2)); + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* + * Clean up. + */ + free(data); + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_disk.c b/Utilities/cmlibarchive/libarchive/test/test_write_disk.c new file mode 100644 index 000000000..f14811d9a --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_disk.c @@ -0,0 +1,323 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk.c,v 1.15 2008/09/30 04:02:36 kientzle Exp $"); + +#if ARCHIVE_VERSION_NUMBER >= 1009000 + +#define UMASK 022 + +static void create(struct archive_entry *ae, const char *msg) +{ + struct archive *ad; + struct stat st; + + /* Write the entry to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + failure("%s", msg); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(ad); +#else + assertEqualInt(0, archive_write_finish(ad)); +#endif + /* Test the entries on disk. */ + assert(0 == stat(archive_entry_pathname(ae), &st)); + failure("st.st_mode=%o archive_entry_mode(ae)=%o", + st.st_mode, archive_entry_mode(ae)); + /* When verifying a dir, ignore the S_ISGID bit, as some systems set + * that automatically. */ +#if !defined(_WIN32) || defined(__CYGWIN__) + if (archive_entry_filetype(ae) == AE_IFDIR) + st.st_mode &= ~S_ISGID; + assertEqualInt(st.st_mode, archive_entry_mode(ae) & ~UMASK); +#endif +} + +static void create_reg_file(struct archive_entry *ae, const char *msg) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct archive *ad; + + /* Write the entry to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + archive_write_disk_set_options(ad, ARCHIVE_EXTRACT_TIME); + failure("%s", msg); + /* + * A touchy API design issue: archive_write_data() does (as of + * 2.4.12) enforce the entry size as a limit on the data + * written to the file. This was not enforced prior to + * 2.4.12. The change was prompted by the refined + * hardlink-restore semantics introduced at that time. In + * short, libarchive needs to know whether a "hardlink entry" + * is going to overwrite the contents so that it can know + * whether or not to open the file for writing. This implies + * that there is a fundamental semantic difference between an + * entry with a zero size and one with a non-zero size in the + * case of hardlinks and treating the hardlink case + * differently from the regular file case is just asking for + * trouble. So, a zero size must always mean that no data + * will be accepted, which is consistent with the file size in + * the entry being a maximum size. + */ + archive_entry_set_size(ae, sizeof(data)); + archive_entry_set_mtime(ae, 123456789, 0); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(ad); +#else + assertEqualInt(0, archive_write_finish(ad)); +#endif + /* Test the entries on disk. */ + assertIsReg(archive_entry_pathname(ae), archive_entry_mode(ae) & 0777); + assertFileSize(archive_entry_pathname(ae), sizeof(data)); + /* test_write_disk_times has more detailed tests of this area. */ + assertFileMtime(archive_entry_pathname(ae), 123456789, 0); + failure("No atime given, so atime should get set to current time"); + assertFileAtimeRecent(archive_entry_pathname(ae)); +} + +static void create_reg_file2(struct archive_entry *ae, const char *msg) +{ + const int datasize = 100000; + char *data; + struct archive *ad; + int i; + + data = malloc(datasize); + for (i = 0; i < datasize; i++) + data[i] = (char)(i % 256); + + /* Write the entry to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + failure("%s", msg); + /* + * See above for an explanation why this next call + * is necessary. + */ + archive_entry_set_size(ae, datasize); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + for (i = 0; i < datasize - 999; i += 1000) { + assertEqualIntA(ad, ARCHIVE_OK, + archive_write_data_block(ad, data + i, 1000, i)); + } + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + assertEqualInt(0, archive_write_finish(ad)); + + /* Test the entries on disk. */ + assertIsReg(archive_entry_pathname(ae), archive_entry_mode(ae) & 0777); + assertFileSize(archive_entry_pathname(ae), i); + assertFileContents(data, datasize, archive_entry_pathname(ae)); + free(data); +} + +static void create_reg_file3(struct archive_entry *ae, const char *msg) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct archive *ad; + struct stat st; + + /* Write the entry to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + failure("%s", msg); + /* Set the size smaller than the data and verify the truncation. */ + archive_entry_set_size(ae, 5); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(5, archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(ad); +#else + assertEqualInt(0, archive_write_finish(ad)); +#endif + /* Test the entry on disk. */ + assert(0 == stat(archive_entry_pathname(ae), &st)); + failure("st.st_mode=%o archive_entry_mode(ae)=%o", + st.st_mode, archive_entry_mode(ae)); +#if !defined(_WIN32) || defined(__CYGWIN__) + assertEqualInt(st.st_mode, (archive_entry_mode(ae) & ~UMASK)); +#endif + assertEqualInt(st.st_size, 5); +} + + +static void create_reg_file4(struct archive_entry *ae, const char *msg) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct archive *ad; + struct stat st; + + /* Write the entry to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + /* Leave the size unset. The data should not be truncated. */ + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(ARCHIVE_OK, + archive_write_data_block(ad, data, sizeof(data), 0)); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(ad); +#else + assertEqualInt(0, archive_write_finish(ad)); +#endif + /* Test the entry on disk. */ + assert(0 == stat(archive_entry_pathname(ae), &st)); + failure("st.st_mode=%o archive_entry_mode(ae)=%o", + st.st_mode, archive_entry_mode(ae)); +#if !defined(_WIN32) || defined(__CYGWIN__) + assertEqualInt(st.st_mode, (archive_entry_mode(ae) & ~UMASK)); +#endif + failure(msg); + assertEqualInt(st.st_size, sizeof(data)); +} + +#if defined(_WIN32) && !defined(__CYGWIN__) +static void create_reg_file_win(struct archive_entry *ae, const char *msg) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct archive *ad; + struct stat st; + char *p, *fname; + size_t l; + + /* Write the entry to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + archive_write_disk_set_options(ad, ARCHIVE_EXTRACT_TIME); + failure("%s", msg); + archive_entry_set_size(ae, sizeof(data)); + archive_entry_set_mtime(ae, 123456789, 0); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(ad); +#else + assertEqualInt(0, archive_write_finish(ad)); +#endif + /* Test the entries on disk. */ + l = strlen(archive_entry_pathname(ae)); + fname = malloc(l + 1); + assert(NULL != fname); + strcpy(fname, archive_entry_pathname(ae)); + /* Replace unusable characters in Windows to '_' */ + for (p = fname; *p != '\0'; p++) + if (*p == ':' || *p == '*' || *p == '?' || + *p == '"' || *p == '<' || *p == '>' || *p == '|') + *p = '_'; + assert(0 == stat(fname, &st)); + failure("st.st_mode=%o archive_entry_mode(ae)=%o", + st.st_mode, archive_entry_mode(ae)); + assertEqualInt(st.st_size, sizeof(data)); +} +#endif /* _WIN32 && !__CYGWIN__ */ +#endif + +DEFINE_TEST(test_write_disk) +{ +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("archive_write_disk interface"); +#else + struct archive_entry *ae; + + /* Force the umask to something predictable. */ + assertUmask(UMASK); + + /* A regular file. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + create_reg_file(ae, "Test creating a regular file"); + archive_entry_free(ae); + + /* Another regular file. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file2"); + archive_entry_set_mode(ae, S_IFREG | 0755); + create_reg_file2(ae, "Test creating another regular file"); + archive_entry_free(ae); + + /* A regular file with a size restriction */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file3"); + archive_entry_set_mode(ae, S_IFREG | 0755); + create_reg_file3(ae, "Regular file with size restriction"); + archive_entry_free(ae); + + /* A regular file with an unspecified size */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file3"); + archive_entry_set_mode(ae, S_IFREG | 0755); + create_reg_file4(ae, "Regular file with unspecified size"); + archive_entry_free(ae); + + /* A regular file over an existing file */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0724); + create(ae, "Test creating a file over an existing file."); + archive_entry_free(ae); + + /* A directory. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "dir"); + archive_entry_set_mode(ae, S_IFDIR | 0555); + create(ae, "Test creating a regular dir."); + archive_entry_free(ae); + + /* A directory over an existing file. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFDIR | 0742); + create(ae, "Test creating a dir over an existing file."); + archive_entry_free(ae); + + /* A file over an existing dir. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0744); + create(ae, "Test creating a file over an existing dir."); + archive_entry_free(ae); + +#if defined(_WIN32) && !defined(__CYGWIN__) + /* A file with unusable characters in its file name. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "f:i*l?e\"fl|e"); + archive_entry_set_mode(ae, S_IFREG | 0755); + create_reg_file_win(ae, "Test creating a regular file" + " with unusable characters in its file name"); + archive_entry_free(ae); + + /* A file with unusable characters in its directory name. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "d:i*r?e\"co|ry/file1"); + archive_entry_set_mode(ae, S_IFREG | 0755); + create_reg_file_win(ae, "Test creating a regular file" + " with unusable characters in its file name"); + archive_entry_free(ae); +#endif /* _WIN32 && !__CYGWIN__ */ +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_disk_failures.c b/Utilities/cmlibarchive/libarchive/test/test_write_disk_failures.c new file mode 100644 index 000000000..0092737bb --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_disk_failures.c @@ -0,0 +1,72 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk.c,v 1.15 2008/09/30 04:02:36 kientzle Exp $"); + +#if ARCHIVE_VERSION_NUMBER >= 1009000 + +#define UMASK 022 + + +#endif + +DEFINE_TEST(test_write_disk_failures) +{ +#if ARCHIVE_VERSION_NUMBER < 1009000 || (defined(_WIN32) && !defined(__CYGWIN__)) + skipping("archive_write_disk interface"); +#else + struct archive_entry *ae; + struct archive *a; + int fd; + + /* Force the umask to something predictable. */ + assertUmask(UMASK); + + /* A directory that we can't write to. */ + assertMakeDir("dir", 0555); + + /* Can we? */ + fd = open("dir/testfile", O_WRONLY | O_CREAT | O_BINARY, 0777); + if (fd >= 0) { + /* Apparently, we can, so the test below won't work. */ + close(fd); + skipping("Can't test writing to non-writable directory"); + return; + } + + /* Try to extract a regular file into the directory above. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "dir/file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 8); + assert((a = archive_write_disk_new()) != NULL); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_TIME); + archive_entry_set_mtime(ae, 123456789, 0); + assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); + assertEqualIntA(a, 0, archive_write_finish_entry(a)); + assertEqualInt(0, archive_write_finish(a)); + archive_entry_free(ae); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_disk_hardlink.c b/Utilities/cmlibarchive/libarchive/test/test_write_disk_hardlink.c new file mode 100644 index 000000000..560a7299c --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_disk_hardlink.c @@ -0,0 +1,223 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk_hardlink.c,v 1.5 2008/09/05 06:13:11 kientzle Exp $"); + +#if defined(_WIN32) && !defined(__CYGWIN__) +/* Execution bits, Group members bits and others bits do not work. */ +#define UMASK 0177 +#define E_MASK (~0177) +#else +#define UMASK 022 +#define E_MASK (~0) +#endif + +/* + * Exercise hardlink recreation. + * + * File permissions are chosen so that the authoritive entry + * has the correct permission and the non-authoritive versions + * are just writeable files. + */ +DEFINE_TEST(test_write_disk_hardlink) +{ +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("archive_write_disk_hardlink tests"); +#else + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct archive *ad; + struct archive_entry *ae; + int r; + + /* Force the umask to something predictable. */ + assertUmask(UMASK); + + /* Write entries to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + + /* + * First, use a tar-like approach; a regular file, then + * a separate "hardlink" entry. + */ + + /* Regular file. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link1a"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, sizeof(data)); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(sizeof(data), + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* Link. Size of zero means this doesn't carry data. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link1b"); + archive_entry_set_mode(ae, S_IFREG | 0642); + archive_entry_set_size(ae, 0); + archive_entry_copy_hardlink(ae, "link1a"); + assertEqualIntA(ad, 0, r = archive_write_header(ad, ae)); + if (r >= ARCHIVE_WARN) { + assertEqualInt(ARCHIVE_WARN, + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + } + archive_entry_free(ae); + + /* + * Repeat tar approach test, but use unset to mark the + * hardlink as having no data. + */ + + /* Regular file. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link2a"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, sizeof(data)); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(sizeof(data), + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* Link. Unset size means this doesn't carry data. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link2b"); + archive_entry_set_mode(ae, S_IFREG | 0642); + archive_entry_unset_size(ae); + archive_entry_copy_hardlink(ae, "link2a"); + assertEqualIntA(ad, 0, r = archive_write_header(ad, ae)); + if (r >= ARCHIVE_WARN) { + assertEqualInt(ARCHIVE_WARN, + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + } + archive_entry_free(ae); + + /* + * Second, try an old-cpio-like approach; a regular file, then + * another identical one (which has been marked hardlink). + */ + + /* Regular file. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link3a"); + archive_entry_set_mode(ae, S_IFREG | 0600); + archive_entry_set_size(ae, sizeof(data)); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* Link. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link3b"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, sizeof(data)); + archive_entry_copy_hardlink(ae, "link3a"); + assertEqualIntA(ad, 0, r = archive_write_header(ad, ae)); + if (r > ARCHIVE_WARN) { + assertEqualInt(sizeof(data), + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + } + archive_entry_free(ae); + + /* + * Finally, try a new-cpio-like approach, where the initial + * regular file is empty and the hardlink has the data. + */ + + /* Regular file. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link4a"); + archive_entry_set_mode(ae, S_IFREG | 0600); + archive_entry_set_size(ae, 0); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); +#if ARCHIVE_VERSION_NUMBER < 3000000 + assertEqualInt(ARCHIVE_WARN, archive_write_data(ad, data, 1)); +#else + assertEqualInt(-1, archive_write_data(ad, data, 1)); +#endif + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* Link. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link4b"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, sizeof(data)); + archive_entry_copy_hardlink(ae, "link4a"); + assertEqualIntA(ad, 0, r = archive_write_header(ad, ae)); + if (r > ARCHIVE_FAILED) { + assertEqualInt(sizeof(data), + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + } + archive_entry_free(ae); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(ad); +#else + assertEqualInt(0, archive_write_finish(ad)); +#endif + + /* Test the entries on disk. */ + + /* Test #1 */ + /* If the hardlink was successfully created and the archive + * doesn't carry data for it, we consider it to be + * non-authoritive for meta data as well. This is consistent + * with GNU tar and BSD pax. */ + assertIsReg("link1a", 0755 & ~UMASK); + assertFileSize("link1a", sizeof(data)); + assertFileNLinks("link1a", 2); + assertIsHardlink("link1a", "link1b"); + + /* Test #2: Should produce identical results to test #1 */ + /* Note that marking a hardlink with size = 0 is treated the + * same as having an unset size. This is partly for backwards + * compatibility (we used to not have unset tracking, so + * relied on size == 0) and partly to match the model used by + * common file formats that store a size of zero for + * hardlinks. */ + assertIsReg("link2a", 0755 & ~UMASK); + assertFileSize("link2a", sizeof(data)); + assertFileNLinks("link2a", 2); + assertIsHardlink("link2a", "link2b"); + + /* Test #3 */ + assertIsReg("link3a", 0755 & ~UMASK); + assertFileSize("link3a", sizeof(data)); + assertFileNLinks("link3a", 2); + assertIsHardlink("link3a", "link3b"); + + /* Test #4 */ + assertIsReg("link4a", 0755 & ~UMASK); + assertFileNLinks("link4a", 2); + assertFileSize("link4a", sizeof(data)); + assertIsHardlink("link4a", "link4b"); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_disk_perms.c b/Utilities/cmlibarchive/libarchive/test/test_write_disk_perms.c new file mode 100644 index 000000000..0693997ff --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_disk_perms.c @@ -0,0 +1,457 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk_perms.c,v 1.11 2008/12/06 06:01:50 kientzle Exp $"); + +#if ARCHIVE_VERSION_NUMBER >= 1009000 && (!defined(_WIN32) || defined(__CYGWIN__)) + +#define UMASK 022 + +static long _default_gid = -1; +static long _invalid_gid = -1; +static long _alt_gid = -1; + +/* + * To fully test SGID restores, we need three distinct GIDs to work + * with: + * * the GID that files are created with by default (for the + * current user in the current directory) + * * An "alt gid" that this user can create files with + * * An "invalid gid" that this user is not permitted to create + * files with. + * The second fails if this user doesn't belong to at least two groups; + * the third fails if the current user is root. + */ +static void +searchgid(void) +{ + static int _searched = 0; + uid_t uid = getuid(); + gid_t gid = 0; + unsigned int n; + struct stat st; + int fd; + + /* If we've already looked this up, we're done. */ + if (_searched) + return; + _searched = 1; + + /* Create a file on disk in the current default dir. */ + fd = open("test_gid", O_CREAT | O_BINARY, 0664); + failure("Couldn't create a file for gid testing."); + assert(fd > 0); + + /* See what GID it ended up with. This is our "valid" GID. */ + assert(fstat(fd, &st) == 0); + _default_gid = st.st_gid; + + /* Find a GID for which fchown() fails. This is our "invalid" GID. */ + _invalid_gid = -1; + /* This loop stops when we wrap the gid or examine 10,000 gids. */ + for (gid = 1, n = 1; gid == n && n < 10000 ; n++, gid++) { + if (fchown(fd, uid, gid) != 0) { + _invalid_gid = gid; + break; + } + } + + /* + * Find a GID for which fchown() succeeds, but which isn't the + * default. This is the "alternate" gid. + */ + _alt_gid = -1; + for (gid = 0, n = 0; gid == n && n < 10000 ; n++, gid++) { + /* _alt_gid must be different than _default_gid */ + if (gid == (gid_t)_default_gid) + continue; + if (fchown(fd, uid, gid) == 0) { + _alt_gid = gid; + break; + } + } + close(fd); +} + +static int +altgid(void) +{ + searchgid(); + return (_alt_gid); +} + +static int +invalidgid(void) +{ + searchgid(); + return (_invalid_gid); +} + +static int +defaultgid(void) +{ + searchgid(); + return (_default_gid); +} +#endif + +/* + * Exercise permission and ownership restores. + * In particular, try to exercise a bunch of border cases related + * to files/dirs that already exist, SUID/SGID bits, etc. + */ + +DEFINE_TEST(test_write_disk_perms) +{ +#if ARCHIVE_VERSION_NUMBER < 1009000 || (defined(_WIN32) && !defined(__CYGWIN__)) + skipping("archive_write_disk interface"); +#else + struct archive *a; + struct archive_entry *ae; + struct stat st; + + assertUmask(UMASK); + + /* + * Set ownership of the current directory to the group of this + * process. Otherwise, the SGID tests below fail if the + * /tmp directory is owned by a group to which we don't belong + * and we're on a system where group ownership is inherited. + * (Because we're not allowed to SGID files with defaultgid().) + */ + assertEqualInt(0, chown(".", getuid(), getgid())); + + /* Create an archive_write_disk object. */ + assert((a = archive_write_disk_new()) != NULL); + + /* Write a regular file to it. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file_0755"); + archive_entry_set_mode(ae, S_IFREG | 0777); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + archive_entry_free(ae); + + /* Write a regular file, then write over it. */ + /* For files, the perms should get updated. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file_overwrite_0144"); + archive_entry_set_mode(ae, S_IFREG | 0777); + assert(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assert(0 == archive_write_finish_entry(a)); + /* Check that file was created with different perms. */ + assert(0 == stat("file_overwrite_0144", &st)); + failure("file_overwrite_0144: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) != 0144); + /* Overwrite, this should change the perms. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file_overwrite_0144"); + archive_entry_set_mode(ae, S_IFREG | 0144); + assert(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assert(0 == archive_write_finish_entry(a)); + + /* Write a regular dir. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "dir_0514"); + archive_entry_set_mode(ae, S_IFDIR | 0514); + assert(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assert(0 == archive_write_finish_entry(a)); + + /* Overwrite an existing dir. */ + /* For dir, the first perms should get left. */ + assertMakeDir("dir_overwrite_0744", 0744); + /* Check original perms. */ + assert(0 == stat("dir_overwrite_0744", &st)); + failure("dir_overwrite_0744: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 0777) == 0744); + /* Overwrite shouldn't edit perms. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "dir_overwrite_0744"); + archive_entry_set_mode(ae, S_IFDIR | 0777); + assert(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assert(0 == archive_write_finish_entry(a)); + /* Make sure they're unchanged. */ + assert(0 == stat("dir_overwrite_0744", &st)); + failure("dir_overwrite_0744: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 0777) == 0744); + + /* Write a regular file with SUID bit, but don't use _EXTRACT_PERM. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file_no_suid"); + archive_entry_set_mode(ae, S_IFREG | S_ISUID | 0777); + archive_write_disk_set_options(a, 0); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + + /* Write a regular file with ARCHIVE_EXTRACT_PERM. */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_0777"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_PERM); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + + /* Write a regular file with ARCHIVE_EXTRACT_PERM & SUID bit */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_4742"); + archive_entry_set_mode(ae, S_IFREG | S_ISUID | 0742); + archive_entry_set_uid(ae, getuid()); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_PERM); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + + /* + * Write a regular file with ARCHIVE_EXTRACT_PERM & SUID bit, + * but wrong uid. POSIX says you shouldn't restore SUID bit + * unless the UID could be restored. + */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_bad_suid"); + archive_entry_set_mode(ae, S_IFREG | S_ISUID | 0742); + archive_entry_set_uid(ae, getuid() + 1); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_PERM); + assertA(0 == archive_write_header(a, ae)); + /* + * Because we didn't ask for owner, the failure to + * restore SUID shouldn't return a failure. + * We check below to make sure SUID really wasn't set. + * See more detailed comments below. + */ + failure("Opportunistic SUID failure shouldn't return error."); + assertEqualInt(0, archive_write_finish_entry(a)); + + if (getuid() != 0) { + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_bad_suid2"); + archive_entry_set_mode(ae, S_IFREG | S_ISUID | 0742); + archive_entry_set_uid(ae, getuid() + 1); + archive_write_disk_set_options(a, + ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_OWNER); + assertA(0 == archive_write_header(a, ae)); + /* Owner change should fail here. */ + failure("Non-opportunistic SUID failure should return error."); + assertEqualInt(ARCHIVE_WARN, archive_write_finish_entry(a)); + } + + /* Write a regular file with ARCHIVE_EXTRACT_PERM & SGID bit */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_perm_sgid"); + archive_entry_set_mode(ae, S_IFREG | S_ISGID | 0742); + archive_entry_set_gid(ae, defaultgid()); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_PERM); + assert(0 == archive_write_header(a, ae)); + failure("Setting SGID bit should succeed here."); + assertEqualIntA(a, 0, archive_write_finish_entry(a)); + + if (altgid() == -1) { + /* + * Current user must belong to at least two groups or + * else we can't test setting the GID to another group. + */ + skipping("Current user can't test gid restore: must belong to more than one group."); + } else { + /* + * Write a regular file with ARCHIVE_EXTRACT_PERM & SGID bit + * but without ARCHIVE_EXTRACT_OWNER. + */ + /* + * This is a weird case: The user has asked for permissions to + * be restored but not asked for ownership to be restored. As + * a result, the default file creation will create a file with + * the wrong group. There are several possible behaviors for + * libarchive in this scenario: + * = Set the SGID bit. It is wrong and a security hole to + * set SGID with the wrong group. Even POSIX thinks so. + * = Implicitly set the group. I don't like this. + * = drop the SGID bit and warn (the old libarchive behavior) + * = drop the SGID bit and don't warn (the current libarchive + * behavior). + * The current behavior sees SGID/SUID restore when you + * don't ask for owner restore as an "opportunistic" + * action. That is, libarchive should do it if it can, + * but if it can't, it's not an error. + */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_alt_sgid"); + archive_entry_set_mode(ae, S_IFREG | S_ISGID | 0742); + archive_entry_set_uid(ae, getuid()); + archive_entry_set_gid(ae, altgid()); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_PERM); + assert(0 == archive_write_header(a, ae)); + failure("Setting SGID bit should fail because of group mismatch but the failure should be silent because we didn't ask for the group to be set."); + assertEqualIntA(a, 0, archive_write_finish_entry(a)); + + /* + * As above, but add _EXTRACT_OWNER to verify that it + * does succeed. + */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_alt_sgid_owner"); + archive_entry_set_mode(ae, S_IFREG | S_ISGID | 0742); + archive_entry_set_uid(ae, getuid()); + archive_entry_set_gid(ae, altgid()); + archive_write_disk_set_options(a, + ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_OWNER); + assert(0 == archive_write_header(a, ae)); + failure("Setting SGID bit should succeed here."); + assertEqualIntA(a, ARCHIVE_OK, archive_write_finish_entry(a)); + } + + /* + * Write a regular file with ARCHIVE_EXTRACT_PERM & SGID bit, + * but wrong GID. POSIX says you shouldn't restore SGID bit + * unless the GID could be restored. + */ + if (invalidgid() == -1) { + /* This test always fails for root. */ + printf("Running as root: Can't test SGID failures.\n"); + } else { + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_bad_sgid"); + archive_entry_set_mode(ae, S_IFREG | S_ISGID | 0742); + archive_entry_set_gid(ae, invalidgid()); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_PERM); + assertA(0 == archive_write_header(a, ae)); + failure("This SGID restore should fail without an error."); + assertEqualIntA(a, 0, archive_write_finish_entry(a)); + + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_bad_sgid2"); + archive_entry_set_mode(ae, S_IFREG | S_ISGID | 0742); + archive_entry_set_gid(ae, invalidgid()); + archive_write_disk_set_options(a, + ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_OWNER); + assertA(0 == archive_write_header(a, ae)); + failure("This SGID restore should fail with an error."); + assertEqualIntA(a, ARCHIVE_WARN, archive_write_finish_entry(a)); + } + + /* Set ownership should fail if we're not root. */ + if (getuid() == 0) { + printf("Running as root: Can't test setuid failures.\n"); + } else { + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "file_bad_owner"); + archive_entry_set_mode(ae, S_IFREG | 0744); + archive_entry_set_uid(ae, getuid() + 1); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_OWNER); + assertA(0 == archive_write_header(a, ae)); + assertEqualIntA(a,ARCHIVE_WARN,archive_write_finish_entry(a)); + } + +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assert(0 == archive_write_finish(a)); +#endif + archive_entry_free(ae); + + /* Test the entries on disk. */ + assert(0 == stat("file_0755", &st)); + failure("file_0755: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == 0755); + + assert(0 == stat("file_overwrite_0144", &st)); + failure("file_overwrite_0144: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == 0144); + + assert(0 == stat("dir_0514", &st)); + failure("dir_0514: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == 0514); + + assert(0 == stat("dir_overwrite_0744", &st)); + failure("dir_overwrite_0744: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 0777) == 0744); + + assert(0 == stat("file_no_suid", &st)); + failure("file_0755: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == 0755); + + assert(0 == stat("file_0777", &st)); + failure("file_0777: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == 0777); + + /* SUID bit should get set here. */ + assert(0 == stat("file_4742", &st)); + failure("file_4742: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (S_ISUID | 0742)); + + /* SUID bit should NOT have been set here. */ + assert(0 == stat("file_bad_suid", &st)); + failure("file_bad_suid: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (0742)); + + /* Some things don't fail if you're root, so suppress this. */ + if (getuid() != 0) { + /* SUID bit should NOT have been set here. */ + assert(0 == stat("file_bad_suid2", &st)); + failure("file_bad_suid2: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (0742)); + } + + /* SGID should be set here. */ + assert(0 == stat("file_perm_sgid", &st)); + failure("file_perm_sgid: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (S_ISGID | 0742)); + + if (altgid() != -1) { + /* SGID should not be set here. */ + assert(0 == stat("file_alt_sgid", &st)); + failure("file_alt_sgid: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (0742)); + + /* SGID should be set here. */ + assert(0 == stat("file_alt_sgid_owner", &st)); + failure("file_alt_sgid: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (S_ISGID | 0742)); + } + + if (invalidgid() != -1) { + /* SGID should NOT be set here. */ + assert(0 == stat("file_bad_sgid", &st)); + failure("file_bad_sgid: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (0742)); + /* SGID should NOT be set here. */ + assert(0 == stat("file_bad_sgid2", &st)); + failure("file_bad_sgid2: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (0742)); + } + + if (getuid() != 0) { + assert(0 == stat("file_bad_owner", &st)); + failure("file_bad_owner: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == (0744)); + failure("file_bad_owner: st.st_uid=%d getuid()=%d", + st.st_uid, getuid()); + /* The entry had getuid()+1, but because we're + * not root, we should not have been able to set that. */ + assert(st.st_uid == getuid()); + } +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_disk_secure.c b/Utilities/cmlibarchive/libarchive/test/test_write_disk_secure.c new file mode 100644 index 000000000..08c9ef125 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_disk_secure.c @@ -0,0 +1,215 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_disk_secure.c,v 1.8 2008/09/07 23:59:27 kientzle Exp $"); + +#define UMASK 022 + +/* + * Exercise security checks that should prevent certain + * writes. + */ + +DEFINE_TEST(test_write_disk_secure) +{ +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("archive_write_disk interface"); +#elif !defined(_WIN32) || defined(__CYGWIN__) + struct archive *a; + struct archive_entry *ae; + struct stat st; + + /* Start with a known umask. */ + assertUmask(UMASK); + + /* Create an archive_write_disk object. */ + assert((a = archive_write_disk_new()) != NULL); + + /* Write a regular dir to it. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "dir"); + archive_entry_set_mode(ae, S_IFDIR | 0777); + assert(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assert(0 == archive_write_finish_entry(a)); + + /* Write a symlink to the dir above. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir"); + archive_entry_set_mode(ae, S_IFLNK | 0777); + archive_entry_set_symlink(ae, "dir"); + archive_write_disk_set_options(a, 0); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + + /* + * Without security checks, we should be able to + * extract a file through the link. + */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir/filea"); + archive_entry_set_mode(ae, S_IFREG | 0777); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + + /* But with security checks enabled, this should fail. */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir/fileb"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_SECURE_SYMLINKS); + failure("Extracting a file through a symlink should fail here."); + assertEqualInt(ARCHIVE_FAILED, archive_write_header(a, ae)); + archive_entry_free(ae); + assert(0 == archive_write_finish_entry(a)); + + /* Create another link. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir2"); + archive_entry_set_mode(ae, S_IFLNK | 0777); + archive_entry_set_symlink(ae, "dir"); + archive_write_disk_set_options(a, 0); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + + /* + * With symlink check and unlink option, it should remove + * the link and create the dir. + */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir2/filec"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_SECURE_SYMLINKS | ARCHIVE_EXTRACT_UNLINK); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assert(0 == archive_write_finish_entry(a)); + + /* + * Without security checks, extracting a dir over a link to a + * dir should follow the link. + */ + /* Create a symlink to a dir. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir3"); + archive_entry_set_mode(ae, S_IFLNK | 0777); + archive_entry_set_symlink(ae, "dir"); + archive_write_disk_set_options(a, 0); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + /* Extract a dir whose name matches the symlink. */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir3"); + archive_entry_set_mode(ae, S_IFDIR | 0777); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + /* Verify link was followed. */ + assertEqualInt(0, lstat("link_to_dir3", &st)); + assert(S_ISLNK(st.st_mode)); + archive_entry_free(ae); + + /* + * As above, but a broken link, so the link should get replaced. + */ + /* Create a symlink to a dir. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir4"); + archive_entry_set_mode(ae, S_IFLNK | 0777); + archive_entry_set_symlink(ae, "nonexistent_dir"); + archive_write_disk_set_options(a, 0); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + /* Extract a dir whose name matches the symlink. */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir4"); + archive_entry_set_mode(ae, S_IFDIR | 0777); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + /* Verify link was replaced. */ + assertEqualInt(0, lstat("link_to_dir4", &st)); + assert(S_ISDIR(st.st_mode)); + archive_entry_free(ae); + + /* + * As above, but a link to a non-dir, so the link should get replaced. + */ + /* Create a regular file and a symlink to it */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "non_dir"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_write_disk_set_options(a, 0); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + /* Create symlink to the file. */ + archive_entry_copy_pathname(ae, "link_to_dir5"); + archive_entry_set_mode(ae, S_IFLNK | 0777); + archive_entry_set_symlink(ae, "non_dir"); + archive_write_disk_set_options(a, 0); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + /* Extract a dir whose name matches the symlink. */ + assert(archive_entry_clear(ae) != NULL); + archive_entry_copy_pathname(ae, "link_to_dir5"); + archive_entry_set_mode(ae, S_IFDIR | 0777); + assert(0 == archive_write_header(a, ae)); + assert(0 == archive_write_finish_entry(a)); + /* Verify link was replaced. */ + assertEqualInt(0, lstat("link_to_dir5", &st)); + assert(S_ISDIR(st.st_mode)); + archive_entry_free(ae); + + assert(0 == archive_write_finish(a)); + + /* Test the entries on disk. */ + assert(0 == lstat("dir", &st)); + failure("dir: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 0777) == 0755); + + assert(0 == lstat("link_to_dir", &st)); + failure("link_to_dir: st.st_mode=%o", st.st_mode); + assert(S_ISLNK(st.st_mode)); +#if HAVE_LCHMOD + /* Systems that lack lchmod() can't set symlink perms, so skip this. */ + failure("link_to_dir: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == 0755); +#endif + + assert(0 == lstat("dir/filea", &st)); + failure("dir/filea: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == 0755); + + failure("dir/fileb: This file should not have been created"); + assert(0 != lstat("dir/fileb", &st)); + + assert(0 == lstat("link_to_dir2", &st)); + failure("link_to_dir2 should have been re-created as a true dir"); + assert(S_ISDIR(st.st_mode)); + failure("link_to_dir2: Implicit dir creation should obey umask, but st.st_mode=%o", st.st_mode); + assert((st.st_mode & 0777) == 0755); + + assert(0 == lstat("link_to_dir2/filec", &st)); + assert(S_ISREG(st.st_mode)); + failure("link_to_dir2/filec: st.st_mode=%o", st.st_mode); + assert((st.st_mode & 07777) == 0755); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_disk_sparse.c b/Utilities/cmlibarchive/libarchive/test/test_write_disk_sparse.c new file mode 100644 index 000000000..5f4235a6c --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_disk_sparse.c @@ -0,0 +1,280 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Write a file using archive_write_data call, read the file + * back and verify the contents. The data written includes large + * blocks of nulls, so it should exercise the sparsification logic + * if ARCHIVE_EXTRACT_SPARSE is enabled. + */ +static void +verify_write_data(struct archive *a, int sparse) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct stat st; + struct archive_entry *ae; + size_t buff_size = 64 * 1024; + char *buff, *p; + const char *msg = sparse ? "sparse" : "non-sparse"; + FILE *f; + + buff = malloc(buff_size); + assert(buff != NULL); + + ae = archive_entry_new(); + assert(ae != NULL); + archive_entry_set_size(ae, 8 * buff_size); + archive_entry_set_pathname(ae, "test_write_data"); + archive_entry_set_mode(ae, AE_IFREG | 0755); + assertEqualIntA(a, 0, archive_write_header(a, ae)); + + /* Use archive_write_data() to write three relatively sparse blocks. */ + + /* First has non-null data at beginning. */ + memset(buff, 0, buff_size); + memcpy(buff, data, sizeof(data)); + failure("%s", msg); + assertEqualInt(buff_size, archive_write_data(a, buff, buff_size)); + + /* Second has non-null data in the middle. */ + memset(buff, 0, buff_size); + memcpy(buff + buff_size / 2 - 3, data, sizeof(data)); + failure("%s", msg); + assertEqualInt(buff_size, archive_write_data(a, buff, buff_size)); + + /* Third has non-null data at the end. */ + memset(buff, 0, buff_size); + memcpy(buff + buff_size - sizeof(data), data, sizeof(data)); + failure("%s", msg); + assertEqualInt(buff_size, archive_write_data(a, buff, buff_size)); + + failure("%s", msg); + assertEqualIntA(a, 0, archive_write_finish_entry(a)); + + /* Test the entry on disk. */ + assert(0 == stat(archive_entry_pathname(ae), &st)); + assertEqualInt(st.st_size, 8 * buff_size); + f = fopen(archive_entry_pathname(ae), "rb"); + if (!assert(f != NULL)) + return; + + /* Check first block. */ + assertEqualInt(buff_size, fread(buff, 1, buff_size, f)); + failure("%s", msg); + assertEqualMem(buff, data, sizeof(data)); + for (p = buff + sizeof(data); p < buff + buff_size; ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (!assertEqualInt(0, *p)) + break; + } + + /* Check second block. */ + assertEqualInt(buff_size, fread(buff, 1, buff_size, f)); + for (p = buff; p < buff + buff_size; ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (p == buff + buff_size / 2 - 3) { + assertEqualMem(p, data, sizeof(data)); + p += sizeof(data); + } else if (!assertEqualInt(0, *p)) + break; + } + + /* Check third block. */ + assertEqualInt(buff_size, fread(buff, 1, buff_size, f)); + for (p = buff; p < buff + buff_size - sizeof(data); ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (!assertEqualInt(0, *p)) + break; + } + failure("%s", msg); + assertEqualMem(buff + buff_size - sizeof(data), data, sizeof(data)); + + /* XXX more XXX */ + + assertEqualInt(0, fclose(f)); + archive_entry_free(ae); + free(buff); +} + +/* + * As above, but using the archive_write_data_block() call. + */ +static void +verify_write_data_block(struct archive *a, int sparse) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct stat st; + struct archive_entry *ae; + size_t buff_size = 64 * 1024; + char *buff, *p; + const char *msg = sparse ? "sparse" : "non-sparse"; + FILE *f; + + buff = malloc(buff_size); + assert(buff != NULL); + + ae = archive_entry_new(); + assert(ae != NULL); + archive_entry_set_size(ae, 8 * buff_size); + archive_entry_set_pathname(ae, "test_write_data_block"); + archive_entry_set_mode(ae, AE_IFREG | 0755); + assertEqualIntA(a, 0, archive_write_header(a, ae)); + + /* Use archive_write_data_block() to write three + relatively sparse blocks. */ + + /* First has non-null data at beginning. */ + memset(buff, 0, buff_size); + memcpy(buff, data, sizeof(data)); + failure("%s", msg); + assertEqualInt(ARCHIVE_OK, + archive_write_data_block(a, buff, buff_size, 100)); + + /* Second has non-null data in the middle. */ + memset(buff, 0, buff_size); + memcpy(buff + buff_size / 2 - 3, data, sizeof(data)); + failure("%s", msg); + assertEqualInt(ARCHIVE_OK, + archive_write_data_block(a, buff, buff_size, buff_size + 200)); + + /* Third has non-null data at the end. */ + memset(buff, 0, buff_size); + memcpy(buff + buff_size - sizeof(data), data, sizeof(data)); + failure("%s", msg); + assertEqualInt(ARCHIVE_OK, + archive_write_data_block(a, buff, buff_size, buff_size * 2 + 300)); + + failure("%s", msg); + assertEqualIntA(a, 0, archive_write_finish_entry(a)); + + /* Test the entry on disk. */ + assert(0 == stat(archive_entry_pathname(ae), &st)); + assertEqualInt(st.st_size, 8 * buff_size); + f = fopen(archive_entry_pathname(ae), "rb"); + if (!assert(f != NULL)) + return; + + /* Check 100-byte gap at beginning */ + assertEqualInt(100, fread(buff, 1, 100, f)); + failure("%s", msg); + for (p = buff; p < buff + 100; ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (!assertEqualInt(0, *p)) + break; + } + + /* Check first block. */ + assertEqualInt(buff_size, fread(buff, 1, buff_size, f)); + failure("%s", msg); + assertEqualMem(buff, data, sizeof(data)); + for (p = buff + sizeof(data); p < buff + buff_size; ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (!assertEqualInt(0, *p)) + break; + } + + /* Check 100-byte gap */ + assertEqualInt(100, fread(buff, 1, 100, f)); + failure("%s", msg); + for (p = buff; p < buff + 100; ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (!assertEqualInt(0, *p)) + break; + } + + /* Check second block. */ + assertEqualInt(buff_size, fread(buff, 1, buff_size, f)); + for (p = buff; p < buff + buff_size; ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (p == buff + buff_size / 2 - 3) { + assertEqualMem(p, data, sizeof(data)); + p += sizeof(data); + } else if (!assertEqualInt(0, *p)) + break; + } + + /* Check 100-byte gap */ + assertEqualInt(100, fread(buff, 1, 100, f)); + failure("%s", msg); + for (p = buff; p < buff + 100; ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (!assertEqualInt(0, *p)) + break; + } + + /* Check third block. */ + assertEqualInt(buff_size, fread(buff, 1, buff_size, f)); + for (p = buff; p < buff + buff_size - sizeof(data); ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (!assertEqualInt(0, *p)) + break; + } + failure("%s", msg); + assertEqualMem(buff + buff_size - sizeof(data), data, sizeof(data)); + + /* Check another block size beyond last we wrote. */ + assertEqualInt(buff_size, fread(buff, 1, buff_size, f)); + failure("%s", msg); + for (p = buff; p < buff + buff_size; ++p) { + failure("offset: %d, %s", (int)(p - buff), msg); + if (!assertEqualInt(0, *p)) + break; + } + + + /* XXX more XXX */ + + assertEqualInt(0, fclose(f)); + free(buff); + archive_entry_free(ae); +} + +DEFINE_TEST(test_write_disk_sparse) +{ + struct archive *ad; + + + /* + * The return values, etc, of the write data functions + * shouldn't change regardless of whether we've requested + * sparsification. (The performance and pattern of actual + * write calls to the disk should vary, of course, but the + * client program shouldn't see any difference.) + */ + assert((ad = archive_write_disk_new()) != NULL); + archive_write_disk_set_options(ad, 0); + verify_write_data(ad, 0); + verify_write_data_block(ad, 0); + assertEqualInt(0, archive_write_finish(ad)); + + assert((ad = archive_write_disk_new()) != NULL); + archive_write_disk_set_options(ad, ARCHIVE_EXTRACT_SPARSE); + verify_write_data(ad, 1); + verify_write_data_block(ad, 1); + assertEqualInt(0, archive_write_finish(ad)); + +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_disk_symlink.c b/Utilities/cmlibarchive/libarchive/test/test_write_disk_symlink.c new file mode 100644 index 000000000..7da2cf5ae --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_disk_symlink.c @@ -0,0 +1,117 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Exercise symlink recreation. + */ +DEFINE_TEST(test_write_disk_symlink) +{ + static const char data[]="abcdefghijklmnopqrstuvwxyz"; + struct archive *ad; + struct archive_entry *ae; + int r; + + if (!canSymlink()) { + skipping("Symlinks not supported"); + return; + } + + /* Write entries to disk. */ + assert((ad = archive_write_disk_new()) != NULL); + + /* + * First, create a regular file then a symlink to that file. + */ + + /* Regular file: link1a */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link1a"); + archive_entry_set_mode(ae, AE_IFREG | 0755); + archive_entry_set_size(ae, sizeof(data)); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(sizeof(data), + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* Symbolic Link: link1b -> link1a */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link1b"); + archive_entry_set_mode(ae, AE_IFLNK | 0642); + archive_entry_set_size(ae, 0); + archive_entry_copy_symlink(ae, "link1a"); + assertEqualIntA(ad, 0, r = archive_write_header(ad, ae)); + if (r >= ARCHIVE_WARN) + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + /* + * We should be able to do this in the other order as well, + * of course. + */ + + /* Symbolic link: link2b -> link2a */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link2b"); + archive_entry_set_mode(ae, AE_IFLNK | 0642); + archive_entry_unset_size(ae); + archive_entry_copy_symlink(ae, "link2a"); + assertEqualIntA(ad, 0, r = archive_write_header(ad, ae)); + if (r >= ARCHIVE_WARN) { + assertEqualInt(ARCHIVE_WARN, + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + } + archive_entry_free(ae); + + /* File: link2a */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "link2a"); + archive_entry_set_mode(ae, AE_IFREG | 0755); + archive_entry_set_size(ae, sizeof(data)); + assertEqualIntA(ad, 0, archive_write_header(ad, ae)); + assertEqualInt(sizeof(data), + archive_write_data(ad, data, sizeof(data))); + assertEqualIntA(ad, 0, archive_write_finish_entry(ad)); + archive_entry_free(ae); + + assertEqualInt(ARCHIVE_OK, archive_write_finish(ad)); + + /* Test the entries on disk. */ + + /* Test #1 */ + assertIsReg("link1a", -1); + assertFileSize("link1a", sizeof(data)); + assertFileNLinks("link1a", 1); + assertIsSymlink("link1b", "link1a"); + + /* Test #2: Should produce identical results to test #1 */ + assertIsReg("link2a", -1); + assertFileSize("link2a", sizeof(data)); + assertFileNLinks("link2a", 1); + assertIsSymlink("link2b", "link2a"); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_disk_times.c b/Utilities/cmlibarchive/libarchive/test/test_write_disk_times.c new file mode 100644 index 000000000..27c3786f1 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_disk_times.c @@ -0,0 +1,167 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Exercise time restores in archive_write_disk(), including + * correct handling of omitted time values. + * On FreeBSD, we also test birthtime and high-res time restores. + */ + +DEFINE_TEST(test_write_disk_times) +{ + struct archive *a; + struct archive_entry *ae; + + /* Create an archive_write_disk object. */ + assert((a = archive_write_disk_new()) != NULL); + assertEqualInt(ARCHIVE_OK, + archive_write_disk_set_options(a, ARCHIVE_EXTRACT_TIME)); + + /* + * Easy case: mtime and atime both specified. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file1"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_entry_set_atime(ae, 123456, 0); + archive_entry_set_mtime(ae, 234567, 0); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a)); + archive_entry_free(ae); + /* Verify */ + assertFileAtime("file1", 123456, 0); + assertFileMtime("file1", 234567, 0); + + /* + * mtime specified, but not atime + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file2"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_entry_set_mtime(ae, 234567, 0); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a)); + archive_entry_free(ae); + assertFileMtime("file2", 234567, 0); + assertFileAtimeRecent("file2"); + + /* + * atime specified, but not mtime + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file3"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_entry_set_atime(ae, 345678, 0); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a)); + archive_entry_free(ae); + /* Verify: Current mtime and atime as specified. */ + assertFileAtime("file3", 345678, 0); + assertFileMtimeRecent("file3"); + + /* + * Neither atime nor mtime specified. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file4"); + archive_entry_set_mode(ae, S_IFREG | 0777); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a)); + archive_entry_free(ae); + /* Verify: Current mtime and atime. */ + assertFileAtimeRecent("file4"); + assertFileMtimeRecent("file4"); + +#if defined(__FreeBSD__) + /* + * High-res mtime and atime on FreeBSD. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file10"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_entry_set_atime(ae, 1234567, 23456); + archive_entry_set_mtime(ae, 2345678, 4567); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a)); + archive_entry_free(ae); + /* Verify */ + assertFileMtime("file10", 2345678, 4567); + assertFileAtime("file10", 1234567, 23456); + + /* + * Birthtime, mtime and atime on FreeBSD + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file11"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_entry_set_atime(ae, 1234567, 23456); + archive_entry_set_birthtime(ae, 3456789, 12345); + /* mtime must be later than birthtime! */ + archive_entry_set_mtime(ae, 12345678, 4567); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a)); + archive_entry_free(ae); + /* Verify */ + assertFileAtime("file11", 1234567, 23456); + assertFileBirthtime("file11", 3456789, 12345); + assertFileMtime("file11", 12345678, 4567); + + /* + * Birthtime only on FreeBSD. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file12"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_entry_set_birthtime(ae, 3456789, 12345); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a)); + archive_entry_free(ae); + /* Verify */ + assertFileAtimeRecent("file12"); + assertFileBirthtime("file12", 3456789, 12345); + assertFileMtimeRecent("file12"); + + /* + * mtime only on FreeBSD. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file13"); + archive_entry_set_mode(ae, S_IFREG | 0777); + archive_entry_set_mtime(ae, 4567890, 23456); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a)); + archive_entry_free(ae); + /* Verify */ + assertFileAtimeRecent("file13"); + assertFileBirthtime("file13", 4567890, 23456); + assertFileMtime("file13", 4567890, 23456); +#else + skipping("Platform-specific time restore tests"); +#endif + + archive_write_finish(a); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_ar.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_ar.c new file mode 100644 index 000000000..d06952206 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_ar.c @@ -0,0 +1,209 @@ +/*- + * Copyright (c) 2007 Kai Wang + * Copyright (c) 2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_ar.c,v 1.9 2008/12/17 19:03:44 kientzle Exp $"); + +char buff[4096]; +char buff2[64]; +static char strtab[] = "abcdefghijklmn.o/\nggghhhjjjrrrttt.o/\niiijjjdddsssppp.o/\n"; + +DEFINE_TEST(test_write_format_ar) +{ +#if ARCHIVE_VERSION_NUMBER < 1009000 + skipping("ar write support"); +#else + struct archive_entry *ae; + struct archive* a; + size_t used; + + /* + * First we try to create a SVR4/GNU format archive. + */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ar_svr4(a)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* write the filename table */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "//"); + archive_entry_set_size(ae, strlen(strtab)); + assertA(0 == archive_write_header(a, ae)); + assertA(strlen(strtab) == (size_t)archive_write_data(a, strtab, strlen(strtab))); + archive_entry_free(ae); + + /* write entries */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 0); + assert(1 == archive_entry_mtime(ae)); + archive_entry_set_mode(ae, S_IFREG | 0755); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + archive_entry_copy_pathname(ae, "abcdefghijklmn.o"); + archive_entry_set_size(ae, 8); + assertA(0 == archive_write_header(a, ae)); + assertA(8 == archive_write_data(a, "87654321", 15)); + archive_entry_free(ae); + + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "ggghhhjjjrrrttt.o"); + archive_entry_set_filetype(ae, AE_IFREG); + archive_entry_set_size(ae, 7); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, 7, archive_write_data(a, "7777777", 7)); + archive_entry_free(ae); + + /* test full pathname */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "/usr/home/xx/iiijjjdddsssppp.o"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 8); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, 8, archive_write_data(a, "88877766", 8)); + archive_entry_free(ae); + + /* trailing "/" should be rejected */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "/usr/home/xx/iiijjj/"); + archive_entry_set_size(ae, 8); + assertA(0 != archive_write_header(a, ae)); + archive_entry_free(ae); + + /* Non regular file should be rejected */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "gfgh.o"); + archive_entry_set_mode(ae, S_IFDIR | 0755); + archive_entry_set_size(ae, 6); + assertA(0 != archive_write_header(a, ae)); + archive_entry_free(ae); + + archive_write_close(a); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertEqualInt(0, archive_write_finish(a)); +#endif + + /* + * Now, read the data back. + */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(0, archive_entry_mtime(ae)); + assertEqualString("//", archive_entry_pathname(ae)); + assertEqualInt(0, archive_entry_size(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualString("abcdefghijklmn.o", archive_entry_pathname(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff2, 10)); + assertEqualMem(buff2, "87654321", 8); + + assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("ggghhhjjjrrrttt.o", archive_entry_pathname(ae)); + assertEqualInt(7, archive_entry_size(ae)); + assertEqualIntA(a, 7, archive_read_data(a, buff2, 11)); + assertEqualMem(buff2, "7777777", 7); + + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + assertEqualString("iiijjjdddsssppp.o", archive_entry_pathname(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff2, 17)); + assertEqualMem(buff2, "88877766", 8); + + assertEqualIntA(a, 0, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(0, archive_read_finish(a)); +#endif + + /* + * Then, we try to create a BSD format archive. + */ + memset(buff, 0, sizeof(buff)); + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ar_bsd(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* write a entry need long name extension */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "ttttyyyyuuuuiiii.o"); + archive_entry_set_filetype(ae, AE_IFREG); + archive_entry_set_size(ae, 5); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualInt(5, archive_entry_size(ae)); + assertEqualIntA(a, 5, archive_write_data(a, "12345", 7)); + archive_entry_free(ae); + + /* write a entry with a short name */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "ttyy.o"); + archive_entry_set_filetype(ae, AE_IFREG); + archive_entry_set_size(ae, 6); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, 6, archive_write_data(a, "555555", 7)); + archive_entry_free(ae); + archive_write_close(a); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertEqualInt(0, archive_write_finish(a)); +#endif + + /* Now, Read the data back */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + assertEqualString("ttttyyyyuuuuiiii.o", archive_entry_pathname(ae)); + assertEqualInt(5, archive_entry_size(ae)); + assertEqualIntA(a, 5, archive_read_data(a, buff2, 10)); + assertEqualMem(buff2, "12345", 5); + + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + assertEqualString("ttyy.o", archive_entry_pathname(ae)); + assertEqualInt(6, archive_entry_size(ae)); + assertEqualIntA(a, 6, archive_read_data(a, buff2, 10)); + assertEqualMem(buff2, "555555", 6); + + /* Test EOF */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, 0, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(0, archive_read_finish(a)); +#endif +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio.c new file mode 100644 index 000000000..4405ee3cd --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio.c @@ -0,0 +1,206 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_cpio.c,v 1.6 2008/12/06 06:02:26 kientzle Exp $"); + +/* The version stamp macro was introduced after cpio write support. */ +#if ARCHIVE_VERSION_NUMBER >= 1009000 +static void +test_format(int (*set_format)(struct archive *)) +{ + char filedata[64]; + struct archive_entry *ae; + struct archive *a; + char *p; + size_t used; + size_t buffsize = 1000000; + char *buff; + int damaged = 0; + + buff = malloc(buffsize); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == (*set_format)(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 10); + assert(1 == archive_entry_mtime(ae)); + assert(10 == archive_entry_mtime_nsec(ae)); + p = strdup("file"); + archive_entry_copy_pathname(ae, p); + strcpy(p, "XXXX"); + free(p); + assertEqualString("file", archive_entry_pathname(ae)); + archive_entry_set_mode(ae, S_IFREG | 0755); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + archive_entry_set_size(ae, 8); + + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assertA(8 == archive_write_data(a, "12345678", 9)); + + /* + * Write another file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 10); + assert(1 == archive_entry_mtime(ae)); + assert(10 == archive_entry_mtime_nsec(ae)); + p = strdup("file2"); + archive_entry_copy_pathname(ae, p); + strcpy(p, "XXXX"); + free(p); + assertEqualString("file2", archive_entry_pathname(ae)); + archive_entry_set_mode(ae, S_IFREG | 0755); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + archive_entry_set_size(ae, 4); + + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assertA(4 == archive_write_data(a, "1234", 5)); + + /* + * Write a directory to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 11, 110); + archive_entry_copy_pathname(ae, "dir"); + archive_entry_set_mode(ae, S_IFDIR | 0755); + archive_entry_set_size(ae, 512); + + assertA(0 == archive_write_header(a, ae)); + assertEqualInt(0, archive_entry_size(ae)); + archive_entry_free(ae); + assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9)); + + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + + /* + * Damage the second entry to test the search-ahead recovery. + */ + { + int i; + for (i = 80; i < 150; i++) { + if (memcmp(buff + i, "07070", 5) == 0) { + damaged = 1; + buff[i] = 'X'; + break; + } + } + } + failure("Unable to locate the second header for damage-recovery test."); + assert(damaged = 1); + + /* + * Now, read the data back. + */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used)); + + if (!assertEqualIntA(a, 0, archive_read_next_header(a, &ae))) { + archive_read_finish(a); + return; + } + + assertEqualInt(1, archive_entry_mtime(ae)); + /* Not the same as above: cpio doesn't store hi-res times. */ + assert(0 == archive_entry_mtime_nsec(ae)); + assert(0 == archive_entry_atime(ae)); + assert(0 == archive_entry_ctime(ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertA(8 == archive_read_data(a, filedata, 10)); + assert(0 == memcmp(filedata, "12345678", 8)); + + /* + * Read the second file back. + */ + if (!damaged) { + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_entry_mtime(ae)); + /* Not the same as above: cpio doesn't store hi-res times. */ + assert(0 == archive_entry_mtime_nsec(ae)); + assert(0 == archive_entry_atime(ae)); + assert(0 == archive_entry_ctime(ae)); + assertEqualString("file2", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(4, archive_entry_size(ae)); + assertEqualIntA(a, 4, archive_read_data(a, filedata, 10)); + assert(0 == memcmp(filedata, "1234", 4)); + } + + /* + * Read the dir entry back. + */ + assertEqualIntA(a, + damaged ? ARCHIVE_WARN : ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualInt(11, archive_entry_mtime(ae)); + assert(0 == archive_entry_mtime_nsec(ae)); + assert(0 == archive_entry_atime(ae)); + assert(0 == archive_entry_ctime(ae)); + assertEqualString("dir", archive_entry_pathname(ae)); + assertEqualInt((S_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualIntA(a, 0, archive_read_data(a, filedata, 10)); + + /* Verify the end of the archive. */ + assertEqualIntA(a, 1, archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + + free(buff); +} +#endif + +DEFINE_TEST(test_write_format_cpio) +{ +#if ARCHIVE_VERSION_NUMBER >= 1009000 + test_format(archive_write_set_format_cpio); + test_format(archive_write_set_format_cpio_newc); +#else + skipping("cpio write support"); +#endif +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_empty.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_empty.c new file mode 100644 index 000000000..c5f94b543 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_empty.c @@ -0,0 +1,75 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_cpio_empty.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); + +/* + * Check that an "empty" cpio archive is correctly created. + */ + +/* Here's what an empty cpio archive should look like. */ +static char ref[] = +"070707" /* Magic number */ +"000000" /* Dev = 0 */ +"000000" /* ino = 0 */ +"000000" /* mode = 0 */ +"000000" /* uid = 0 */ +"000000" /* gid = 0 */ +"000001" /* nlink = 1 */ +"000000" /* rdev = 0 */ +"00000000000" /* mtime = 0 */ +"000013" /* Namesize = 11 */ +"00000000000" /* filesize = 0 */ +"TRAILER!!!\0"; /* Name */ + +DEFINE_TEST(test_write_format_cpio_empty) +{ + struct archive *a; + char buff[2048]; + size_t used; + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_cpio(a)); + assertA(0 == archive_write_set_compression_none(a)); + /* 1-byte block size ensures we see only the required bytes. */ + /* We're not testing the padding here. */ + assertA(0 == archive_write_set_bytes_per_block(a, 1)); + assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + + failure("Empty cpio archive should be exactly 87 bytes, was %d.", used); + assert(used == 87); + failure("Empty cpio archive is incorrectly formatted."); + assert(memcmp(buff, ref, 87) == 0); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_newc.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_newc.c new file mode 100644 index 000000000..22029b387 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_newc.c @@ -0,0 +1,212 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_cpio_newc.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); + + +static int +is_hex(const char *p, size_t l) +{ + while (l > 0) { + if (*p >= 0 && *p <= '9') { + /* Ascii digit */ + } else if (*p >= 'a' && *p <= 'f') { + /* lowercase letter a-f */ + } else { + /* Not hex. */ + return (0); + } + --l; + ++p; + } + return (1); +} + +/* + * Detailed verification that cpio 'newc' archives are written with + * the correct format. + */ +DEFINE_TEST(test_write_format_cpio_newc) +{ + struct archive *a; + struct archive_entry *entry; + char *buff, *e; + size_t buffsize = 100000; + size_t used; + + buff = malloc(buffsize); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, 0, archive_write_set_format_cpio_newc(a)); + assertEqualIntA(a, 0, archive_write_set_compression_none(a)); + assertEqualIntA(a, 0, archive_write_open_memory(a, buff, buffsize, &used)); + + /* + * Add various files to it. + * TODO: Extend this to cover more filetypes. + */ + + /* Regular file */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 1, 10); + archive_entry_set_pathname(entry, "file"); + archive_entry_set_mode(entry, S_IFREG | 0664); + archive_entry_set_size(entry, 10); + archive_entry_set_uid(entry, 80); + archive_entry_set_gid(entry, 90); + archive_entry_set_dev(entry, 12); + archive_entry_set_ino(entry, 89); + archive_entry_set_nlink(entry, 1); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, 10, archive_write_data(a, "1234567890", 10)); + + /* Directory */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 2, 20); + archive_entry_set_pathname(entry, "dir"); + archive_entry_set_mode(entry, S_IFDIR | 0775); + archive_entry_set_size(entry, 10); + archive_entry_set_nlink(entry, 2); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, 0, archive_write_data(a, "1234567890", 10)); + + /* Symlink */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 3, 30); + archive_entry_set_pathname(entry, "lnk"); + archive_entry_set_mode(entry, 0664); + archive_entry_set_filetype(entry, AE_IFLNK); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, 83); + archive_entry_set_gid(entry, 93); + archive_entry_set_dev(entry, 13); + archive_entry_set_ino(entry, 88); + archive_entry_set_nlink(entry, 1); + archive_entry_set_symlink(entry,"a"); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + + +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assert(0 == archive_write_finish(a)); +#endif + + /* + * Verify the archive format. + */ + e = buff; + + /* First entry is "file" */ + assert(is_hex(e, 110)); /* Entire header is hex digits. */ + assertEqualMem(e + 0, "070701", 6); /* Magic */ + assertEqualMem(e + 6, "00000059", 8); /* ino */ + assertEqualMem(e + 14, "000081b4", 8); /* Mode */ + assertEqualMem(e + 22, "00000050", 8); /* uid */ + assertEqualMem(e + 30, "0000005a", 8); /* gid */ + assertEqualMem(e + 38, "00000001", 8); /* nlink */ + assertEqualMem(e + 46, "00000001", 8); /* mtime */ + assertEqualMem(e + 54, "0000000a", 8); /* File size */ + assertEqualMem(e + 62, "00000000", 8); /* devmajor */ + assertEqualMem(e + 70, "0000000c", 8); /* devminor */ + assertEqualMem(e + 78, "00000000", 8); /* rdevmajor */ + assertEqualMem(e + 86, "00000000", 8); /* rdevminor */ + assertEqualMem(e + 94, "00000005", 8); /* Name size */ + assertEqualMem(e + 102, "00000000", 8); /* CRC */ + assertEqualMem(e + 110, "file\0\0", 6); /* Name contents */ + assertEqualMem(e + 116, "1234567890", 10); /* File body */ + assertEqualMem(e + 126, "\0\0", 2); /* Pad to multiple of 4 */ + e += 128; /* Must be multiple of four here! */ + + /* Second entry is "dir" */ + assert(is_hex(e, 110)); + assertEqualMem(e + 0, "070701", 6); /* Magic */ + assertEqualMem(e + 6, "00000000", 8); /* ino */ + assertEqualMem(e + 14, "000041fd", 8); /* Mode */ + assertEqualMem(e + 22, "00000000", 8); /* uid */ + assertEqualMem(e + 30, "00000000", 8); /* gid */ + assertEqualMem(e + 38, "00000002", 8); /* nlink */ + assertEqualMem(e + 46, "00000002", 8); /* mtime */ + assertEqualMem(e + 54, "00000000", 8); /* File size */ + assertEqualMem(e + 62, "00000000", 8); /* devmajor */ + assertEqualMem(e + 70, "00000000", 8); /* devminor */ + assertEqualMem(e + 78, "00000000", 8); /* rdevmajor */ + assertEqualMem(e + 86, "00000000", 8); /* rdevminor */ + assertEqualMem(e + 94, "00000004", 8); /* Name size */ + assertEqualMem(e + 102, "00000000", 8); /* CRC */ + assertEqualMem(e + 110, "dir\0", 4); /* name */ + assertEqualMem(e + 114, "\0\0", 2); /* Pad to multiple of 4 */ + e += 116; /* Must be multiple of four here! */ + + /* Third entry is "lnk" */ + assert(is_hex(e, 110)); /* Entire header is hex digits. */ + assertEqualMem(e + 0, "070701", 6); /* Magic */ + assertEqualMem(e + 6, "00000058", 8); /* ino */ + assertEqualMem(e + 14, "0000a1b4", 8); /* Mode */ + assertEqualMem(e + 22, "00000053", 8); /* uid */ + assertEqualMem(e + 30, "0000005d", 8); /* gid */ + assertEqualMem(e + 38, "00000001", 8); /* nlink */ + assertEqualMem(e + 46, "00000003", 8); /* mtime */ + assertEqualMem(e + 54, "00000001", 8); /* File size */ + assertEqualMem(e + 62, "00000000", 8); /* devmajor */ + assertEqualMem(e + 70, "0000000d", 8); /* devminor */ + assertEqualMem(e + 78, "00000000", 8); /* rdevmajor */ + assertEqualMem(e + 86, "00000000", 8); /* rdevminor */ + assertEqualMem(e + 94, "00000004", 8); /* Name size */ + assertEqualMem(e + 102, "00000000", 8); /* CRC */ + assertEqualMem(e + 110, "lnk\0\0\0", 6); /* Name contents */ + assertEqualMem(e + 116, "a\0\0\0", 4); /* File body + pad */ + e += 120; /* Must be multiple of four here! */ + + /* TODO: Verify other types of entries. */ + + /* Last entry is end-of-archive marker. */ + assert(is_hex(e, 76)); + assertEqualMem(e + 0, "070701", 6); /* Magic */ + assertEqualMem(e + 6, "00000000", 8); /* ino */ + assertEqualMem(e + 14, "00000000", 8); /* Mode */ + assertEqualMem(e + 22, "00000000", 8); /* uid */ + assertEqualMem(e + 30, "00000000", 8); /* gid */ + assertEqualMem(e + 38, "00000001", 8); /* nlink */ + assertEqualMem(e + 46, "00000000", 8); /* mtime */ + assertEqualMem(e + 54, "00000000", 8); /* File size */ + assertEqualMem(e + 62, "00000000", 8); /* devmajor */ + assertEqualMem(e + 70, "00000000", 8); /* devminor */ + assertEqualMem(e + 78, "00000000", 8); /* rdevmajor */ + assertEqualMem(e + 86, "00000000", 8); /* rdevminor */ + assertEqualMem(e + 94, "0000000b", 8); /* Name size */ + assertEqualMem(e + 102, "00000000", 8); /* CRC */ + assertEqualMem(e + 110, "TRAILER!!!\0", 11); /* Name */ + assertEqualMem(e + 121, "\0\0\0", 3); /* Pad to multiple of 4 bytes */ + e += 124; /* Must be multiple of four here! */ + + assertEqualInt((int)used, e - buff); + + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_odc.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_odc.c new file mode 100644 index 000000000..46a930398 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_cpio_odc.c @@ -0,0 +1,225 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_cpio_odc.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); + + +static int +is_octal(const char *p, size_t l) +{ + while (l > 0) { + if (*p < '0' || *p > '7') + return (0); + --l; + ++p; + } + return (1); +} + +/* + * Detailed verification that cpio 'odc' archives are written with + * the correct format. + */ +DEFINE_TEST(test_write_format_cpio_odc) +{ + struct archive *a; + struct archive_entry *entry; + char *buff, *e; + size_t buffsize = 100000; + size_t used; + + buff = malloc(buffsize); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, 0, archive_write_set_format_cpio(a)); + assertEqualIntA(a, 0, archive_write_set_compression_none(a)); + assertEqualIntA(a, 0, archive_write_open_memory(a, buff, buffsize, &used)); + + /* + * Add various files to it. + * TODO: Extend this to cover more filetypes. + */ + + /* "file" with 10 bytes of content */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 1, 10); + archive_entry_set_pathname(entry, "file"); + archive_entry_set_mode(entry, S_IFREG | 0664); + archive_entry_set_size(entry, 10); + archive_entry_set_uid(entry, 80); + archive_entry_set_gid(entry, 90); + archive_entry_set_dev(entry, 12); + archive_entry_set_ino(entry, 89); + archive_entry_set_nlink(entry, 2); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, 10, archive_write_data(a, "1234567890", 10)); + + /* Hardlink to "file" with 10 bytes of content */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 1, 10); + archive_entry_set_pathname(entry, "linkfile"); + archive_entry_set_mode(entry, S_IFREG | 0664); + archive_entry_set_size(entry, 10); + archive_entry_set_uid(entry, 80); + archive_entry_set_gid(entry, 90); + archive_entry_set_dev(entry, 12); + archive_entry_set_ino(entry, 89); + archive_entry_set_nlink(entry, 2); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, 10, archive_write_data(a, "1234567890", 10)); + + /* "dir" */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 2, 20); + archive_entry_set_pathname(entry, "dir"); + archive_entry_set_mode(entry, S_IFDIR | 0775); + archive_entry_set_size(entry, 10); + archive_entry_set_nlink(entry, 2); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + /* Write of data to dir should fail == zero bytes get written. */ + assertEqualIntA(a, 0, archive_write_data(a, "1234567890", 10)); + + /* "symlink" pointing to "file" */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 3, 30); + archive_entry_set_pathname(entry, "symlink"); + archive_entry_set_mode(entry, 0664); + archive_entry_set_filetype(entry, AE_IFLNK); + archive_entry_set_symlink(entry,"file"); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, 88); + archive_entry_set_gid(entry, 98); + archive_entry_set_dev(entry, 12); + archive_entry_set_ino(entry, 90); + archive_entry_set_nlink(entry, 1); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + /* Write of data to symlink should fail == zero bytes get written. */ + assertEqualIntA(a, 0, archive_write_data(a, "1234567890", 10)); + +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assert(0 == archive_write_finish(a)); +#endif + + /* + * Verify the archive format. + */ + e = buff; + + /* "file" */ + assert(is_octal(e, 76)); /* Entire header is octal digits. */ + assertEqualMem(e + 0, "070707", 6); /* Magic */ + assertEqualMem(e + 6, "000014", 6); /* dev */ + assertEqualMem(e + 12, "000131", 6); /* ino */ + assertEqualMem(e + 18, "100664", 6); /* Mode */ + assertEqualMem(e + 24, "000120", 6); /* uid */ + assertEqualMem(e + 30, "000132", 6); /* gid */ + assertEqualMem(e + 36, "000002", 6); /* nlink */ + assertEqualMem(e + 42, "000000", 6); /* rdev */ + assertEqualMem(e + 48, "00000000001", 11); /* mtime */ + assertEqualMem(e + 59, "000005", 6); /* Name size */ + assertEqualMem(e + 65, "00000000012", 11); /* File size */ + assertEqualMem(e + 76, "file\0", 5); /* Name contents */ + assertEqualMem(e + 81, "1234567890", 10); /* File contents */ + e += 91; + + /* hardlink to "file" */ + assert(is_octal(e, 76)); /* Entire header is octal digits. */ + assertEqualMem(e + 0, "070707", 6); /* Magic */ + assertEqualMem(e + 6, "000014", 6); /* dev */ + assertEqualMem(e + 12, "000131", 6); /* ino */ + assertEqualMem(e + 18, "100664", 6); /* Mode */ + assertEqualMem(e + 24, "000120", 6); /* uid */ + assertEqualMem(e + 30, "000132", 6); /* gid */ + assertEqualMem(e + 36, "000002", 6); /* nlink */ + assertEqualMem(e + 42, "000000", 6); /* rdev */ + assertEqualMem(e + 48, "00000000001", 11); /* mtime */ + assertEqualMem(e + 59, "000011", 6); /* Name size */ + assertEqualMem(e + 65, "00000000012", 11); /* File size */ + assertEqualMem(e + 76, "linkfile\0", 9); /* Name contents */ + assertEqualMem(e + 85, "1234567890", 10); /* File contents */ + e += 95; + + /* "dir" */ + assert(is_octal(e, 76)); + assertEqualMem(e + 0, "070707", 6); /* Magic */ + assertEqualMem(e + 6, "000000", 6); /* dev */ + assertEqualMem(e + 12, "000000", 6); /* ino */ + assertEqualMem(e + 18, "040775", 6); /* Mode */ + assertEqualMem(e + 24, "000000", 6); /* uid */ + assertEqualMem(e + 30, "000000", 6); /* gid */ + assertEqualMem(e + 36, "000002", 6); /* Nlink */ + assertEqualMem(e + 42, "000000", 6); /* rdev */ + assertEqualMem(e + 48, "00000000002", 11); /* mtime */ + assertEqualMem(e + 59, "000004", 6); /* Name size */ + assertEqualMem(e + 65, "00000000000", 11); /* File size */ + assertEqualMem(e + 76, "dir\0", 4); /* name */ + e += 80; + + /* "symlink" pointing to "file" */ + assert(is_octal(e, 76)); /* Entire header is octal digits. */ + assertEqualMem(e + 0, "070707", 6); /* Magic */ + assertEqualMem(e + 6, "000014", 6); /* dev */ + assertEqualMem(e + 12, "000132", 6); /* ino */ + assertEqualMem(e + 18, "120664", 6); /* Mode */ + assertEqualMem(e + 24, "000130", 6); /* uid */ + assertEqualMem(e + 30, "000142", 6); /* gid */ + assertEqualMem(e + 36, "000001", 6); /* nlink */ + assertEqualMem(e + 42, "000000", 6); /* rdev */ + assertEqualMem(e + 48, "00000000003", 11); /* mtime */ + assertEqualMem(e + 59, "000010", 6); /* Name size */ + assertEqualMem(e + 65, "00000000004", 11); /* File size */ + assertEqualMem(e + 76, "symlink\0", 8); /* Name contents */ + assertEqualMem(e + 84, "file", 4); /* File contents == link target */ + e += 88; + + /* TODO: Verify other types of entries. */ + + /* Last entry is end-of-archive marker. */ + assert(is_octal(e, 76)); + assertEqualMem(e + 0, "070707", 6); /* Magic */ + assertEqualMem(e + 6, "000000", 6); /* dev */ + assertEqualMem(e + 12, "000000", 6); /* ino */ + assertEqualMem(e + 18, "000000", 6); /* Mode */ + assertEqualMem(e + 24, "000000", 6); /* uid */ + assertEqualMem(e + 30, "000000", 6); /* gid */ + assertEqualMem(e + 36, "000001", 6); /* Nlink */ + assertEqualMem(e + 42, "000000", 6); /* rdev */ + assertEqualMem(e + 48, "00000000000", 11); /* mtime */ + assertEqualMem(e + 59, "000013", 6); /* Name size */ + assertEqualMem(e + 65, "00000000000", 11); /* File size */ + assertEqualMem(e + 76, "TRAILER!!!\0", 11); /* Name */ + e += 87; + + assertEqualInt((int)used, e - buff); + + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_mtree.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_mtree.c new file mode 100644 index 000000000..483a5f216 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_mtree.c @@ -0,0 +1,154 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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" + +static char buff[4096]; +static struct { + const char *path; + mode_t mode; + time_t mtime; + uid_t uid; + gid_t gid; +} entries[] = { + { "./Makefile", S_IFREG | 0644, 1233041050, 1001, 1001 }, + { "./NEWS", S_IFREG | 0644, 1231975636, 1001, 1001 }, + { "./PROJECTS", S_IFREG | 0644, 1231975636, 1001, 1001 }, + { "./README", S_IFREG | 0644, 1231975636, 1001, 1001 }, + { "./COPYING", S_IFREG | 0644, 1231975636, 1001, 1001 }, + { "./subdir", S_IFDIR | 0755, 1233504586, 1001, 1001 }, + { "./subdir/README", S_IFREG | 0664, 1231975636, 1002, 1001 }, + { "./subdir/config", S_IFREG | 0664, 1232266273, 1003, 1003 }, + { "./subdir2", S_IFDIR | 0755, 1233504586, 1001, 1001 }, + { "./subdir3", S_IFDIR | 0755, 1233504586, 1001, 1001 }, + { "./subdir3/mtree", S_IFREG | 0664, 1232266273, 1003, 1003 }, + { NULL, 0, 0, 0, 0 } +}; + +static void +test_write_format_mtree_sub(int use_set, int dironly) +{ + struct archive_entry *ae; + struct archive* a; + size_t used; + int i; + + /* Create a mtree format archive. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_mtree(a)); + if (use_set) + assertA(0 == archive_write_set_options(a, "use-set")); + if (dironly) + assertA(0 == archive_write_set_options(a, "dironly")); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff)-1, &used)); + + /* Write entries */ + for (i = 0; entries[i].path != NULL; i++) { + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, entries[i].mtime, 0); + assert(entries[i].mtime == archive_entry_mtime(ae)); + archive_entry_set_mode(ae, entries[i].mode); + assert(entries[i].mode == archive_entry_mode(ae)); + archive_entry_set_uid(ae, entries[i].uid); + assert(entries[i].uid == archive_entry_uid(ae)); + archive_entry_set_gid(ae, entries[i].gid); + assert(entries[i].gid == archive_entry_gid(ae)); + archive_entry_copy_pathname(ae, entries[i].path); + if ((entries[i].mode & AE_IFMT) != S_IFDIR) + archive_entry_set_size(ae, 8); + assertA(0 == archive_write_header(a, ae)); + if ((entries[i].mode & AE_IFMT) != S_IFDIR) + assertA(8 == archive_write_data(a, "Hello012", 15)); + archive_entry_free(ae); + } + archive_write_close(a); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertEqualInt(0, archive_write_finish(a)); +#endif + if (use_set) { + const char *p; + + buff[used] = '\0'; + assert(NULL != (p = strstr(buff, "\n/set "))); + if (p != NULL) { + char *r; + const char *o; + p++; + r = strchr(p, '\n'); + if (r != NULL) + *r = '\0'; + if (dironly) + o = "/set type=dir uid=1001 gid=1001 mode=755"; + else + o = "/set type=file uid=1001 gid=1001 mode=644"; + assertEqualString(o, p); + if (r != NULL) + *r = '\n'; + } + } + + /* + * Read the data and check it. + */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + + /* Read entries */ + for (i = 0; entries[i].path != NULL; i++) { + if (dironly && (entries[i].mode & AE_IFMT) != S_IFDIR) + continue; + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(entries[i].mtime, archive_entry_mtime(ae)); + assertEqualInt(entries[i].mode, archive_entry_mode(ae)); + assertEqualInt(entries[i].uid, archive_entry_uid(ae)); + assertEqualInt(entries[i].gid, archive_entry_gid(ae)); + assertEqualString(entries[i].path, archive_entry_pathname(ae)); + if ((entries[i].mode & AE_IFMT) != S_IFDIR) + assertEqualInt(8, archive_entry_size(ae)); + } + assertEqualIntA(a, 0, archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assertEqualInt(0, archive_read_finish(a)); +#endif +} + +DEFINE_TEST(test_write_format_mtree) +{ + /* Default setting */ + test_write_format_mtree_sub(0, 0); + /* Directory only */ + test_write_format_mtree_sub(0, 1); + /* Use /set keyword */ + test_write_format_mtree_sub(1, 0); + /* Use /set keyword with directory only */ + test_write_format_mtree_sub(1, 1); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_pax.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_pax.c new file mode 100644 index 000000000..c12bc944c --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_pax.c @@ -0,0 +1,146 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +char buff2[64]; + +DEFINE_TEST(test_write_format_pax) +{ + size_t buffsize = 1000000; + char *buff; + struct archive_entry *ae; + struct archive *a; + size_t used; + + buff = malloc(buffsize); /* million bytes of work area */ + assert(buff != NULL); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_pax(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_open_memory(a, buff, buffsize, &used)); + + /* + * "file" has a bunch of attributes and 8 bytes of data. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_atime(ae, 2, 20); + archive_entry_set_birthtime(ae, 3, 30); + archive_entry_set_ctime(ae, 4, 40); + archive_entry_set_mtime(ae, 5, 50); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 8); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9)); + + /* + * "file2" is similar but has birthtime later than mtime. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_atime(ae, 2, 20); + archive_entry_set_birthtime(ae, 8, 80); + archive_entry_set_ctime(ae, 4, 40); + archive_entry_set_mtime(ae, 5, 50); + archive_entry_copy_pathname(ae, "file2"); + archive_entry_set_mode(ae, S_IFREG | 0755); + archive_entry_set_size(ae, 8); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9)); + + /* + * XXX TODO XXX Archive directory, other file types. + * Archive extended attributes, ACLs, other metadata. + * Verify they get read back correctly. + */ + + /* Close out the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_finish(a)); + + /* + * + * Now, read the data back. + * + */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, 0, archive_read_support_format_all(a)); + assertEqualIntA(a, 0, archive_read_support_compression_all(a)); + assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used)); + + /* + * Read "file" + */ + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + assertEqualInt(2, archive_entry_atime(ae)); + assertEqualInt(20, archive_entry_atime_nsec(ae)); + assertEqualInt(3, archive_entry_birthtime(ae)); + assertEqualInt(30, archive_entry_birthtime_nsec(ae)); + assertEqualInt(4, archive_entry_ctime(ae)); + assertEqualInt(40, archive_entry_ctime_nsec(ae)); + assertEqualInt(5, archive_entry_mtime(ae)); + assertEqualInt(50, archive_entry_mtime_nsec(ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff2, 10)); + assertEqualMem(buff2, "12345678", 8); + + /* + * Read "file2" + */ + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + assert(archive_entry_atime_is_set(ae)); + assertEqualInt(2, archive_entry_atime(ae)); + assertEqualInt(20, archive_entry_atime_nsec(ae)); + /* Birthtime > mtime above, so it doesn't get stored at all. */ + assert(!archive_entry_birthtime_is_set(ae)); + assertEqualInt(0, archive_entry_birthtime(ae)); + assertEqualInt(0, archive_entry_birthtime_nsec(ae)); + assert(archive_entry_ctime_is_set(ae)); + assertEqualInt(4, archive_entry_ctime(ae)); + assertEqualInt(40, archive_entry_ctime_nsec(ae)); + assert(archive_entry_mtime_is_set(ae)); + assertEqualInt(5, archive_entry_mtime(ae)); + assertEqualInt(50, archive_entry_mtime_nsec(ae)); + assertEqualString("file2", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff2, 10)); + assertEqualMem(buff2, "12345678", 8); + + /* + * Verify the end of the archive. + */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_finish(a)); + + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_shar_empty.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_shar_empty.c new file mode 100644 index 000000000..a7996d5cf --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_shar_empty.c @@ -0,0 +1,58 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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. + */ + +DEFINE_TEST(test_write_format_shar_empty) +{ + struct archive *a; + char buff[2048]; + size_t used; + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_shar(a)); + assertA(0 == archive_write_set_compression_none(a)); + /* 1-byte block size ensures we see only the required bytes. */ + /* We're not testing the padding here. */ + assertA(0 == archive_write_set_bytes_per_block(a, 1)); + assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + + failure("Empty shar archive should be exactly 0 bytes, was %d.", used); + assert(used == 0); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_tar.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_tar.c new file mode 100644 index 000000000..60870dc3d --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_tar.c @@ -0,0 +1,114 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_tar.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); + +char buff[1000000]; +char buff2[64]; + +DEFINE_TEST(test_write_format_tar) +{ + struct archive_entry *ae; + struct archive *a; + char *p; + size_t used; + size_t blocksize; + + /* Repeat the following for a variety of odd blocksizes. */ + for (blocksize = 1; blocksize < 100000; blocksize += blocksize + 3) { + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_set_bytes_per_block(a, (int)blocksize)); + assertA(0 == archive_write_set_bytes_in_last_block(a, (int)blocksize)); + assertA(blocksize == (size_t)archive_write_get_bytes_in_last_block(a)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + assertA(blocksize == (size_t)archive_write_get_bytes_in_last_block(a)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 10); + assert(1 == archive_entry_mtime(ae)); +#if !defined(__INTERIX) + assert(10 == archive_entry_mtime_nsec(ae)); +#endif + p = strdup("file"); + archive_entry_copy_pathname(ae, p); + strcpy(p, "XXXX"); + free(p); + assertEqualString("file", archive_entry_pathname(ae)); + archive_entry_set_mode(ae, S_IFREG | 0755); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + archive_entry_set_size(ae, 8); + + assertA(0 == archive_write_header(a, ae)); + archive_entry_free(ae); + assertA(8 == archive_write_data(a, "12345678", 9)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + /* This calculation gives "the smallest multiple of + * the block size that is at least 2048 bytes". */ + assert(((2048 - 1)/blocksize+1)*blocksize == used); + + /* + * Now, read the data back. + */ + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_support_compression_all(a)); + assertA(0 == archive_read_open_memory(a, buff, used)); + + assertA(0 == archive_read_next_header(a, &ae)); + + assert(1 == archive_entry_mtime(ae)); + /* Not the same as above: ustar doesn't store hi-res times. */ + assert(0 == archive_entry_mtime_nsec(ae)); + assert(0 == archive_entry_atime(ae)); + assert(0 == archive_entry_ctime(ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assert(8 == archive_entry_size(ae)); + assertA(8 == archive_read_data(a, buff2, 10)); + assert(0 == memcmp(buff2, "12345678", 8)); + + /* Verify the end of the archive. */ + assert(1 == archive_read_next_header(a, &ae)); + assert(0 == archive_read_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_read_finish(a); +#else + assert(0 == archive_read_finish(a)); +#endif + } +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_tar_empty.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_tar_empty.c new file mode 100644 index 000000000..3d5d09ddb --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_tar_empty.c @@ -0,0 +1,92 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_tar_empty.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); + +/* + * Check that an "empty" tar archive is correctly created. + */ + +DEFINE_TEST(test_write_format_tar_empty) +{ + struct archive *a; + char buff[2048]; + size_t used; + unsigned int i; + + /* USTAR format: Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_set_bytes_per_block(a, 512)); + assertA(0 == archive_write_set_bytes_in_last_block(a, 512)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + +#if ARCHIVE_VERSION_NUMBER < 1009000 + /* Earlier versions wrote 0-length files for empty tar archives. */ + skipping("empty tar archive size"); +#else + assert(used == 1024); +#endif + for (i = 0; i < used; i++) { + failure("Empty tar archive should be all nulls."); + assert(buff[i] == 0); + } + + /* PAX format: Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_pax(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_set_bytes_per_block(a, 512)); + assertA(0 == archive_write_set_bytes_in_last_block(a, 512)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* Close out the archive. */ + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assertA(0 == archive_write_finish(a)); +#endif + +#if ARCHIVE_VERSION_NUMBER < 1009000 + /* Earlier versions wrote 0-length files for empty tar archives. */ + skipping("empty tar archive size"); +#else + assertEqualInt((int)used, 1024); +#endif + for (i = 0; i < used; i++) { + failure("Empty tar archive should be all nulls."); + assert(buff[i] == 0); + } +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_tar_ustar.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_tar_ustar.c new file mode 100644 index 000000000..b8ca998ba --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_tar_ustar.c @@ -0,0 +1,347 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_tar_ustar.c,v 1.2 2008/08/11 01:19:36 kientzle Exp $"); + +static int +is_null(const char *p, size_t l) +{ + while (l > 0) { + if (*p != '\0') + return (0); + --l; + ++p; + } + return (1); +} + +/* Verify the contents, then erase them to NUL bytes. */ +/* Tar requires all "unused" bytes be set to NUL; this allows us + * to easily verify that by invoking is_null() over the entire header + * after verifying each field. */ +#define myAssertEqualMem(a,b,s) assertEqualMem(a, b, s); memset(a, 0, s) + +/* + * Detailed verification that 'ustar' archives are written with + * the correct format. + */ +DEFINE_TEST(test_write_format_tar_ustar) +{ + struct archive *a; + struct archive_entry *entry; + char *buff, *e; + size_t buffsize = 100000; + size_t used; + int i; + char f99[100]; + char f100[101]; + char f256[257]; + + for (i = 0; i < 99; ++i) + f99[i] = 'a' + i % 26; + f99[99] = '\0'; + + for (i = 0; i < 100; ++i) + f100[i] = 'A' + i % 26; + f100[100] = '\0'; + + for (i = 0; i < 256; ++i) + f256[i] = 'A' + i % 26; + f256[155] = '/'; + f256[256] = '\0'; + + buff = malloc(buffsize); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, 0, archive_write_set_format_ustar(a)); + assertEqualIntA(a, 0, archive_write_set_compression_none(a)); + assertEqualIntA(a, 0, archive_write_open_memory(a, buff, buffsize, &used)); + + /* + * Add various files to it. + * TODO: Extend this to cover more filetypes. + */ + + /* "file" with 10 bytes of content */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 1, 10); + archive_entry_set_pathname(entry, "file"); + archive_entry_set_mode(entry, S_IFREG | 0664); + archive_entry_set_size(entry, 10); + archive_entry_set_uid(entry, 80); + archive_entry_set_gid(entry, 90); + archive_entry_set_dev(entry, 12); + archive_entry_set_ino(entry, 89); + archive_entry_set_nlink(entry, 2); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, 10, archive_write_data(a, "1234567890", 10)); + + /* Hardlink to "file" with 10 bytes of content */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 1, 10); + archive_entry_set_pathname(entry, "linkfile"); + archive_entry_set_mode(entry, S_IFREG | 0664); + /* TODO: Put this back and fix the bug. */ + /* archive_entry_set_size(entry, 10); */ + archive_entry_set_uid(entry, 80); + archive_entry_set_gid(entry, 90); + archive_entry_set_dev(entry, 12); + archive_entry_set_ino(entry, 89); + archive_entry_set_nlink(entry, 2); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + /* Write of data to dir should fail == zero bytes get written. */ + assertEqualIntA(a, 0, archive_write_data(a, "1234567890", 10)); + + /* "dir" */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 2, 20); + archive_entry_set_pathname(entry, "dir"); + archive_entry_set_mode(entry, S_IFDIR | 0775); + archive_entry_set_size(entry, 10); + archive_entry_set_nlink(entry, 2); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + /* Write of data to dir should fail == zero bytes get written. */ + assertEqualIntA(a, 0, archive_write_data(a, "1234567890", 10)); + + /* "symlink" pointing to "file" */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 3, 30); + archive_entry_set_pathname(entry, "symlink"); + archive_entry_set_mode(entry, 0664); + archive_entry_set_filetype(entry, AE_IFLNK); + archive_entry_set_symlink(entry,"file"); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, 88); + archive_entry_set_gid(entry, 98); + archive_entry_set_dev(entry, 12); + archive_entry_set_ino(entry, 90); + archive_entry_set_nlink(entry, 1); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + /* Write of data to symlink should fail == zero bytes get written. */ + assertEqualIntA(a, 0, archive_write_data(a, "1234567890", 10)); + + /* file with 99-char filename. */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 1, 10); + archive_entry_set_pathname(entry, f99); + archive_entry_set_mode(entry, S_IFREG | 0664); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, 82); + archive_entry_set_gid(entry, 93); + archive_entry_set_dev(entry, 102); + archive_entry_set_ino(entry, 7); + archive_entry_set_nlink(entry, 1); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + + /* file with 100-char filename. */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 1, 10); + archive_entry_set_pathname(entry, f100); + archive_entry_set_mode(entry, S_IFREG | 0664); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, 82); + archive_entry_set_gid(entry, 93); + archive_entry_set_dev(entry, 102); + archive_entry_set_ino(entry, 7); + archive_entry_set_nlink(entry, 1); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + + /* file with 256-char filename. */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_mtime(entry, 1, 10); + archive_entry_set_pathname(entry, f256); + archive_entry_set_mode(entry, S_IFREG | 0664); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, 82); + archive_entry_set_gid(entry, 93); + archive_entry_set_dev(entry, 102); + archive_entry_set_ino(entry, 7); + archive_entry_set_nlink(entry, 1); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assert(0 == archive_write_finish(a)); +#endif + + /* + * Verify the archive format. + */ + e = buff; + + /* "file" */ + myAssertEqualMem(e + 0, "file", 5); /* Filename */ + myAssertEqualMem(e + 100, "000664 ", 8); /* mode */ + myAssertEqualMem(e + 108, "000120 ", 8); /* uid */ + myAssertEqualMem(e + 116, "000132 ", 8); /* gid */ + myAssertEqualMem(e + 124, "00000000012 ", 12); /* size */ + myAssertEqualMem(e + 136, "00000000001 ", 12); /* mtime */ + myAssertEqualMem(e + 148, "010034\0 ", 8); /* checksum */ + myAssertEqualMem(e + 156, "0", 1); /* linkflag */ + myAssertEqualMem(e + 157, "", 1); /* linkname */ + myAssertEqualMem(e + 257, "ustar\000000", 8); /* signature/version */ + myAssertEqualMem(e + 265, "", 1); /* uname */ + myAssertEqualMem(e + 297, "", 1); /* gname */ + myAssertEqualMem(e + 329, "000000 ", 8); /* devmajor */ + myAssertEqualMem(e + 337, "000000 ", 8); /* devminor */ + myAssertEqualMem(e + 345, "", 1); /* prefix */ + assert(is_null(e + 0, 512)); + myAssertEqualMem(e + 512, "1234567890", 10); + assert(is_null(e + 512, 512)); + e += 1024; + + /* hardlink to "file" */ + myAssertEqualMem(e + 0, "linkfile", 9); /* Filename */ + myAssertEqualMem(e + 100, "000664 ", 8); /* mode */ + myAssertEqualMem(e + 108, "000120 ", 8); /* uid */ + myAssertEqualMem(e + 116, "000132 ", 8); /* gid */ + myAssertEqualMem(e + 124, "00000000000 ", 12); /* size */ + myAssertEqualMem(e + 136, "00000000001 ", 12); /* mtime */ + myAssertEqualMem(e + 148, "010707\0 ", 8); /* checksum */ + myAssertEqualMem(e + 156, "0", 1); /* linkflag */ + myAssertEqualMem(e + 157, "", 1); /* linkname */ + myAssertEqualMem(e + 257, "ustar\000000", 8); /* signature/version */ + myAssertEqualMem(e + 265, "", 1); /* uname */ + myAssertEqualMem(e + 297, "", 1); /* gname */ + myAssertEqualMem(e + 329, "000000 ", 8); /* devmajor */ + myAssertEqualMem(e + 337, "000000 ", 8); /* devminor */ + myAssertEqualMem(e + 345, "", 1); /* prefix */ + assert(is_null(e + 0, 512)); + e += 512; + + /* "dir" */ + myAssertEqualMem(e + 0, "dir/", 4); /* Filename */ + myAssertEqualMem(e + 100, "000775 ", 8); /* mode */ + myAssertEqualMem(e + 108, "000000 ", 8); /* uid */ + myAssertEqualMem(e + 116, "000000 ", 8); /* gid */ + myAssertEqualMem(e + 124, "00000000000 ", 12); /* size */ + myAssertEqualMem(e + 136, "00000000002 ", 12); /* mtime */ + myAssertEqualMem(e + 148, "007747\0 ", 8); /* checksum */ + myAssertEqualMem(e + 156, "5", 1); /* typeflag */ + myAssertEqualMem(e + 157, "", 1); /* linkname */ + myAssertEqualMem(e + 257, "ustar\000000", 8); /* signature/version */ + myAssertEqualMem(e + 265, "", 1); /* uname */ + myAssertEqualMem(e + 297, "", 1); /* gname */ + myAssertEqualMem(e + 329, "000000 ", 8); /* devmajor */ + myAssertEqualMem(e + 337, "000000 ", 8); /* devminor */ + myAssertEqualMem(e + 345, "", 1); /* prefix */ + assert(is_null(e + 0, 512)); + e += 512; + + /* "symlink" pointing to "file" */ + myAssertEqualMem(e + 0, "symlink", 8); /* Filename */ + myAssertEqualMem(e + 100, "000664 ", 8); /* mode */ + myAssertEqualMem(e + 108, "000130 ", 8); /* uid */ + myAssertEqualMem(e + 116, "000142 ", 8); /* gid */ + myAssertEqualMem(e + 124, "00000000000 ", 12); /* size */ + myAssertEqualMem(e + 136, "00000000003 ", 12); /* mtime */ + myAssertEqualMem(e + 148, "011446\0 ", 8); /* checksum */ + myAssertEqualMem(e + 156, "2", 1); /* linkflag */ + myAssertEqualMem(e + 157, "file", 5); /* linkname */ + myAssertEqualMem(e + 257, "ustar\000000", 8); /* signature/version */ + myAssertEqualMem(e + 265, "", 1); /* uname */ + myAssertEqualMem(e + 297, "", 1); /* gname */ + myAssertEqualMem(e + 329, "000000 ", 8); /* devmajor */ + myAssertEqualMem(e + 337, "000000 ", 8); /* devminor */ + myAssertEqualMem(e + 345, "", 1); /* prefix */ + assert(is_null(e + 0, 512)); + e += 512; + + /* File with 99-char filename */ + myAssertEqualMem(e + 0, f99, 100); /* Filename */ + myAssertEqualMem(e + 100, "000664 ", 8); /* mode */ + myAssertEqualMem(e + 108, "000122 ", 8); /* uid */ + myAssertEqualMem(e + 116, "000135 ", 8); /* gid */ + myAssertEqualMem(e + 124, "00000000000 ", 12); /* size */ + myAssertEqualMem(e + 136, "00000000001 ", 12); /* mtime */ + myAssertEqualMem(e + 148, "034242\0 ", 8); /* checksum */ + myAssertEqualMem(e + 156, "0", 1); /* linkflag */ + myAssertEqualMem(e + 157, "", 1); /* linkname */ + myAssertEqualMem(e + 257, "ustar\000000", 8); /* signature/version */ + myAssertEqualMem(e + 265, "", 1); /* uname */ + myAssertEqualMem(e + 297, "", 1); /* gname */ + myAssertEqualMem(e + 329, "000000 ", 8); /* devmajor */ + myAssertEqualMem(e + 337, "000000 ", 8); /* devminor */ + myAssertEqualMem(e + 345, "", 1); /* prefix */ + assert(is_null(e + 0, 512)); + e += 512; + + /* File with 100-char filename */ + myAssertEqualMem(e + 0, f100, 100); /* Filename */ + myAssertEqualMem(e + 100, "000664 ", 8); /* mode */ + myAssertEqualMem(e + 108, "000122 ", 8); /* uid */ + myAssertEqualMem(e + 116, "000135 ", 8); /* gid */ + myAssertEqualMem(e + 124, "00000000000 ", 12); /* size */ + myAssertEqualMem(e + 136, "00000000001 ", 12); /* mtime */ + myAssertEqualMem(e + 148, "026230\0 ", 8); /* checksum */ + myAssertEqualMem(e + 156, "0", 1); /* linkflag */ + myAssertEqualMem(e + 157, "", 1); /* linkname */ + myAssertEqualMem(e + 257, "ustar\000000", 8); /* signature/version */ + myAssertEqualMem(e + 265, "", 1); /* uname */ + myAssertEqualMem(e + 297, "", 1); /* gname */ + myAssertEqualMem(e + 329, "000000 ", 8); /* devmajor */ + myAssertEqualMem(e + 337, "000000 ", 8); /* devminor */ + myAssertEqualMem(e + 345, "", 1); /* prefix */ + assert(is_null(e + 0, 512)); + e += 512; + + /* File with 256-char filename */ + myAssertEqualMem(e + 0, f256 + 156, 100); /* Filename */ + myAssertEqualMem(e + 100, "000664 ", 8); /* mode */ + myAssertEqualMem(e + 108, "000122 ", 8); /* uid */ + myAssertEqualMem(e + 116, "000135 ", 8); /* gid */ + myAssertEqualMem(e + 124, "00000000000 ", 12); /* size */ + myAssertEqualMem(e + 136, "00000000001 ", 12); /* mtime */ + myAssertEqualMem(e + 148, "055570\0 ", 8); /* checksum */ + myAssertEqualMem(e + 156, "0", 1); /* linkflag */ + myAssertEqualMem(e + 157, "", 1); /* linkname */ + myAssertEqualMem(e + 257, "ustar\000000", 8); /* signature/version */ + myAssertEqualMem(e + 265, "", 1); /* uname */ + myAssertEqualMem(e + 297, "", 1); /* gname */ + myAssertEqualMem(e + 329, "000000 ", 8); /* devmajor */ + myAssertEqualMem(e + 337, "000000 ", 8); /* devminor */ + myAssertEqualMem(e + 345, f256, 155); /* prefix */ + assert(is_null(e + 0, 512)); + e += 512; + + /* TODO: Verify other types of entries. */ + + /* Last entry is end-of-archive marker. */ + assert(is_null(e, 1024)); + e += 1024; + + assertEqualInt((int)used, e - buff); + + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_zip.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_zip.c new file mode 100644 index 000000000..0ab665978 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_zip.c @@ -0,0 +1,180 @@ +/*- + * Copyright (c) 2003-2008 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. + */ + +/* + * Development supported by Google Summer of Code 2008. + */ + +/* TODO: reader does not yet restore permissions. */ + +#include "test.h" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_write_format_zip) +{ + char filedata[64]; + struct archive_entry *ae; + struct archive *a; + size_t used; + size_t buffsize = 1000000; + char *buff; + const char *compression_type; + + 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)); +#ifdef HAVE_ZLIB_H + compression_type = "zip:compression=deflate"; +#else + compression_type = "zip:compression=store"; +#endif + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_format_options(a, compression_type)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_none(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, buffsize, &used)); + + /* + * Write a file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 10); + assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualInt(10, archive_entry_mtime_nsec(ae)); + archive_entry_copy_pathname(ae, "file"); + assertEqualString("file", archive_entry_pathname(ae)); + archive_entry_set_mode(ae, S_IFREG | 0755); + assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); + archive_entry_set_size(ae, 8); + + assertEqualInt(0, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualInt(8, archive_write_data(a, "12345678", 9)); + assertEqualInt(0, archive_write_data(a, "1", 1)); + + /* + * Write another file to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 1, 10); + assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualInt(10, archive_entry_mtime_nsec(ae)); + archive_entry_copy_pathname(ae, "file2"); + assertEqualString("file2", archive_entry_pathname(ae)); + archive_entry_set_mode(ae, S_IFREG | 0755); + assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); + archive_entry_set_size(ae, 4); + + assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualInt(4, archive_write_data(a, "1234", 5)); + + /* + * Write a directory to it. + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_mtime(ae, 11, 110); + archive_entry_copy_pathname(ae, "dir"); + archive_entry_set_mode(ae, S_IFDIR | 0755); + archive_entry_set_size(ae, 512); + + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + failure("size should be zero so that applications know not to write"); + assertEqualInt(0, archive_entry_size(ae)); + archive_entry_free(ae); + assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9)); + + /* Close out the archive. */ + assertEqualInt(ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + + /* + * Now, read the data back. + */ + ae = NULL; + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used)); + + /* + * Read and verify first file. + */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_entry_mtime(ae)); + /* Zip doesn't store high-resolution mtime. */ + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(0, archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_ctime(ae)); + assertEqualString("file", archive_entry_pathname(ae)); + //assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualIntA(a, 8, + archive_read_data(a, filedata, sizeof(filedata))); + assertEqualMem(filedata, "12345678", 8); + + + /* + * Read the second file back. + */ + if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))){ + free(buff); + return; + } + assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(0, archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_ctime(ae)); + assertEqualString("file2", archive_entry_pathname(ae)); + //assert((S_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualIntA(a, 4, + archive_read_data(a, filedata, sizeof(filedata))); + assertEqualMem(filedata, "1234", 4); + + /* + * Read the dir entry back. + */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(11, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualInt(0, archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_ctime(ae)); + assertEqualString("dir/", archive_entry_pathname(ae)); + //assertEqualInt((S_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualIntA(a, 0, archive_read_data(a, filedata, 10)); + + /* Verify the end of the archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + free(buff); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_zip_empty.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_zip_empty.c new file mode 100644 index 000000000..218725c08 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_zip_empty.c @@ -0,0 +1,56 @@ +/*- + * 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. + */ + +/* + * Development supported by Google Summer of Code 2008. + */ + +#include "test.h" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_write_format_zip_empty) +{ + struct archive *a; + char buff[256]; + size_t used; + + /* Zip format: Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_zip(a)); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_set_bytes_per_block(a, 1)); + assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* Close out the archive without writing anything. */ + assertA(0 == archive_write_close(a)); + assertA(0 == archive_write_finish(a)); + + /* Verify the correct format for an empy Zip archive. */ + assertEqualInt(used, 22); + assertEqualMem(buff, + "PK\005\006\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", + 22); +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_format_zip_no_compression.c b/Utilities/cmlibarchive/libarchive/test/test_write_format_zip_no_compression.c new file mode 100644 index 000000000..f3da66d0d --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_format_zip_no_compression.c @@ -0,0 +1,304 @@ +/*- + * 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. + */ + +/* + * Development supported by Google Summer of Code 2008. + */ + +#include "test.h" +__FBSDID("$FreeBSD$"); + +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 int i2(const char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } +static int i4(const char *p) { return (i2(p) | (i2(p + 2) << 16)); } + +DEFINE_TEST(test_write_format_zip_no_compression) +{ + /* Buffer data */ + struct archive *a; + struct archive_entry *entry; + char buff[100000]; + const char *buffend; + /* p is the pointer to walk over the central directory, + * q walks over the local headers, the data and the data descriptors. */ + const char *p, *q; + size_t used; + + /* File data */ + char file_name[] = "file"; + char file_data1[] = {'1', '2', '3', '4', '5'}; + char file_data2[] = {'6', '7', '8', '9', '0'}; + int file_perm = 00644; + short file_uid = 10; + short file_gid = 20; + + /* Folder data */ + char folder_name[] = "folder/"; + int folder_perm = 00755; + short folder_uid = 30; + short folder_gid = 40; + + /* Time data */ + time_t t = time(NULL); + struct tm *tm = localtime(&t); + + /* Misc variables */ + unsigned long crc; + + /* Create new ZIP archive in memory without padding. */ + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_zip(a)); + assertA(0 == archive_write_set_format_options(a, "zip:compression=store")); + assertA(0 == archive_write_set_compression_none(a)); + assertA(0 == archive_write_set_bytes_per_block(a, 1)); + assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); + assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* Write entries. */ + + /* Regular file */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, file_name); + archive_entry_set_mode(entry, S_IFREG | 0644); + archive_entry_set_size(entry, sizeof(file_data1) + sizeof(file_data2)); + archive_entry_set_uid(entry, file_uid); + archive_entry_set_gid(entry, file_gid); + archive_entry_set_mtime(entry, t, 0); + archive_entry_set_atime(entry, t, 0); + archive_entry_set_ctime(entry, t, 0); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + assertEqualIntA(a, sizeof(file_data1), archive_write_data(a, file_data1, sizeof(file_data1))); + assertEqualIntA(a, sizeof(file_data2), archive_write_data(a, file_data2, sizeof(file_data2))); + archive_entry_free(entry); + + /* Folder */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, folder_name); + archive_entry_set_mode(entry, S_IFDIR | folder_perm); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, folder_uid); + archive_entry_set_gid(entry, folder_gid); + archive_entry_set_mtime(entry, t, 0); + archive_entry_set_atime(entry, t, 0); + archive_entry_set_ctime(entry, t, 0); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); + + /* Close the archive . */ + assertA(0 == archive_write_close(a)); + assertA(0 == archive_write_finish(a)); + + /* Remember the end of the archive in memory. */ + buffend = buff + used; + + /* Verify "End of Central Directory" record. */ + /* Get address of end-of-central-directory 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)); + failure("CD start (%d) + CD length (%d) should == archive size - 22", + i4(p + 12), i4(p + 16)); + assertEqualInt(i4(p + 12) + i4(p + 16), used - 22); + failure("no zip comment"); + assertEqualInt(i2(p + 20), 0); + + /* Get address of first entry in central directory. */ + 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 + 20); /* Version made by */ + assertEqualInt(i2(p + 6), 20); /* Version needed to extract */ + assertEqualInt(i2(p + 8), 8); /* Flags */ + assertEqualInt(i2(p + 10), 0); /* Compression method */ + assertEqualInt(i2(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + crc = bitcrc32(0, file_data1, sizeof(file_data1)); + crc = bitcrc32(crc, file_data2, sizeof(file_data2)); + assertEqualInt(i4(p + 16), crc); /* CRC-32 */ + 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), 13); /* 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 */ + 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 = p + 46 + strlen(file_name); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 7); /* 'UT' flags */ + assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ + p = p + 9; + assertEqualInt(i2(p), 0x7855); /* 'Ux' extension header */ + assertEqualInt(i2(p + 2), 0); /* 'Ux' size */ + p = p + 4; + + /* Verify local header of file entry. */ + q = buff; + assertEqualMem(q, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2(q + 4), 20); /* Version needed to extract */ + assertEqualInt(i2(q + 6), 8); /* Flags */ + 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(i2(q + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2(q + 28), 25); /* Extra field length */ + assertEqualMem(q + 30, file_name, strlen(file_name)); /* Pathname */ + q = q + 30 + strlen(file_name); + assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(q + 2), 13); /* 'UT' size */ + assertEqualInt(q[4], 7); /* 'UT' flags */ + assertEqualInt(i4(q + 5), t); /* 'UT' mtime */ + assertEqualInt(i4(q + 9), t); /* 'UT' atime */ + assertEqualInt(i4(q + 13), t); /* 'UT' ctime */ + q = q + 17; + assertEqualInt(i2(q), 0x7855); /* 'Ux' extension header */ + assertEqualInt(i2(q + 2), 4); /* 'Ux' size */ + assertEqualInt(i2(q + 4), file_uid); /* 'Ux' UID */ + assertEqualInt(i2(q + 6), file_gid); /* 'Ux' GID */ + q = q + 8; + + /* Verify data of file entry. */ + assertEqualMem(q, file_data1, sizeof(file_data1)); + assertEqualMem(q + sizeof(file_data1), file_data2, sizeof(file_data2)); + q = q + sizeof(file_data1) + sizeof(file_data2); + + /* Verify data descriptor of file entry. */ + assertEqualMem(q, "PK\007\010", 4); /* Signature */ + assertEqualInt(i4(q + 4), crc); /* CRC-32 */ + assertEqualInt(i4(q + 8), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ + assertEqualInt(i4(q + 12), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + q = q + 16; + + /* Verify folder entry in central directory. */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2(p + 4), 3 * 256 + 20); /* Version made by */ + assertEqualInt(i2(p + 6), 20); /* Version needed to extract */ + assertEqualInt(i2(p + 8), 8); /* Flags */ + assertEqualInt(i2(p + 10), 0); /* Compression method */ + assertEqualInt(i2(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + crc = 0; + assertEqualInt(i4(p + 16), crc); /* CRC-32 */ + 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), 13); /* 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 */ + assertEqualInt(i4(p + 38) >> 16 & 01777, folder_perm); /* External file attrs */ + 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), 5); /* 'UT' size */ + assertEqualInt(p[4], 7); /* 'UT' flags */ + assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ + p = p + 9; + assertEqualInt(i2(p), 0x7855); /* 'Ux' extension header */ + assertEqualInt(i2(p + 2), 0); /* 'Ux' size */ + p = p + 4; + + /* Verify local header of folder entry. */ + assertEqualMem(q, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2(q + 4), 20); /* Version needed to extract */ + assertEqualInt(i2(q + 6), 8); /* Flags */ + 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), 0); /* Compressed size */ + assertEqualInt(i4(q + 22), 0); /* Uncompressed size */ + assertEqualInt(i2(q + 26), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2(q + 28), 25); /* Extra field length */ + assertEqualMem(q + 30, folder_name, strlen(folder_name)); /* Pathname */ + q = q + 30 + strlen(folder_name); + assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(q + 2), 13); /* 'UT' size */ + assertEqualInt(q[4], 7); /* 'UT' flags */ + assertEqualInt(i4(q + 5), t); /* 'UT' mtime */ + assertEqualInt(i4(q + 9), t); /* 'UT' atime */ + assertEqualInt(i4(q + 13), t); /* 'UT' ctime */ + q = q + 17; + assertEqualInt(i2(q), 0x7855); /* 'Ux' extension header */ + assertEqualInt(i2(q + 2), 4); /* 'Ux' size */ + assertEqualInt(i2(q + 4), folder_uid); /* 'Ux' UID */ + assertEqualInt(i2(q + 6), folder_gid); /* 'Ux' GID */ + q = q + 8; + + /* There should not be any data in the folder entry, + * meaning next is the data descriptor header. */ + + /* Verify data descriptor of folder entry. */ + assertEqualMem(q, "PK\007\010", 4); /* Signature */ + assertEqualInt(i4(q + 4), crc); /* CRC-32 */ + assertEqualInt(i4(q + 8), 0); /* Compressed size */ + assertEqualInt(i4(q + 12), 0); /* Uncompressed size */ + q = q + 16; +} diff --git a/Utilities/cmlibarchive/libarchive/test/test_write_open_memory.c b/Utilities/cmlibarchive/libarchive/test/test_write_open_memory.c new file mode 100644 index 000000000..5a419fcb4 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/test/test_write_open_memory.c @@ -0,0 +1,76 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_open_memory.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); + +/* Try to force archive_write_open_memory.c to write past the end of an array. */ +static unsigned char buff[16384]; + +DEFINE_TEST(test_write_open_memory) +{ + unsigned int i; + struct archive *a; + struct archive_entry *ae; + const char *name="/tmp/test"; + + /* Create a simple archive_entry. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_pathname(ae, name); + archive_entry_set_mode(ae, S_IFREG); + assertEqualString(archive_entry_pathname(ae), name); + + /* Try writing with different buffer sizes. */ + /* Make sure that we get failure on too-small buffers, success on + * large enough ones. */ + for (i = 100; i < 1600; i++) { + size_t s; + size_t blocksize = 94; + assert((a = archive_write_new()) != NULL); + assertA(0 == archive_write_set_format_ustar(a)); + assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); + assertA(0 == archive_write_set_bytes_per_block(a, (int)blocksize)); + buff[i] = 0xAE; + assertA(0 == archive_write_open_memory(a, buff, i, &s)); + /* If buffer is smaller than a tar header, this should fail. */ + if (i < (511/blocksize)*blocksize) + assertA(ARCHIVE_FATAL == archive_write_header(a,ae)); + else + assertA(0 == archive_write_header(a, ae)); + /* If buffer is smaller than a tar header plus 1024 byte + * end-of-archive marker, then this should fail. */ + if (i < 1536) + assertA(ARCHIVE_FATAL == archive_write_close(a)); + else + assertA(0 == archive_write_close(a)); +#if ARCHIVE_VERSION_NUMBER < 2000000 + archive_write_finish(a); +#else + assert(0 == archive_write_finish(a)); +#endif + assert(buff[i] == 0xAE); + assert(s <= i); + } + archive_entry_free(ae); +} diff --git a/Utilities/cmlibarchive/libarchive_fe/err.c b/Utilities/cmlibarchive/libarchive_fe/err.c new file mode 100644 index 000000000..b0bc70a93 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/err.c @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "lafe_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_STDARG_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "err.h" + +const char *lafe_progname; + +static void +lafe_vwarnc(int code, const char *fmt, va_list ap) +{ + fprintf(stderr, "%s: ", lafe_progname); + vfprintf(stderr, fmt, ap); + if (code != 0) + fprintf(stderr, ": %s", strerror(code)); + fprintf(stderr, "\n"); +} + +void +lafe_warnc(int code, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + lafe_vwarnc(code, fmt, ap); + va_end(ap); +} + +void +lafe_errc(int eval, int code, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + lafe_vwarnc(code, fmt, ap); + va_end(ap); + exit(eval); +} diff --git a/Utilities/cmlibarchive/libarchive_fe/err.h b/Utilities/cmlibarchive/libarchive_fe/err.h new file mode 100644 index 000000000..c507be1ee --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/err.h @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2009 Joerg Sonnenberger + * 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. + */ + +#ifndef LAFE_ERR_H +#define LAFE_ERR_H + +extern const char *lafe_progname; + +void lafe_warnc(int code, const char *fmt, ...); +void lafe_errc(int eval, int code, const char *fmt, ...); + +#endif diff --git a/Utilities/cmlibarchive/libarchive_fe/lafe_platform.h b/Utilities/cmlibarchive/libarchive_fe/lafe_platform.h new file mode 100644 index 000000000..79fa2b44f --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/lafe_platform.h @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/usr.bin/cpio/cpio_platform.h,v 1.2 2008/12/06 07:15:42 kientzle Exp $ + */ + +/* + * This header is the first thing included in any of the libarchive_fe + * source files. As far as possible, platform-specific issues should + * be dealt with here and not within individual source files. + */ + +#ifndef LAFE_PLATFORM_H_INCLUDED +#define LAFE_PLATFORM_H_INCLUDED + +#if defined(PLATFORM_CONFIG_H) +/* Use hand-built config.h in environments that need it. */ +#include PLATFORM_CONFIG_H +#else +/* Read config.h or die trying. */ +#include "config.h" +#endif + +/* No non-FreeBSD platform will have __FBSDID, so just define it here. */ +#ifdef __FreeBSD__ +#include /* For __FBSDID */ +#elif !defined(__FBSDID) +/* Just leaving this macro replacement empty leads to a dangling semicolon. */ +#define __FBSDID(a) struct _undefined_hack +#endif + +#endif diff --git a/Utilities/cmlibarchive/libarchive_fe/line_reader.c b/Utilities/cmlibarchive/libarchive_fe/line_reader.c new file mode 100644 index 000000000..f7d265647 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/line_reader.c @@ -0,0 +1,171 @@ +/*- + * Copyright (c) 2008 Tim Kientzle + * 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 "lafe_platform.h" +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include "err.h" +#include "line_reader.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) +#define strdup _strdup +#endif + +/* + * Read lines from file and do something with each one. If option_null + * is set, lines are terminated with zero bytes; otherwise, they're + * terminated with newlines. + * + * This uses a self-sizing buffer to handle arbitrarily-long lines. + */ +struct lafe_line_reader { + FILE *f; + char *buff, *buff_end, *line_start, *line_end, *p; + char *pathname; + size_t buff_length; + int nullSeparator; /* Lines separated by null, not CR/CRLF/etc. */ + int ret; +}; + +struct lafe_line_reader * +lafe_line_reader(const char *pathname, int nullSeparator) +{ + struct lafe_line_reader *lr; + + lr = calloc(1, sizeof(*lr)); + if (lr == NULL) + lafe_errc(1, ENOMEM, "Can't open %s", pathname); + + lr->nullSeparator = nullSeparator; + lr->pathname = strdup(pathname); + + if (strcmp(pathname, "-") == 0) + lr->f = stdin; + else + lr->f = fopen(pathname, "r"); + if (lr->f == NULL) + lafe_errc(1, errno, "Couldn't open %s", pathname); + lr->buff_length = 8192; + lr->buff = malloc(lr->buff_length); + if (lr->buff == NULL) + lafe_errc(1, ENOMEM, "Can't read %s", pathname); + lr->line_start = lr->line_end = lr->buff_end = lr->buff; + + return (lr); +} + +const char * +lafe_line_reader_next(struct lafe_line_reader *lr) +{ + size_t bytes_wanted, bytes_read, new_buff_size; + char *line_start, *p; + + for (;;) { + /* If there's a line in the buffer, return it immediately. */ + while (lr->line_end < lr->buff_end) { + if (lr->nullSeparator) { + if (*lr->line_end == '\0') { + line_start = lr->line_start; + lr->line_start = lr->line_end + 1; + lr->line_end = lr->line_start; + return (line_start); + } + } else if (*lr->line_end == '\x0a' || *lr->line_end == '\x0d') { + *lr->line_end = '\0'; + line_start = lr->line_start; + lr->line_start = lr->line_end + 1; + lr->line_end = lr->line_start; + if (line_start[0] != '\0') + return (line_start); + } + lr->line_end++; + } + + /* If we're at end-of-file, process the final data. */ + if (lr->f == NULL) { + /* If there's more text, return one last line. */ + if (lr->line_end > lr->line_start) { + *lr->line_end = '\0'; + line_start = lr->line_start; + lr->line_start = lr->line_end + 1; + lr->line_end = lr->line_start; + return (line_start); + } + /* Otherwise, we're done. */ + return (NULL); + } + + /* Buffer only has part of a line. */ + if (lr->line_start > lr->buff) { + /* Move a leftover fractional line to the beginning. */ + memmove(lr->buff, lr->line_start, + lr->buff_end - lr->line_start); + lr->buff_end -= lr->line_start - lr->buff; + lr->line_end -= lr->line_start - lr->buff; + lr->line_start = lr->buff; + } else { + /* Line is too big; enlarge the buffer. */ + new_buff_size = lr->buff_length * 2; + if (new_buff_size <= lr->buff_length) + lafe_errc(1, ENOMEM, + "Line too long in %s", lr->pathname); + lr->buff_length = new_buff_size; + p = realloc(lr->buff, new_buff_size); + if (p == NULL) + lafe_errc(1, ENOMEM, + "Line too long in %s", lr->pathname); + lr->buff_end = p + (lr->buff_end - lr->buff); + lr->line_end = p + (lr->line_end - lr->buff); + lr->line_start = lr->buff = p; + } + + /* Get some more data into the buffer. */ + bytes_wanted = lr->buff + lr->buff_length - lr->buff_end; + bytes_read = fread(lr->buff_end, 1, bytes_wanted, lr->f); + lr->buff_end += bytes_read; + + if (ferror(lr->f)) + lafe_errc(1, errno, "Can't read %s", lr->pathname); + if (feof(lr->f)) { + if (lr->f != stdin) + fclose(lr->f); + lr->f = NULL; + } + } +} + +void +lafe_line_reader_free(struct lafe_line_reader *lr) +{ + free(lr->buff); + free(lr->pathname); + free(lr); +} diff --git a/Utilities/cmlibarchive/libarchive_fe/line_reader.h b/Utilities/cmlibarchive/libarchive_fe/line_reader.h new file mode 100644 index 000000000..7b6f42984 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/line_reader.h @@ -0,0 +1,35 @@ +/*- + * Copyright (c) 2009 Joerg Sonnenberger + * 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. + */ + +#ifndef LAFE_LINE_READER_H +#define LAFE_LINE_READER_H + +struct lafe_line_reader; + +struct lafe_line_reader *lafe_line_reader(const char *, int nullSeparator); +const char *lafe_line_reader_next(struct lafe_line_reader *); +void lafe_line_reader_free(struct lafe_line_reader *); + +#endif diff --git a/Utilities/cmlibarchive/libarchive_fe/matching.c b/Utilities/cmlibarchive/libarchive_fe/matching.c new file mode 100644 index 000000000..0a05bd363 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/matching.c @@ -0,0 +1,284 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "lafe_platform.h" +__FBSDID("$FreeBSD: src/usr.bin/cpio/matching.c,v 1.2 2008/06/21 02:20:20 kientzle Exp $"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "err.h" +#include "line_reader.h" +#include "matching.h" +#include "pathmatch.h" + +struct match { + struct match *next; + int matches; + char pattern[1]; +}; + +struct lafe_matching { + struct match *exclusions; + int exclusions_count; + struct match *inclusions; + int inclusions_count; + int inclusions_unmatched_count; +}; + +static void add_pattern(struct match **list, const char *pattern); +static void initialize_matching(struct lafe_matching **); +static int match_exclusion(struct match *, const char *pathname); +static int match_inclusion(struct match *, const char *pathname); + +/* + * The matching logic here needs to be re-thought. I started out to + * try to mimic gtar's matching logic, but it's not entirely + * consistent. In particular 'tar -t' and 'tar -x' interpret patterns + * on the command line as anchored, but --exclude doesn't. + */ + +/* + * Utility functions to manage exclusion/inclusion patterns + */ + +int +lafe_exclude(struct lafe_matching **matching, const char *pattern) +{ + + if (*matching == NULL) + initialize_matching(matching); + add_pattern(&((*matching)->exclusions), pattern); + (*matching)->exclusions_count++; + return (0); +} + +int +lafe_exclude_from_file(struct lafe_matching **matching, const char *pathname) +{ + struct lafe_line_reader *lr; + const char *p; + int ret = 0; + + lr = lafe_line_reader(pathname, '\n'); + while ((p = lafe_line_reader_next(lr)) != NULL) { + if (lafe_exclude(matching, p) != 0) + ret = -1; + } + lafe_line_reader_free(lr); + return (ret); +} + +int +lafe_include(struct lafe_matching **matching, const char *pattern) +{ + + if (*matching == NULL) + initialize_matching(matching); + add_pattern(&((*matching)->inclusions), pattern); + (*matching)->inclusions_count++; + (*matching)->inclusions_unmatched_count++; + return (0); +} + +int +lafe_include_from_file(struct lafe_matching **matching, const char *pathname, + int nullSeparator) +{ + struct lafe_line_reader *lr; + const char *p; + int ret = 0; + + lr = lafe_line_reader(pathname, nullSeparator); + while ((p = lafe_line_reader_next(lr)) != NULL) { + if (lafe_include(matching, p) != 0) + ret = -1; + } + lafe_line_reader_free(lr); + return (ret); +} + +static void +add_pattern(struct match **list, const char *pattern) +{ + struct match *match; + size_t len; + + len = strlen(pattern); + match = malloc(sizeof(*match) + len + 1); + if (match == NULL) + lafe_errc(1, errno, "Out of memory"); + strcpy(match->pattern, pattern); + /* Both "foo/" and "foo" should match "foo/bar". */ + if (len && match->pattern[len - 1] == '/') + match->pattern[strlen(match->pattern)-1] = '\0'; + match->next = *list; + *list = match; + match->matches = 0; +} + + +int +lafe_excluded(struct lafe_matching *matching, const char *pathname) +{ + struct match *match; + struct match *matched; + + if (matching == NULL) + return (0); + + /* Exclusions take priority */ + for (match = matching->exclusions; match != NULL; match = match->next){ + if (match_exclusion(match, pathname)) + return (1); + } + + /* Then check for inclusions */ + matched = NULL; + for (match = matching->inclusions; match != NULL; match = match->next){ + if (match_inclusion(match, pathname)) { + /* + * If this pattern has never been matched, + * then we're done. + */ + if (match->matches == 0) { + match->matches++; + matching->inclusions_unmatched_count--; + return (0); + } + /* + * Otherwise, remember the match but keep checking + * in case we can tick off an unmatched pattern. + */ + matched = match; + } + } + /* + * We didn't find a pattern that had never been matched, but + * we did find a match, so count it and exit. + */ + if (matched != NULL) { + matched->matches++; + return (0); + } + + /* If there were inclusions, default is to exclude. */ + if (matching->inclusions != NULL) + return (1); + + /* No explicit inclusions, default is to match. */ + return (0); +} + +/* + * This is a little odd, but it matches the default behavior of + * gtar. In particular, 'a*b' will match 'foo/a1111/222b/bar' + * + */ +static int +match_exclusion(struct match *match, const char *pathname) +{ + return (lafe_pathmatch(match->pattern, + pathname, + PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END)); +} + +/* + * Again, mimic gtar: inclusions are always anchored (have to match + * the beginning of the path) even though exclusions are not anchored. + */ +static int +match_inclusion(struct match *match, const char *pathname) +{ +#if 0 + return (lafe_pathmatch(match->pattern, pathname, 0)); +#else + return (lafe_pathmatch(match->pattern, pathname, PATHMATCH_NO_ANCHOR_END)); +#endif +} + +void +lafe_cleanup_exclusions(struct lafe_matching **matching) +{ + struct match *p, *q; + + if (*matching == NULL) + return; + + for (p = (*matching)->inclusions; p != NULL; ) { + q = p; + p = p->next; + free(q); + } + + for (p = (*matching)->exclusions; p != NULL; ) { + q = p; + p = p->next; + free(q); + } + + free(*matching); + *matching = NULL; +} + +static void +initialize_matching(struct lafe_matching **matching) +{ + *matching = calloc(sizeof(**matching), 1); + if (*matching == NULL) + lafe_errc(1, errno, "No memory"); +} + +int +lafe_unmatched_inclusions(struct lafe_matching *matching) +{ + + if (matching == NULL) + return (0); + return (matching->inclusions_unmatched_count); +} + +int +lafe_unmatched_inclusions_warn(struct lafe_matching *matching, const char *msg) +{ + struct match *p; + + if (matching == NULL) + return (0); + + for (p = matching->inclusions; p != NULL; p = p->next) { + if (p->matches == 0) + lafe_warnc(0, "%s: %s", p->pattern, msg); + } + + return (matching->inclusions_unmatched_count); +} diff --git a/Utilities/cmlibarchive/libarchive_fe/matching.h b/Utilities/cmlibarchive/libarchive_fe/matching.h new file mode 100644 index 000000000..af9e57551 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/matching.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD$ + */ + +#ifndef MATCHING_H +#define MATCHING_H + +struct lafe_matching; + +int lafe_exclude(struct lafe_matching **matching, const char *pattern); +int lafe_exclude_from_file(struct lafe_matching **matching, + const char *pathname); +int lafe_include(struct lafe_matching **matching, const char *pattern); +int lafe_include_from_file(struct lafe_matching **matching, + const char *pathname, int nullSeparator); + +int lafe_excluded(struct lafe_matching *, const char *pathname); +void lafe_cleanup_exclusions(struct lafe_matching **); +int lafe_unmatched_inclusions(struct lafe_matching *); +int lafe_unmatched_inclusions_warn(struct lafe_matching *, const char *msg); + +#endif diff --git a/Utilities/cmlibarchive/libarchive_fe/pathmatch.c b/Utilities/cmlibarchive/libarchive_fe/pathmatch.c new file mode 100644 index 000000000..8ea9161e3 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/pathmatch.c @@ -0,0 +1,257 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "lafe_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_STRING_H +#include +#endif + +#include "pathmatch.h" + +/* + * Check whether a character 'c' is matched by a list specification [...]: + * * Leading '!' negates the class. + * * - is a range of characters + * * \ removes any special meaning for + * + * Some interesting boundary cases: + * a-d-e is one range (a-d) followed by two single characters - and e. + * \a-\d is same as a-d + * a\-d is three single characters: a, d, - + * Trailing - is not special (so [a-] is two characters a and -). + * Initial - is not special ([a-] is same as [-a] is same as [\\-a]) + * This function never sees a trailing \. + * [] always fails + * [!] always succeeds + */ +static int +pm_list(const char *start, const char *end, const char c, int flags) +{ + const char *p = start; + char rangeStart = '\0', nextRangeStart; + int match = 1, nomatch = 0; + + /* This will be used soon... */ + (void)flags; /* UNUSED */ + + /* If this is a negated class, return success for nomatch. */ + if (*p == '!' && p < end) { + match = 0; + nomatch = 1; + ++p; + } + + while (p < end) { + nextRangeStart = '\0'; + switch (*p) { + case '-': + /* Trailing or initial '-' is not special. */ + if ((rangeStart == '\0') || (p == end - 1)) { + if (*p == c) + return (match); + } else { + char rangeEnd = *++p; + if (rangeEnd == '\\') + rangeEnd = *++p; + if ((rangeStart <= c) && (c <= rangeEnd)) + return (match); + } + break; + case '\\': + ++p; + /* Fall through */ + default: + if (*p == c) + return (match); + nextRangeStart = *p; /* Possible start of range. */ + } + rangeStart = nextRangeStart; + ++p; + } + return (nomatch); +} + +/* + * If s is pointing to "./", ".//", "./././" or the like, skip it. + */ +static const char * +pm_slashskip(const char *s) { + while ((*s == '/') + || (s[0] == '.' && s[1] == '/') + || (s[0] == '.' && s[1] == '\0')) + ++s; + return (s); +} + +static int +pm(const char *p, const char *s, int flags) +{ + const char *end; + + /* + * Ignore leading './', './/', '././', etc. + */ + if (s[0] == '.' && s[1] == '/') + s = pm_slashskip(s + 1); + if (p[0] == '.' && p[1] == '/') + p = pm_slashskip(p + 1); + + for (;;) { + switch (*p) { + case '\0': + if (s[0] == '/') { + if (flags & PATHMATCH_NO_ANCHOR_END) + return (1); + /* "dir" == "dir/" == "dir/." */ + s = pm_slashskip(s); + } + return (*s == '\0'); + break; + case '?': + /* ? always succeds, unless we hit end of 's' */ + if (*s == '\0') + return (0); + break; + case '*': + /* "*" == "**" == "***" ... */ + while (*p == '*') + ++p; + /* Trailing '*' always succeeds. */ + if (*p == '\0') + return (1); + while (*s) { + if (lafe_pathmatch(p, s, flags)) + return (1); + ++s; + } + return (0); + break; + case '[': + /* + * Find the end of the [...] character class, + * ignoring \] that might occur within the class. + */ + end = p + 1; + while (*end != '\0' && *end != ']') { + if (*end == '\\' && end[1] != '\0') + ++end; + ++end; + } + if (*end == ']') { + /* We found [...], try to match it. */ + if (!pm_list(p + 1, end, *s, flags)) + return (0); + p = end; /* Jump to trailing ']' char. */ + break; + } else + /* No final ']', so just match '['. */ + if (*p != *s) + return (0); + break; + case '\\': + /* Trailing '\\' matches itself. */ + if (p[1] == '\0') { + if (*s != '\\') + return (0); + } else { + ++p; + if (*p != *s) + return (0); + } + break; + case '/': + if (*s != '/' && *s != '\0') + return (0); + /* Note: pattern "/\./" won't match "/"; + * pm_slashskip() correctly stops at backslash. */ + p = pm_slashskip(p); + s = pm_slashskip(s); + if (*p == '\0' && (flags & PATHMATCH_NO_ANCHOR_END)) + return (1); + --p; /* Counteract the increment below. */ + --s; + break; + case '$': + /* '$' is special only at end of pattern and only + * if PATHMATCH_NO_ANCHOR_END is specified. */ + if (p[1] == '\0' && (flags & PATHMATCH_NO_ANCHOR_END)){ + /* "dir" == "dir/" == "dir/." */ + return (*pm_slashskip(s) == '\0'); + } + /* Otherwise, '$' is not special. */ + /* FALL THROUGH */ + default: + if (*p != *s) + return (0); + break; + } + ++p; + ++s; + } +} + +/* Main entry point. */ +int +lafe_pathmatch(const char *p, const char *s, int flags) +{ + /* Empty pattern only matches the empty string. */ + if (p == NULL || *p == '\0') + return (s == NULL || *s == '\0'); + + /* Leading '^' anchors the start of the pattern. */ + if (*p == '^') { + ++p; + flags &= ~PATHMATCH_NO_ANCHOR_START; + } + + if (*p == '/' && *s != '/') + return (0); + + /* Certain patterns and file names anchor implicitly. */ + if (*p == '*' || *p == '/' || *p == '/') { + while (*p == '/') + ++p; + while (*s == '/') + ++s; + return (pm(p, s, flags)); + } + + /* If start is unanchored, try to match start of each path element. */ + if (flags & PATHMATCH_NO_ANCHOR_START) { + for ( ; s != NULL; s = strchr(s, '/')) { + if (*s == '/') + s++; + if (pm(p, s, flags)) + return (1); + } + return (0); + } + + /* Default: Match from beginning. */ + return (pm(p, s, flags)); +} diff --git a/Utilities/cmlibarchive/libarchive_fe/pathmatch.h b/Utilities/cmlibarchive/libarchive_fe/pathmatch.h new file mode 100644 index 000000000..ee8eecc38 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive_fe/pathmatch.h @@ -0,0 +1,42 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD$ + */ + +#ifndef LAFE_PATHMATCH_H +#define LAFE_PATHMATCH_H + +/* Don't anchor at beginning unless the pattern starts with "^" */ +#define PATHMATCH_NO_ANCHOR_START 1 +/* Don't anchor at end unless the pattern ends with "$" */ +#define PATHMATCH_NO_ANCHOR_END 2 + +/* Note that "^" and "$" are not special unless you set the corresponding + * flag above. */ + +int lafe_pathmatch(const char *p, const char *s, int flags); + +#endif diff --git a/Utilities/cmlibarchive/tar/CMakeLists.txt b/Utilities/cmlibarchive/tar/CMakeLists.txt new file mode 100644 index 000000000..f6a0d0ec7 --- /dev/null +++ b/Utilities/cmlibarchive/tar/CMakeLists.txt @@ -0,0 +1,58 @@ +############################################ +# +# How to build bsdtar +# +############################################ +IF (ENABLE_TAR) + + SET(bsdtar_SOURCES + bsdtar.c + bsdtar.h + bsdtar_platform.h + cmdline.c + getdate.c + read.c + subst.c + tree.c + tree.h + util.c + write.c + ../libarchive_fe/err.c + ../libarchive_fe/err.h + ../libarchive_fe/lafe_platform.h + ../libarchive_fe/line_reader.c + ../libarchive_fe/line_reader.h + ../libarchive_fe/matching.c + ../libarchive_fe/matching.h + ../libarchive_fe/pathmatch.c + ../libarchive_fe/pathmatch.h + ) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../libarchive_fe) + IF(WIN32 AND NOT CYGWIN) + LIST(APPEND bsdtar_SOURCES bsdtar_windows.c) + LIST(APPEND bsdtar_SOURCES bsdtar_windows.h) + ENDIF(WIN32 AND NOT CYGWIN) + + # bsdtar documentation + SET(bsdtar_MANS bsdtar.1) + + # How to build bsdtar + ADD_EXECUTABLE(bsdtar ${bsdtar_SOURCES}) + IF(ENABLE_TAR_SHARED) + TARGET_LINK_LIBRARIES(bsdtar archive ${ADDITIONAL_LIBS}) + ELSE(ENABLE_TAR_SHARED) + TARGET_LINK_LIBRARIES(bsdtar archive_static ${ADDITIONAL_LIBS}) + ENDIF(ENABLE_TAR_SHARED) + # On Windows, DLL must end up in same dir with EXEs + IF(WIN32 AND NOT CYGWIN) + SET_TARGET_PROPERTIES(bsdtar PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + ENDIF(WIN32 AND NOT CYGWIN) + GET_TARGET_PROPERTY(BSDTAR bsdtar LOCATION) + + # Installation rules + INSTALL(TARGETS bsdtar RUNTIME DESTINATION bin) + INSTALL_MAN(${bsdtar_MANS}) +ENDIF(ENABLE_TAR) + +add_subdirectory(test) diff --git a/Utilities/cmlibarchive/tar/Makefile b/Utilities/cmlibarchive/tar/Makefile new file mode 100644 index 000000000..73eb5ba38 --- /dev/null +++ b/Utilities/cmlibarchive/tar/Makefile @@ -0,0 +1,23 @@ +# $FreeBSD: src/usr.bin/tar/Makefile,v 1.40 2008/12/06 07:38:14 kientzle Exp $ + +.PATH: ${.CURDIR}/../libarchive_fe + +PROG= bsdtar +BSDTAR_VERSION_STRING=2.7.900a +SRCS= bsdtar.c cmdline.c getdate.c read.c subst.c tree.c util.c write.c +SRCS+= err.c line_reader.c matching.c pathmatch.c +WARNS?= 5 +DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} +LDADD= -larchive -lbz2 -lz -lmd -lcrypto +CFLAGS+= -DBSDTAR_VERSION_STRING=\"${BSDTAR_VERSION_STRING}\" +CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" +CFLAGS+= -I"${.CURDIR}" -I"${.CURDIR}/../libarchive_fe" +SYMLINKS= bsdtar ${BINDIR}/tar +MLINKS= bsdtar.1 tar.1 +DEBUG_FLAGS=-g + +.PHONY: check test +check test: $(PROG) bsdtar.1.gz + cd ${.CURDIR}/test && make test + +.include diff --git a/Utilities/cmlibarchive/tar/bsdtar.1 b/Utilities/cmlibarchive/tar/bsdtar.1 new file mode 100644 index 000000000..28d5106e2 --- /dev/null +++ b/Utilities/cmlibarchive/tar/bsdtar.1 @@ -0,0 +1,921 @@ +.\" Copyright (c) 2003-2007 Tim Kientzle +.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $FreeBSD: src/usr.bin/tar/bsdtar.1,v 1.46 2008/12/06 07:37:55 kientzle Exp $ +.\" +.Dd May 26, 2009 +.Dt BSDTAR 1 +.Os +.Sh NAME +.Nm tar +.Nd manipulate tape archives +.Sh SYNOPSIS +.Nm +.Op Ar bundled-flags Ao args Ac +.Op Ao Ar file Ac | Ao Ar pattern Ac ... +.Nm +.Brq Fl c +.Op Ar options +.Op Ar files | Ar directories +.Nm +.Brq Fl r | Fl u +.Fl f Ar archive-file +.Op Ar options +.Op Ar files | Ar directories +.Nm +.Brq Fl t | Fl x +.Op Ar options +.Op Ar patterns +.Sh DESCRIPTION +.Nm +creates and manipulates streaming archive files. +This implementation can extract from tar, pax, cpio, zip, jar, ar, +and ISO 9660 cdrom images and can create tar, pax, cpio, ar, +and shar archives. +.Pp +The first synopsis form shows a +.Dq bundled +option word. +This usage is provided for compatibility with historical implementations. +See COMPATIBILITY below for details. +.Pp +The other synopsis forms show the preferred usage. +The first option to +.Nm +is a mode indicator from the following list: +.Bl -tag -compact -width indent +.It Fl c +Create a new archive containing the specified items. +.It Fl r +Like +.Fl c , +but new entries are appended to the archive. +Note that this only works on uncompressed archives stored in regular files. +The +.Fl f +option is required. +.It Fl t +List archive contents to stdout. +.It Fl u +Like +.Fl r , +but new entries are added only if they have a modification date +newer than the corresponding entry in the archive. +Note that this only works on uncompressed archives stored in regular files. +The +.Fl f +option is required. +.It Fl x +Extract to disk from the archive. +If a file with the same name appears more than once in the archive, +each copy will be extracted, with later copies overwriting (replacing) +earlier copies. +.El +.Pp +In +.Fl c , +.Fl r , +or +.Fl u +mode, each specified file or directory is added to the +archive in the order specified on the command line. +By default, the contents of each directory are also archived. +.Pp +In extract or list mode, the entire command line +is read and parsed before the archive is opened. +The pathnames or patterns on the command line indicate +which items in the archive should be processed. +Patterns are shell-style globbing patterns as +documented in +.Xr tcsh 1 . +.Sh OPTIONS +Unless specifically stated otherwise, options are applicable in +all operating modes. +.Bl -tag -width indent +.It Cm @ Ns Pa archive +(c and r mode only) +The specified archive is opened and the entries +in it will be appended to the current archive. +As a simple example, +.Dl Nm Fl c Fl f Pa - Pa newfile Cm @ Ns Pa original.tar +writes a new archive to standard output containing a file +.Pa newfile +and all of the entries from +.Pa original.tar . +In contrast, +.Dl Nm Fl c Fl f Pa - Pa newfile Pa original.tar +creates a new archive with only two entries. +Similarly, +.Dl Nm Fl czf Pa - Fl -format Cm pax Cm @ Ns Pa - +reads an archive from standard input (whose format will be determined +automatically) and converts it into a gzip-compressed +pax-format archive on stdout. +In this way, +.Nm +can be used to convert archives from one format to another. +.It Fl b Ar blocksize +Specify the block size, in 512-byte records, for tape drive I/O. +As a rule, this argument is only needed when reading from or writing +to tape drives, and usually not even then as the default block size of +20 records (10240 bytes) is very common. +.It Fl C Ar directory +In c and r mode, this changes the directory before adding +the following files. +In x mode, change directories after opening the archive +but before extracting entries from the archive. +.It Fl -check-links +(c and r modes only) +Issue a warning message unless all links to each file are archived. +.It Fl -chroot +(x mode only) +.Fn chroot +to the current directory after processing any +.Fl C +options and before extracting any files. +.It Fl -exclude Ar pattern +Do not process files or directories that match the +specified pattern. +Note that exclusions take precedence over patterns or filenames +specified on the command line. +.It Fl -format Ar format +(c, r, u mode only) +Use the specified format for the created archive. +Supported formats include +.Dq cpio , +.Dq pax , +.Dq shar , +and +.Dq ustar . +Other formats may also be supported; see +.Xr libarchive-formats 5 +for more information about currently-supported formats. +In r and u modes, when extending an existing archive, the format specified +here must be compatible with the format of the existing archive on disk. +.It Fl f Ar file +Read the archive from or write the archive to the specified file. +The filename can be +.Pa - +for standard input or standard output. +If not specified, the default tape device will be used. +(On +.Fx , +the default tape device is +.Pa /dev/sa0 . ) +.It Fl H +(c and r mode only) +Symbolic links named on the command line will be followed; the +target of the link will be archived, not the link itself. +.It Fl h +(c and r mode only) +Synonym for +.Fl L . +.It Fl I +Synonym for +.Fl T . +.It Fl -include Ar pattern +Process only files or directories that match the specified pattern. +Note that exclusions specified with +.Fl -exclude +take precedence over inclusions. +If no inclusions are explicitly specified, all entries are processed by +default. +The +.Fl -include +option is especially useful when filtering archives. +For example, the command +.Dl Nm Fl c Fl f Pa new.tar Fl -include='*foo*' Cm @ Ns Pa old.tgz +creates a new archive +.Pa new.tar +containing only the entries from +.Pa old.tgz +containing the string +.Sq foo . +.It Fl j +(c mode only) +Compress the resulting archive with +.Xr bzip2 1 . +In extract or list modes, this option is ignored. +Note that, unlike other +.Nm tar +implementations, this implementation recognizes bzip2 compression +automatically when reading archives. +.It Fl k +(x mode only) +Do not overwrite existing files. +In particular, if a file appears more than once in an archive, +later copies will not overwrite earlier copies. +.It Fl -keep-newer-files +(x mode only) +Do not overwrite existing files that are newer than the +versions appearing in the archive being extracted. +.It Fl L +(c and r mode only) +All symbolic links will be followed. +Normally, symbolic links are archived as such. +With this option, the target of the link will be archived instead. +.It Fl l +This is a synonym for the +.Fl -check-links +option. +.It Fl m +(x mode only) +Do not extract modification time. +By default, the modification time is set to the time stored in the archive. +.It Fl n +(c, r, u modes only) +Do not recursively archive the contents of directories. +.It Fl -newer Ar date +(c, r, u modes only) +Only include files and directories newer than the specified date. +This compares ctime entries. +.It Fl -newer-mtime Ar date +(c, r, u modes only) +Like +.Fl -newer , +except it compares mtime entries instead of ctime entries. +.It Fl -newer-than Pa file +(c, r, u modes only) +Only include files and directories newer than the specified file. +This compares ctime entries. +.It Fl -newer-mtime-than Pa file +(c, r, u modes only) +Like +.Fl -newer-than , +except it compares mtime entries instead of ctime entries. +.It Fl -nodump +(c and r modes only) +Honor the nodump file flag by skipping this file. +.It Fl -null +(use with +.Fl I , +.Fl T , +or +.Fl X ) +Filenames or patterns are separated by null characters, +not by newlines. +This is often used to read filenames output by the +.Fl print0 +option to +.Xr find 1 . +.It Fl -numeric-owner +(x mode only) +Ignore symbolic user and group names when restoring archives to disk, +only numeric uid and gid values will be obeyed. +.It Fl O +(x, t modes only) +In extract (-x) mode, files will be written to standard out rather than +being extracted to disk. +In list (-t) mode, the file listing will be written to stderr rather than +the usual stdout. +.It Fl o +(x mode) +Use the user and group of the user running the program rather +than those specified in the archive. +Note that this has no significance unless +.Fl p +is specified, and the program is being run by the root user. +In this case, the file modes and flags from +the archive will be restored, but ACLs or owner information in +the archive will be discarded. +.It Fl o +(c, r, u mode) +A synonym for +.Fl -format Ar ustar +.It Fl -one-file-system +(c, r, and u modes) +Do not cross mount points. +.It Fl -options Ar options +Select optional behaviors for particular modules. +The argument is a text string containing comma-separated +keywords and values. +These are passed to the modules that handle particular +formats to control how those formats will behave. +Each option has one of the following forms: +.Bl -tag -compact -width indent +.It Ar key=value +The key will be set to the specified value in every module that supports it. +Modules that do not support this key will ignore it. +.It Ar key +The key will be enabled in every module that supports it. +This is equivalent to +.Ar key Ns Cm =1 . +.It Ar !key +The key will be disabled in every module that supports it. +.It Ar module:key=value , Ar module:key , Ar module:!key +As above, but the corresponding key and value will be provided +only to modules whose name matches +.Ar module . +.El +The currently supported modules and keys are: +.Bl -tag -compact -width indent +.It Cm iso9660:joliet +Support Joliet extensions. +This is enabled by default, use +.Cm !joliet +or +.Cm iso9660:!joliet +to disable. +.It Cm iso9660:rock-ridge +Support Rock Ridge extensions. +This is enabled by default, use +.Cm !rock-ridge +or +.Cm iso9660:!rock-ridge +to disable. +.It Cm gzip:compression-level +A decimal integer from 0 to 9 specifying the gzip compression level. +.It Cm xz:compression-level +A decimal integer from 0 to 9 specifying the xz compression level. +.It Cm mtree: Ns Ar keyword +The mtree writer module allows you to specify which mtree keywords +will be included in the output. +Supported keywords include: +.Cm cksum , Cm device , Cm flags , Cm gid , Cm gname , Cm indent , +.Cm link , Cm md5 , Cm mode , Cm nlink , Cm rmd160 , Cm sha1 , Cm sha256 , +.Cm sha384 , Cm sha512 , Cm size , Cm time , Cm uid , Cm uname . +The default is equivalent to: +.Dq device, flags, gid, gname, link, mode, nlink, size, time, type, uid, uname . +.It Cm mtree:all +Enables all of the above keywords. +You can also use +.Cm mtree:!all +to disable all keywords. +.It Cm mtree:use-set +Enable generation of +.Cm /set +lines in the output. +.It Cm mtree:indent +Produce human-readable output by indenting options and splitting lines +to fit into 80 columns. +.It Cm zip:compression Ns = Ns Ar type +Use +.Ar type +as compression method. +Supported values are store (uncompressed) and deflate (gzip algorithm). +.El +If a provided option is not supported by any module, that +is a fatal error. +.It Fl P +Preserve pathnames. +By default, absolute pathnames (those that begin with a / +character) have the leading slash removed both when creating archives +and extracting from them. +Also, +.Nm +will refuse to extract archive entries whose pathnames contain +.Pa .. +or whose target directory would be altered by a symlink. +This option suppresses these behaviors. +.It Fl p +(x mode only) +Preserve file permissions. +Attempt to restore the full permissions, including owner, file modes, file +flags and ACLs, if available, for each item extracted from the archive. +By default, newly-created files are owned by the user running +.Nm , +the file mode is restored for newly-created regular files, and +all other types of entries receive default permissions. +If +.Nm +is being run by root, the default is to restore the owner unless the +.Fl o +option is also specified. +.It Fl q ( Fl -fast-read ) +(x and t mode only) +Extract or list only the first archive entry that matches each pattern +or filename operand. +Exit as soon as each specified pattern or filename has been matched. +By default, the archive is always read to the very end, since +there can be multiple entries with the same name and, by convention, +later entries overwrite earlier entries. +This option is provided as a performance optimization. +.It Fl S +(x mode only) +Extract files as sparse files. +For every block on disk, check first if it contains only NULL bytes and seek +over it otherwise. +This works similiar to the conv=sparse option of dd. +.It Fl -strip-components Ar count +(x mode only) +Remove the specified number of leading path elements. +Pathnames with fewer elements will be silently skipped. +Note that the pathname is edited after checking inclusion/exclusion patterns +but before security checks. +.It Fl s Ar pattern +Modify file or archive member names according to +.Pa pattern . +The pattern has the format +.Ar /old/new/ Ns Op gps +where +.Ar old +is a basic regular expression, +.Ar new +is the replacement string of the matched part, +and the optional trailing letters modify +how the replacement is handled. +If +.Ar old +is not matched, the pattern is skipped. +Within +.Ar new , +~ is substituted with the match, \1 to \9 with the content of +the corresponding captured group. +The optional trailing g specifies that matching should continue +after the matched part and stopped on the first unmatched pattern. +The optional trailing s specifies that the pattern applies to the value +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. +.It Fl T Ar filename +In x or t mode, +.Nm +will read the list of names to be extracted from +.Pa filename . +In c mode, +.Nm +will read names to be archived from +.Pa filename . +The special name +.Dq -C +on a line by itself will cause the current directory to be changed to +the directory specified on the following line. +Names are terminated by newlines unless +.Fl -null +is specified. +Note that +.Fl -null +also disables the special handling of lines containing +.Dq -C . +.It Fl U +(x mode only) +Unlink files before creating them. +Without this option, +.Nm +overwrites existing files, which preserves existing hardlinks. +With this option, existing hardlinks will be broken, as will any +symlink that would affect the location of an extracted file. +.It Fl -use-compress-program Ar program +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 v +Produce verbose output. +In create and extract modes, +.Nm +will list each file name as it is read from or written to +the archive. +In list mode, +.Nm +will produce output similar to that of +.Xr ls 1 . +Additional +.Fl v +options will provide additional detail. +.It Fl -version +Print version of +.Nm +and +.Nm libarchive , +and exit. +.It Fl w +Ask for confirmation for every action. +.It Fl X Ar filename +Read a list of exclusion patterns from the specified file. +See +.Fl -exclude +for more information about the handling of exclusions. +.It Fl y +(c mode only) +Compress the resulting archive with +.Xr bzip2 1 . +In extract or list modes, this option is ignored. +Note that, unlike other +.Nm tar +implementations, this implementation recognizes bzip2 compression +automatically when reading archives. +.It Fl z +(c mode only) +Compress the resulting archive with +.Xr gzip 1 . +In extract or list modes, this option is ignored. +Note that, unlike other +.Nm tar +implementations, this implementation recognizes gzip compression +automatically when reading archives. +.It Fl Z +(c mode only) +Compress the resulting archive with +.Xr compress 1 . +In extract or list modes, this option is ignored. +Note that, unlike other +.Nm tar +implementations, this implementation recognizes compress compression +automatically when reading archives. +.El +.Sh ENVIRONMENT +The following environment variables affect the execution of +.Nm : +.Bl -tag -width ".Ev BLOCKSIZE" +.It Ev LANG +The locale to use. +See +.Xr environ 7 +for more information. +.It Ev TAPE +The default tape device. +The +.Fl f +option overrides this. +.It Ev TZ +The timezone to use when displaying dates. +See +.Xr environ 7 +for more information. +.El +.Sh FILES +.Bl -tag -width ".Ev BLOCKSIZE" +.It Pa /dev/sa0 +The default tape device, if not overridden by the +.Ev TAPE +environment variable or the +.Fl f +option. +.El +.Sh EXIT STATUS +.Ex -std +.Sh EXAMPLES +The following creates a new archive +called +.Ar file.tar.gz +that contains two files +.Ar source.c +and +.Ar source.h : +.Dl Nm Fl czf Pa file.tar.gz Pa source.c Pa source.h +.Pp +To view a detailed table of contents for this +archive: +.Dl Nm Fl tvf Pa file.tar.gz +.Pp +To extract all entries from the archive on +the default tape drive: +.Dl Nm Fl x +.Pp +To examine the contents of an ISO 9660 cdrom image: +.Dl Nm Fl tf Pa image.iso +.Pp +To move file hierarchies, invoke +.Nm +as +.Dl Nm Fl cf Pa - Fl C Pa srcdir\ . | Nm Fl xpf Pa - Fl C Pa destdir +or more traditionally +.Dl cd srcdir \&; Nm Fl cf Pa -\ . | ( cd destdir \&; Nm Fl xpf Pa - ) +.Pp +In create mode, the list of files and directories to be archived +can also include directory change instructions of the form +.Cm -C Ns Pa foo/baz +and archive inclusions of the form +.Cm @ Ns Pa archive-file . +For example, the command line +.Dl Nm Fl c Fl f Pa new.tar Pa foo1 Cm @ Ns Pa old.tgz Cm -C Ns Pa /tmp Pa foo2 +will create a new archive +.Pa new.tar . +.Nm +will read the file +.Pa foo1 +from the current directory and add it to the output archive. +It will then read each entry from +.Pa old.tgz +and add those entries to the output archive. +Finally, it will switch to the +.Pa /tmp +directory and add +.Pa foo2 +to the output archive. +.Pp +An input file in +.Xr mtree 5 +format can be used to create an output archive with arbitrary ownership, +permissions, or names that differ from existing data on disk: +.Pp +.Dl $ cat input.mtree +.Dl #mtree +.Dl usr/bin uid=0 gid=0 mode=0755 type=dir +.Dl usr/bin/ls uid=0 gid=0 mode=0755 type=file content=myls +.Dl $ tar -cvf output.tar @input.mtree +.Pp +The +.Fl -newer +and +.Fl -newer-mtime +switches accept a variety of common date and time specifications, including +.Dq 12 Mar 2005 7:14:29pm , +.Dq 2005-03-12 19:14 , +.Dq 5 minutes ago , +and +.Dq 19:14 PST May 1 . +.Pp +The +.Fl -options +argument can be used to control various details of archive generation +or reading. +For example, you can generate mtree output which only contains +.Cm type , Cm time , +and +.Cm uid +keywords: +.Dl Nm Fl cf Pa file.tar Fl -format=mtree Fl -options='!all,type,time,uid' Pa dir +or you can set the compression level used by gzip or xz compression: +.Dl Nm Fl czf Pa file.tar Fl -options='compression-level=9' . +For more details, see the explanation of the +.Fn archive_read_set_options +and +.Fn archive_write_set_options +API calls that are described in +.Xr archive_read 3 +and +.Xr archive_write 3 . +.Sh COMPATIBILITY +The bundled-arguments format is supported for compatibility +with historic implementations. +It consists of an initial word (with no leading - character) in which +each character indicates an option. +Arguments follow as separate words. +The order of the arguments must match the order +of the corresponding characters in the bundled command word. +For example, +.Dl Nm Cm tbf 32 Pa file.tar +specifies three flags +.Cm t , +.Cm b , +and +.Cm f . +The +.Cm b +and +.Cm f +flags both require arguments, +so there must be two additional items +on the command line. +The +.Ar 32 +is the argument to the +.Cm b +flag, and +.Ar file.tar +is the argument to the +.Cm f +flag. +.Pp +The mode options c, r, t, u, and x and the options +b, f, l, m, o, v, and w comply with SUSv2. +.Pp +For maximum portability, scripts that invoke +.Nm tar +should use the bundled-argument format above, should limit +themselves to the +.Cm c , +.Cm t , +and +.Cm x +modes, and the +.Cm b , +.Cm f , +.Cm m , +.Cm v , +and +.Cm w +options. +.Pp +Additional long options are provided to improve compatibility with other +tar implementations. +.Sh SECURITY +Certain security issues are common to many archiving programs, including +.Nm . +In particular, carefully-crafted archives can request that +.Nm +extract files to locations outside of the target directory. +This can potentially be used to cause unwitting users to overwrite +files they did not intend to overwrite. +If the archive is being extracted by the superuser, any file +on the system can potentially be overwritten. +There are three ways this can happen. +Although +.Nm +has mechanisms to protect against each one, +savvy users should be aware of the implications: +.Bl -bullet -width indent +.It +Archive entries can have absolute pathnames. +By default, +.Nm +removes the leading +.Pa / +character from filenames before restoring them to guard against this problem. +.It +Archive entries can have pathnames that include +.Pa .. +components. +By default, +.Nm +will not extract files containing +.Pa .. +components in their pathname. +.It +Archive entries can exploit symbolic links to restore +files to other directories. +An archive can restore a symbolic link to another directory, +then use that link to restore a file into that directory. +To guard against this, +.Nm +checks each extracted path for symlinks. +If the final path element is a symlink, it will be removed +and replaced with the archive entry. +If +.Fl U +is specified, any intermediate symlink will also be unconditionally removed. +If neither +.Fl U +nor +.Fl P +is specified, +.Nm +will refuse to extract the entry. +.El +To protect yourself, you should be wary of any archives that +come from untrusted sources. +You should examine the contents of an archive with +.Dl Nm Fl tf Pa filename +before extraction. +You should use the +.Fl k +option to ensure that +.Nm +will not overwrite any existing files or the +.Fl U +option to remove any pre-existing files. +You should generally not extract archives while running with super-user +privileges. +Note that the +.Fl P +option to +.Nm +disables the security checks above and allows you to extract +an archive while preserving any absolute pathnames, +.Pa .. +components, or symlinks to other directories. +.Sh SEE ALSO +.Xr bzip2 1 , +.Xr compress 1 , +.Xr cpio 1 , +.Xr gzip 1 , +.Xr mt 1 , +.Xr pax 1 , +.Xr shar 1 , +.Xr libarchive 3 , +.Xr libarchive-formats 5 , +.Xr tar 5 +.Sh STANDARDS +There is no current POSIX standard for the tar command; it appeared +in +.St -p1003.1-96 +but was dropped from +.St -p1003.1-2001 . +The options used by this implementation were developed by surveying a +number of existing tar implementations as well as the old POSIX specification +for tar and the current POSIX specification for pax. +.Pp +The ustar and pax interchange file formats are defined by +.St -p1003.1-2001 +for the pax command. +.Sh HISTORY +A +.Nm tar +command appeared in Seventh Edition Unix, which was released in January, 1979. +There have been numerous other implementations, +many of which extended the file format. +John Gilmore's +.Nm pdtar +public-domain implementation (circa November, 1987) +was quite influential, and formed the basis of GNU tar. +GNU tar was included as the standard system tar +in +.Fx +beginning with +.Fx 1.0 . +.Pp +This is a complete re-implementation based on the +.Xr libarchive 3 +library. +.Sh BUGS +This program follows +.St -p1003.1-96 +for the definition of the +.Fl l +option. +Note that GNU tar prior to version 1.15 treated +.Fl l +as a synonym for the +.Fl -one-file-system +option. +.Pp +The +.Fl C Pa dir +option may differ from historic implementations. +.Pp +All archive output is written in correctly-sized blocks, even +if the output is being compressed. +Whether or not the last output block is padded to a full +block size varies depending on the format and the +output device. +For tar and cpio formats, the last block of output is padded +to a full block size if the output is being +written to standard output or to a character or block device such as +a tape drive. +If the output is being written to a regular file, the last block +will not be padded. +Many compressors, including +.Xr gzip 1 +and +.Xr bzip2 1 , +complain about the null padding when decompressing an archive created by +.Nm , +although they still extract it correctly. +.Pp +The compression and decompression is implemented internally, so +there may be insignificant differences between the compressed output +generated by +.Dl Nm Fl czf Pa - file +and that generated by +.Dl Nm Fl cf Pa - file | Nm gzip +.Pp +The default should be to read and write archives to the standard I/O paths, +but tradition (and POSIX) dictates otherwise. +.Pp +The +.Cm r +and +.Cm u +modes require that the archive be uncompressed +and located in a regular file on disk. +Other archives can be modified using +.Cm c +mode with the +.Pa @archive-file +extension. +.Pp +To archive a file called +.Pa @foo +or +.Pa -foo +you must specify it as +.Pa ./@foo +or +.Pa ./-foo , +respectively. +.Pp +In create mode, a leading +.Pa ./ +is always removed. +A leading +.Pa / +is stripped unless the +.Fl P +option is specified. +.Pp +There needs to be better support for file selection on both create +and extract. +.Pp +There is not yet any support for multi-volume archives or for archiving +sparse files. +.Pp +Converting between dissimilar archive formats (such as tar and cpio) using the +.Cm @ Ns Pa - +convention can cause hard link information to be lost. +(This is a consequence of the incompatible ways that different archive +formats store hardlink information.) +.Pp +There are alternative long options for many of the short options that +are deliberately not documented. diff --git a/Utilities/cmlibarchive/tar/bsdtar.c b/Utilities/cmlibarchive/tar/bsdtar.c new file mode 100644 index 000000000..35f6bc67d --- /dev/null +++ b/Utilities/cmlibarchive/tar/bsdtar.c @@ -0,0 +1,730 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_LANGINFO_H +#include +#endif +#ifdef HAVE_LOCALE_H +#include +#endif +#ifdef HAVE_PATHS_H +#include +#endif +#ifdef HAVE_SIGNAL_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#if HAVE_ZLIB_H +#include +#endif + +#include "bsdtar.h" +#include "err.h" + +/* + * Per POSIX.1-1988, tar defaults to reading/writing archives to/from + * the default tape device for the system. Pick something reasonable here. + */ +#ifdef __linux +#define _PATH_DEFTAPE "/dev/st0" +#endif +#if defined(_WIN32) && !defined(__CYGWIN__) +#define _PATH_DEFTAPE "\\\\.\\tape0" +#endif + +#ifndef _PATH_DEFTAPE +#define _PATH_DEFTAPE "/dev/tape" +#endif + +static struct bsdtar *_bsdtar; + +#if defined(SIGINFO) || defined(SIGUSR1) +static volatile int siginfo_occurred; + +static void +siginfo_handler(int sig) +{ + (void)sig; /* UNUSED */ + siginfo_occurred = 1; +} + +int +need_report(void) +{ + int r = siginfo_occurred; + siginfo_occurred = 0; + return (r); +} +#else +int +need_report(void) +{ + return (0); +} +#endif + +/* External function to parse a date/time string */ +time_t get_date(time_t, const char *); + +static 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); + +/* A basic set of security flags to request from libarchive. */ +#define SECURITY \ + (ARCHIVE_EXTRACT_SECURE_SYMLINKS \ + | ARCHIVE_EXTRACT_SECURE_NODOTDOT) + +int +main(int argc, char **argv) +{ + struct bsdtar *bsdtar, bsdtar_storage; + int opt, t; + char option_o; + char possible_help_request; + char buff[16]; + time_t now; + + /* + * Use a pointer for consistency, but stack-allocated storage + * for ease of cleanup. + */ + _bsdtar = bsdtar = &bsdtar_storage; + memset(bsdtar, 0, sizeof(*bsdtar)); + bsdtar->fd = -1; /* Mark as "unused" */ + option_o = 0; + +#if defined(SIGINFO) || defined(SIGUSR1) + { /* Catch SIGINFO and SIGUSR1, if they exist. */ + struct sigaction sa; + sa.sa_handler = siginfo_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; +#ifdef SIGINFO + if (sigaction(SIGINFO, &sa, NULL)) + lafe_errc(1, errno, "sigaction(SIGINFO) failed"); +#endif +#ifdef SIGUSR1 + /* ... and treat SIGUSR1 the same way as SIGINFO. */ + if (sigaction(SIGUSR1, &sa, NULL)) + lafe_errc(1, errno, "sigaction(SIGUSR1) failed"); +#endif + } +#endif + + + /* Need lafe_progname before calling lafe_warnc. */ + if (*argv == NULL) + lafe_progname = "bsdtar"; + else { +#if defined(_WIN32) && !defined(__CYGWIN__) + lafe_progname = strrchr(*argv, '\\'); +#else + lafe_progname = strrchr(*argv, '/'); +#endif + if (lafe_progname != NULL) + lafe_progname++; + else + lafe_progname = *argv; + } + + time(&now); + +#if HAVE_SETLOCALE + if (setlocale(LC_ALL, "") == NULL) + lafe_warnc(0, "Failed to set default locale"); +#endif +#if defined(HAVE_NL_LANGINFO) && defined(HAVE_D_MD_ORDER) + bsdtar->day_first = (*nl_langinfo(D_MD_ORDER) == 'd'); +#endif + possible_help_request = 0; + + /* Look up uid of current user for future reference */ + bsdtar->user_uid = geteuid(); + + /* Default: open tape drive. */ + bsdtar->filename = getenv("TAPE"); + if (bsdtar->filename == NULL) + bsdtar->filename = _PATH_DEFTAPE; + + /* Default: preserve mod time on extract */ + bsdtar->extract_flags = ARCHIVE_EXTRACT_TIME; + + /* Default: Perform basic security checks. */ + bsdtar->extract_flags |= SECURITY; + +#ifndef _WIN32 + /* On POSIX systems, assume --same-owner and -p when run by + * the root user. This doesn't make any sense on Windows. */ + if (bsdtar->user_uid == 0) { + /* --same-owner */ + bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER; + /* -p */ + bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM; + bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL; + bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR; + bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS; + } +#endif + + bsdtar->argv = argv; + bsdtar->argc = argc; + + /* + * Comments following each option indicate where that option + * originated: SUSv2, POSIX, GNU tar, star, etc. If there's + * no such comment, then I don't know of anyone else who + * implements that option. + */ + while ((opt = bsdtar_getopt(bsdtar)) != -1) { + switch (opt) { + case 'B': /* GNU tar */ + /* libarchive doesn't need this; just ignore it. */ + break; + case 'b': /* SUSv2 */ + t = atoi(bsdtar->optarg); + if (t <= 0 || t > 1024) + lafe_errc(1, 0, + "Argument to -b is out of range (1..1024)"); + bsdtar->bytes_per_block = 512 * t; + break; + case 'C': /* GNU tar */ + set_chdir(bsdtar, bsdtar->optarg); + break; + case 'c': /* SUSv2 */ + set_mode(bsdtar, opt); + break; + case OPTION_CHECK_LINKS: /* GNU tar */ + bsdtar->option_warn_links = 1; + break; + case OPTION_CHROOT: /* NetBSD */ + bsdtar->option_chroot = 1; + break; + case OPTION_EXCLUDE: /* GNU tar */ + if (lafe_exclude(&bsdtar->matching, bsdtar->optarg)) + lafe_errc(1, 0, + "Couldn't exclude %s\n", bsdtar->optarg); + break; + case OPTION_FORMAT: /* GNU tar, others */ + bsdtar->create_format = bsdtar->optarg; + break; + case OPTION_OPTIONS: + bsdtar->option_options = bsdtar->optarg; + break; + case 'f': /* SUSv2 */ + bsdtar->filename = bsdtar->optarg; + if (strcmp(bsdtar->filename, "-") == 0) + bsdtar->filename = NULL; + break; + case 'H': /* BSD convention */ + bsdtar->symlink_mode = 'H'; + break; + case 'h': /* Linux Standards Base, gtar; synonym for -L */ + bsdtar->symlink_mode = 'L'; + /* Hack: -h by itself is the "help" command. */ + possible_help_request = 1; + break; + case OPTION_HELP: /* GNU tar, others */ + long_help(); + exit(0); + break; + case 'I': /* GNU tar */ + /* + * TODO: Allow 'names' to come from an archive, + * not just a text file. Design a good UI for + * allowing names and mode/owner to be read + * from an archive, with contents coming from + * disk. This can be used to "refresh" an + * archive or to design archives with special + * permissions without having to create those + * permissions on disk. + */ + bsdtar->names_from_file = bsdtar->optarg; + break; + case OPTION_INCLUDE: + /* + * Noone else has the @archive extension, so + * noone else needs this to filter entries + * when transforming archives. + */ + if (lafe_include(&bsdtar->matching, bsdtar->optarg)) + lafe_errc(1, 0, + "Failed to add %s to inclusion list", + bsdtar->optarg); + break; + case 'j': /* GNU tar */ + if (bsdtar->create_compression != '\0') + lafe_errc(1, 0, + "Can't specify both -%c and -%c", opt, + bsdtar->create_compression); + bsdtar->create_compression = opt; + break; + case 'J': /* GNU tar 1.21 and later */ + if (bsdtar->create_compression != '\0') + lafe_errc(1, 0, + "Can't specify both -%c and -%c", opt, + bsdtar->create_compression); + bsdtar->create_compression = opt; + break; + case 'k': /* GNU tar */ + bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE; + break; + case OPTION_KEEP_NEWER_FILES: /* GNU tar */ + bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER; + break; + case 'L': /* BSD convention */ + bsdtar->symlink_mode = 'L'; + break; + case 'l': /* SUSv2 and GNU tar beginning with 1.16 */ + /* GNU tar 1.13 used -l for --one-file-system */ + bsdtar->option_warn_links = 1; + break; + case OPTION_LZMA: + if (bsdtar->create_compression != '\0') + lafe_errc(1, 0, + "Can't specify both -%c and -%c", opt, + bsdtar->create_compression); + bsdtar->create_compression = opt; + break; + case 'm': /* SUSv2 */ + bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_TIME; + break; + case 'n': /* GNU tar */ + bsdtar->option_no_subdirs = 1; + break; + /* + * Selecting files by time: + * --newer-?time='date' Only files newer than 'date' + * --newer-?time-than='file' Only files newer than time + * on specified file (useful for incremental backups) + * TODO: Add corresponding "older" options to reverse these. + */ + case OPTION_NEWER_CTIME: /* GNU tar */ + bsdtar->newer_ctime_sec = get_date(now, bsdtar->optarg); + break; + case OPTION_NEWER_CTIME_THAN: + { + struct stat st; + if (stat(bsdtar->optarg, &st) != 0) + lafe_errc(1, 0, + "Can't open file %s", bsdtar->optarg); + bsdtar->newer_ctime_sec = st.st_ctime; + bsdtar->newer_ctime_nsec = + ARCHIVE_STAT_CTIME_NANOS(&st); + } + break; + case OPTION_NEWER_MTIME: /* GNU tar */ + bsdtar->newer_mtime_sec = get_date(now, bsdtar->optarg); + break; + case OPTION_NEWER_MTIME_THAN: + { + struct stat st; + if (stat(bsdtar->optarg, &st) != 0) + lafe_errc(1, 0, + "Can't open file %s", bsdtar->optarg); + bsdtar->newer_mtime_sec = st.st_mtime; + bsdtar->newer_mtime_nsec = + ARCHIVE_STAT_MTIME_NANOS(&st); + } + break; + case OPTION_NODUMP: /* star */ + bsdtar->option_honor_nodump = 1; + break; + case OPTION_NO_SAME_OWNER: /* GNU tar */ + bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER; + break; + case OPTION_NO_SAME_PERMISSIONS: /* GNU tar */ + bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_PERM; + bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_ACL; + bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_XATTR; + bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS; + break; + case OPTION_NULL: /* GNU tar */ + bsdtar->option_null++; + break; + case OPTION_NUMERIC_OWNER: /* GNU tar */ + bsdtar->option_numeric_owner++; + break; + case 'O': /* GNU tar */ + bsdtar->option_stdout = 1; + break; + case 'o': /* SUSv2 and GNU conflict here, but not fatally */ + option_o = 1; /* Record it and resolve it later. */ + break; + case OPTION_ONE_FILE_SYSTEM: /* GNU tar */ + bsdtar->option_dont_traverse_mounts = 1; + break; +#if 0 + /* + * The common BSD -P option is not necessary, since + * our default is to archive symlinks, not follow + * them. This is convenient, as -P conflicts with GNU + * tar anyway. + */ + case 'P': /* BSD convention */ + /* Default behavior, no option necessary. */ + break; +#endif + case 'P': /* GNU tar */ + bsdtar->extract_flags &= ~SECURITY; + bsdtar->option_absolute_paths = 1; + break; + case 'p': /* GNU tar, star */ + bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM; + bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL; + bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR; + bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS; + break; + case OPTION_POSIX: /* GNU tar */ + bsdtar->create_format = "pax"; + break; + case 'q': /* FreeBSD GNU tar --fast-read, NetBSD -q */ + bsdtar->option_fast_read = 1; + break; + case 'r': /* SUSv2 */ + set_mode(bsdtar, opt); + break; + case 'S': /* NetBSD pax-as-tar */ + bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE; + break; + case 's': /* NetBSD pax-as-tar */ +#if HAVE_REGEX_H + add_substitution(bsdtar, bsdtar->optarg); +#else + lafe_warnc(0, + "-s is not supported by this version of bsdtar"); + usage(); +#endif + break; + case OPTION_SAME_OWNER: /* GNU tar */ + bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER; + break; + case OPTION_STRIP_COMPONENTS: /* GNU tar 1.15 */ + bsdtar->strip_components = atoi(bsdtar->optarg); + break; + case 'T': /* GNU tar */ + bsdtar->names_from_file = bsdtar->optarg; + break; + case 't': /* SUSv2 */ + set_mode(bsdtar, opt); + bsdtar->verbose++; + break; + case OPTION_TOTALS: /* GNU tar */ + bsdtar->option_totals++; + break; + case 'U': /* GNU tar */ + bsdtar->extract_flags |= ARCHIVE_EXTRACT_UNLINK; + bsdtar->option_unlink_first = 1; + break; + case 'u': /* SUSv2 */ + set_mode(bsdtar, opt); + break; + case 'v': /* SUSv2 */ + bsdtar->verbose++; + break; + case OPTION_VERSION: /* GNU convention */ + version(); + break; +#if 0 + /* + * The -W longopt feature is handled inside of + * bsdtar_getopt(), so -W is not available here. + */ + case 'W': /* Obscure GNU convention. */ + break; +#endif + case 'w': /* SUSv2 */ + bsdtar->option_interactive = 1; + break; + case 'X': /* GNU tar */ + if (lafe_exclude_from_file(&bsdtar->matching, bsdtar->optarg)) + lafe_errc(1, 0, + "failed to process exclusions from file %s", + bsdtar->optarg); + break; + case 'x': /* SUSv2 */ + set_mode(bsdtar, opt); + break; + case 'y': /* FreeBSD version of GNU tar */ + if (bsdtar->create_compression != '\0') + lafe_errc(1, 0, + "Can't specify both -%c and -%c", opt, + bsdtar->create_compression); + bsdtar->create_compression = opt; + break; + case 'Z': /* GNU tar */ + if (bsdtar->create_compression != '\0') + lafe_errc(1, 0, + "Can't specify both -%c and -%c", opt, + bsdtar->create_compression); + bsdtar->create_compression = opt; + break; + case 'z': /* GNU tar, star, many others */ + if (bsdtar->create_compression != '\0') + lafe_errc(1, 0, + "Can't specify both -%c and -%c", opt, + bsdtar->create_compression); + bsdtar->create_compression = opt; + break; + case OPTION_USE_COMPRESS_PROGRAM: + bsdtar->compress_program = bsdtar->optarg; + break; + default: + usage(); + } + } + + /* + * Sanity-check options. + */ + + /* 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. */ + if (bsdtar->mode == '\0') + lafe_errc(1, 0, + "Must specify one of -c, -r, -t, -u, -x"); + + /* Check boolean options only permitted in certain modes. */ + if (bsdtar->option_dont_traverse_mounts) + only_mode(bsdtar, "--one-file-system", "cru"); + if (bsdtar->option_fast_read) + only_mode(bsdtar, "--fast-read", "xt"); + if (bsdtar->option_honor_nodump) + only_mode(bsdtar, "--nodump", "cru"); + if (option_o > 0) { + switch (bsdtar->mode) { + case 'c': + /* + * In GNU tar, -o means "old format." The + * "ustar" format is the closest thing + * supported by libarchive. + */ + bsdtar->create_format = "ustar"; + /* TODO: bsdtar->create_format = "v7"; */ + break; + case 'x': + /* POSIX-compatible behavior. */ + bsdtar->option_no_owner = 1; + bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER; + break; + default: + only_mode(bsdtar, "-o", "xc"); + break; + } + } + if (bsdtar->option_no_subdirs) + only_mode(bsdtar, "-n", "cru"); + if (bsdtar->option_stdout) + only_mode(bsdtar, "-O", "xt"); + if (bsdtar->option_unlink_first) + only_mode(bsdtar, "-U", "x"); + if (bsdtar->option_warn_links) + only_mode(bsdtar, "--check-links", "cr"); + + /* Check other parameters only permitted in certain modes. */ + if (bsdtar->create_compression != '\0') { + strcpy(buff, "-?"); + buff[1] = bsdtar->create_compression; + only_mode(bsdtar, buff, "cxt"); + } + if (bsdtar->create_format != NULL) + only_mode(bsdtar, "--format", "cru"); + if (bsdtar->symlink_mode != '\0') { + strcpy(buff, "-?"); + buff[1] = bsdtar->symlink_mode; + only_mode(bsdtar, buff, "cru"); + } + if (bsdtar->strip_components != 0) + only_mode(bsdtar, "--strip-components", "xt"); + + switch(bsdtar->mode) { + case 'c': + tar_mode_c(bsdtar); + break; + case 'r': + tar_mode_r(bsdtar); + break; + case 't': + tar_mode_t(bsdtar); + break; + case 'u': + tar_mode_u(bsdtar); + break; + case 'x': + tar_mode_x(bsdtar); + break; + } + + lafe_cleanup_exclusions(&bsdtar->matching); +#if HAVE_REGEX_H + cleanup_substitution(bsdtar); +#endif + + if (bsdtar->return_value != 0) + lafe_warnc(0, + "Error exit delayed from previous errors."); + return (bsdtar->return_value); +} + +static void +set_mode(struct bsdtar *bsdtar, char opt) +{ + if (bsdtar->mode != '\0' && bsdtar->mode != opt) + lafe_errc(1, 0, + "Can't specify both -%c and -%c", opt, bsdtar->mode); + bsdtar->mode = opt; +} + +/* + * Verify that the mode is correct. + */ +static void +only_mode(struct bsdtar *bsdtar, const char *opt, const char *valid_modes) +{ + if (strchr(valid_modes, bsdtar->mode) == NULL) + lafe_errc(1, 0, + "Option %s is not permitted in mode -%c", + opt, bsdtar->mode); +} + + +void +usage(void) +{ + const char *p; + + p = lafe_progname; + + fprintf(stderr, "Usage:\n"); + fprintf(stderr, " List: %s -tf \n", p); + fprintf(stderr, " Extract: %s -xf \n", p); + fprintf(stderr, " Create: %s -cf [filenames...]\n", p); + fprintf(stderr, " Help: %s --help\n", p); + exit(1); +} + +static void +version(void) +{ + printf("bsdtar %s - %s\n", + BSDTAR_VERSION_STRING, + archive_version()); + exit(0); +} + +static const char *long_help_msg = + "First option must be a mode specifier:\n" + " -c Create -r Add/Replace -t List -u Update -x Extract\n" + "Common Options:\n" + " -b # Use # 512-byte records per I/O block\n" + " -f Location of archive (default " _PATH_DEFTAPE ")\n" + " -v Verbose\n" + " -w Interactive\n" + "Create: %p -c [options] [ | | @ | -C ]\n" + " , add these items to archive\n" + " -z, -j, -J, --lzma Compress archive with gzip/bzip2/xz/lzma\n" + " --format {ustar|pax|cpio|shar} Select archive format\n" + " --exclude Skip files that match pattern\n" + " -C Change to before processing remaining files\n" + " @ Add entries from to output\n" + "List: %p -t [options] []\n" + " If specified, list only entries that match\n" + "Extract: %p -x [options] []\n" + " If specified, extract only entries that match\n" + " -k Keep (don't overwrite) existing files\n" + " -m Don't restore modification times\n" + " -O Write entries to stdout, don't restore to disk\n" + " -p Restore permissions (including ACLs, owner, file flags)\n"; + + +/* + * Note that the word 'bsdtar' will always appear in the first line + * of output. + * + * In particular, /bin/sh scripts that need to test for the presence + * of bsdtar can use the following template: + * + * if (tar --help 2>&1 | grep bsdtar >/dev/null 2>&1 ) then \ + * echo bsdtar; else echo not bsdtar; fi + */ +static void +long_help(void) +{ + const char *prog; + const char *p; + + prog = lafe_progname; + + fflush(stderr); + + p = (strcmp(prog,"bsdtar") != 0) ? "(bsdtar)" : ""; + printf("%s%s: manipulate archive files\n", prog, p); + + for (p = long_help_msg; *p != '\0'; p++) { + if (*p == '%') { + if (p[1] == 'p') { + fputs(prog, stdout); + p++; + } else + putchar('%'); + } else + putchar(*p); + } + version(); +} diff --git a/Utilities/cmlibarchive/tar/bsdtar.h b/Utilities/cmlibarchive/tar/bsdtar.h new file mode 100644 index 000000000..9dfe843d6 --- /dev/null +++ b/Utilities/cmlibarchive/tar/bsdtar.h @@ -0,0 +1,157 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/usr.bin/tar/bsdtar.h,v 1.37 2008/12/06 07:37:14 kientzle Exp $ + */ + +#include "bsdtar_platform.h" +#include + +#include "matching.h" + +#define DEFAULT_BYTES_PER_BLOCK (20*512) + +/* + * The internal state for the "bsdtar" program. + * + * Keeping all of the state in a structure like this simplifies memory + * leak testing (at exit, anything left on the heap is suspect). A + * pointer to this structure is passed to most bsdtar internal + * functions. + */ +struct bsdtar { + /* Options */ + const char *filename; /* -f filename */ + const char *create_format; /* -F format */ + char *pending_chdir; /* -C dir */ + const char *names_from_file; /* -T file */ + time_t newer_ctime_sec; /* --newer/--newer-than */ + long newer_ctime_nsec; /* --newer/--newer-than */ + time_t newer_mtime_sec; /* --newer-mtime */ + long newer_mtime_nsec; /* --newer-mtime-than */ + int bytes_per_block; /* -b block_size */ + int verbose; /* -v */ + int extract_flags; /* Flags for extract operation */ + int strip_components; /* Remove this many leading dirs */ + char mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */ + char symlink_mode; /* H or L, per BSD conventions */ + char create_compression; /* j, y, or z */ + const char *compress_program; + char option_absolute_paths; /* -P */ + char option_chroot; /* --chroot */ + char option_dont_traverse_mounts; /* --one-file-system */ + char option_fast_read; /* --fast-read */ + const char *option_options; /* --options */ + char option_honor_nodump; /* --nodump */ + char option_interactive; /* -w */ + char option_no_owner; /* -o */ + char option_no_subdirs; /* -n */ + char option_null; /* --null */ + char option_numeric_owner; /* --numeric-owner */ + char option_stdout; /* -O */ + char option_totals; /* --totals */ + char option_unlink_first; /* -U */ + char option_warn_links; /* --check-links */ + char day_first; /* show day before month in -tv output */ + + /* If >= 0, then close this when done. */ + int fd; + + /* Miscellaneous state information */ + int argc; + char **argv; + const char *optarg; + size_t gs_width; /* For 'list_item' in read.c */ + size_t u_width; /* for 'list_item' in read.c */ + uid_t user_uid; /* UID running this program */ + int return_value; /* Value returned by main() */ + char warned_lead_slash; /* Already displayed warning */ + char next_line_is_dir; /* Used for -C parsing in -cT */ + + /* + * Data for various subsystems. Full definitions are located in + * the file where they are used. + */ + struct archive *diskreader; /* for write.c */ + struct archive_entry_linkresolver *resolver; /* for write.c */ + struct archive_dir *archive_dir; /* for write.c */ + struct name_cache *gname_cache; /* for write.c */ + char *buff; /* for write.c */ + struct lafe_matching *matching; /* for matching.c */ + struct security *security; /* for read.c */ + struct name_cache *uname_cache; /* for write.c */ + struct siginfo_data *siginfo; /* for siginfo.c */ + struct substitution *substitution; /* for subst.c */ +}; + +/* Fake short equivalents for long options that otherwise lack them. */ +enum { + OPTION_CHECK_LINKS = 1, + OPTION_CHROOT, + OPTION_EXCLUDE, + OPTION_FORMAT, + OPTION_OPTIONS, + OPTION_HELP, + OPTION_INCLUDE, + OPTION_KEEP_NEWER_FILES, + OPTION_LZMA, + OPTION_NEWER_CTIME, + OPTION_NEWER_CTIME_THAN, + OPTION_NEWER_MTIME, + OPTION_NEWER_MTIME_THAN, + OPTION_NODUMP, + OPTION_NO_SAME_OWNER, + OPTION_NO_SAME_PERMISSIONS, + OPTION_NULL, + OPTION_NUMERIC_OWNER, + OPTION_ONE_FILE_SYSTEM, + OPTION_POSIX, + OPTION_SAME_OWNER, + OPTION_STRIP_COMPONENTS, + OPTION_TOTALS, + OPTION_USE_COMPRESS_PROGRAM, + OPTION_VERSION +}; + + +int bsdtar_getopt(struct bsdtar *); +void do_chdir(struct bsdtar *); +int edit_pathname(struct bsdtar *, struct archive_entry *); +int need_report(void); +int pathcmp(const char *a, const char *b); +void safe_fprintf(FILE *, const char *fmt, ...); +void set_chdir(struct bsdtar *, const char *newdir); +void tar_mode_c(struct bsdtar *bsdtar); +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); +int yes(const char *fmt, ...); + +#if HAVE_REGEX_H +void add_substitution(struct bsdtar *, const char *); +int apply_substitution(struct bsdtar *, const char *, char **, int); +void cleanup_substitution(struct bsdtar *); +#endif diff --git a/Utilities/cmlibarchive/tar/bsdtar_platform.h b/Utilities/cmlibarchive/tar/bsdtar_platform.h new file mode 100644 index 000000000..b532f04ed --- /dev/null +++ b/Utilities/cmlibarchive/tar/bsdtar_platform.h @@ -0,0 +1,149 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/usr.bin/tar/bsdtar_platform.h,v 1.26 2008/12/06 07:37:14 kientzle Exp $ + */ + +/* + * This header is the first thing included in any of the bsdtar + * source files. As far as possible, platform-specific issues should + * be dealt with here and not within individual source files. + */ + +#ifndef BSDTAR_PLATFORM_H_INCLUDED +#define BSDTAR_PLATFORM_H_INCLUDED + +#if defined(PLATFORM_CONFIG_H) +/* Use hand-built config.h in environments that need it. */ +#include PLATFORM_CONFIG_H +#else +/* Not having a config.h of some sort is a serious problem. */ +#include "config.h" +#endif + +/* 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 +#include +#else +/* Otherwise, include user headers. */ +#include "archive.h" +#include "archive_entry.h" +#endif + +#ifdef HAVE_LIBACL +#include +#endif + +/* + * Include "dirent.h" (or it's equivalent on several different platforms). + * + * This is slightly modified from the GNU autoconf recipe. + * In particular, FreeBSD includes d_namlen in it's dirent structure, + * so my configure script includes an explicit test for the d_namlen + * field. + */ +#if HAVE_DIRENT_H +# include +# if HAVE_DIRENT_D_NAMLEN +# define DIRENT_NAMLEN(dirent) (dirent)->d_namlen +# else +# define DIRENT_NAMLEN(dirent) strlen((dirent)->d_name) +# endif +#else +# define dirent direct +# define DIRENT_NAMLEN(dirent) (dirent)->d_namlen +# if HAVE_SYS_NDIR_H +# include +# endif +# if HAVE_SYS_DIR_H +# include +# endif +# if HAVE_NDIR_H +# include +# endif +#endif + + +/* + * We need to be able to display a filesize using printf(). The type + * and format string here must be compatible with one another and + * large enough for any file. + */ +#if HAVE_UINTMAX_T +#define BSDTAR_FILESIZE_TYPE uintmax_t +#define BSDTAR_FILESIZE_PRINTF "%ju" +#else +#if HAVE_UNSIGNED_LONG_LONG +#define BSDTAR_FILESIZE_TYPE unsigned long long +#define BSDTAR_FILESIZE_PRINTF "%llu" +#else +#define BSDTAR_FILESIZE_TYPE unsigned long +#define BSDTAR_FILESIZE_PRINTF "%lu" +#endif +#endif + +#if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC +#define ARCHIVE_STAT_CTIME_NANOS(st) (st)->st_ctimespec.tv_nsec +#define ARCHIVE_STAT_MTIME_NANOS(st) (st)->st_mtimespec.tv_nsec +#elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC +#define ARCHIVE_STAT_CTIME_NANOS(st) (st)->st_ctim.tv_nsec +#define ARCHIVE_STAT_MTIME_NANOS(st) (st)->st_mtim.tv_nsec +#elif HAVE_STRUCT_STAT_ST_MTIME_N +#define ARCHIVE_STAT_CTIME_NANOS(st) (st)->st_ctime_n +#define ARCHIVE_STAT_MTIME_NANOS(st) (st)->st_mtime_n +#elif HAVE_STRUCT_STAT_ST_UMTIME +#define ARCHIVE_STAT_CTIME_NANOS(st) (st)->st_uctime * 1000 +#define ARCHIVE_STAT_MTIME_NANOS(st) (st)->st_umtime * 1000 +#elif HAVE_STRUCT_STAT_ST_MTIME_USEC +#define ARCHIVE_STAT_CTIME_NANOS(st) (st)->st_ctime_usec * 1000 +#define ARCHIVE_STAT_MTIME_NANOS(st) (st)->st_mtime_usec * 1000 +#else +#define ARCHIVE_STAT_CTIME_NANOS(st) (0) +#define ARCHIVE_STAT_MTIME_NANOS(st) (0) +#endif + +/* How to mark functions that don't return. */ +/* This facilitates use of some newer static code analysis tools. */ +#undef __LA_DEAD +#if defined(__GNUC__) && (__GNUC__ > 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_DEAD __attribute__((__noreturn__)) +#else +#define __LA_DEAD +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include "bsdtar_windows.h" +#endif + +#endif /* !BSDTAR_PLATFORM_H_INCLUDED */ diff --git a/Utilities/cmlibarchive/tar/bsdtar_windows.c b/Utilities/cmlibarchive/tar/bsdtar_windows.c new file mode 100644 index 000000000..1c8008e7e --- /dev/null +++ b/Utilities/cmlibarchive/tar/bsdtar_windows.c @@ -0,0 +1,296 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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. + * + * $FreeBSD$ + */ + +#if defined(_WIN32) && !defined(__CYGWIN__) + +#include "bsdtar_platform.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bsdtar.h" +#include "err.h" + +/* This may actually not be needed anymore. + * TODO: Review the error handling for chdir() failures and + * simply dump this if it's not really needed. */ +static void __tar_dosmaperr(unsigned long); + +/* + * Prepend "\\?\" to the path name and convert it to unicode to permit + * an extended-length path for a maximum total path length of 32767 + * characters. + * see also http://msdn.microsoft.com/en-us/library/aa365247.aspx + */ +static wchar_t * +permissive_name(const char *name) +{ + wchar_t *wn, *wnp; + wchar_t *ws, *wsp; + size_t l, len, slen, alloclen; + int unc; + + len = strlen(name); + wn = malloc((len + 1) * sizeof(wchar_t)); + if (wn == NULL) + return (NULL); + l = MultiByteToWideChar(CP_ACP, 0, name, len, wn, len); + if (l == 0) { + free(wn); + return (NULL); + } + wn[l] = L'\0'; + + /* Get a full path names */ + l = GetFullPathNameW(wn, 0, NULL, NULL); + if (l == 0) { + free(wn); + return (NULL); + } + wnp = malloc(l * sizeof(wchar_t)); + if (wnp == NULL) { + free(wn); + return (NULL); + } + len = GetFullPathNameW(wn, l, wnp, NULL); + free(wn); + wn = wnp; + + if (wnp[0] == L'\\' && wnp[1] == L'\\' && + wnp[2] == L'?' && wnp[3] == L'\\') + /* We have already permissive names. */ + return (wn); + + if (wnp[0] == L'\\' && wnp[1] == L'\\' && + wnp[2] == L'.' && wnp[3] == L'\\') { + /* Device names */ + if (((wnp[4] >= L'a' && wnp[4] <= L'z') || + (wnp[4] >= L'A' && wnp[4] <= L'Z')) && + wnp[5] == L':' && wnp[6] == L'\\') + wnp[2] = L'?';/* Not device names. */ + return (wn); + } + + unc = 0; + if (wnp[0] == L'\\' && wnp[1] == L'\\' && wnp[2] != L'\\') { + wchar_t *p = &wnp[2]; + + /* Skip server-name letters. */ + while (*p != L'\\' && *p != L'\0') + ++p; + if (*p == L'\\') { + wchar_t *rp = ++p; + /* Skip share-name letters. */ + while (*p != L'\\' && *p != L'\0') + ++p; + if (*p == L'\\' && p != rp) { + /* Now, match patterns such as + * "\\server-name\share-name\" */ + wnp += 2; + len -= 2; + unc = 1; + } + } + } + + alloclen = slen = 4 + (unc * 4) + len + 1; + ws = wsp = malloc(slen * sizeof(wchar_t)); + if (ws == NULL) { + free(wn); + return (NULL); + } + /* prepend "\\?\" */ + wcsncpy(wsp, L"\\\\?\\", 4); + wsp += 4; + slen -= 4; + if (unc) { + /* append "UNC\" ---> "\\?\UNC\" */ + wcsncpy(wsp, L"UNC\\", 4); + wsp += 4; + slen -= 4; + } + wcsncpy(wsp, wnp, slen); + free(wn); + ws[alloclen - 1] = L'\0'; + return (ws); +} + +int +__tar_chdir(const char *path) +{ + wchar_t *ws; + int r; + + r = SetCurrentDirectoryA(path); + if (r == 0) { + if (GetLastError() != ERROR_FILE_NOT_FOUND) { + __tar_dosmaperr(GetLastError()); + return (-1); + } + } else + return (0); + ws = permissive_name(path); + if (ws == NULL) { + errno = EINVAL; + return (-1); + } + r = SetCurrentDirectoryW(ws); + free(ws); + if (r == 0) { + __tar_dosmaperr(GetLastError()); + return (-1); + } + return (0); +} + +/* + * The following function was modified from PostgreSQL sources and is + * subject to the copyright below. + */ +/*------------------------------------------------------------------------- + * + * win32error.c + * Map win32 error codes to errno values + * + * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + * + * IDENTIFICATION + * $PostgreSQL: pgsql/src/port/win32error.c,v 1.4 2008/01/01 19:46:00 momjian Exp $ + * + *------------------------------------------------------------------------- + */ +/* +PostgreSQL Database Management System +(formerly known as Postgres, then as Postgres95) + +Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +*/ + +static const struct { + DWORD winerr; + int doserr; +} doserrors[] = +{ + { ERROR_INVALID_FUNCTION, EINVAL }, + { ERROR_FILE_NOT_FOUND, ENOENT }, + { ERROR_PATH_NOT_FOUND, ENOENT }, + { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, + { ERROR_ACCESS_DENIED, EACCES }, + { ERROR_INVALID_HANDLE, EBADF }, + { ERROR_ARENA_TRASHED, ENOMEM }, + { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, + { ERROR_INVALID_BLOCK, ENOMEM }, + { ERROR_BAD_ENVIRONMENT, E2BIG }, + { ERROR_BAD_FORMAT, ENOEXEC }, + { ERROR_INVALID_ACCESS, EINVAL }, + { ERROR_INVALID_DATA, EINVAL }, + { ERROR_INVALID_DRIVE, ENOENT }, + { ERROR_CURRENT_DIRECTORY, EACCES }, + { ERROR_NOT_SAME_DEVICE, EXDEV }, + { ERROR_NO_MORE_FILES, ENOENT }, + { ERROR_LOCK_VIOLATION, EACCES }, + { ERROR_SHARING_VIOLATION, EACCES }, + { ERROR_BAD_NETPATH, ENOENT }, + { ERROR_NETWORK_ACCESS_DENIED, EACCES }, + { ERROR_BAD_NET_NAME, ENOENT }, + { ERROR_FILE_EXISTS, EEXIST }, + { ERROR_CANNOT_MAKE, EACCES }, + { ERROR_FAIL_I24, EACCES }, + { ERROR_INVALID_PARAMETER, EINVAL }, + { ERROR_NO_PROC_SLOTS, EAGAIN }, + { ERROR_DRIVE_LOCKED, EACCES }, + { ERROR_BROKEN_PIPE, EPIPE }, + { ERROR_DISK_FULL, ENOSPC }, + { ERROR_INVALID_TARGET_HANDLE, EBADF }, + { ERROR_INVALID_HANDLE, EINVAL }, + { ERROR_WAIT_NO_CHILDREN, ECHILD }, + { ERROR_CHILD_NOT_COMPLETE, ECHILD }, + { ERROR_DIRECT_ACCESS_HANDLE, EBADF }, + { ERROR_NEGATIVE_SEEK, EINVAL }, + { ERROR_SEEK_ON_DEVICE, EACCES }, + { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, + { ERROR_NOT_LOCKED, EACCES }, + { ERROR_BAD_PATHNAME, ENOENT }, + { ERROR_MAX_THRDS_REACHED, EAGAIN }, + { ERROR_LOCK_FAILED, EACCES }, + { ERROR_ALREADY_EXISTS, EEXIST }, + { ERROR_FILENAME_EXCED_RANGE, ENOENT }, + { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, + { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } +}; + +static void +__tar_dosmaperr(unsigned long e) +{ + int i; + + if (e == 0) { + errno = 0; + return; + } + + for (i = 0; i < sizeof(doserrors); i++) { + if (doserrors[i].winerr == e) { + errno = doserrors[i].doserr; + return; + } + } + + /* fprintf(stderr, "unrecognized win32 error code: %lu", e); */ + errno = EINVAL; + return; +} + +#endif diff --git a/Utilities/cmlibarchive/tar/bsdtar_windows.h b/Utilities/cmlibarchive/tar/bsdtar_windows.h new file mode 100644 index 000000000..9761d4872 --- /dev/null +++ b/Utilities/cmlibarchive/tar/bsdtar_windows.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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. + * + * $FreeBSD$ + */ + +#ifndef BSDTAR_WINDOWS_H +#define BSDTAR_WINDOWS_H 1 +#include +#include + +#ifndef PRId64 +#define PRId64 "I64" +#endif +#define geteuid() 0 + +#ifndef S_IFIFO +#define S_IFIFO 0010000 /* pipe */ +#endif + +#include /* Must include before redefining 'strdup' */ +#define strdup _strdup +#define read _read +#define getcwd _getcwd + +#define chdir __tar_chdir +int __tar_chdir(const char *); + +#ifndef S_ISREG +#define S_ISREG(a) (a & _S_IFREG) +#endif +#ifndef S_ISBLK +#define S_ISBLK(a) (0) +#endif + +#endif /* BSDTAR_WINDOWS_H */ diff --git a/Utilities/cmlibarchive/tar/cmdline.c b/Utilities/cmlibarchive/tar/cmdline.c new file mode 100644 index 000000000..3a7ce372c --- /dev/null +++ b/Utilities/cmlibarchive/tar/cmdline.c @@ -0,0 +1,381 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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. + */ + +/* + * Command line parser for tar. + */ + +#include "bsdtar_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "bsdtar.h" +#include "err.h" + +/* + * Short options for tar. Please keep this sorted. + */ +static const char *short_options + = "Bb:C:cf:HhI:JjkLlmnOoPpqrSs:T:tUuvW:wX:xyZz"; + +/* + * Long options for tar. Please keep this list sorted. + * + * The symbolic names for options that lack a short equivalent are + * defined in bsdtar.h. Also note that so far I've found no need + * to support optional arguments to long options. That would be + * a small change to the code below. + */ + +static struct option { + const char *name; + int required; /* 1 if this option requires an argument. */ + int equivalent; /* Equivalent short option. */ +} tar_longopts[] = { + { "absolute-paths", 0, 'P' }, + { "append", 0, 'r' }, + { "block-size", 1, 'b' }, + { "bunzip2", 0, 'j' }, + { "bzip", 0, 'j' }, + { "bzip2", 0, 'j' }, + { "cd", 1, 'C' }, + { "check-links", 0, OPTION_CHECK_LINKS }, + { "chroot", 0, OPTION_CHROOT }, + { "compress", 0, 'Z' }, + { "confirmation", 0, 'w' }, + { "create", 0, 'c' }, + { "dereference", 0, 'L' }, + { "directory", 1, 'C' }, + { "exclude", 1, OPTION_EXCLUDE }, + { "exclude-from", 1, 'X' }, + { "extract", 0, 'x' }, + { "fast-read", 0, 'q' }, + { "file", 1, 'f' }, + { "files-from", 1, 'T' }, + { "format", 1, OPTION_FORMAT }, + { "options", 1, OPTION_OPTIONS }, + { "gunzip", 0, 'z' }, + { "gzip", 0, 'z' }, + { "help", 0, OPTION_HELP }, + { "include", 1, OPTION_INCLUDE }, + { "interactive", 0, 'w' }, + { "insecure", 0, 'P' }, + { "keep-newer-files", 0, OPTION_KEEP_NEWER_FILES }, + { "keep-old-files", 0, 'k' }, + { "list", 0, 't' }, + { "lzma", 0, OPTION_LZMA }, + { "modification-time", 0, 'm' }, + { "newer", 1, OPTION_NEWER_CTIME }, + { "newer-ctime", 1, OPTION_NEWER_CTIME }, + { "newer-ctime-than", 1, OPTION_NEWER_CTIME_THAN }, + { "newer-mtime", 1, OPTION_NEWER_MTIME }, + { "newer-mtime-than", 1, OPTION_NEWER_MTIME_THAN }, + { "newer-than", 1, OPTION_NEWER_CTIME_THAN }, + { "nodump", 0, OPTION_NODUMP }, + { "norecurse", 0, 'n' }, + { "no-recursion", 0, 'n' }, + { "no-same-owner", 0, OPTION_NO_SAME_OWNER }, + { "no-same-permissions", 0, OPTION_NO_SAME_PERMISSIONS }, + { "null", 0, OPTION_NULL }, + { "numeric-owner", 0, OPTION_NUMERIC_OWNER }, + { "one-file-system", 0, OPTION_ONE_FILE_SYSTEM }, + { "posix", 0, OPTION_POSIX }, + { "preserve-permissions", 0, 'p' }, + { "read-full-blocks", 0, 'B' }, + { "same-owner", 0, OPTION_SAME_OWNER }, + { "same-permissions", 0, 'p' }, + { "strip-components", 1, OPTION_STRIP_COMPONENTS }, + { "to-stdout", 0, 'O' }, + { "totals", 0, OPTION_TOTALS }, + { "uncompress", 0, 'Z' }, + { "unlink", 0, 'U' }, + { "unlink-first", 0, 'U' }, + { "update", 0, 'u' }, + { "use-compress-program", 1, OPTION_USE_COMPRESS_PROGRAM }, + { "verbose", 0, 'v' }, + { "version", 0, OPTION_VERSION }, + { "xz", 0, 'J' }, + { NULL, 0, 0 } +}; + +/* + * This getopt implementation has two key features that common + * getopt_long() implementations lack. Apart from those, it's a + * straightforward option parser, considerably simplified by not + * needing to support the wealth of exotic getopt_long() features. It + * has, of course, been shamelessly tailored for bsdtar. (If you're + * looking for a generic getopt_long() implementation for your + * project, I recommend Gregory Pietsch's public domain getopt_long() + * implementation.) The two additional features are: + * + * Old-style tar arguments: The original tar implementation treated + * the first argument word as a list of single-character option + * letters. All arguments follow as separate words. For example, + * tar xbf 32 /dev/tape + * Here, the "xbf" is three option letters, "32" is the argument for + * "b" and "/dev/tape" is the argument for "f". We support this usage + * if the first command-line argument does not begin with '-'. We + * also allow regular short and long options to follow, e.g., + * tar xbf 32 /dev/tape -P --format=pax + * + * -W long options: There's an obscure GNU convention (only rarely + * supported even there) that allows "-W option=argument" as an + * alternative way to support long options. This was supported in + * early bsdtar as a way to access long options on platforms that did + * not support getopt_long() and is preserved here for backwards + * compatibility. (Of course, if I'd started with a custom + * command-line parser from the beginning, I would have had normal + * long option support on every platform so that hack wouldn't have + * been necessary. Oh, well. Some mistakes you just have to live + * with.) + * + * TODO: We should be able to use this to pull files and intermingled + * options (such as -C) from the command line in write mode. That + * will require a little rethinking of the argument handling in + * bsdtar.c. + * + * TODO: If we want to support arbitrary command-line options from -T + * input (as GNU tar does), we may need to extend this to handle option + * words from sources other than argv/arc. I'm not really sure if I + * like that feature of GNU tar, so it's certainly not a priority. + */ + +int +bsdtar_getopt(struct bsdtar *bsdtar) +{ + enum { state_start = 0, state_old_tar, state_next_word, + state_short, state_long }; + static int state = state_start; + static char *opt_word; + + const struct option *popt, *match = NULL, *match2 = NULL; + const char *p, *long_prefix = "--"; + size_t optlength; + int opt = '?'; + int required = 0; + + bsdtar->optarg = NULL; + + /* First time through, initialize everything. */ + if (state == state_start) { + /* Skip program name. */ + ++bsdtar->argv; + --bsdtar->argc; + if (*bsdtar->argv == NULL) + return (-1); + /* Decide between "new style" and "old style" arguments. */ + if (bsdtar->argv[0][0] == '-') { + state = state_next_word; + } else { + state = state_old_tar; + opt_word = *bsdtar->argv++; + --bsdtar->argc; + } + } + + /* + * We're parsing old-style tar arguments + */ + if (state == state_old_tar) { + /* Get the next option character. */ + opt = *opt_word++; + if (opt == '\0') { + /* New-style args can follow old-style. */ + state = state_next_word; + } else { + /* See if it takes an argument. */ + p = strchr(short_options, opt); + if (p == NULL) + return ('?'); + if (p[1] == ':') { + bsdtar->optarg = *bsdtar->argv; + if (bsdtar->optarg == NULL) { + lafe_warnc(0, + "Option %c requires an argument", + opt); + return ('?'); + } + ++bsdtar->argv; + --bsdtar->argc; + } + } + } + + /* + * We're ready to look at the next word in argv. + */ + if (state == state_next_word) { + /* No more arguments, so no more options. */ + if (bsdtar->argv[0] == NULL) + return (-1); + /* Doesn't start with '-', so no more options. */ + if (bsdtar->argv[0][0] != '-') + return (-1); + /* "--" marks end of options; consume it and return. */ + if (strcmp(bsdtar->argv[0], "--") == 0) { + ++bsdtar->argv; + --bsdtar->argc; + return (-1); + } + /* Get next word for parsing. */ + opt_word = *bsdtar->argv++; + --bsdtar->argc; + if (opt_word[1] == '-') { + /* Set up long option parser. */ + state = state_long; + opt_word += 2; /* Skip leading '--' */ + } else { + /* Set up short option parser. */ + state = state_short; + ++opt_word; /* Skip leading '-' */ + } + } + + /* + * We're parsing a group of POSIX-style single-character options. + */ + if (state == state_short) { + /* Peel next option off of a group of short options. */ + opt = *opt_word++; + if (opt == '\0') { + /* End of this group; recurse to get next option. */ + state = state_next_word; + return bsdtar_getopt(bsdtar); + } + + /* Does this option take an argument? */ + p = strchr(short_options, opt); + if (p == NULL) + return ('?'); + if (p[1] == ':') + required = 1; + + /* If it takes an argument, parse that. */ + if (required) { + /* If arg is run-in, opt_word already points to it. */ + if (opt_word[0] == '\0') { + /* Otherwise, pick up the next word. */ + opt_word = *bsdtar->argv; + if (opt_word == NULL) { + lafe_warnc(0, + "Option -%c requires an argument", + opt); + return ('?'); + } + ++bsdtar->argv; + --bsdtar->argc; + } + if (opt == 'W') { + state = state_long; + long_prefix = "-W "; /* For clearer errors. */ + } else { + state = state_next_word; + bsdtar->optarg = opt_word; + } + } + } + + /* We're reading a long option, including -W long=arg convention. */ + if (state == state_long) { + /* After this long option, we'll be starting a new word. */ + state = state_next_word; + + /* Option name ends at '=' if there is one. */ + p = strchr(opt_word, '='); + if (p != NULL) { + optlength = (size_t)(p - opt_word); + bsdtar->optarg = (char *)(uintptr_t)(p + 1); + } else { + optlength = strlen(opt_word); + } + + /* Search the table for an unambiguous match. */ + for (popt = tar_longopts; popt->name != NULL; popt++) { + /* Short-circuit if first chars don't match. */ + if (popt->name[0] != opt_word[0]) + continue; + /* If option is a prefix of name in table, record it.*/ + if (strncmp(opt_word, popt->name, optlength) == 0) { + match2 = match; /* Record up to two matches. */ + match = popt; + /* If it's an exact match, we're done. */ + if (strlen(popt->name) == optlength) { + match2 = NULL; /* Forget the others. */ + break; + } + } + } + + /* Fail if there wasn't a unique match. */ + if (match == NULL) { + lafe_warnc(0, + "Option %s%s is not supported", + long_prefix, opt_word); + return ('?'); + } + if (match2 != NULL) { + lafe_warnc(0, + "Ambiguous option %s%s (matches --%s and --%s)", + long_prefix, opt_word, match->name, match2->name); + return ('?'); + } + + /* We've found a unique match; does it need an argument? */ + if (match->required) { + /* Argument required: get next word if necessary. */ + if (bsdtar->optarg == NULL) { + bsdtar->optarg = *bsdtar->argv; + if (bsdtar->optarg == NULL) { + lafe_warnc(0, + "Option %s%s requires an argument", + long_prefix, match->name); + return ('?'); + } + ++bsdtar->argv; + --bsdtar->argc; + } + } else { + /* Argument forbidden: fail if there is one. */ + if (bsdtar->optarg != NULL) { + lafe_warnc(0, + "Option %s%s does not allow an argument", + long_prefix, match->name); + return ('?'); + } + } + return (match->equivalent); + } + + return (opt); +} diff --git a/Utilities/cmlibarchive/tar/config_freebsd.h b/Utilities/cmlibarchive/tar/config_freebsd.h new file mode 100644 index 000000000..585ee9f9d --- /dev/null +++ b/Utilities/cmlibarchive/tar/config_freebsd.h @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $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. */ + +#include /* __FreeBSD_version */ + +#undef HAVE_ATTR_XATTR_H +#define HAVE_CHROOT 1 +#define HAVE_DIRENT_D_NAMLEN 1 +#define HAVE_DIRENT_H 1 +#define HAVE_D_MD_ORDER 1 +#define HAVE_ERRNO_H 1 +#undef HAVE_EXT2FS_EXT2_FS_H +#define HAVE_FCHDIR 1 +#define HAVE_FCNTL_H 1 +#define HAVE_GRP_H 1 +#define HAVE_LANGINFO_H 1 +#undef HAVE_LIBACL +#define HAVE_LIBARCHIVE 1 +#define HAVE_LIMITS_H 1 +#define HAVE_LINK 1 +#undef HAVE_LINUX_EXT2_FS_H +#undef HAVE_LINUX_FS_H +#define HAVE_LOCALE_H 1 +#define HAVE_MBTOWC 1 +#undef HAVE_NDIR_H +#if __FreeBSD_version >= 450002 /* nl_langinfo introduced */ +#define HAVE_NL_LANGINFO 1 +#endif +#define HAVE_PATHS_H 1 +#define HAVE_PWD_H 1 +#define HAVE_READLINK 1 +#define HAVE_REGEX_H 1 +#define HAVE_SETLOCALE 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRUCT_STAT_ST_FLAGS 1 +#undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC +#undef HAVE_STRUCT_STAT_ST_MTIME_N +#undef HAVE_STRUCT_STAT_ST_MTIME_USEC +#define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1 +#undef HAVE_STRUCT_STAT_ST_UMTIME +#define HAVE_SYMLINK 1 +#undef HAVE_SYS_DIR_H +#define HAVE_SYS_IOCTL_H 1 +#undef HAVE_SYS_NDIR_H +#define HAVE_SYS_PARAM_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_TIME_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_UINTMAX_T 1 +#define HAVE_UNISTD_H 1 +#define HAVE_UNSIGNED_LONG_LONG +#define HAVE_WCTYPE_H 1 +#define HAVE_ZLIB_H 1 +#undef MAJOR_IN_MKDEV +#define STDC_HEADERS 1 diff --git a/Utilities/cmlibarchive/tar/getdate.c b/Utilities/cmlibarchive/tar/getdate.c new file mode 100644 index 000000000..aa4ccbb95 --- /dev/null +++ b/Utilities/cmlibarchive/tar/getdate.c @@ -0,0 +1,1037 @@ +/* + * This code is in the public domain and has no copyright. + * + * This is a plain C recursive-descent translation of an old + * public-domain YACC grammar that has been used for parsing dates in + * very many open-source projects. + * + * Since the original authors were generous enough to donate their + * work to the public domain, I feel compelled to match their + * generosity. + * + * Tim Kientzle, February 2009. + */ + +/* + * Header comment from original getdate.y: + */ + +/* +** Originally written by Steven M. Bellovin while +** at the University of North Carolina at Chapel Hill. Later tweaked by +** a couple of people on Usenet. Completely overhauled by Rich $alz +** and Jim Berets in August, 1990; +** +** This grammar has 10 shift/reduce conflicts. +** +** This code is in the public domain and has no copyright. +*/ + +#ifdef __FreeBSD__ +#include +__FBSDID("$FreeBSD$"); +#endif + +#include +#include +#include +#include +#include + +/* This file defines a single public function. */ +time_t get_date(time_t now, char *); + +/* Basic time units. */ +#define EPOCH 1970 +#define MINUTE (60L) +#define HOUR (60L * MINUTE) +#define DAY (24L * HOUR) + +/* Daylight-savings mode: on, off, or not yet known. */ +enum DSTMODE { DSTon, DSToff, DSTmaybe }; +/* Meridian: am or pm. */ +enum { tAM, tPM }; +/* Token types returned by nexttoken() */ +enum { tAGO = 260, tDAY, tDAYZONE, tAMPM, tMONTH, tMONTH_UNIT, tSEC_UNIT, + tUNUMBER, tZONE, tDST }; +struct token { int token; time_t value; }; + +/* + * Parser state. + */ +struct gdstate { + struct token *tokenp; /* Pointer to next token. */ + /* HaveXxxx counts how many of this kind of phrase we've seen; + * it's a fatal error to have more than one time, zone, day, + * or date phrase. */ + int HaveYear; + int HaveMonth; + int HaveDay; + int HaveWeekDay; /* Day of week */ + int HaveTime; /* Hour/minute/second */ + int HaveZone; /* timezone and/or DST info */ + int HaveRel; /* time offset; we can have more than one */ + /* Absolute time values. */ + time_t Timezone; /* Seconds offset from GMT */ + time_t Day; + time_t Hour; + time_t Minutes; + time_t Month; + time_t Seconds; + time_t Year; + /* DST selection */ + enum DSTMODE DSTmode; + /* Day of week accounting, e.g., "3rd Tuesday" */ + time_t DayOrdinal; /* "3" in "3rd Tuesday" */ + time_t DayNumber; /* "Tuesday" in "3rd Tuesday" */ + /* Relative time values: hour/day/week offsets are measured in + * seconds, month/year are counted in months. */ + time_t RelMonth; + time_t RelSeconds; +}; + +/* + * A series of functions that recognize certain common time phrases. + * Each function returns 1 if it managed to make sense of some of the + * tokens, zero otherwise. + */ + +/* + * hour:minute or hour:minute:second with optional AM, PM, or numeric + * timezone offset + */ +static int +timephrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == ':' + && gds->tokenp[2].token == tUNUMBER + && gds->tokenp[3].token == ':' + && gds->tokenp[4].token == tUNUMBER) { + /* "12:14:18" or "22:08:07" */ + ++gds->HaveTime; + gds->Hour = gds->tokenp[0].value; + gds->Minutes = gds->tokenp[2].value; + gds->Seconds = gds->tokenp[4].value; + gds->tokenp += 5; + } + else if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == ':' + && gds->tokenp[2].token == tUNUMBER) { + /* "12:14" or "22:08" */ + ++gds->HaveTime; + gds->Hour = gds->tokenp[0].value; + gds->Minutes = gds->tokenp[2].value; + gds->Seconds = 0; + gds->tokenp += 3; + } + else if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tAMPM) { + /* "7" is a time if it's followed by "am" or "pm" */ + ++gds->HaveTime; + gds->Hour = gds->tokenp[0].value; + gds->Minutes = gds->Seconds = 0; + /* We'll handle the AM/PM below. */ + gds->tokenp += 1; + } else { + /* We can't handle this. */ + return 0; + } + + if (gds->tokenp[0].token == tAMPM) { + /* "7:12pm", "12:20:13am" */ + if (gds->Hour == 12) + gds->Hour = 0; + if (gds->tokenp[0].value == tPM) + gds->Hour += 12; + gds->tokenp += 1; + } + if (gds->tokenp[0].token == '+' + && gds->tokenp[1].token == tUNUMBER) { + /* "7:14+0700" */ + gds->HaveZone++; + gds->DSTmode = DSToff; + gds->Timezone = - ((gds->tokenp[1].value / 100) * HOUR + + (gds->tokenp[1].value % 100) * MINUTE); + gds->tokenp += 2; + } + if (gds->tokenp[0].token == '-' + && gds->tokenp[1].token == tUNUMBER) { + /* "19:14:12-0530" */ + gds->HaveZone++; + gds->DSTmode = DSToff; + gds->Timezone = + ((gds->tokenp[1].value / 100) * HOUR + + (gds->tokenp[1].value % 100) * MINUTE); + gds->tokenp += 2; + } + return 1; +} + +/* + * Timezone name, possibly including DST. + */ +static int +zonephrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == tZONE + && gds->tokenp[1].token == tDST) { + gds->HaveZone++; + gds->Timezone = gds->tokenp[0].value; + gds->DSTmode = DSTon; + gds->tokenp += 1; + return 1; + } + + if (gds->tokenp[0].token == tZONE) { + gds->HaveZone++; + gds->Timezone = gds->tokenp[0].value; + gds->DSTmode = DSToff; + gds->tokenp += 1; + return 1; + } + + if (gds->tokenp[0].token == tDAYZONE) { + gds->HaveZone++; + gds->Timezone = gds->tokenp[0].value; + gds->DSTmode = DSTon; + gds->tokenp += 1; + return 1; + } + return 0; +} + +/* + * Year/month/day in various combinations. + */ +static int +datephrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == '/' + && gds->tokenp[2].token == tUNUMBER + && gds->tokenp[3].token == '/' + && gds->tokenp[4].token == tUNUMBER) { + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + if (gds->tokenp[0].value >= 13) { + /* First number is big: 2004/01/29, 99/02/17 */ + gds->Year = gds->tokenp[0].value; + gds->Month = gds->tokenp[2].value; + gds->Day = gds->tokenp[4].value; + } else if ((gds->tokenp[4].value >= 13) + || (gds->tokenp[2].value >= 13)) { + /* Last number is big: 01/07/98 */ + /* Middle number is big: 01/29/04 */ + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[2].value; + gds->Year = gds->tokenp[4].value; + } else { + /* No significant clues: 02/03/04 */ + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[2].value; + gds->Year = gds->tokenp[4].value; + } + gds->tokenp += 5; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == '/' + && gds->tokenp[2].token == tUNUMBER) { + /* "1/15" */ + gds->HaveMonth++; + gds->HaveDay++; + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == '-' + && gds->tokenp[2].token == tUNUMBER + && gds->tokenp[3].token == '-' + && gds->tokenp[4].token == tUNUMBER) { + /* ISO 8601 format. yyyy-mm-dd. */ + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + gds->Year = gds->tokenp[0].value; + gds->Month = gds->tokenp[2].value; + gds->Day = gds->tokenp[4].value; + gds->tokenp += 5; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == '-' + && gds->tokenp[2].token == tMONTH + && gds->tokenp[3].token == '-' + && gds->tokenp[4].token == tUNUMBER) { + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + if (gds->tokenp[0].value > 31) { + /* e.g. 1992-Jun-17 */ + gds->Year = gds->tokenp[0].value; + gds->Month = gds->tokenp[2].value; + gds->Day = gds->tokenp[4].value; + } else { + /* e.g. 17-JUN-1992. */ + gds->Day = gds->tokenp[0].value; + gds->Month = gds->tokenp[2].value; + gds->Year = gds->tokenp[4].value; + } + gds->tokenp += 5; + return 1; + } + + if (gds->tokenp[0].token == tMONTH + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == ',' + && gds->tokenp[3].token == tUNUMBER) { + /* "June 17, 2001" */ + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[1].value; + gds->Year = gds->tokenp[3].value; + gds->tokenp += 4; + return 1; + } + + if (gds->tokenp[0].token == tMONTH + && gds->tokenp[1].token == tUNUMBER) { + /* "May 3" */ + gds->HaveMonth++; + gds->HaveDay++; + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tMONTH + && gds->tokenp[2].token == tUNUMBER) { + /* "12 Sept 1997" */ + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + gds->Day = gds->tokenp[0].value; + gds->Month = gds->tokenp[1].value; + gds->Year = gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tMONTH) { + /* "12 Sept" */ + gds->HaveMonth++; + gds->HaveDay++; + gds->Day = gds->tokenp[0].value; + gds->Month = gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + + return 0; +} + +/* + * Relative time phrase: "tomorrow", "yesterday", "+1 hour", etc. + */ +static int +relunitphrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == '-' + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == tSEC_UNIT) { + /* "-3 hours" */ + gds->HaveRel++; + gds->RelSeconds -= gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == '+' + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == tSEC_UNIT) { + /* "+1 minute" */ + gds->HaveRel++; + gds->RelSeconds += gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tSEC_UNIT) { + /* "1 day" */ + gds->HaveRel++; + gds->RelSeconds += gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == '-' + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == tMONTH_UNIT) { + /* "-3 months" */ + gds->HaveRel++; + gds->RelMonth -= gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == '+' + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == tMONTH_UNIT) { + /* "+5 years" */ + gds->HaveRel++; + gds->RelMonth += gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tMONTH_UNIT) { + /* "2 years" */ + gds->HaveRel++; + gds->RelMonth += gds->tokenp[0].value * gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + if (gds->tokenp[0].token == tSEC_UNIT) { + /* "now", "tomorrow" */ + gds->HaveRel++; + gds->RelSeconds += gds->tokenp[0].value; + ++gds->tokenp; + return 1; + } + if (gds->tokenp[0].token == tMONTH_UNIT) { + /* "month" */ + gds->HaveRel++; + gds->RelMonth += gds->tokenp[0].value; + gds->tokenp += 1; + return 1; + } + return 0; +} + +/* + * Day of the week specification. + */ +static int +dayphrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == tDAY) { + /* "tues", "wednesday," */ + gds->HaveWeekDay++; + gds->DayOrdinal = 1; + gds->DayNumber = gds->tokenp[0].value; + gds->tokenp += 1; + if (gds->tokenp[0].token == ',') + gds->tokenp += 1; + return 1; + } + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tDAY) { + /* "second tues" "3 wed" */ + gds->HaveWeekDay++; + gds->DayOrdinal = gds->tokenp[0].value; + gds->DayNumber = gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + return 0; +} + +/* + * Try to match a phrase using one of the above functions. + * This layer also deals with a couple of generic issues. + */ +static int +phrase(struct gdstate *gds) +{ + if (timephrase(gds)) + return 1; + if (zonephrase(gds)) + return 1; + if (datephrase(gds)) + return 1; + if (dayphrase(gds)) + return 1; + if (relunitphrase(gds)) { + if (gds->tokenp[0].token == tAGO) { + gds->RelSeconds = -gds->RelSeconds; + gds->RelMonth = -gds->RelMonth; + gds->tokenp += 1; + } + return 1; + } + + /* Bare numbers sometimes have meaning. */ + if (gds->tokenp[0].token == tUNUMBER) { + if (gds->HaveTime && !gds->HaveYear && !gds->HaveRel) { + gds->HaveYear++; + gds->Year = gds->tokenp[0].value; + gds->tokenp += 1; + return 1; + } + + if(gds->tokenp[0].value > 10000) { + /* "20040301" */ + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + gds->Day= (gds->tokenp[0].value)%100; + gds->Month= (gds->tokenp[0].value/100)%100; + gds->Year = gds->tokenp[0].value/10000; + gds->tokenp += 1; + return 1; + } + + if (gds->tokenp[0].value < 24) { + gds->HaveTime++; + gds->Hour = gds->tokenp[0].value; + gds->Minutes = 0; + gds->Seconds = 0; + gds->tokenp += 1; + return 1; + } + + if ((gds->tokenp[0].value / 100 < 24) + && (gds->tokenp[0].value % 100 < 60)) { + /* "513" is same as "5:13" */ + gds->Hour = gds->tokenp[0].value / 100; + gds->Minutes = gds->tokenp[0].value % 100; + gds->Seconds = 0; + gds->tokenp += 1; + return 1; + } + } + + return 0; +} + +/* + * A dictionary of time words. + */ +static struct LEXICON { + size_t abbrev; + const char *name; + int type; + time_t value; +} const TimeWords[] = { + /* am/pm */ + { 0, "am", tAMPM, tAM }, + { 0, "pm", tAMPM, tPM }, + + /* Month names. */ + { 3, "january", tMONTH, 1 }, + { 3, "february", tMONTH, 2 }, + { 3, "march", tMONTH, 3 }, + { 3, "april", tMONTH, 4 }, + { 3, "may", tMONTH, 5 }, + { 3, "june", tMONTH, 6 }, + { 3, "july", tMONTH, 7 }, + { 3, "august", tMONTH, 8 }, + { 3, "september", tMONTH, 9 }, + { 3, "october", tMONTH, 10 }, + { 3, "november", tMONTH, 11 }, + { 3, "december", tMONTH, 12 }, + + /* Days of the week. */ + { 2, "sunday", tDAY, 0 }, + { 3, "monday", tDAY, 1 }, + { 2, "tuesday", tDAY, 2 }, + { 3, "wednesday", tDAY, 3 }, + { 2, "thursday", tDAY, 4 }, + { 2, "friday", tDAY, 5 }, + { 2, "saturday", tDAY, 6 }, + + /* Timezones: Offsets are in seconds. */ + { 0, "gmt", tZONE, 0*HOUR }, /* Greenwich Mean */ + { 0, "ut", tZONE, 0*HOUR }, /* Universal (Coordinated) */ + { 0, "utc", tZONE, 0*HOUR }, + { 0, "wet", tZONE, 0*HOUR }, /* Western European */ + { 0, "bst", tDAYZONE, 0*HOUR }, /* British Summer */ + { 0, "wat", tZONE, 1*HOUR }, /* West Africa */ + { 0, "at", tZONE, 2*HOUR }, /* Azores */ + /* { 0, "bst", tZONE, 3*HOUR }, */ /* Brazil Standard: Conflict */ + /* { 0, "gst", tZONE, 3*HOUR }, */ /* Greenland Standard: Conflict*/ + { 0, "nft", tZONE, 3*HOUR+30*MINUTE }, /* Newfoundland */ + { 0, "nst", tZONE, 3*HOUR+30*MINUTE }, /* Newfoundland Standard */ + { 0, "ndt", tDAYZONE, 3*HOUR+30*MINUTE }, /* Newfoundland Daylight */ + { 0, "ast", tZONE, 4*HOUR }, /* Atlantic Standard */ + { 0, "adt", tDAYZONE, 4*HOUR }, /* Atlantic Daylight */ + { 0, "est", tZONE, 5*HOUR }, /* Eastern Standard */ + { 0, "edt", tDAYZONE, 5*HOUR }, /* Eastern Daylight */ + { 0, "cst", tZONE, 6*HOUR }, /* Central Standard */ + { 0, "cdt", tDAYZONE, 6*HOUR }, /* Central Daylight */ + { 0, "mst", tZONE, 7*HOUR }, /* Mountain Standard */ + { 0, "mdt", tDAYZONE, 7*HOUR }, /* Mountain Daylight */ + { 0, "pst", tZONE, 8*HOUR }, /* Pacific Standard */ + { 0, "pdt", tDAYZONE, 8*HOUR }, /* Pacific Daylight */ + { 0, "yst", tZONE, 9*HOUR }, /* Yukon Standard */ + { 0, "ydt", tDAYZONE, 9*HOUR }, /* Yukon Daylight */ + { 0, "hst", tZONE, 10*HOUR }, /* Hawaii Standard */ + { 0, "hdt", tDAYZONE, 10*HOUR }, /* Hawaii Daylight */ + { 0, "cat", tZONE, 10*HOUR }, /* Central Alaska */ + { 0, "ahst", tZONE, 10*HOUR }, /* Alaska-Hawaii Standard */ + { 0, "nt", tZONE, 11*HOUR }, /* Nome */ + { 0, "idlw", tZONE, 12*HOUR }, /* Intl Date Line West */ + { 0, "cet", tZONE, -1*HOUR }, /* Central European */ + { 0, "met", tZONE, -1*HOUR }, /* Middle European */ + { 0, "mewt", tZONE, -1*HOUR }, /* Middle European Winter */ + { 0, "mest", tDAYZONE, -1*HOUR }, /* Middle European Summer */ + { 0, "swt", tZONE, -1*HOUR }, /* Swedish Winter */ + { 0, "sst", tDAYZONE, -1*HOUR }, /* Swedish Summer */ + { 0, "fwt", tZONE, -1*HOUR }, /* French Winter */ + { 0, "fst", tDAYZONE, -1*HOUR }, /* French Summer */ + { 0, "eet", tZONE, -2*HOUR }, /* Eastern Eur, USSR Zone 1 */ + { 0, "bt", tZONE, -3*HOUR }, /* Baghdad, USSR Zone 2 */ + { 0, "it", tZONE, -3*HOUR-30*MINUTE },/* Iran */ + { 0, "zp4", tZONE, -4*HOUR }, /* USSR Zone 3 */ + { 0, "zp5", tZONE, -5*HOUR }, /* USSR Zone 4 */ + { 0, "ist", tZONE, -5*HOUR-30*MINUTE },/* Indian Standard */ + { 0, "zp6", tZONE, -6*HOUR }, /* USSR Zone 5 */ + /* { 0, "nst", tZONE, -6.5*HOUR }, */ /* North Sumatra: Conflict */ + /* { 0, "sst", tZONE, -7*HOUR }, */ /* So Sumatra, USSR 6: Conflict */ + { 0, "wast", tZONE, -7*HOUR }, /* West Australian Standard */ + { 0, "wadt", tDAYZONE, -7*HOUR }, /* West Australian Daylight */ + { 0, "jt", tZONE, -7*HOUR-30*MINUTE },/* Java (3pm in Cronusland!)*/ + { 0, "cct", tZONE, -8*HOUR }, /* China Coast, USSR Zone 7 */ + { 0, "jst", tZONE, -9*HOUR }, /* Japan Std, USSR Zone 8 */ + { 0, "cast", tZONE, -9*HOUR-30*MINUTE },/* Ctrl Australian Std */ + { 0, "cadt", tDAYZONE, -9*HOUR-30*MINUTE },/* Ctrl Australian Daylt */ + { 0, "east", tZONE, -10*HOUR }, /* Eastern Australian Std */ + { 0, "eadt", tDAYZONE, -10*HOUR }, /* Eastern Australian Daylt */ + { 0, "gst", tZONE, -10*HOUR }, /* Guam Std, USSR Zone 9 */ + { 0, "nzt", tZONE, -12*HOUR }, /* New Zealand */ + { 0, "nzst", tZONE, -12*HOUR }, /* New Zealand Standard */ + { 0, "nzdt", tDAYZONE, -12*HOUR }, /* New Zealand Daylight */ + { 0, "idle", tZONE, -12*HOUR }, /* Intl Date Line East */ + + { 0, "dst", tDST, 0 }, + + /* Time units. */ + { 4, "years", tMONTH_UNIT, 12 }, + { 5, "months", tMONTH_UNIT, 1 }, + { 9, "fortnights", tSEC_UNIT, 14 * DAY }, + { 4, "weeks", tSEC_UNIT, 7 * DAY }, + { 3, "days", tSEC_UNIT, DAY }, + { 4, "hours", tSEC_UNIT, HOUR }, + { 3, "minutes", tSEC_UNIT, MINUTE }, + { 3, "seconds", tSEC_UNIT, 1 }, + + /* Relative-time words. */ + { 0, "tomorrow", tSEC_UNIT, DAY }, + { 0, "yesterday", tSEC_UNIT, -DAY }, + { 0, "today", tSEC_UNIT, 0 }, + { 0, "now", tSEC_UNIT, 0 }, + { 0, "last", tUNUMBER, -1 }, + { 0, "this", tSEC_UNIT, 0 }, + { 0, "next", tUNUMBER, 2 }, + { 0, "first", tUNUMBER, 1 }, + { 0, "1st", tUNUMBER, 1 }, +/* { 0, "second", tUNUMBER, 2 }, */ + { 0, "2nd", tUNUMBER, 2 }, + { 0, "third", tUNUMBER, 3 }, + { 0, "3rd", tUNUMBER, 3 }, + { 0, "fourth", tUNUMBER, 4 }, + { 0, "4th", tUNUMBER, 4 }, + { 0, "fifth", tUNUMBER, 5 }, + { 0, "5th", tUNUMBER, 5 }, + { 0, "sixth", tUNUMBER, 6 }, + { 0, "seventh", tUNUMBER, 7 }, + { 0, "eighth", tUNUMBER, 8 }, + { 0, "ninth", tUNUMBER, 9 }, + { 0, "tenth", tUNUMBER, 10 }, + { 0, "eleventh", tUNUMBER, 11 }, + { 0, "twelfth", tUNUMBER, 12 }, + { 0, "ago", tAGO, 1 }, + + /* Military timezones. */ + { 0, "a", tZONE, 1*HOUR }, + { 0, "b", tZONE, 2*HOUR }, + { 0, "c", tZONE, 3*HOUR }, + { 0, "d", tZONE, 4*HOUR }, + { 0, "e", tZONE, 5*HOUR }, + { 0, "f", tZONE, 6*HOUR }, + { 0, "g", tZONE, 7*HOUR }, + { 0, "h", tZONE, 8*HOUR }, + { 0, "i", tZONE, 9*HOUR }, + { 0, "k", tZONE, 10*HOUR }, + { 0, "l", tZONE, 11*HOUR }, + { 0, "m", tZONE, 12*HOUR }, + { 0, "n", tZONE, -1*HOUR }, + { 0, "o", tZONE, -2*HOUR }, + { 0, "p", tZONE, -3*HOUR }, + { 0, "q", tZONE, -4*HOUR }, + { 0, "r", tZONE, -5*HOUR }, + { 0, "s", tZONE, -6*HOUR }, + { 0, "t", tZONE, -7*HOUR }, + { 0, "u", tZONE, -8*HOUR }, + { 0, "v", tZONE, -9*HOUR }, + { 0, "w", tZONE, -10*HOUR }, + { 0, "x", tZONE, -11*HOUR }, + { 0, "y", tZONE, -12*HOUR }, + { 0, "z", tZONE, 0*HOUR }, + + /* End of table. */ + { 0, NULL, 0, 0 } +}; + +/* + * Year is either: + * = A number from 0 to 99, which means a year from 1970 to 2069, or + * = The actual year (>=100). + */ +static time_t +Convert(time_t Month, time_t Day, time_t Year, + time_t Hours, time_t Minutes, time_t Seconds, + time_t Timezone, enum DSTMODE DSTmode) +{ + static int DaysInMonth[12] = { + 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 + }; + time_t Julian; + int i; + + if (Year < 69) + Year += 2000; + else if (Year < 100) + Year += 1900; + DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) + ? 29 : 28; + /* Checking for 2038 bogusly assumes that time_t is 32 bits. But + I'm too lazy to try to check for time_t overflow in another way. */ + if (Year < EPOCH || Year > 2038 + || Month < 1 || Month > 12 + /* Lint fluff: "conversion from long may lose accuracy" */ + || Day < 1 || Day > DaysInMonth[(int)--Month] + || Hours < 0 || Hours > 23 + || Minutes < 0 || Minutes > 59 + || Seconds < 0 || Seconds > 59) + return -1; + + Julian = Day - 1; + for (i = 0; i < Month; i++) + Julian += DaysInMonth[i]; + for (i = EPOCH; i < Year; i++) + Julian += 365 + (i % 4 == 0); + Julian *= DAY; + Julian += Timezone; + Julian += Hours * HOUR + Minutes * MINUTE + Seconds; + if (DSTmode == DSTon + || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst)) + Julian -= HOUR; + return Julian; +} + + +static time_t +DSTcorrect(time_t Start, time_t Future) +{ + time_t StartDay; + time_t FutureDay; + + StartDay = (localtime(&Start)->tm_hour + 1) % 24; + FutureDay = (localtime(&Future)->tm_hour + 1) % 24; + return (Future - Start) + (StartDay - FutureDay) * HOUR; +} + + +static time_t +RelativeDate(time_t Start, time_t zone, int dstmode, + time_t DayOrdinal, time_t DayNumber) +{ + struct tm *tm; + time_t t, now; + + t = Start - zone; + tm = gmtime(&t); + now = Start; + now += DAY * ((DayNumber - tm->tm_wday + 7) % 7); + now += 7 * DAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1); + if (dstmode == DSTmaybe) + return DSTcorrect(Start, now); + return now - Start; +} + + +static time_t +RelativeMonth(time_t Start, time_t Timezone, time_t RelMonth) +{ + struct tm *tm; + time_t Month; + time_t Year; + + if (RelMonth == 0) + return 0; + tm = localtime(&Start); + Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth; + Year = Month / 12; + Month = Month % 12 + 1; + return DSTcorrect(Start, + Convert(Month, (time_t)tm->tm_mday, Year, + (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec, + Timezone, DSTmaybe)); +} + +/* + * Tokenizer. + */ +static int +nexttoken(char **in, time_t *value) +{ + char c; + char buff[64]; + + for ( ; ; ) { + while (isspace((unsigned char)**in)) + ++*in; + + /* Skip parenthesized comments. */ + if (**in == '(') { + int Count = 0; + do { + c = *(*in)++; + if (c == '\0') + return c; + if (c == '(') + Count++; + else if (c == ')') + Count--; + } while (Count > 0); + continue; + } + + /* Try the next token in the word table first. */ + /* This allows us to match "2nd", for example. */ + { + char *src = *in; + const struct LEXICON *tp; + unsigned i = 0; + + /* Force to lowercase and strip '.' characters. */ + while (*src != '\0' + && (isalnum((unsigned char)*src) || *src == '.') + && i < sizeof(buff)-1) { + if (*src != '.') { + if (isupper((unsigned char)*src)) + buff[i++] = tolower((unsigned char)*src); + else + buff[i++] = *src; + } + src++; + } + buff[i++] = '\0'; + + /* + * Find the first match. If the word can be + * abbreviated, make sure we match at least + * the minimum abbreviation. + */ + for (tp = TimeWords; tp->name; tp++) { + size_t abbrev = tp->abbrev; + if (abbrev == 0) + abbrev = strlen(tp->name); + if (strlen(buff) >= abbrev + && strncmp(tp->name, buff, strlen(buff)) + == 0) { + /* Skip over token. */ + *in = src; + /* Return the match. */ + *value = tp->value; + return tp->type; + } + } + } + + /* + * Not in the word table, maybe it's a number. Note: + * Because '-' and '+' have other special meanings, I + * don't deal with signed numbers here. + */ + if (isdigit((unsigned char)(c = **in))) { + for (*value = 0; isdigit((unsigned char)(c = *(*in)++)); ) + *value = 10 * *value + c - '0'; + (*in)--; + return (tUNUMBER); + } + + return *(*in)++; + } +} + +#define TM_YEAR_ORIGIN 1900 + +/* Yield A - B, measured in seconds. */ +static long +difftm (struct tm *a, struct tm *b) +{ + int ay = a->tm_year + (TM_YEAR_ORIGIN - 1); + int by = b->tm_year + (TM_YEAR_ORIGIN - 1); + int days = ( + /* difference in day of year */ + a->tm_yday - b->tm_yday + /* + intervening leap days */ + + ((ay >> 2) - (by >> 2)) + - (ay/100 - by/100) + + ((ay/100 >> 2) - (by/100 >> 2)) + /* + difference in years * 365 */ + + (long)(ay-by) * 365 + ); + return (days * DAY + (a->tm_hour - b->tm_hour) * HOUR + + (a->tm_min - b->tm_min) * MINUTE + + (a->tm_sec - b->tm_sec)); +} + +/* + * + * The public function. + * + * TODO: tokens[] array should be dynamically sized. + */ +time_t +get_date(time_t now, char *p) +{ + struct token tokens[256]; + struct gdstate _gds; + struct token *lasttoken; + struct gdstate *gds; + struct tm local, *tm; + struct tm gmt, *gmt_ptr; + time_t Start; + time_t tod; + long tzone; + + /* Clear out the parsed token array. */ + memset(tokens, 0, sizeof(tokens)); + /* Initialize the parser state. */ + memset(&_gds, 0, sizeof(_gds)); + gds = &_gds; + + /* Look up the current time. */ + memset(&local, 0, sizeof(local)); + tm = localtime (&now); + if (tm == NULL) + return -1; + local = *tm; + + /* Look up UTC if we can and use that to determine the current + * timezone offset. */ + memset(&gmt, 0, sizeof(gmt)); + gmt_ptr = gmtime (&now); + if (gmt_ptr != NULL) { + /* Copy, in case localtime and gmtime use the same buffer. */ + gmt = *gmt_ptr; + } + if (gmt_ptr != NULL) + tzone = difftm (&gmt, &local); + else + /* This system doesn't understand timezones; fake it. */ + tzone = 0; + if(local.tm_isdst) + tzone += HOUR; + + /* Tokenize the input string. */ + lasttoken = tokens; + while ((lasttoken->token = nexttoken(&p, &lasttoken->value)) != 0) { + ++lasttoken; + if (lasttoken > tokens + 255) + return -1; + } + gds->tokenp = tokens; + + /* Match phrases until we run out of input tokens. */ + while (gds->tokenp < lasttoken) { + if (!phrase(gds)) + return -1; + } + + /* Use current local timezone if none was specified. */ + if (!gds->HaveZone) { + gds->Timezone = tzone; + gds->DSTmode = DSTmaybe; + } + + /* If a timezone was specified, use that for generating the default + * time components instead of the local timezone. */ + if (gds->HaveZone && gmt_ptr != NULL) { + now -= gds->Timezone; + gmt_ptr = gmtime (&now); + if (gmt_ptr != NULL) + local = *gmt_ptr; + now += gds->Timezone; + } + + if (!gds->HaveYear) + gds->Year = local.tm_year + 1900; + if (!gds->HaveMonth) + gds->Month = local.tm_mon + 1; + if (!gds->HaveDay) + gds->Day = local.tm_mday; + /* Note: No default for hour/min/sec; a specifier that just + * gives date always refers to 00:00 on that date. */ + + /* If we saw more than one time, timezone, weekday, year, month, + * or day, then give up. */ + if (gds->HaveTime > 1 || gds->HaveZone > 1 || gds->HaveWeekDay > 1 + || gds->HaveYear > 1 || gds->HaveMonth > 1 || gds->HaveDay > 1) + return -1; + + /* Compute an absolute time based on whatever absolute information + * we collected. */ + if (gds->HaveYear || gds->HaveMonth || gds->HaveDay + || gds->HaveTime || gds->HaveWeekDay) { + Start = Convert(gds->Month, gds->Day, gds->Year, + gds->Hour, gds->Minutes, gds->Seconds, + gds->Timezone, gds->DSTmode); + if (Start < 0) + return -1; + } else { + Start = now; + if (!gds->HaveRel) + Start -= local.tm_hour * HOUR + local.tm_min * MINUTE + + local.tm_sec; + } + + /* Add the relative offset. */ + Start += gds->RelSeconds; + Start += RelativeMonth(Start, gds->Timezone, gds->RelMonth); + + /* Adjust for day-of-week offsets. */ + if (gds->HaveWeekDay + && !(gds->HaveYear || gds->HaveMonth || gds->HaveDay)) { + tod = RelativeDate(Start, gds->Timezone, + gds->DSTmode, gds->DayOrdinal, gds->DayNumber); + Start += tod; + } + + /* -1 is an error indicator, so return 0 instead of -1 if + * that's the actual time. */ + return Start == -1 ? 0 : Start; +} + + +#if defined(TEST) + +/* ARGSUSED */ +int +main(int argc, char **argv) +{ + time_t d; + + while (*++argv != NULL) { + (void)printf("Input: %s\n", *argv); + d = get_date(*argv); + if (d == -1) + (void)printf("Bad format - couldn't convert.\n"); + else + (void)printf("Output: %s\n", ctime(&d)); + } + exit(0); + /* NOTREACHED */ +} +#endif /* defined(TEST) */ diff --git a/Utilities/cmlibarchive/tar/read.c b/Utilities/cmlibarchive/tar/read.c new file mode 100644 index 000000000..3aff1d5f8 --- /dev/null +++ b/Utilities/cmlibarchive/tar/read.c @@ -0,0 +1,440 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif + +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "bsdtar.h" +#include "err.h" + +struct progress_data { + struct bsdtar *bsdtar; + struct archive *archive; + struct archive_entry *entry; +}; + +static void list_item_verbose(struct bsdtar *, FILE *, + struct archive_entry *); +static void read_archive(struct bsdtar *bsdtar, char mode); + +void +tar_mode_t(struct bsdtar *bsdtar) +{ + read_archive(bsdtar, 't'); + if (lafe_unmatched_inclusions_warn(bsdtar->matching, "Not found in archive") != 0) + bsdtar->return_value = 1; +} + +void +tar_mode_x(struct bsdtar *bsdtar) +{ + read_archive(bsdtar, 'x'); + + if (lafe_unmatched_inclusions_warn(bsdtar->matching, "Not found in archive") != 0) + bsdtar->return_value = 1; +} + +static void +progress_func(void *cookie) +{ + struct progress_data *progress_data = cookie; + struct bsdtar *bsdtar = progress_data->bsdtar; + struct archive *a = progress_data->archive; + struct archive_entry *entry = progress_data->entry; + uintmax_t comp, uncomp; + + if (!need_report()) + return; + + if (bsdtar->verbose) + fprintf(stderr, "\n"); + if (a != NULL) { + comp = archive_position_compressed(a); + uncomp = archive_position_uncompressed(a); + fprintf(stderr, + "In: %ju bytes, compression %d%%;", + comp, (int)((uncomp - comp) * 100 / uncomp)); + fprintf(stderr, " Out: %d files, %ju bytes\n", + archive_file_count(a), uncomp); + } + if (entry != NULL) { + safe_fprintf(stderr, "Current: %s (%ju bytes)", + archive_entry_pathname(entry), + (uintmax_t)archive_entry_size(entry)); + fprintf(stderr, "\n"); + } +} + +/* + * Handle 'x' and 't' modes. + */ +static void +read_archive(struct bsdtar *bsdtar, char mode) +{ + struct progress_data progress_data; + FILE *out; + struct archive *a; + struct archive_entry *entry; + const struct stat *st; + int r; + + while (*bsdtar->argv) { + lafe_include(&bsdtar->matching, *bsdtar->argv); + bsdtar->argv++; + } + + if (bsdtar->names_from_file != NULL) + lafe_include_from_file(&bsdtar->matching, + bsdtar->names_from_file, bsdtar->option_null); + + a = archive_read_new(); + if (bsdtar->compress_program != NULL) + archive_read_support_compression_program(a, bsdtar->compress_program); + else + archive_read_support_compression_all(a); + archive_read_support_format_all(a); + if (ARCHIVE_OK != archive_read_set_options(a, bsdtar->option_options)) + lafe_errc(1, 0, archive_error_string(a)); + if (archive_read_open_file(a, bsdtar->filename, + bsdtar->bytes_per_block != 0 ? bsdtar->bytes_per_block : + DEFAULT_BYTES_PER_BLOCK)) + lafe_errc(1, 0, "Error opening archive: %s", + archive_error_string(a)); + + do_chdir(bsdtar); + + if (mode == 'x') { + /* Set an extract callback so that we can handle SIGINFO. */ + progress_data.bsdtar = bsdtar; + progress_data.archive = a; + archive_read_extract_set_progress_callback(a, progress_func, + &progress_data); + } + + if (mode == 'x' && bsdtar->option_chroot) { +#if HAVE_CHROOT + if (chroot(".") != 0) + lafe_errc(1, errno, "Can't chroot to \".\""); +#else + lafe_errc(1, 0, + "chroot isn't supported on this platform"); +#endif + } + + for (;;) { + /* Support --fast-read option */ + if (bsdtar->option_fast_read && + lafe_unmatched_inclusions(bsdtar->matching) == 0) + break; + + r = archive_read_next_header(a, &entry); + progress_data.entry = entry; + if (r == ARCHIVE_EOF) + break; + if (r < ARCHIVE_OK) + lafe_warnc(0, "%s", archive_error_string(a)); + if (r <= ARCHIVE_WARN) + bsdtar->return_value = 1; + if (r == ARCHIVE_RETRY) { + /* Retryable error: try again */ + lafe_warnc(0, "Retrying..."); + continue; + } + if (r == ARCHIVE_FATAL) + break; + + if (bsdtar->option_numeric_owner) { + archive_entry_set_uname(entry, NULL); + archive_entry_set_gname(entry, NULL); + } + + /* + * Exclude entries that are too old. + */ + st = archive_entry_stat(entry); + if (bsdtar->newer_ctime_sec > 0) { + if (st->st_ctime < bsdtar->newer_ctime_sec) + continue; /* Too old, skip it. */ + if (st->st_ctime == bsdtar->newer_ctime_sec + && ARCHIVE_STAT_CTIME_NANOS(st) + <= bsdtar->newer_ctime_nsec) + continue; /* Too old, skip it. */ + } + if (bsdtar->newer_mtime_sec > 0) { + if (st->st_mtime < bsdtar->newer_mtime_sec) + continue; /* Too old, skip it. */ + if (st->st_mtime == bsdtar->newer_mtime_sec + && ARCHIVE_STAT_MTIME_NANOS(st) + <= bsdtar->newer_mtime_nsec) + continue; /* Too old, skip it. */ + } + + /* + * Note that pattern exclusions are checked before + * pathname rewrites are handled. This gives more + * control over exclusions, since rewrites always lose + * information. (For example, consider a rewrite + * s/foo[0-9]/foo/. If we check exclusions after the + * rewrite, there would be no way to exclude foo1/bar + * while allowing foo2/bar.) + */ + if (lafe_excluded(bsdtar->matching, archive_entry_pathname(entry))) + continue; /* Excluded by a pattern test. */ + + if (mode == 't') { + /* Perversely, gtar uses -O to mean "send to stderr" + * when used with -t. */ + out = bsdtar->option_stdout ? stderr : stdout; + + /* + * TODO: Provide some reasonable way to + * preview rewrites. gtar always displays + * the unedited path in -t output, which means + * you cannot easily preview rewrites. + */ + if (bsdtar->verbose < 2) + safe_fprintf(out, "%s", + archive_entry_pathname(entry)); + else + list_item_verbose(bsdtar, out, entry); + fflush(out); + r = archive_read_data_skip(a); + if (r == ARCHIVE_WARN) { + fprintf(out, "\n"); + lafe_warnc(0, "%s", + archive_error_string(a)); + } + if (r == ARCHIVE_RETRY) { + fprintf(out, "\n"); + lafe_warnc(0, "%s", + archive_error_string(a)); + } + if (r == ARCHIVE_FATAL) { + fprintf(out, "\n"); + lafe_warnc(0, "%s", + archive_error_string(a)); + bsdtar->return_value = 1; + break; + } + fprintf(out, "\n"); + } else { + /* Note: some rewrite failures prevent extraction. */ + if (edit_pathname(bsdtar, entry)) + continue; /* Excluded by a rewrite failure. */ + + if (bsdtar->option_interactive && + !yes("extract '%s'", archive_entry_pathname(entry))) + continue; + + /* + * Format here is from SUSv2, including the + * deferred '\n'. + */ + if (bsdtar->verbose) { + safe_fprintf(stderr, "x %s", + archive_entry_pathname(entry)); + fflush(stderr); + } + + // TODO siginfo_printinfo(bsdtar, 0); + + if (bsdtar->option_stdout) + r = archive_read_data_into_fd(a, 1); + else + r = archive_read_extract(a, entry, + bsdtar->extract_flags); + if (r != ARCHIVE_OK) { + if (!bsdtar->verbose) + safe_fprintf(stderr, "%s", + archive_entry_pathname(entry)); + safe_fprintf(stderr, ": %s", + archive_error_string(a)); + if (!bsdtar->verbose) + fprintf(stderr, "\n"); + bsdtar->return_value = 1; + } + if (bsdtar->verbose) + fprintf(stderr, "\n"); + if (r == ARCHIVE_FATAL) + break; + } + } + + + r = archive_read_close(a); + if (r != ARCHIVE_OK) + lafe_warnc(0, "%s", archive_error_string(a)); + if (r <= ARCHIVE_WARN) + bsdtar->return_value = 1; + + if (bsdtar->verbose > 2) + fprintf(stdout, "Archive Format: %s, Compression: %s\n", + archive_format_name(a), archive_compression_name(a)); + + archive_read_finish(a); +} + + +/* + * Display information about the current file. + * + * The format here roughly duplicates the output of 'ls -l'. + * This is based on SUSv2, where 'tar tv' is documented as + * listing additional information in an "unspecified format," + * and 'pax -l' is documented as using the same format as 'ls -l'. + */ +static void +list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) +{ + char tmp[100]; + size_t w; + const char *p; + const char *fmt; + time_t tim; + static time_t now; + + /* + * We avoid collecting the entire list in memory at once by + * listing things as we see them. However, that also means we can't + * just pre-compute the field widths. Instead, we start with guesses + * and just widen them as necessary. These numbers are completely + * arbitrary. + */ + if (!bsdtar->u_width) { + bsdtar->u_width = 6; + bsdtar->gs_width = 13; + } + if (!now) + time(&now); + fprintf(out, "%s %d ", + archive_entry_strmode(entry), + archive_entry_nlink(entry)); + + /* Use uname if it's present, else uid. */ + p = archive_entry_uname(entry); + if ((p == NULL) || (*p == '\0')) { + sprintf(tmp, "%lu ", + (unsigned long)archive_entry_uid(entry)); + p = tmp; + } + w = strlen(p); + if (w > bsdtar->u_width) + bsdtar->u_width = w; + fprintf(out, "%-*s ", (int)bsdtar->u_width, p); + + /* Use gname if it's present, else gid. */ + p = archive_entry_gname(entry); + if (p != NULL && p[0] != '\0') { + fprintf(out, "%s", p); + w = strlen(p); + } else { + sprintf(tmp, "%lu", + (unsigned long)archive_entry_gid(entry)); + w = strlen(tmp); + fprintf(out, "%s", tmp); + } + + /* + * Print device number or file size, right-aligned so as to make + * total width of group and devnum/filesize fields be gs_width. + * If gs_width is too small, grow it. + */ + if (archive_entry_filetype(entry) == AE_IFCHR + || archive_entry_filetype(entry) == AE_IFBLK) { + sprintf(tmp, "%lu,%lu", + (unsigned long)archive_entry_rdevmajor(entry), + (unsigned long)archive_entry_rdevminor(entry)); + } else { + /* + * Note the use of platform-dependent macros to format + * the filesize here. We need the format string and the + * corresponding type for the cast. + */ + sprintf(tmp, BSDTAR_FILESIZE_PRINTF, + (BSDTAR_FILESIZE_TYPE)archive_entry_size(entry)); + } + if (w + strlen(tmp) >= bsdtar->gs_width) + bsdtar->gs_width = w+strlen(tmp)+1; + fprintf(out, "%*s", (int)(bsdtar->gs_width - w), tmp); + + /* Format the time using 'ls -l' conventions. */ + tim = archive_entry_mtime(entry); +#define HALF_YEAR (time_t)365 * 86400 / 2 +#if defined(_WIN32) && !defined(__CYGWIN__) +#define DAY_FMT "%d" /* Windows' strftime function does not support %e format. */ +#else +#define DAY_FMT "%e" /* Day number without leading zeros */ +#endif + if (tim < now - HALF_YEAR || tim > now + HALF_YEAR) + fmt = bsdtar->day_first ? DAY_FMT " %b %Y" : "%b " DAY_FMT " %Y"; + else + fmt = bsdtar->day_first ? DAY_FMT " %b %H:%M" : "%b " DAY_FMT " %H:%M"; + strftime(tmp, sizeof(tmp), fmt, localtime(&tim)); + fprintf(out, " %s ", tmp); + safe_fprintf(out, "%s", archive_entry_pathname(entry)); + + /* Extra information for links. */ + if (archive_entry_hardlink(entry)) /* Hard link */ + safe_fprintf(out, " link to %s", + archive_entry_hardlink(entry)); + else if (archive_entry_symlink(entry)) /* Symbolic link */ + safe_fprintf(out, " -> %s", archive_entry_symlink(entry)); +} diff --git a/Utilities/cmlibarchive/tar/subst.c b/Utilities/cmlibarchive/tar/subst.c new file mode 100644 index 000000000..34295ef38 --- /dev/null +++ b/Utilities/cmlibarchive/tar/subst.c @@ -0,0 +1,289 @@ +/*- + * Copyright (c) 2008 Joerg Sonnenberger + * 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 "bsdtar_platform.h" +__FBSDID("$FreeBSD: src/usr.bin/tar/subst.c,v 1.4 2008/06/15 10:08:16 kientzle Exp $"); + +#if HAVE_REGEX_H +#include "bsdtar.h" + +#include +#include +#include +#include + +#ifndef REG_BASIC +#define REG_BASIC 0 +#endif + +#include "err.h" + +struct subst_rule { + struct subst_rule *next; + regex_t re; + char *result; + unsigned int global:1, print:1, symlink:1; +}; + +struct substitution { + struct subst_rule *first_rule, *last_rule; +}; + +static void +init_substitution(struct bsdtar *bsdtar) +{ + struct substitution *subst; + + bsdtar->substitution = subst = malloc(sizeof(*subst)); + if (subst == NULL) + lafe_errc(1, errno, "Out of memory"); + subst->first_rule = subst->last_rule = NULL; +} + +void +add_substitution(struct bsdtar *bsdtar, const char *rule_text) +{ + struct subst_rule *rule; + struct substitution *subst; + const char *end_pattern, *start_subst; + char *pattern; + int r; + + if ((subst = bsdtar->substitution) == NULL) { + init_substitution(bsdtar); + subst = bsdtar->substitution; + } + + rule = malloc(sizeof(*rule)); + if (rule == NULL) + lafe_errc(1, errno, "Out of memory"); + rule->next = NULL; + + if (subst->last_rule == NULL) + subst->first_rule = rule; + else + subst->last_rule->next = rule; + subst->last_rule = rule; + + if (*rule_text == '\0') + lafe_errc(1, 0, "Empty replacement string"); + end_pattern = strchr(rule_text + 1, *rule_text); + if (end_pattern == NULL) + lafe_errc(1, 0, "Invalid replacement string"); + + pattern = malloc(end_pattern - rule_text); + if (pattern == NULL) + lafe_errc(1, errno, "Out of memory"); + memcpy(pattern, rule_text + 1, end_pattern - rule_text - 1); + pattern[end_pattern - rule_text - 1] = '\0'; + + if ((r = regcomp(&rule->re, pattern, REG_BASIC)) != 0) { + char buf[80]; + regerror(r, &rule->re, buf, sizeof(buf)); + lafe_errc(1, 0, "Invalid regular expression: %s", buf); + } + free(pattern); + + start_subst = end_pattern + 1; + end_pattern = strchr(start_subst, *rule_text); + if (end_pattern == NULL) + lafe_errc(1, 0, "Invalid replacement string"); + + rule->result = malloc(end_pattern - start_subst + 1); + if (rule->result == NULL) + lafe_errc(1, errno, "Out of memory"); + memcpy(rule->result, start_subst, end_pattern - start_subst); + rule->result[end_pattern - start_subst] = '\0'; + + rule->global = 0; + rule->print = 0; + rule->symlink = 0; + + while (*++end_pattern) { + switch (*end_pattern) { + case 'g': + case 'G': + rule->global = 1; + break; + case 'p': + case 'P': + rule->print = 1; + break; + case 's': + case 'S': + rule->symlink = 1; + break; + default: + lafe_errc(1, 0, "Invalid replacement flag %c", *end_pattern); + } + } +} + +static void +realloc_strncat(char **str, const char *append, size_t len) +{ + char *new_str; + size_t old_len; + + if (*str == NULL) + old_len = 0; + else + old_len = strlen(*str); + + new_str = malloc(old_len + len + 1); + if (new_str == NULL) + lafe_errc(1, errno, "Out of memory"); + memcpy(new_str, *str, old_len); + memcpy(new_str + old_len, append, len); + new_str[old_len + len] = '\0'; + free(*str); + *str = new_str; +} + +static void +realloc_strcat(char **str, const char *append) +{ + char *new_str; + size_t old_len; + + if (*str == NULL) + old_len = 0; + else + old_len = strlen(*str); + + new_str = malloc(old_len + strlen(append) + 1); + if (new_str == NULL) + lafe_errc(1, errno, "Out of memory"); + memcpy(new_str, *str, old_len); + strcpy(new_str + old_len, append); + free(*str); + *str = new_str; +} + +int +apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, int symlink_only) +{ + const char *path = name; + regmatch_t matches[10]; + size_t i, j; + struct subst_rule *rule; + struct substitution *subst; + int c, got_match, print_match; + + *result = NULL; + + if ((subst = bsdtar->substitution) == NULL) + return 0; + + got_match = 0; + print_match = 0; + + for (rule = subst->first_rule; rule != NULL; rule = rule->next) { + if (symlink_only && !rule->symlink) + continue; + if (regexec(&rule->re, name, 10, matches, 0)) + continue; + + got_match = 1; + print_match |= rule->print; + realloc_strncat(result, name, matches[0].rm_so); + + for (i = 0, j = 0; rule->result[i] != '\0'; ++i) { + if (rule->result[i] == '~') { + realloc_strncat(result, rule->result + j, i - j); + realloc_strncat(result, name, matches[0].rm_eo); + j = i + 1; + continue; + } + if (rule->result[i] != '\\') + continue; + + ++i; + c = rule->result[i]; + switch (c) { + case '~': + case '\\': + realloc_strncat(result, rule->result + j, i - j - 1); + j = i; + break; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + realloc_strncat(result, rule->result + j, i - j - 1); + if ((size_t)(c - '0') > (size_t)(rule->re.re_nsub)) { + free(*result); + *result = NULL; + return -1; + } + realloc_strncat(result, name + matches[c - '0'].rm_so, matches[c - '0'].rm_eo - matches[c - '0'].rm_so); + j = i + 1; + break; + default: + /* Just continue; */ + break; + } + + } + + realloc_strcat(result, rule->result + j); + + name += matches[0].rm_eo; + + if (!rule->global) + break; + } + + if (got_match) + realloc_strcat(result, name); + + if (print_match) + fprintf(stderr, "%s >> %s\n", path, *result); + + return got_match; +} + +void +cleanup_substitution(struct bsdtar *bsdtar) +{ + struct subst_rule *rule; + struct substitution *subst; + + if ((subst = bsdtar->substitution) == NULL) + return; + + while ((rule = subst->first_rule) != NULL) { + subst->first_rule = rule->next; + free(rule->result); + free(rule); + } + free(subst); +} +#endif /* HAVE_REGEX_H */ diff --git a/Utilities/cmlibarchive/tar/test/CMakeLists.txt b/Utilities/cmlibarchive/tar/test/CMakeLists.txt new file mode 100644 index 000000000..81870c482 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/CMakeLists.txt @@ -0,0 +1,62 @@ +############################################ +# +# How to build bsdtar_test +# +############################################ +IF(ENABLE_TAR AND ENABLE_TEST) + SET(bsdtar_test_SOURCES + ../getdate.c + main.c + test.h + test_0.c + test_basic.c + test_copy.c + test_getdate.c + test_help.c + test_option_T_upper.c + test_option_q.c + test_option_r.c + test_option_s.c + test_patterns.c + test_stdio.c + test_strip_components.c + test_symlink_dir.c + test_version.c + test_windows.c + ) + IF(WIN32 AND NOT CYGWIN) + LIST(APPEND bsdtar_test_SOURCES ../bsdtar_windows.c) + LIST(APPEND bsdtar_test_SOURCES ../bsdtar_windows.h) + ENDIF(WIN32 AND NOT CYGWIN) + + # + # Generate the list.h + # + GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h + ${CMAKE_CURRENT_LIST_FILE} ${bsdtar_test_SOURCES}) + SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES + ${CMAKE_CURRENT_BINARY_DIR}) + # + # Register target + # + ADD_EXECUTABLE(bsdtar_test ${bsdtar_test_SOURCES}) + SET_PROPERTY(TARGET bsdtar_test PROPERTY COMPILE_DEFINITIONS LIST_H) + + # ADD_TEST() for each separate test + SET(num 0) + FOREACH(test ${bsdtar_test_SOURCES}) + IF(test MATCHES "^test_[^/]+[.]c$") + STRING(REGEX REPLACE "^(test_[^/]+)[.]c$" "\\1" testname ${test}) + ADD_TEST("bsdtar_${testname}" bsdtar_test + -q -v -p ${BSDTAR} -r ${CMAKE_CURRENT_SOURCE_DIR} ${num}) + MATH(EXPR num "${num} + 1") + ENDIF(test MATCHES "^test_[^/]+[.]c$") + ENDFOREACH(test) + + # Experimental new test handling + ADD_CUSTOM_TARGET(run_bsdtar_test + COMMAND bsdtar_test -p ${BSDTAR} -r ${CMAKE_CURRENT_SOURCE_DIR}) + ADD_DEPENDENCIES(run_bsdtar_test bsdtar) + ADD_DEPENDENCIES(run_all_tests run_bsdtar_test) + +ENDIF (ENABLE_TAR AND ENABLE_TEST) diff --git a/Utilities/cmlibarchive/tar/test/Makefile b/Utilities/cmlibarchive/tar/test/Makefile new file mode 100644 index 000000000..a3382fcff --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/Makefile @@ -0,0 +1,68 @@ +# $FreeBSD: src/usr.bin/tar/test/Makefile,v 1.5 2008/11/10 05:04:55 kientzle Exp $ + +# Where to find the tar sources (for the internal unit tests) +TAR_SRCDIR=${.CURDIR}/.. +.PATH: ${TAR_SRCDIR} + +# Some tar sources are pulled in for white-box tests +TAR_SRCS= \ + getdate.c + +TESTS= \ + test_0.c \ + test_basic.c \ + test_copy.c \ + test_getdate.c \ + test_help.c \ + test_option_T_upper.c \ + test_option_q.c \ + test_option_r.c \ + test_option_s.c \ + test_patterns.c \ + test_stdio.c \ + test_strip_components.c \ + test_symlink_dir.c \ + test_version.c \ + test_windows.c + +# Build the test program +SRCS= ${TAR_SRCS} \ + ${TESTS} \ + list.h \ + main.c + +CLEANFILES+= list.h + +NO_MAN=yes + +PROG=bsdtar_test +DPADD=${LIBARCHIVE} ${LIBBZ2} ${LIBZ} +CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" +CFLAGS+= -I.. +LDADD= -larchive -lz -lbz2 +CFLAGS+= -static -g -O2 -Wall +CFLAGS+= -I${.OBJDIR} +CFLAGS+= -I${TAR_SRCDIR} + +# Uncomment to link against dmalloc +#LDADD+= -L/usr/local/lib -ldmalloc +#CFLAGS+= -I/usr/local/include -DUSE_DMALLOC +WARNS=6 + +check test: bsdtar_test + ./bsdtar_test -p ${.OBJDIR}/../bsdtar -r ${.CURDIR} + +list.h: ${TESTS} Makefile + (cd ${.CURDIR}; cat ${TESTS}) | grep DEFINE_TEST > list.h + +clean: + rm -f *.out + rm -f *.o + rm -f *.core + rm -f *~ + rm -f list.h + rm -f archive.h ../archive.h + -chmod -R +w /tmp/bsdtar_test.* + rm -rf /tmp/bsdtar_test.* + +.include diff --git a/Utilities/cmlibarchive/tar/test/main.c b/Utilities/cmlibarchive/tar/test/main.c new file mode 100644 index 000000000..9815a8543 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/main.c @@ -0,0 +1,2057 @@ +/* + * Copyright (c) 2003-2009 Tim Kientzle + * 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 +#include +#include +#include +#include "test.h" + +/* + * This same file is used pretty much verbatim for all test harnesses. + * + * The next few lines are the only differences. + * TODO: Move this into a separate configuration header, have all test + * suites share one copy of this file. + */ +__FBSDID("$FreeBSD: src/usr.bin/tar/test/main.c,v 1.6 2008/11/05 06:40:53 kientzle Exp $"); +#define KNOWNREF "test_patterns_2.tar.uu" +#define ENVBASE "BSDTAR" /* Prefix for environment variables. */ +#define PROGRAM "bsdtar" /* Name of program being tested. */ +#undef LIBRARY /* Not testing a library. */ +#undef EXTRA_DUMP /* How to dump extra data */ +/* How to generate extra version info. */ +#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "") + +/* + * + * Windows support routines + * + * Note: Configuration is a tricky issue. Using HAVE_* feature macros + * in the test harness is dangerous because they cover up + * configuration errors. The classic example of this is omitting a + * configure check. If libarchive and libarchive_test both look for + * the same feature macro, such errors are hard to detect. Platform + * macros (e.g., _WIN32 or __GNUC__) are a little better, but can + * easily lead to very messy code. It's best to limit yourself + * to only the most generic programming techniques in the test harness + * and thus avoid conditionals altogether. Where that's not possible, + * try to minimize conditionals by grouping platform-specific tests in + * one place (e.g., test_acl_freebsd) or by adding new assert() + * functions (e.g., assertMakeHardlink()) to cover up platform + * differences. Platform-specific coding in libarchive_test is often + * a symptom that some capability is missing from libarchive itself. + */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#if !defined(__GNUC__) +#include +#endif +#include +#include +#ifndef F_OK +#define F_OK (0) +#endif +#ifndef S_ISDIR +#define S_ISDIR(m) ((m) & _S_IFDIR) +#endif +#ifndef S_ISREG +#define S_ISREG(m) ((m) & _S_IFREG) +#endif +#define access _access +#ifndef fileno +#define fileno _fileno +#endif +/*#define fstat _fstat64*/ +#define getcwd _getcwd +#define lstat stat +/*#define lstat _stat64*/ +/*#define stat _stat64*/ +#define rmdir _rmdir +#define strdup _strdup +#define umask _umask +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) +void *GetFunctionKernel32(const char *name) +{ + static HINSTANCE lib; + static int set; + if (!set) { + set = 1; + lib = LoadLibrary("kernel32.dll"); + } + if (lib == NULL) { + fprintf(stderr, "Can't load kernel32.dll?!\n"); + exit(1); + } + return (void *)GetProcAddress(lib, name); +} + +static int +my_CreateSymbolicLinkA(const char *linkname, const char *target, int flags) +{ + static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, DWORD); + static int set; + if (!set) { + set = 1; + f = GetFunctionKernel32("CreateSymbolicLinkA"); + } + return f == NULL ? 0 : (*f)(linkname, target, flags); +} + +static int +my_CreateHardLinkA(const char *linkname, const char *target) +{ + static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES); + static int set; + if (!set) { + set = 1; + f = GetFunctionKernel32("CreateHardLinkA"); + } + return f == NULL ? 0 : (*f)(linkname, target, NULL); +} + +int +my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi) +{ + HANDLE h; + int r; + + h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) + return (0); + r = GetFileInformationByHandle(h, bhfi); + CloseHandle(h); + return (r); +} +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__) +static void +invalid_parameter_handler(const wchar_t * expression, + const wchar_t * function, const wchar_t * file, + unsigned int line, uintptr_t pReserved) +{ + /* nop */ +} +#endif + +/* + * + * OPTIONS FLAGS + * + */ + +/* Enable core dump on failure. */ +static int dump_on_failure = 0; +/* Default is to remove temp dirs and log data for successful tests. */ +static int keep_temp_files = 0; +/* Default is to just report pass/fail for each test. */ +static int verbosity = 0; +#define VERBOSITY_SUMMARY_ONLY -1 /* -q */ +#define VERBOSITY_PASSFAIL 0 /* Default */ +#define VERBOSITY_LIGHT_REPORT 1 /* -v */ +#define VERBOSITY_FULL 2 /* -vv */ +/* A few places generate even more output for verbosity > VERBOSITY_FULL, + * mostly for debugging the test harness itself. */ +/* Cumulative count of assertion failures. */ +static int failures = 0; +/* Cumulative count of reported skips. */ +static int skips = 0; +/* Cumulative count of assertions checked. */ +static int assertions = 0; + +/* Directory where uuencoded reference files can be found. */ +static const char *refdir; + +/* + * Report log information selectively to console and/or disk log. + */ +static int log_console = 0; +static FILE *logfile; +static void +vlogprintf(const char *fmt, va_list ap) +{ + if (log_console) + vfprintf(stdout, fmt, ap); + if (logfile != NULL) + vfprintf(logfile, fmt, ap); +} + +static void +logprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vlogprintf(fmt, ap); + va_end(ap); +} + +/* Set up a message to display only if next assertion fails. */ +static char msgbuff[4096]; +static const char *msg, *nextmsg; +void +failure(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vsprintf(msgbuff, fmt, ap); + va_end(ap); + nextmsg = msgbuff; +} + +/* + * Copy arguments into file-local variables. + * This was added to permit vararg assert() functions without needing + * variadic wrapper macros. Turns out that the vararg capability is almost + * never used, so almost all of the vararg assertions can be simplified + * by removing the vararg capability and reworking the wrapper macro to + * pass __FILE__, __LINE__ directly into the function instead of using + * this hook. I suspect this machinery is used so rarely that we + * would be better off just removing it entirely. That would simplify + * the code here noticably. + */ +static const char *test_filename; +static int test_line; +static void *test_extra; +void assertion_setup(const char *filename, int line) +{ + test_filename = filename; + test_line = line; +} + +/* Called at the beginning of each assert() function. */ +static void +assertion_count(const char *file, int line) +{ + (void)file; /* UNUSED */ + (void)line; /* UNUSED */ + ++assertions; + /* Proper handling of "failure()" message. */ + msg = nextmsg; + nextmsg = NULL; + /* Uncomment to print file:line after every assertion. + * Verbose, but occasionally useful in tracking down crashes. */ + /* printf("Checked %s:%d\n", file, line); */ +} + +/* + * For each test source file, we remember how many times each + * assertion was reported. Cleared before each new test, + * used by test_summarize(). + */ +static struct line { + int count; + int skip; +} failed_lines[10000]; + +/* Count this failure, setup up log destination and handle initial report. */ +static void +failure_start(const char *filename, int line, const char *fmt, ...) +{ + va_list ap; + + /* Record another failure for this line. */ + ++failures; + /* test_filename = filename; */ + failed_lines[line].count++; + + /* Determine whether to log header to console. */ + switch (verbosity) { + case VERBOSITY_FULL: + log_console = 1; + break; + case VERBOSITY_LIGHT_REPORT: + log_console = (failed_lines[line].count < 2); + break; + default: + log_console = 0; + } + + /* Log file:line header for this failure */ + va_start(ap, fmt); +#if _MSC_VER + logprintf("%s(%d): ", filename, line); +#else + logprintf("%s:%d: ", filename, line); +#endif + vlogprintf(fmt, ap); + va_end(ap); + logprintf("\n"); + + if (msg != NULL && msg[0] != '\0') { + logprintf(" Description: %s\n", msg); + msg = NULL; + } + + /* Determine whether to log details to console. */ + if (verbosity == VERBOSITY_LIGHT_REPORT) + log_console = 0; +} + +/* Complete reporting of failed tests. */ +/* + * The 'extra' hook here is used by libarchive to include libarchive + * error messages with assertion failures. It could also be used + * to add strerror() output, for example. Just define the EXTRA_DUMP() + * macro appropriately. + */ +static void +failure_finish(void *extra) +{ + (void)extra; /* UNUSED (maybe) */ +#ifdef EXTRA_DUMP + if (extra != NULL) + logprintf(" detail: %s\n", EXTRA_DUMP(extra)); +#endif + + if (dump_on_failure) { + fprintf(stderr, + " *** forcing core dump so failure can be debugged ***\n"); + *(char *)(NULL) = 0; + exit(1); + } +} + +/* Inform user that we're skipping some checks. */ +void +test_skipping(const char *fmt, ...) +{ + char buff[1024]; + va_list ap; + + va_start(ap, fmt); + vsprintf(buff, fmt, ap); + va_end(ap); + /* failure_start() isn't quite right, but is awfully convenient. */ + failure_start(test_filename, test_line, "SKIPPING: %s", buff); + --failures; /* Undo failures++ in failure_start() */ + /* Don't failure_finish() here. */ + /* Mark as skip, so doesn't count as failed test. */ + failed_lines[test_line].skip = 1; + ++skips; +} + +/* + * + * ASSERTIONS + * + */ + +/* Generic assert() just displays the failed condition. */ +int +assertion_assert(const char *file, int line, int value, + const char *condition, void *extra) +{ + assertion_count(file, line); + if (!value) { + failure_start(file, line, "Assertion failed: %s", condition); + failure_finish(extra); + } + return (value); +} + +/* chdir() and report any errors */ +int +assertion_chdir(const char *file, int line, const char *pathname) +{ + assertion_count(file, line); + if (chdir(pathname) == 0) + return (1); + failure_start(file, line, "chdir(\"%s\")", pathname); + failure_finish(NULL); + return (0); + +} + +/* Verify two integers are equal. */ +int +assertion_equal_int(const char *file, int line, + long long v1, const char *e1, long long 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=%lld (0x%llx, 0%llo)\n", e1, v1, v1, v1); + logprintf(" %s=%lld (0x%llx, 0%llo)\n", e2, v2, v2, v2); + failure_finish(extra); + return (0); +} + +static void strdump(const char *e, const char *p) +{ + const char *q = p; + + logprintf(" %s = ", e); + if (p == NULL) { + logprintf("NULL"); + return; + } + logprintf("\""); + while (*p != '\0') { + unsigned int c = 0xff & *p++; + switch (c) { + case '\a': printf("\a"); break; + case '\b': printf("\b"); break; + case '\n': printf("\n"); break; + case '\r': printf("\r"); break; + default: + if (c >= 32 && c < 127) + logprintf("%c", c); + else + logprintf("\\x%02X", c); + } + } + logprintf("\""); + logprintf(" (length %d)\n", q == NULL ? -1 : (int)strlen(q)); +} + +/* Verify two strings are equal, dump them if not. */ +int +assertion_equal_string(const char *file, int line, + const char *v1, const char *e1, + const char *v2, const char *e2, + void *extra) +{ + assertion_count(file, line); + if (v1 == v2 || strcmp(v1, v2) == 0) + return (1); + failure_start(file, line, "%s != %s", e1, e2); + strdump(e1, v1); + strdump(e2, v2); + failure_finish(extra); + return (0); +} + +static void +wcsdump(const char *e, const wchar_t *w) +{ + logprintf(" %s = ", e); + if (w == NULL) { + logprintf("(null)"); + return; + } + logprintf("\""); + while (*w != L'\0') { + unsigned int c = *w++; + if (c >= 32 && c < 127) + logprintf("%c", c); + else if (c < 256) + logprintf("\\x%02X", c); + else if (c < 0x10000) + logprintf("\\u%04X", c); + else + logprintf("\\U%08X", c); + } + logprintf("\"\n"); +} + +/* Verify that two wide strings are equal, dump them if not. */ +int +assertion_equal_wstring(const char *file, int line, + const wchar_t *v1, const char *e1, + const wchar_t *v2, const char *e2, + void *extra) +{ + assertion_count(file, line); + if (v1 == v2 || wcscmp(v1, v2) == 0) + return (1); + failure_start(file, line, "%s != %s", e1, e2); + wcsdump(e1, v1); + wcsdump(e2, v2); + failure_finish(extra); + return (0); +} + +/* + * Pretty standard hexdump routine. As a bonus, if ref != NULL, then + * any bytes in p that differ from ref will be highlighted with '_' + * before and after the hex value. + */ +static void +hexdump(const char *p, const char *ref, size_t l, size_t offset) +{ + size_t i, j; + char sep; + + for(i=0; i < l; i+=16) { + logprintf("%04x", (unsigned)(i + offset)); + sep = ' '; + for (j = 0; j < 16 && i + j < l; j++) { + if (ref != NULL && p[i + j] != ref[i + j]) + sep = '_'; + logprintf("%c%02x", sep, 0xff & (int)p[i+j]); + if (ref != NULL && p[i + j] == ref[i + j]) + sep = ' '; + } + for (; j < 16; j++) { + logprintf("%c ", sep); + sep = ' '; + } + logprintf("%c", sep); + for (j=0; j < 16 && i + j < l; j++) { + int c = p[i + j]; + if (c >= ' ' && c <= 126) + logprintf("%c", c); + else + logprintf("."); + } + logprintf("\n"); + } +} + +/* Verify that two blocks of memory are the same, display the first + * block of differences if they're not. */ +int +assertion_equal_mem(const char *file, int line, + const void *_v1, const char *e1, + const void *_v2, const char *e2, + size_t l, const char *ld, void *extra) +{ + const char *v1 = (const char *)_v1; + const char *v2 = (const char *)_v2; + size_t offset; + + assertion_count(file, line); + if (v1 == v2 || memcmp(v1, v2, l) == 0) + return (1); + + failure_start(file, line, "%s != %s", e1, e2); + logprintf(" size %s = %d\n", ld, (int)l); + /* Dump 48 bytes (3 lines) so that the first difference is + * in the second line. */ + offset = 0; + while (l > 64 && memcmp(v1, v2, 32) == 0) { + /* Two lines agree, so step forward one line. */ + v1 += 16; + v2 += 16; + l -= 16; + offset += 16; + } + logprintf(" Dump of %s\n", e1); + hexdump(v1, v2, l < 64 ? l : 64, offset); + logprintf(" Dump of %s\n", e2); + hexdump(v2, v1, l < 64 ? l : 64, offset); + logprintf("\n"); + failure_finish(extra); + return (0); +} + +/* Verify that the named file exists and is empty. */ +int +assertion_empty_file(const char *f1fmt, ...) +{ + char buff[1024]; + char f1[1024]; + struct stat st; + va_list ap; + ssize_t s; + FILE *f; + + assertion_count(test_filename, test_line); + va_start(ap, f1fmt); + vsprintf(f1, f1fmt, ap); + va_end(ap); + + if (stat(f1, &st) != 0) { + failure_start(test_filename, test_line, "Stat failed: %s", f1); + failure_finish(NULL); + return (0); + } + if (st.st_size == 0) + return (1); + + failure_start(test_filename, test_line, "File should be empty: %s", f1); + logprintf(" File size: %d\n", (int)st.st_size); + logprintf(" Contents:\n"); + f = fopen(f1, "rb"); + if (f == NULL) { + logprintf(" Unable to open %s\n", f1); + } else { + s = ((off_t)sizeof(buff) < st.st_size) ? + (ssize_t)sizeof(buff) : (ssize_t)st.st_size; + s = fread(buff, 1, s, f); + hexdump(buff, NULL, s, 0); + fclose(f); + } + failure_finish(NULL); + return (0); +} + +/* Verify that the named file exists and is not empty. */ +int +assertion_non_empty_file(const char *f1fmt, ...) +{ + char f1[1024]; + struct stat st; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, f1fmt); + vsprintf(f1, f1fmt, ap); + va_end(ap); + + if (stat(f1, &st) != 0) { + failure_start(test_filename, test_line, "Stat failed: %s", f1); + failure_finish(NULL); + return (0); + } + if (st.st_size == 0) { + failure_start(test_filename, test_line, "File empty: %s", f1); + failure_finish(NULL); + return (0); + } + return (1); +} + +/* Verify that two files have the same contents. */ +/* TODO: hexdump the first bytes that actually differ. */ +int +assertion_equal_file(const char *fn1, const char *f2pattern, ...) +{ + char fn2[1024]; + va_list ap; + char buff1[1024]; + char buff2[1024]; + FILE *f1, *f2; + int n1, n2; + + assertion_count(test_filename, test_line); + va_start(ap, f2pattern); + vsprintf(fn2, f2pattern, ap); + va_end(ap); + + f1 = fopen(fn1, "rb"); + f2 = fopen(fn2, "rb"); + for (;;) { + n1 = fread(buff1, 1, sizeof(buff1), f1); + n2 = fread(buff2, 1, sizeof(buff2), f2); + if (n1 != n2) + break; + if (n1 == 0 && n2 == 0) { + fclose(f1); + fclose(f2); + return (1); + } + if (memcmp(buff1, buff2, n1) != 0) + break; + } + fclose(f1); + fclose(f2); + failure_start(test_filename, test_line, "Files not identical"); + logprintf(" file1=\"%s\"\n", fn1); + logprintf(" file2=\"%s\"\n", fn2); + failure_finish(test_extra); + return (0); +} + +/* Verify that the named file does exist. */ +int +assertion_file_exists(const char *fpattern, ...) +{ + char f[1024]; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(f, fpattern, ap); + va_end(ap); + +#if defined(_WIN32) && !defined(__CYGWIN__) + if (!_access(f, 0)) + return (1); +#else + if (!access(f, F_OK)) + return (1); +#endif + failure_start(test_filename, test_line, "File should exist: %s", f); + failure_finish(test_extra); + return (0); +} + +/* Verify that the named file doesn't exist. */ +int +assertion_file_not_exists(const char *fpattern, ...) +{ + char f[1024]; + va_list ap; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(f, fpattern, ap); + va_end(ap); + +#if defined(_WIN32) && !defined(__CYGWIN__) + if (_access(f, 0)) + return (1); +#else + if (access(f, F_OK)) + return (1); +#endif + failure_start(test_filename, test_line, "File should not exist: %s", f); + failure_finish(test_extra); + return (0); +} + +/* Compare the contents of a file to a block of memory. */ +int +assertion_file_contents(const void *buff, int s, const char *fpattern, ...) +{ + char fn[1024]; + va_list ap; + char *contents; + FILE *f; + int n; + + assertion_count(test_filename, test_line); + va_start(ap, fpattern); + vsprintf(fn, fpattern, ap); + va_end(ap); + + f = fopen(fn, "rb"); + if (f == NULL) { + failure_start(test_filename, test_line, + "File should exist: %s", fn); + failure_finish(test_extra); + return (0); + } + contents = malloc(s * 2); + n = fread(contents, 1, s * 2, f); + fclose(f); + if (n == s && memcmp(buff, contents, s) == 0) { + free(contents); + return (1); + } + failure_start(test_filename, test_line, "File contents don't match"); + logprintf(" file=\"%s\"\n", fn); + if (n > 0) + hexdump(contents, buff, n > 512 ? 512 : n, 0); + else { + logprintf(" File empty, contents should be:\n"); + hexdump(buff, NULL, s > 512 ? 512 : n, 0); + } + failure_finish(test_extra); + free(contents); + return (0); +} + +/* Check the contents of a text file, being tolerant of line endings. */ +int +assertion_text_file_contents(const char *buff, const char *fn) +{ + char *contents; + const char *btxt, *ftxt; + FILE *f; + int n, s; + + assertion_count(test_filename, test_line); + f = fopen(fn, "r"); + s = strlen(buff); + contents = malloc(s * 2 + 128); + n = fread(contents, 1, s * 2 + 128 - 1, f); + if (n >= 0) + contents[n] = '\0'; + fclose(f); + /* Compare texts. */ + btxt = buff; + ftxt = (const char *)contents; + while (*btxt != '\0' && *ftxt != '\0') { + if (*btxt == *ftxt) { + ++btxt; + ++ftxt; + continue; + } + if (btxt[0] == '\n' && ftxt[0] == '\r' && ftxt[1] == '\n') { + /* Pass over different new line characters. */ + ++btxt; + ftxt += 2; + continue; + } + break; + } + if (*btxt == '\0' && *ftxt == '\0') { + free(contents); + return (1); + } + failure_start(test_filename, test_line, "Contents don't match"); + logprintf(" file=\"%s\"\n", fn); + if (n > 0) + hexdump(contents, buff, n, 0); + else { + logprintf(" File empty, contents should be:\n"); + hexdump(buff, NULL, s, 0); + } + failure_finish(test_extra); + free(contents); + return (0); +} + +/* Test that two paths point to the same file. */ +/* As a side-effect, asserts that both files exist. */ +static int +is_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2; + int r; + + assertion_count(file, line); + r = my_GetFileInformationByName(path1, &bhfi1); + if (r == 0) { + failure_start(file, line, "File %s can't be inspected?", path1); + failure_finish(NULL); + return (0); + } + r = my_GetFileInformationByName(path2, &bhfi2); + if (r == 0) { + failure_start(file, line, "File %s can't be inspected?", path2); + failure_finish(NULL); + return (0); + } + return (bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh + && bhfi1.nFileIndexLow == bhfi2.nFileIndexLow); +#else + struct stat st1, st2; + int r; + + assertion_count(file, line); + r = lstat(path1, &st1); + if (r != 0) { + failure_start(file, line, "File should exist: %s", path1); + failure_finish(NULL); + return (0); + } + r = lstat(path2, &st2); + if (r != 0) { + failure_start(file, line, "File should exist: %s", path2); + failure_finish(NULL); + return (0); + } + return (st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev); +#endif +} + +int +assertion_is_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ + if (is_hardlink(file, line, path1, path2)) + return (1); + failure_start(file, line, + "Files %s and %s are not hardlinked", path1, path2); + failure_finish(NULL); + return (0); +} + +int +assertion_is_not_hardlink(const char *file, int line, + const char *path1, const char *path2) +{ + if (!is_hardlink(file, line, path1, path2)) + return (1); + failure_start(file, line, + "Files %s and %s should not be hardlinked", path1, path2); + failure_finish(NULL); + return (0); +} + +/* Verify a/b/mtime of 'pathname'. */ +/* If 'recent', verify that it's within last 10 seconds. */ +static int +assertion_file_time(const char *file, int line, + const char *pathname, long t, long nsec, char type, int recent) +{ + long long filet, filet_nsec; + int r; + +#if defined(_WIN32) && !defined(__CYGWIN__) +#define EPOC_TIME (116444736000000000ULL) + FILETIME ftime, fbirthtime, fatime, fmtime; + ULARGE_INTEGER wintm; + HANDLE h; + ftime.dwLowDateTime = 0; + ftime.dwHighDateTime = 0; + + assertion_count(file, line); + h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) { + failure_start(file, line, "Can't access %s\n", pathname); + failure_finish(NULL); + return (0); + } + r = GetFileTime(h, &fbirthtime, &fatime, &fmtime); + switch (type) { + case 'a': ftime = fatime; break; + case 'b': ftime = fbirthtime; break; + case 'm': ftime = fmtime; break; + } + CloseHandle(h); + if (r == 0) { + failure_start(file, line, "Can't GetFileTime %s\n", pathname); + failure_finish(NULL); + return (0); + } + wintm.LowPart = ftime.dwLowDateTime; + wintm.HighPart = ftime.dwHighDateTime; + filet = (wintm.QuadPart - EPOC_TIME) / 10000000; + filet_nsec = ((wintm.QuadPart - EPOC_TIME) % 10000000) * 100; + nsec = (nsec / 100) * 100; /* Round the request */ +#else + struct stat st; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, "Can't stat %s\n", pathname); + failure_finish(NULL); + return (0); + } + switch (type) { + case 'a': filet = st.st_atime; break; + case 'm': filet = st.st_mtime; break; + case 'b': filet = 0; break; + default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type); + exit(1); + } +#if defined(__FreeBSD__) + switch (type) { + case 'a': filet_nsec = st.st_atimespec.tv_nsec; break; + case 'b': filet = st.st_birthtime; + filet_nsec = st.st_birthtimespec.tv_nsec; break; + case 'm': filet_nsec = st.st_mtimespec.tv_nsec; break; + default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type); + exit(1); + } + /* FreeBSD generally only stores to microsecond res, so round. */ + filet_nsec = (filet_nsec / 1000) * 1000; + nsec = (nsec / 1000) * 1000; +#else + filet_nsec = nsec = 0; /* Generic POSIX only has whole seconds. */ + if (type == 'b') return (1); /* Generic POSIX doesn't have birthtime */ +#endif +#endif + if (recent) { + /* Check that requested time is up-to-date. */ + time_t now = time(NULL); + if (filet < now - 10 || filet > now + 1) { + failure_start(file, line, + "File %s has %ctime %ld, %ld seconds ago\n", + pathname, type, filet, now - filet); + failure_finish(NULL); + return (0); + } + } else if (filet != t || filet_nsec != nsec) { + failure_start(file, line, + "File %s has %ctime %ld.%09ld, expected %ld.%09ld", + pathname, type, filet, filet_nsec, t, nsec); + failure_finish(NULL); + return (0); + } + return (1); +} + +/* Verify atime of 'pathname'. */ +int +assertion_file_atime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'a', 0); +} + +/* Verify atime of 'pathname' is up-to-date. */ +int +assertion_file_atime_recent(const char *file, int line, const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'a', 1); +} + +/* Verify birthtime of 'pathname'. */ +int +assertion_file_birthtime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'b', 0); +} + +/* Verify birthtime of 'pathname' is up-to-date. */ +int +assertion_file_birthtime_recent(const char *file, int line, + const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'b', 1); +} + +/* Verify mtime of 'pathname'. */ +int +assertion_file_mtime(const char *file, int line, + const char *pathname, long t, long nsec) +{ + return assertion_file_time(file, line, pathname, t, nsec, 'm', 0); +} + +/* Verify mtime of 'pathname' is up-to-date. */ +int +assertion_file_mtime_recent(const char *file, int line, const char *pathname) +{ + return assertion_file_time(file, line, pathname, 0, 0, 'm', 1); +} + +/* Verify number of links to 'pathname'. */ +int +assertion_file_nlinks(const char *file, int line, + const char *pathname, int nlinks) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + BY_HANDLE_FILE_INFORMATION bhfi; + int r; + + assertion_count(file, line); + r = my_GetFileInformationByName(pathname, &bhfi); + if (r != 0 && bhfi.nNumberOfLinks == nlinks) + return (1); + failure_start(file, line, "File %s has %d links, expected %d", + pathname, bhfi.nNumberOfLinks, nlinks); + failure_finish(NULL); + return (0); +#else + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r == 0 && st.st_nlink == nlinks) + return (1); + failure_start(file, line, "File %s has %d links, expected %d", + pathname, st.st_nlink, nlinks); + failure_finish(NULL); + return (0); +#endif +} + +/* Verify size of 'pathname'. */ +int +assertion_file_size(const char *file, int line, const char *pathname, long size) +{ + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r == 0 && st.st_size == size) + return (1); + failure_start(file, line, "File %s has size %ld, expected %ld", + pathname, (long)st.st_size, (long)size); + failure_finish(NULL); + return (0); +} + +/* Assert that 'pathname' is a dir. If mode >= 0, verify that too. */ +int +assertion_is_dir(const char *file, int line, const char *pathname, int mode) +{ + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, "Dir should exist: %s", pathname); + failure_finish(NULL); + return (0); + } + if (!S_ISDIR(st.st_mode)) { + failure_start(file, line, "%s is not a dir", pathname); + failure_finish(NULL); + return (0); + } +#if !defined(_WIN32) || defined(__CYGWIN__) + /* Windows doesn't handle permissions the same way as POSIX, + * so just ignore the mode tests. */ + /* TODO: Can we do better here? */ + if (mode >= 0 && mode != (st.st_mode & 07777)) { + failure_start(file, line, "Dir %s has wrong mode", pathname); + logprintf(" Expected: 0%3o\n", mode); + logprintf(" Found: 0%3o\n", st.st_mode & 07777); + failure_finish(NULL); + return (0); + } +#endif + return (1); +} + +/* Verify that 'pathname' is a regular file. If 'mode' is >= 0, + * verify that too. */ +int +assertion_is_reg(const char *file, int line, const char *pathname, int mode) +{ + struct stat st; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0 || !S_ISREG(st.st_mode)) { + failure_start(file, line, "File should exist: %s", pathname); + failure_finish(NULL); + return (0); + } +#if !defined(_WIN32) || defined(__CYGWIN__) + /* Windows doesn't handle permissions the same way as POSIX, + * so just ignore the mode tests. */ + /* TODO: Can we do better here? */ + if (mode >= 0 && mode != (st.st_mode & 07777)) { + failure_start(file, line, "File %s has wrong mode", pathname); + logprintf(" Expected: 0%3o\n", mode); + logprintf(" Found: 0%3o\n", st.st_mode & 07777); + failure_finish(NULL); + return (0); + } +#endif + return (1); +} + +/* Check whether 'pathname' is a symbolic link. If 'contents' is + * non-NULL, verify that the symlink has those contents. */ +static int +is_symlink(const char *file, int line, + const char *pathname, const char *contents) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + assertion_count(file, line); + /* Windows sort-of has real symlinks, but they're only usable + * by privileged users and are crippled even then, so there's + * really not much point in bothering with this. */ + return (0); +#else + char buff[300]; + struct stat st; + ssize_t linklen; + int r; + + assertion_count(file, line); + r = lstat(pathname, &st); + if (r != 0) { + failure_start(file, line, + "Symlink should exist: %s", pathname); + failure_finish(NULL); + return (0); + } + if (!S_ISLNK(st.st_mode)) + return (0); + if (contents == NULL) + return (1); + linklen = readlink(pathname, buff, sizeof(buff)); + if (linklen < 0) { + failure_start(file, line, "Can't read symlink %s", pathname); + failure_finish(NULL); + return (0); + } + buff[linklen] = '\0'; + if (strcmp(buff, contents) != 0) + return (0); + return (1); +#endif +} + +/* Assert that path is a symlink that (optionally) contains contents. */ +int +assertion_is_symlink(const char *file, int line, + const char *path, const char *contents) +{ + if (is_symlink(file, line, path, contents)) + return (1); + if (contents) + failure_start(file, line, "File %s is not a symlink to %s", + path, contents); + else + failure_start(file, line, "File %s is not a symlink", path); + failure_finish(NULL); + return (0); +} + + +/* Create a directory and report any errors. */ +int +assertion_make_dir(const char *file, int line, const char *dirname, int mode) +{ + assertion_count(file, line); +#if defined(_WIN32) && !defined(__CYGWIN__) + if (0 == _mkdir(dirname)) + return (1); +#else + if (0 == mkdir(dirname, mode)) + return (1); +#endif + failure_start(file, line, "Could not create directory %s", dirname); + failure_finish(NULL); + return(0); +} + +/* Create a file with the specified contents and report any failures. */ +int +assertion_make_file(const char *file, int line, + const char *path, int mode, const char *contents) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* TODO: Rework this to set file mode as well. */ + FILE *f; + assertion_count(file, line); + f = fopen(path, "wb"); + if (f == NULL) { + failure_start(file, line, "Could not create file %s", path); + failure_finish(NULL); + return (0); + } + if (contents != NULL) { + if (strlen(contents) + != fwrite(contents, 1, strlen(contents), f)) { + fclose(f); + failure_start(file, line, + "Could not write file %s", path); + failure_finish(NULL); + return (0); + } + } + fclose(f); + return (1); +#else + int fd; + assertion_count(file, line); + fd = open(path, O_CREAT | O_WRONLY, mode >= 0 ? mode : 0644); + if (fd < 0) { + failure_start(file, line, "Could not create %s", path); + failure_finish(NULL); + return (0); + } + if (contents != NULL) { + if ((ssize_t)strlen(contents) + != write(fd, contents, strlen(contents))) { + close(fd); + failure_start(file, line, "Could not write to %s", path); + failure_finish(NULL); + return (0); + } + } + close(fd); + return (1); +#endif +} + +/* Create a hardlink and report any failures. */ +int +assertion_make_hardlink(const char *file, int line, + const char *newpath, const char *linkto) +{ + int succeeded; + + assertion_count(file, line); +#if defined(_WIN32) && !defined(__CYGWIN__) + succeeded = my_CreateHardLinkA(newpath, linkto); +#elif HAVE_LINK + succeeded = !link(linkto, newpath); +#else + succeeded = 0; +#endif + if (succeeded) + return (1); + failure_start(file, line, "Could not create hardlink"); + logprintf(" New link: %s\n", newpath); + logprintf(" Old name: %s\n", linkto); + failure_finish(NULL); + return(0); +} + +/* Create a symlink and report any failures. */ +int +assertion_make_symlink(const char *file, int line, + const char *newpath, const char *linkto) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + int targetIsDir = 0; /* TODO: Fix this */ + assertion_count(file, line); + if (my_CreateSymbolicLinkA(newpath, linkto, targetIsDir)) + return (1); +#elif HAVE_SYMLINK + assertion_count(file, line); + if (0 == symlink(linkto, newpath)) + return (1); +#endif + failure_start(file, line, "Could not create symlink"); + logprintf(" New link: %s\n", newpath); + logprintf(" Old name: %s\n", linkto); + failure_finish(NULL); + return(0); +} + +/* Set umask, report failures. */ +int +assertion_umask(const char *file, int line, int mask) +{ + assertion_count(file, line); + (void)file; /* UNUSED */ + (void)line; /* UNUSED */ + umask(mask); + return (1); +} + +/* + * + * UTILITIES for use by tests. + * + */ + +/* + * Check whether platform supports symlinks. This is intended + * for tests to use in deciding whether to bother testing symlink + * support; if the platform doesn't support symlinks, there's no point + * in checking whether the program being tested can create them. + * + * Note that the first time this test is called, we actually go out to + * disk to create and verify a symlink. This is necessary because + * symlink support is actually a property of a particular filesystem + * and can thus vary between directories on a single system. After + * the first call, this returns the cached result from memory, so it's + * safe to call it as often as you wish. + */ +int +canSymlink(void) +{ + /* Remember the test result */ + static int value = 0, tested = 0; + if (tested) + return (value); + + ++tested; + assertion_make_file(__FILE__, __LINE__, "canSymlink.0", 0644, "a"); + /* Note: Cygwin has its own symlink() emulation that does not + * use the Win32 CreateSymbolicLink() function. */ +#if defined(_WIN32) && !defined(__CYGWIN__) + value = my_CreateSymbolicLinkA("canSymlink.1", "canSymlink.0", 0) + && is_symlink(__FILE__, __LINE__, "canSymlink.1", "canSymlink.0"); +#elif HAVE_SYMLINK + value = (0 == symlink("canSymlink.0", "canSymlink.1")) + && is_symlink(__FILE__, __LINE__, "canSymlink.1","canSymlink.0"); +#endif + return (value); +} + +/* + * Can this platform run the gzip program? + */ +/* Platform-dependent options for hiding the output of a subcommand. */ +#if defined(_WIN32) && !defined(__CYGWIN__) +static const char *redirectArgs = ">NUL 2>NUL"; /* Win32 cmd.exe */ +#else +static const char *redirectArgs = ">/dev/null 2>/dev/null"; /* POSIX 'sh' */ +#endif +int +canGzip(void) +{ + static int tested = 0, value = 0; + if (!tested) { + tested = 1; + if (systemf("gzip -V %s", redirectArgs) == 0) + value = 1; + } + return (value); +} + +/* + * Can this platform run the gunzip program? + */ +int +canGunzip(void) +{ + static int tested = 0, value = 0; + if (!tested) { + tested = 1; + if (systemf("gunzip -V %s", redirectArgs) == 0) + value = 1; + } + return (value); +} + +/* + * Sleep as needed; useful for verifying disk timestamp changes by + * ensuring that the wall-clock time has actually changed before we + * go back to re-read something from disk. + */ +void +sleepUntilAfter(time_t t) +{ + while (t >= time(NULL)) +#if defined(_WIN32) && !defined(__CYGWIN__) + Sleep(500); +#else + sleep(1); +#endif +} + +/* + * Call standard system() call, but build up the command line using + * sprintf() conventions. + */ +int +systemf(const char *fmt, ...) +{ + char buff[8192]; + va_list ap; + int r; + + va_start(ap, fmt); + vsprintf(buff, fmt, ap); + if (verbosity > VERBOSITY_FULL) + logprintf("Cmd: %s\n", buff); + r = system(buff); + va_end(ap); + return (r); +} + +/* + * Slurp a file into memory for ease of comparison and testing. + * Returns size of file in 'sizep' if non-NULL, null-terminates + * data in memory for ease of use. + */ +char * +slurpfile(size_t * sizep, const char *fmt, ...) +{ + char filename[8192]; + struct stat st; + va_list ap; + char *p; + ssize_t bytes_read; + FILE *f; + int r; + + va_start(ap, fmt); + vsprintf(filename, fmt, ap); + va_end(ap); + + f = fopen(filename, "rb"); + if (f == NULL) { + /* Note: No error; non-existent file is okay here. */ + return (NULL); + } + r = fstat(fileno(f), &st); + if (r != 0) { + logprintf("Can't stat file %s\n", filename); + fclose(f); + return (NULL); + } + p = malloc((size_t)st.st_size + 1); + if (p == NULL) { + logprintf("Can't allocate %ld bytes of memory to read file %s\n", + (long int)st.st_size, filename); + fclose(f); + return (NULL); + } + bytes_read = fread(p, 1, (size_t)st.st_size, f); + if (bytes_read < st.st_size) { + logprintf("Can't read file %s\n", filename); + fclose(f); + free(p); + return (NULL); + } + p[st.st_size] = '\0'; + if (sizep != NULL) + *sizep = (size_t)st.st_size; + fclose(f); + return (p); +} + +/* Read a uuencoded file from the reference directory, decode, and + * write the result into the current directory. */ +#define UUDECODE(c) (((c) - 0x20) & 0x3f) +void +extract_reference_file(const char *name) +{ + char buff[1024]; + FILE *in, *out; + + sprintf(buff, "%s/%s.uu", refdir, name); + in = fopen(buff, "r"); + failure("Couldn't open reference file %s", buff); + assert(in != NULL); + if (in == NULL) + return; + /* Read up to and including the 'begin' line. */ + for (;;) { + if (fgets(buff, sizeof(buff), in) == NULL) { + /* TODO: This is a failure. */ + return; + } + if (memcmp(buff, "begin ", 6) == 0) + break; + } + /* Now, decode the rest and write it. */ + /* Not a lot of error checking here; the input better be right. */ + out = fopen(name, "wb"); + while (fgets(buff, sizeof(buff), in) != NULL) { + char *p = buff; + int bytes; + + if (memcmp(buff, "end", 3) == 0) + break; + + bytes = UUDECODE(*p++); + while (bytes > 0) { + int n = 0; + /* Write out 1-3 bytes from that. */ + if (bytes > 0) { + n = UUDECODE(*p++) << 18; + n |= UUDECODE(*p++) << 12; + fputc(n >> 16, out); + --bytes; + } + if (bytes > 0) { + n |= UUDECODE(*p++) << 6; + fputc((n >> 8) & 0xFF, out); + --bytes; + } + if (bytes > 0) { + n |= UUDECODE(*p++); + fputc(n & 0xFF, out); + --bytes; + } + } + } + fclose(out); + fclose(in); +} + +/* + * + * TEST management + * + */ + +/* + * "list.h" is simply created by "grep DEFINE_TEST test_*.c"; it has + * a line like + * DEFINE_TEST(test_function) + * for each test. + */ + +/* Use "list.h" to declare all of the test functions. */ +#undef DEFINE_TEST +#define DEFINE_TEST(name) void name(void); +#include "list.h" + +/* Use "list.h" to create a list of all tests (functions and names). */ +#undef DEFINE_TEST +#define DEFINE_TEST(n) { n, #n, 0 }, +struct { void (*func)(void); const char *name; int failures; } tests[] = { + #include "list.h" +}; + +/* + * Summarize repeated failures in the just-completed test. + */ +static void +test_summarize(const char *filename, int failed) +{ + unsigned int i; + + switch (verbosity) { + case VERBOSITY_SUMMARY_ONLY: + printf(failed ? "E" : "."); + fflush(stdout); + break; + case VERBOSITY_PASSFAIL: + printf(failed ? "FAIL\n" : "ok\n"); + break; + } + + log_console = (verbosity == VERBOSITY_LIGHT_REPORT); + + for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) { + if (failed_lines[i].count > 1 && !failed_lines[i].skip) + logprintf("%s:%d: Summary: Failed %d times\n", + filename, i, failed_lines[i].count); + } + /* Clear the failure history for the next file. */ + memset(failed_lines, 0, sizeof(failed_lines)); +} + +/* + * Actually run a single test, with appropriate setup and cleanup. + */ +static int +test_run(int i, const char *tmpdir) +{ + char logfilename[64]; + int failures_before = failures; + int oldumask; + + switch (verbosity) { + case VERBOSITY_SUMMARY_ONLY: /* No per-test reports at all */ + break; + case VERBOSITY_PASSFAIL: /* rest of line will include ok/FAIL marker */ + printf("%3d: %-50s", i, tests[i].name); + fflush(stdout); + break; + default: /* Title of test, details will follow */ + printf("%3d: %s\n", i, tests[i].name); + } + + /* Chdir to the top-level work directory. */ + if (!assertChdir(tmpdir)) { + fprintf(stderr, + "ERROR: Can't chdir to top work dir %s\n", tmpdir); + exit(1); + } + /* Create a log file for this test. */ + sprintf(logfilename, "%s.log", tests[i].name); + logfile = fopen(logfilename, "w"); + fprintf(logfile, "%s\n\n", tests[i].name); + /* Chdir() to a work dir for this specific test. */ + if (!assertMakeDir(tests[i].name, 0755) + || !assertChdir(tests[i].name)) { + fprintf(stderr, + "ERROR: Can't chdir to work dir %s/%s\n", + tmpdir, tests[i].name); + exit(1); + } + /* Explicitly reset the locale before each test. */ + setlocale(LC_ALL, "C"); + /* Record the umask before we run the test. */ + umask(oldumask = umask(0)); + /* + * Run the actual test. + */ + (*tests[i].func)(); + /* + * Clean up and report afterwards. + */ + /* Restore umask */ + umask(oldumask); + /* Reset locale. */ + setlocale(LC_ALL, "C"); + /* Reset directory. */ + if (!assertChdir(tmpdir)) { + fprintf(stderr, "ERROR: Couldn't chdir to temp dir %s\n", + tmpdir); + exit(1); + } + /* Report per-test summaries. */ + tests[i].failures = failures - failures_before; + test_summarize(test_filename, tests[i].failures); + /* Close the per-test log file. */ + fclose(logfile); + logfile = NULL; + /* If there were no failures, we can remove the work dir and logfile. */ + if (tests[i].failures == 0) { + if (!keep_temp_files && assertChdir(tmpdir)) { +#if defined(_WIN32) && !defined(__CYGWIN__) + systemf("rmdir /S /Q %s", tests[i].name); + systemf("del %s", logfilename); +#else + systemf("rm -rf %s", tests[i].name); + systemf("rm %s", logfilename); +#endif + } + } + /* Return appropriate status. */ + return (tests[i].failures); +} + +/* + * + * + * MAIN and support routines. + * + * + */ + +static void +usage(const char *program) +{ + static const int limit = sizeof(tests) / sizeof(tests[0]); + int i; + + printf("Usage: %s [options] ...\n", program); + printf("Default is to run all tests.\n"); + printf("Otherwise, specify the numbers of the tests you wish to run.\n"); + printf("Options:\n"); + printf(" -d Dump core after any failure, for debugging.\n"); + printf(" -k Keep all temp files.\n"); + printf(" Default: temp files for successful tests deleted.\n"); +#ifdef PROGRAM + printf(" -p Path to executable to be tested.\n"); + printf(" Default: path taken from " ENVBASE " environment variable.\n"); +#endif + printf(" -q Quiet.\n"); + printf(" -r Path to dir containing reference files.\n"); + printf(" Default: Current directory.\n"); + printf(" -v Verbose.\n"); + printf("Available tests:\n"); + for (i = 0; i < limit; i++) + printf(" %d: %s\n", i, tests[i].name); + exit(1); +} + +static char * +get_refdir(const char *d) +{ + char tried[512] = { '\0' }; + char buff[128]; + char *pwd, *p; + + /* If a dir was specified, try that */ + if (d != NULL) { + pwd = NULL; + snprintf(buff, sizeof(buff), "%s", d); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + goto failure; + } + + /* Get the current dir. */ + pwd = getcwd(NULL, 0); + while (pwd[strlen(pwd) - 1] == '\n') + pwd[strlen(pwd) - 1] = '\0'; + + /* Look for a known file. */ + snprintf(buff, sizeof(buff), "%s", pwd); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + snprintf(buff, sizeof(buff), "%s/test", pwd); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + +#if defined(LIBRARY) + snprintf(buff, sizeof(buff), "%s/%s/test", pwd, LIBRARY); +#else + snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM); +#endif + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + if (memcmp(pwd, "/usr/obj", 8) == 0) { + snprintf(buff, sizeof(buff), "%s", pwd + 8); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + + snprintf(buff, sizeof(buff), "%s/test", pwd + 8); + p = slurpfile(NULL, "%s/%s", buff, KNOWNREF); + if (p != NULL) goto success; + strncat(tried, buff, sizeof(tried) - strlen(tried) - 1); + strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1); + } + +failure: + printf("Unable to locate known reference file %s\n", KNOWNREF); + printf(" Checked following directories:\n%s\n", tried); +#if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG) + DebugBreak(); +#endif + exit(1); + +success: + free(p); + free(pwd); + return strdup(buff); +} + +int +main(int argc, char **argv) +{ + static const int limit = sizeof(tests) / sizeof(tests[0]); + int i, tests_run = 0, tests_failed = 0, option; + time_t now; + char *refdir_alloc = NULL; + const char *progname; + const char *tmp, *option_arg, *p; + char tmpdir[256]; + char tmpdir_timestamp[256]; + + (void)argc; /* UNUSED */ + +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__) + /* To stop to run the default invalid parameter handler. */ + _set_invalid_parameter_handler(invalid_parameter_handler); + /* Disable annoying assertion message box. */ + _CrtSetReportMode(_CRT_ASSERT, 0); +#endif + + /* + * Name of this program, used to build root of our temp directory + * tree. + */ + progname = p = argv[0]; + while (*p != '\0') { + /* Support \ or / dir separators for Windows compat. */ + if (*p == '/' || *p == '\\') + progname = p + 1; + ++p; + } + +#ifdef PROGRAM + /* Get the target program from environment, if available. */ + testprogfile = getenv(ENVBASE); +#endif + + if (getenv("TMPDIR") != NULL) + tmp = getenv("TMPDIR"); + else if (getenv("TMP") != NULL) + tmp = getenv("TMP"); + else if (getenv("TEMP") != NULL) + tmp = getenv("TEMP"); + else if (getenv("TEMPDIR") != NULL) + tmp = getenv("TEMPDIR"); + else + tmp = "/tmp"; + + /* Allow -d to be controlled through the environment. */ + if (getenv(ENVBASE "_DEBUG") != NULL) + dump_on_failure = 1; + + /* Get the directory holding test files from environment. */ + refdir = getenv(ENVBASE "_TEST_FILES"); + + /* + * Parse options, without using getopt(), which isn't available + * on all platforms. + */ + ++argv; /* Skip program name */ + while (*argv != NULL) { + if (**argv != '-') + break; + p = *argv++; + ++p; /* Skip '-' */ + while (*p != '\0') { + option = *p++; + option_arg = NULL; + /* If 'opt' takes an argument, parse that. */ + if (option == 'p' || option == 'r') { + if (*p != '\0') + option_arg = p; + else if (*argv == NULL) { + fprintf(stderr, + "Option -%c requires argument.\n", + option); + usage(progname); + } else + option_arg = *argv++; + p = ""; /* End of this option word. */ + } + + /* Now, handle the option. */ + switch (option) { + case 'd': + dump_on_failure = 1; + break; + case 'k': + keep_temp_files = 1; + break; + case 'p': +#ifdef PROGRAM + testprogfile = option_arg; +#else + usage(progname); +#endif + break; + case 'q': + verbosity--; + break; + case 'r': + refdir = option_arg; + break; + case 'v': + verbosity++; + break; + default: + usage(progname); + } + } + } + + /* + * Sanity-check that our options make sense. + */ +#ifdef PROGRAM + if (testprogfile == NULL) + usage(progname); + { + char *testprg; +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Command.com sometimes rejects '/' separators. */ + testprg = strdup(testprogfile); + for (i = 0; testprg[i] != '\0'; i++) { + if (testprg[i] == '/') + testprg[i] = '\\'; + } + testprogfile = testprg; +#endif + /* Quote the name that gets put into shell command lines. */ + testprg = malloc(strlen(testprogfile) + 3); + strcpy(testprg, "\""); + strcat(testprg, testprogfile); + strcat(testprg, "\""); + testprog = testprg; + } +#endif + + /* + * Create a temp directory for the following tests. + * Include the time the tests started as part of the name, + * to make it easier to track the results of multiple tests. + */ + now = time(NULL); + for (i = 0; ; i++) { + strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp), + "%Y-%m-%dT%H.%M.%S", + localtime(&now)); + sprintf(tmpdir, "%s/%s.%s-%03d", tmp, progname, + tmpdir_timestamp, i); + if (assertMakeDir(tmpdir,0755)) + break; + if (i >= 999) { + fprintf(stderr, + "ERROR: Unable to create temp directory %s\n", + tmpdir); + exit(1); + } + } + + /* + * If the user didn't specify a directory for locating + * reference files, try to find the reference files in + * the "usual places." + */ + refdir = refdir_alloc = get_refdir(refdir); + + /* + * Banner with basic information. + */ + printf("\n"); + printf("If tests fail or crash, details will be in:\n"); + printf(" %s\n", tmpdir); + printf("\n"); + if (verbosity > VERBOSITY_SUMMARY_ONLY) { + printf("Reference files will be read from: %s\n", refdir); +#ifdef PROGRAM + printf("Running tests on: %s\n", testprog); +#endif + printf("Exercising: "); + fflush(stdout); + printf("%s\n", EXTRA_VERSION); + } else { + printf("Running "); + fflush(stdout); + } + + /* + * Run some or all of the individual tests. + */ + if (*argv == NULL) { + /* Default: Run all tests. */ + for (i = 0; i < limit; i++) { + if (test_run(i, tmpdir)) + tests_failed++; + tests_run++; + } + } else { + while (*(argv) != NULL) { + if (**argv >= '0' && **argv <= '9') { + i = atoi(*argv); + if (i < 0 || i >= limit) { + printf("*** INVALID Test %s\n", *argv); + free(refdir_alloc); + usage(progname); + /* usage() never returns */ + } + } else { + for (i = 0; i < limit; ++i) { + if (strcmp(*argv, tests[i].name) == 0) + break; + } + if (i >= limit) { + printf("*** INVALID Test ``%s''\n", + *argv); + free(refdir_alloc); + usage(progname); + /* usage() never returns */ + } + } + if (test_run(i, tmpdir)) + tests_failed++; + tests_run++; + argv++; + } + } + + /* + * Report summary statistics. + */ + if (verbosity > VERBOSITY_SUMMARY_ONLY) { + printf("\n"); + printf("Totals:\n"); + printf(" Tests run: %8d\n", tests_run); + printf(" Tests failed: %8d\n", tests_failed); + printf(" Assertions checked:%8d\n", assertions); + printf(" Assertions failed: %8d\n", failures); + printf(" Skips reported: %8d\n", skips); + } + if (failures) { + printf("\n"); + printf("Failing tests:\n"); + for (i = 0; i < limit; ++i) { + if (tests[i].failures) + printf(" %d: %s (%d failures)\n", i, + tests[i].name, tests[i].failures); + } + printf("\n"); + printf("Details for failing tests: %s\n", tmpdir); + printf("\n"); + } else { + if (verbosity == VERBOSITY_SUMMARY_ONLY) + printf("\n"); + printf("%d tests passed, no failures\n", tests_run); + } + + free(refdir_alloc); + + /* If the final tmpdir is empty, we can remove it. */ + /* This should be the usual case when all tests succeed. */ + assertChdir(".."); + rmdir(tmpdir); + + return (tests_failed ? 1 : 0); +} diff --git a/Utilities/cmlibarchive/tar/test/test.h b/Utilities/cmlibarchive/tar/test/test.h new file mode 100644 index 000000000..814da13fb --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test.h @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2003-2006 Tim Kientzle + * 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. + * + * $FreeBSD: src/usr.bin/tar/test/test.h,v 1.4 2008/08/21 07:04:57 kientzle Exp $ + */ + +/* Every test program should #include "test.h" as the first thing. */ + +/* + * The goal of this file (and the matching test.c) is to + * simplify the very repetitive test-*.c test programs. + */ +#if defined(HAVE_CONFIG_H) +/* Most POSIX platforms use the 'configure' script to build config.h */ +#include "config.h" +#elif defined(__FreeBSD__) +/* Building as part of FreeBSD system requires a pre-built config.h. */ +#include "config_freebsd.h" +#elif defined(_WIN32) && !defined(__CYGWIN__) +/* Win32 can't run the 'configure' script. */ +#include "config_windows.h" +#else +/* Warn if the library hasn't been (automatically or manually) configured. */ +#error Oops: No config.h and no pre-built configuration in test.h. +#endif + +#include /* Windows requires this before sys/stat.h */ +#include + +#ifdef USE_DMALLOC +#include +#endif +#if HAVE_DIRENT_H +#include +#else +#include +#define dirent direct +#endif +#include +#include +#ifdef HAVE_IO_H +#include +#endif +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#ifdef HAVE_WINDOWS_H +#include +#endif + +/* + * System-specific tweaks. We really want to minimize these + * as much as possible, since they make it harder to understand + * the mainline code. + */ + +/* Windows (including Visual Studio and MinGW but not Cygwin) */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#include "../bsdtar_windows.h" +#define strdup _strdup +#define LOCALE_DE "deu" +#else +#define LOCALE_DE "de_DE.UTF-8" +#endif + +/* Visual Studio */ +#ifdef _MSC_VER +#define snprintf sprintf_s +#endif + +/* Cygwin */ +#if defined(__CYGWIN__) +/* Cygwin-1.7.x is lazy about populating nlinks, so don't + * expect it to be accurate. */ +# define NLINKS_INACCURATE_FOR_DIRS +#endif + +/* FreeBSD */ +#ifdef __FreeBSD__ +#include /* For __FBSDID */ +#else +/* Surprisingly, some non-FreeBSD platforms define __FBSDID. */ +#ifndef __FBSDID +#define __FBSDID(a) struct _undefined_hack +#endif +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +/* + * Redefine DEFINE_TEST for use in defining the test functions. + */ +#undef DEFINE_TEST +#define DEFINE_TEST(name) void name(void); void name(void) + +/* An implementation of the standard assert() macro */ +#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL) +/* chdir() and error if it fails */ +#define assertChdir(path) \ + assertion_chdir(__FILE__, __LINE__, path) +/* 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) +/* 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) +/* As above, but v1 and v2 are wchar_t * */ +#define assertEqualWString(v1,v2) \ + assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) +/* As above, but raw blocks of bytes. */ +#define assertEqualMem(v1, v2, l) \ + assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL) +/* Assert two files are the same; allow printf-style expansion of second name. + * See below for comments about variable arguments here... + */ +#define assertEqualFile \ + assertion_setup(__FILE__, __LINE__);assertion_equal_file +/* Assert that a file is empty; supports printf-style arguments. */ +#define assertEmptyFile \ + assertion_setup(__FILE__, __LINE__);assertion_empty_file +/* Assert that a file is not empty; supports printf-style arguments. */ +#define assertNonEmptyFile \ + assertion_setup(__FILE__, __LINE__);assertion_non_empty_file +#define assertFileAtime(pathname, sec, nsec) \ + assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileAtimeRecent(pathname) \ + assertion_file_atime_recent(__FILE__, __LINE__, pathname) +#define assertFileBirthtime(pathname, sec, nsec) \ + assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileBirthtimeRecent(pathname) \ + assertion_file_birthtime_recent(__FILE__, __LINE__, pathname) +/* Assert that a file exists; supports printf-style arguments. */ +#define assertFileExists \ + assertion_setup(__FILE__, __LINE__);assertion_file_exists +/* Assert that a file exists; supports printf-style arguments. */ +#define assertFileNotExists \ + assertion_setup(__FILE__, __LINE__);assertion_file_not_exists +/* Assert that file contents match a string; supports printf-style arguments. */ +#define assertFileContents \ + assertion_setup(__FILE__, __LINE__);assertion_file_contents +#define assertFileMtime(pathname, sec, nsec) \ + assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec) +#define assertFileMtimeRecent(pathname) \ + assertion_file_mtime_recent(__FILE__, __LINE__, pathname) +#define assertFileNLinks(pathname, nlinks) \ + assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks) +#define assertFileSize(pathname, size) \ + assertion_file_size(__FILE__, __LINE__, pathname, size) +#define assertTextFileContents \ + assertion_setup(__FILE__, __LINE__);assertion_text_file_contents +#define assertIsDir(pathname, mode) \ + assertion_is_dir(__FILE__, __LINE__, pathname, mode) +#define assertIsHardlink(path1, path2) \ + assertion_is_hardlink(__FILE__, __LINE__, path1, path2) +#define assertIsNotHardlink(path1, path2) \ + assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2) +#define assertIsReg(pathname, mode) \ + assertion_is_reg(__FILE__, __LINE__, pathname, mode) +#define assertIsSymlink(pathname, contents) \ + assertion_is_symlink(__FILE__, __LINE__, pathname, contents) +/* Create a directory, report error if it fails. */ +#define assertMakeDir(dirname, mode) \ + assertion_make_dir(__FILE__, __LINE__, dirname, mode) +#define assertMakeFile(path, mode, contents) \ + assertion_make_file(__FILE__, __LINE__, path, mode, contents) +#define assertMakeHardlink(newfile, oldfile) \ + assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile) +#define assertMakeSymlink(newfile, linkto) \ + assertion_make_symlink(__FILE__, __LINE__, newfile, linkto) +#define assertUmask(mask) \ + assertion_umask(__FILE__, __LINE__, mask) + +/* + * This would be simple with C99 variadic macros, but I don't want to + * require that. Instead, I insert a function call before each + * skipping() call to pass the file and line information down. Crude, + * but effective. + */ +#define skipping \ + assertion_setup(__FILE__, __LINE__);test_skipping + +/* Function declarations. These are defined in test_utility.c. */ +void failure(const char *fmt, ...); +int assertion_assert(const char *, int, int, const char *, void *); +int assertion_chdir(const char *, int, const char *); +int assertion_empty_file(const char *, ...); +int assertion_equal_file(const char *, const char *, ...); +int assertion_equal_int(const char *, int, long long, const char *, long long, 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_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *); +int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *); +int assertion_file_atime(const char *, int, const char *, long, long); +int assertion_file_atime_recent(const char *, int, const char *); +int assertion_file_birthtime(const char *, int, const char *, long, long); +int assertion_file_birthtime_recent(const char *, int, const char *); +int assertion_file_contents(const void *, int, const char *, ...); +int assertion_file_exists(const char *, ...); +int assertion_file_mtime(const char *, int, const char *, long, long); +int assertion_file_mtime_recent(const char *, int, const char *); +int assertion_file_nlinks(const char *, int, const char *, int); +int assertion_file_not_exists(const char *, ...); +int assertion_file_size(const char *, int, const char *, long); +int assertion_is_dir(const char *, int, const char *, int); +int assertion_is_hardlink(const char *, int, const char *, const char *); +int assertion_is_not_hardlink(const char *, int, const char *, const char *); +int assertion_is_reg(const char *, int, const char *, int); +int assertion_is_symlink(const char *, int, const char *, const char *); +int assertion_make_dir(const char *, int, const char *, int); +int assertion_make_file(const char *, int, const char *, int, const char *); +int assertion_make_hardlink(const char *, int, const char *newpath, const char *); +int assertion_make_symlink(const char *, int, const char *newpath, const char *); +int assertion_non_empty_file(const char *, ...); +int assertion_text_file_contents(const char *buff, const char *f); +int assertion_umask(const char *, int, int); +void assertion_setup(const char *, int); + +void test_skipping(const char *fmt, ...); + +/* Like sprintf, then system() */ +int systemf(const char * fmt, ...); + +/* Delay until time() returns a value after this. */ +void sleepUntilAfter(time_t); + +/* Return true if this platform can create symlinks. */ +int canSymlink(void); + +/* Return true if this platform can run the "gzip" program. */ +int canGzip(void); + +/* Return true if this platform can run the "gunzip" program. */ +int canGunzip(void); + +/* Suck file into string allocated via malloc(). Call free() when done. */ +/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */ +char *slurpfile(size_t *, const char *fmt, ...); + +/* Extracts named reference file to the current directory. */ +void extract_reference_file(const char *); + +/* + * Special interfaces for program test harness. + */ + +/* Pathname of exe to be tested. */ +const char *testprogfile; +/* Name of exe to use in printf-formatted command strings. */ +/* On Windows, this includes leading/trailing quotes. */ +const char *testprog; diff --git a/Utilities/cmlibarchive/tar/test/test_0.c b/Utilities/cmlibarchive/tar/test/test_0.c new file mode 100644 index 000000000..34a225aa7 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_0.c @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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 + * most of these, we just exit on failure. + */ +#if !defined(_WIN32) || defined(__CYGWIN__) +#define DEV_NULL "/dev/null" +#else +#define DEV_NULL "NUL" +#endif + +DEFINE_TEST(test_0) +{ + struct stat st; + + failure("File %s does not exist?!", testprog); + if (!assertEqualInt(0, stat(testprogfile, &st))) + exit(1); + + failure("%s is not executable?!", testprog); + if (!assert((st.st_mode & 0111) != 0)) + exit(1); + + /* + * Try to succesfully run the program; this requires that + * we know some option that will succeed. + */ + if (0 == systemf("%s --version >" DEV_NULL, testprog)) { + /* This worked. */ + } else if (0 == systemf("%s -W version >" DEV_NULL, testprog)) { + /* This worked. */ + } else { + failure("Unable to successfully run any of the following:\n" + " * %s --version\n" + " * %s -W version\n", + testprog, testprog); + assert(0); + } + + /* TODO: Ensure that our reference files are available. */ +} diff --git a/Utilities/cmlibarchive/tar/test/test_basic.c b/Utilities/cmlibarchive/tar/test/test_basic.c new file mode 100644 index 000000000..ac392d6dc --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_basic.c @@ -0,0 +1,115 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_basic.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); + + +static void +basic_tar(const char *target, const char *pack_options, + const char *unpack_options, const char *flist) +{ + int r; + + assertMakeDir(target, 0775); + + /* Use the tar program to create an archive. */ + r = systemf("%s cf - %s %s >%s/archive 2>%s/pack.err", testprog, pack_options, flist, target, target); + failure("Error invoking %s cf -", testprog, pack_options); + assertEqualInt(r, 0); + + assertChdir(target); + + /* Verify that nothing went to stderr. */ + assertEmptyFile("pack.err"); + + /* + * Use tar to unpack the archive into another directory. + */ + r = systemf("%s xf archive %s >unpack.out 2>unpack.err", testprog, unpack_options); + failure("Error invoking %s xf archive %s", testprog, unpack_options); + assertEqualInt(r, 0); + + /* Verify that nothing went to stderr. */ + assertEmptyFile("unpack.err"); + + /* + * Verify unpacked files. + */ + + /* Regular file with 2 links. */ + assertIsReg("file", -1); + assertFileSize("file", 10); + failure("%s", target); + assertFileNLinks("file", 2); + + /* Another name for the same file. */ + assertIsReg("linkfile", -1); + assertFileSize("linkfile", 10); + assertFileNLinks("linkfile", 2); + assertIsHardlink("file", "linkfile"); + + /* Symlink */ + if (canSymlink()) + assertIsSymlink("symlink", "file"); + + /* dir */ + assertIsDir("dir", 0775); + assertChdir(".."); +} + +DEFINE_TEST(test_basic) +{ + FILE *f; + const char *flist; + + assertUmask(0); + + /* File with 10 bytes content. */ + f = fopen("file", "wb"); + assert(f != NULL); + assertEqualInt(10, fwrite("123456789", 1, 10, f)); + fclose(f); + + /* hardlink to above file. */ + assertMakeHardlink("linkfile", "file"); + assertIsHardlink("file", "linkfile"); + + /* Symlink to above file. */ + if (canSymlink()) + assertMakeSymlink("symlink", "file"); + + /* Directory. */ + assertMakeDir("dir", 0775); + + if (canSymlink()) + flist = "file linkfile symlink dir"; + else + flist = "file linkfile dir"; + /* Archive/dearchive with a variety of options. */ + basic_tar("copy", "", "", flist); + /* tar doesn't handle cpio symlinks correctly */ + /* basic_tar("copy_odc", "--format=odc", ""); */ + basic_tar("copy_ustar", "--format=ustar", "", flist); +} diff --git a/Utilities/cmlibarchive/tar/test/test_copy.c b/Utilities/cmlibarchive/tar/test/test_copy.c new file mode 100644 index 000000000..b5e4a0bcd --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_copy.c @@ -0,0 +1,373 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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 +# include +#endif + +/* + * Try to figure out how deep we can go in our tests. Assumes that + * the first call to this function has the longest starting cwd (which + * is currently "/original"). This is mostly to work around + * limits in our Win32 support. + * + * Background: On Posix systems, PATH_MAX is merely a limit on the + * length of the string passed into a system call. By repeatedly + * calling chdir(), you can work with arbitrarily long paths on such + * systems. In contrast, Win32 APIs apply PATH_MAX limits to the full + * absolute path, so the permissible length of a system call argument + * varies with the cwd. Some APIs actually enforce limits + * significantly less than PATH_MAX to ensure that you can create + * files within the current working directory. The Win32 limits also + * apply to Cygwin before 1.7. + * + * Someday, I want to convert the Win32 support to use newer + * wide-character paths with '\\?\' prefix, which has a 32k PATH_MAX + * instead of the rather anemic 260 character limit of the older + * system calls. Then we can drop this mess (unless we want to + * continue to special-case Cygwin 1.5 and earlier). + */ +static int +compute_loop_max(void) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + static int LOOP_MAX = 0; + char buf[MAX_PATH]; + size_t cwdlen; + + if (LOOP_MAX == 0) { + assert(_getcwd(buf, MAX_PATH) != NULL); + cwdlen = strlen(buf); + /* 12 characters = length of 8.3 filename */ + /* 4 characters = length of "/../" used in symlink tests */ + /* 1 character = length of extra "/" separator */ + LOOP_MAX = MAX_PATH - (int)cwdlen - 12 - 4 - 1; + } + return LOOP_MAX; +#elif defined(__CYGWIN__) && !defined(HAVE_CYGWIN_CONV_PATH) + static int LOOP_MAX = 0; + if (LOOP_MAX == 0) { + char wbuf[PATH_MAX]; + char pbuf[PATH_MAX]; + size_t wcwdlen; + size_t pcwdlen; + size_t cwdlen; + assert(getcwd(pbuf, PATH_MAX) != NULL); + pcwdlen = strlen(pbuf); + cygwin_conv_to_full_win32_path(pbuf, wbuf); + wcwdlen = strlen(wbuf); + cwdlen = ((wcwdlen > pcwdlen) ? wcwdlen : pcwdlen); + /* Cygwin helper needs an extra few characters. */ + LOOP_MAX = PATH_MAX - (int)cwdlen - 12 - 4 - 4; + } + return LOOP_MAX; +#else + /* cygwin-1.7 ends up here, along with "normal" unix */ + return 200; /* restore pre-r278 depth */ +#endif +} + +/* filenames[i] is a distinctive filename of length i. */ +/* To simplify interpreting failures, each filename ends with a + * decimal integer which is the length of the filename. E.g., A + * filename ending in "_92" is 92 characters long. To detect errors + * which drop or misplace characters, the filenames use a repeating + * "abcdefghijklmnopqrstuvwxyz..." pattern. */ +static char *filenames[201]; + +static void +compute_filenames(void) +{ + char buff[250]; + size_t i,j; + + filenames[0] = strdup(""); + filenames[1] = strdup("1"); + filenames[2] = strdup("a2"); + for (i = 3; i < sizeof(filenames)/sizeof(filenames[0]); ++i) { + /* Fill with "abcdefghij..." */ + for (j = 0; j < i; ++j) + buff[j] = 'a' + (j % 26); + buff[j--] = '\0'; + /* Work from the end to fill in the number portion. */ + buff[j--] = '0' + (i % 10); + if (i > 9) { + buff[j--] = '0' + ((i / 10) % 10); + if (i > 99) + buff[j--] = '0' + (i / 100); + } + buff[j] = '_'; + /* Guard against obvious screwups in the above code. */ + assertEqualInt(strlen(buff), i); + filenames[i] = strdup(buff); + } +} + +static void +create_tree(void) +{ + char buff[260]; + char buff2[260]; + int i; + int LOOP_MAX; + + compute_filenames(); + + /* Log that we'll be omitting some checks. */ + if (!canSymlink()) { + skipping("Symlink checks"); + } + + assertMakeDir("original", 0775); + chdir("original"); + LOOP_MAX = compute_loop_max(); + + assertMakeDir("f", 0775); + assertMakeDir("l", 0775); + assertMakeDir("m", 0775); + assertMakeDir("s", 0775); + assertMakeDir("d", 0775); + + for (i = 1; i < LOOP_MAX; i++) { + failure("Internal sanity check failed: i = %d", i); + assert(filenames[i] != NULL); + + sprintf(buff, "f/%s", filenames[i]); + assertMakeFile(buff, 0777, buff); + + /* Create a link named "l/abcdef..." to the above. */ + sprintf(buff2, "l/%s", filenames[i]); + assertMakeHardlink(buff2, buff); + + /* Create a link named "m/abcdef..." to the above. */ + sprintf(buff2, "m/%s", filenames[i]); + assertMakeHardlink(buff2, buff); + + if (canSymlink()) { + /* Create a symlink named "s/abcdef..." to the above. */ + sprintf(buff, "s/%s", filenames[i]); + sprintf(buff2, "../f/%s", filenames[i]); + failure("buff=\"%s\" buff2=\"%s\"", buff, buff2); + assertMakeSymlink(buff, buff2); + } + /* Create a dir named "d/abcdef...". */ + buff[0] = 'd'; + failure("buff=\"%s\"", buff); + assertMakeDir(buff, 0775); + } + + chdir(".."); +} + +#define LIMIT_NONE 200 +#define LIMIT_USTAR 100 + +static void +verify_tree(size_t limit) +{ + char name1[260]; + char name2[260]; + size_t i, LOOP_MAX; + + LOOP_MAX = compute_loop_max(); + + /* Generate the names we know should be there and verify them. */ + for (i = 1; i < LOOP_MAX; i++) { + /* Verify a file named "f/abcdef..." */ + sprintf(name1, "f/%s", filenames[i]); + if (i <= limit) { + assertFileExists(name1); + assertFileContents(name1, strlen(name1), name1); + } + + sprintf(name2, "l/%s", filenames[i]); + if (i + 2 <= limit) { + /* Verify hardlink "l/abcdef..." */ + assertIsHardlink(name1, name2); + /* Verify hardlink "m/abcdef..." */ + name2[0] = 'm'; + assertIsHardlink(name1, name2); + } + + if (canSymlink()) { + /* Verify symlink "s/abcdef..." */ + sprintf(name1, "s/%s", filenames[i]); + sprintf(name2, "../f/%s", filenames[i]); + if (strlen(name2) <= limit) + assertIsSymlink(name1, name2); + } + + /* Verify dir "d/abcdef...". */ + sprintf(name1, "d/%s", filenames[i]); + if (i + 1 <= limit) { /* +1 for trailing slash */ + if (assertIsDir(name1, -1)) { + /* TODO: opendir/readdir this + * directory and make sure + * it's empty. + */ + } + } + } + +#if !defined(_WIN32) || defined(__CYGWIN__) + { + const char *dp; + /* Now make sure nothing is there that shouldn't be. */ + for (dp = "dflms"; *dp != '\0'; ++dp) { + DIR *d; + struct dirent *de; + char dir[2]; + dir[0] = *dp; dir[1] = '\0'; + d = opendir(dir); + failure("Unable to open dir '%s'", dir); + if (!assert(d != NULL)) + continue; + while ((de = readdir(d)) != NULL) { + char *p = de->d_name; + if (p[0] == '.') + continue; + switch(dp[0]) { + case 'l': case 'm': case 'd': + failure("strlen(p)=%d", strlen(p)); + assert(strlen(p) < limit); + assertEqualString(p, + filenames[strlen(p)]); + break; + case 'f': case 's': + failure("strlen(p)=%d", strlen(p)); + assert(strlen(p) < limit + 1); + assertEqualString(p, + filenames[strlen(p)]); + break; + default: + failure("File %s shouldn't be here", p); + assert(0); + } + } + closedir(d); + } + } +#endif +} + +static void +copy_basic(void) +{ + int r; + + /* NOTE: for proper operation on cygwin-1.5 and windows, the + * length of the name of the directory below, "plain", must be + * less than or equal to the lengthe of the name of the original + * directory, "original" This restriction derives from the + * extremely limited pathname lengths on those platforms. + */ + assertMakeDir("plain", 0775); + assertEqualInt(0, chdir("plain")); + + /* + * Use the tar program to create an archive. + */ + r = systemf("%s cf archive -C ../original f d l m s >pack.out 2>pack.err", + testprog); + failure("Error invoking \"%s cf\"", testprog); + assertEqualInt(r, 0); + + /* Verify that nothing went to stdout or stderr. */ + assertEmptyFile("pack.err"); + assertEmptyFile("pack.out"); + + /* + * Use tar to unpack the archive into another directory. + */ + r = systemf("%s xf archive >unpack.out 2>unpack.err", testprog); + failure("Error invoking %s xf archive", testprog); + assertEqualInt(r, 0); + + /* Verify that nothing went to stdout or stderr. */ + assertEmptyFile("unpack.err"); + assertEmptyFile("unpack.out"); + + verify_tree(LIMIT_NONE); + assertEqualInt(0, chdir("..")); +} + +static void +copy_ustar(void) +{ + const char *target = "ustar"; + int r; + + /* NOTE: for proper operation on cygwin-1.5 and windows, the + * length of the name of the directory below, "ustar", must be + * less than or equal to the lengthe of the name of the original + * directory, "original" This restriction derives from the + * extremely limited pathname lengths on those platforms. + */ + assertMakeDir(target, 0775); + assertEqualInt(0, chdir(target)); + + /* + * Use the tar program to create an archive. + */ + r = systemf("%s cf archive --format=ustar -C ../original f d l m s >pack.out 2>pack.err", + testprog); + failure("Error invoking \"%s cf archive --format=ustar\"", testprog); + assertEqualInt(r, 0); + + /* Verify that nothing went to stdout. */ + assertEmptyFile("pack.out"); + /* Stderr is non-empty, since there are a bunch of files + * with filenames too long to archive. */ + + /* + * Use tar to unpack the archive into another directory. + */ + r = systemf("%s xf archive >unpack.out 2>unpack.err", testprog); + failure("Error invoking %s xf archive", testprog); + assertEqualInt(r, 0); + + /* Verify that nothing went to stdout or stderr. */ + assertEmptyFile("unpack.err"); + assertEmptyFile("unpack.out"); + + chdir("original"); + verify_tree(LIMIT_USTAR); + chdir("../.."); +} + +DEFINE_TEST(test_copy) +{ + assertUmask(0); + create_tree(); /* Create sample files in "original" dir. */ + + /* Test simple "tar -c | tar -x" pipeline copy. */ + copy_basic(); + + /* Same, but constrain to ustar format. */ + copy_ustar(); +} diff --git a/Utilities/cmlibarchive/tar/test/test_getdate.c b/Utilities/cmlibarchive/tar/test/test_getdate.c new file mode 100644 index 000000000..bd5afd006 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_getdate.c @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_getdate.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); + +#include + +/* + * Verify that the getdate() function works. + */ + +time_t get_date(time_t, const char *); + +DEFINE_TEST(test_getdate) +{ + time_t now = time(NULL); + + assertEqualInt(get_date(now, "Jan 1, 1970 UTC"), 0); + assertEqualInt(get_date(now, "7:12:18-0530 4 May 1983"), 420900138); + assertEqualInt(get_date(now, "2004/01/29 513 mest"), 1075345980); + assertEqualInt(get_date(now, "99/02/17 7pm utc"), 919278000); + assertEqualInt(get_date(now, "02/17/99 7:11am est"), 919253460); + /* It's important that we handle ctime() format. */ + assertEqualInt(get_date(now, "Sun Feb 22 17:38:26 PST 2009"), + 1235353106); + /* Basic relative offsets. */ + /* If we use the actual current time as the reference, then + * these tests break around DST changes, so it's actually + * important to use a specific reference time here. */ + assertEqualInt(get_date(0, "tomorrow"), 24 * 60 * 60); + assertEqualInt(get_date(0, "yesterday"), - 24 * 60 * 60); + assertEqualInt(get_date(0, "now + 1 hour"), 60 * 60); + assertEqualInt(get_date(0, "now + 1 hour + 1 minute"), 60 * 60 + 60); + /* Repeat the above for a different start time. */ + now = 1231113600; /* Jan 5, 2009 00:00 UTC */ + assertEqualInt(get_date(0, "Jan 5, 2009 00:00 UTC"), now); + assertEqualInt(get_date(now, "tomorrow"), now + 24 * 60 * 60); + assertEqualInt(get_date(now, "yesterday"), now - 24 * 60 * 60); + assertEqualInt(get_date(now, "now + 1 hour"), now + 60 * 60); + assertEqualInt(get_date(now, "now + 1 hour + 1 minute"), + now + 60 * 60 + 60); + assertEqualInt(get_date(now, "tomorrow 5:16am UTC"), + now + 24 * 60 * 60 + 5 * 60 * 60 + 16 * 60); + assertEqualInt(get_date(now, "UTC 5:16am tomorrow"), + now + 24 * 60 * 60 + 5 * 60 * 60 + 16 * 60); + + /* Jan 5, 2009 was a Monday. */ + assertEqualInt(get_date(now, "monday UTC"), now); + assertEqualInt(get_date(now, "sunday UTC"), now + 6 * 24 * 60 * 60); + assertEqualInt(get_date(now, "tuesday UTC"), now + 24 * 60 * 60); + /* "next tuesday" is one week after "tuesday" */ + assertEqualInt(get_date(now, "UTC next tuesday"), + now + 8 * 24 * 60 * 60); + /* "last tuesday" is one week before "tuesday" */ + assertEqualInt(get_date(now, "last tuesday UTC"), + now - 6 * 24 * 60 * 60); + /* TODO: Lots more tests here. */ +} diff --git a/Utilities/cmlibarchive/tar/test/test_help.c b/Utilities/cmlibarchive/tar/test/test_help.c new file mode 100644 index 000000000..6dcff4490 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_help.c @@ -0,0 +1,81 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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 + * generate reasonable output. + */ + +static int +in_first_line(const char *p, const char *substring) +{ + size_t l = strlen(substring); + + while (*p != '\0' && *p != '\n') { + if (memcmp(p, substring, l) == 0) + return (1); + ++p; + } + return (0); +} + +DEFINE_TEST(test_help) +{ + int r; + char *p; + size_t plen; + + /* Exercise --help option. */ + r = systemf("%s --help >help.stdout 2>help.stderr", testprog); + failure("--help should generate nothing to stderr."); + assertEmptyFile("help.stderr"); + /* Help message should start with name of program. */ + p = slurpfile(&plen, "help.stdout"); + failure("Help output should be long enough."); + assert(plen >= 6); + failure("First line of help output should contain 'bsdtar': %s", p); + assert(in_first_line(p, "bsdtar")); + /* + * TODO: Extend this check to further verify that --help output + * looks approximately right. + */ + free(p); + + /* -h option should generate the same output. */ + r = systemf("%s -h >h.stdout 2>h.stderr", testprog); + failure("-h should generate nothing to stderr."); + assertEmptyFile("h.stderr"); + failure("stdout should be same for -h and --help"); + assertEqualFile("h.stdout", "help.stdout"); + + /* -W help should be another synonym. */ + r = systemf("%s -W help >Whelp.stdout 2>Whelp.stderr", testprog); + failure("-W help should generate nothing to stderr."); + assertEmptyFile("Whelp.stderr"); + failure("stdout should be same for -W help and --help"); + assertEqualFile("Whelp.stdout", "help.stdout"); +} diff --git a/Utilities/cmlibarchive/tar/test/test_option_T_upper.c b/Utilities/cmlibarchive/tar/test/test_option_T_upper.c new file mode 100644 index 000000000..97f895d11 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_option_T_upper.c @@ -0,0 +1,188 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_option_T.c,v 1.3 2008/08/15 06:12:02 kientzle Exp $"); + +static int +touch(const char *fn, int fail) +{ + FILE *f = fopen(fn, "w"); + if (fail) { + failure("Couldn't create file '%s', errno=%d (%s)\n", + fn, errno, strerror(errno)); + if (!assert(f != NULL)) + return (0); /* Failure. */ + } else { + if (f == NULL) + return (0); /* Soft failure. */ + } + fclose(f); + return (1); /* Success */ +} + +DEFINE_TEST(test_option_T_upper) +{ + FILE *f; + int r; + struct stat st; + int gnarlyFilesSupported; + + /* Create a simple dir heirarchy; bail if anything fails. */ + if (!assertMakeDir("d1", 0755)) return; + if (!assertMakeDir("d1/d2", 0755)) return; + if (!touch("f", 1)) return; + if (!touch("d1/f1", 1)) return; + if (!touch("d1/f2", 1)) return; + if (!touch("d1/d2/f3", 1)) return; + if (!touch("d1/d2/f4", 1)) return; + if (!touch("d1/d2/f5", 1)) return; + if (!touch("d1/d2/f6", 1)) return; + /* Some platforms don't permit such things; just skip it. */ + gnarlyFilesSupported = touch("d1/d2/f\x0a", 0); + + /* Populate a file list */ + f = fopen("filelist", "w+"); + if (!assert(f != NULL)) + return; + /* Use a variety of text line endings. */ + fprintf(f, "f\x0d"); /* CR */ + fprintf(f, "d1/f1\x0d\x0a"); /* CRLF */ + fprintf(f, "d1/d2/f4\x0a"); /* NL */ + fprintf(f, "d1/d2/f6"); /* EOF */ + fclose(f); + + /* Populate a second file list */ + f = fopen("filelist2", "w+"); + if (!assert(f != NULL)) + return; + /* Use null-terminated names. */ + fprintf(f, "d1/d2/f3"); + fwrite("\0", 1, 1, f); + fprintf(f, "d1/d2/f5"); + fwrite("\0", 1, 1, f); + if (gnarlyFilesSupported) { + fprintf(f, "d1/d2/f\x0a"); + fwrite("\0", 1, 1, f); + } + fclose(f); + + /* Use -c -T to archive up the files. */ + r = systemf("%s -c -f test1.tar -T filelist > test1.out 2> test1.err", + testprog); + assert(r == 0); + assertEmptyFile("test1.out"); + assertEmptyFile("test1.err"); + + /* Use -x -T to dearchive the files */ + if (!assertMakeDir("test1", 0755)) return; + systemf("%s -x -f test1.tar -T filelist -C test1" + " > test1b.out 2> test1b.err", testprog); + assertEmptyFile("test1b.out"); + assertEmptyFile("test1b.err"); + + /* Verify the files were extracted. */ + assertFileExists("test1/f"); + assertFileExists("test1/d1/f1"); + assertFileNotExists("test1/d1/f2"); + assertFileNotExists("test1/d1/d2/f3"); + assertFileExists("test1/d1/d2/f4"); + assertFileNotExists("test1/d1/d2/f5"); + assertFileExists("test1/d1/d2/f6"); + if (gnarlyFilesSupported) { + assertFileNotExists("test1/d1/d2/f\x0a"); + } + + /* Use -r -T to add more files to the archive. */ + systemf("%s -r -f test1.tar --null -T filelist2 > test2.out 2> test2.err", + testprog); + assertEmptyFile("test2.out"); + assertEmptyFile("test2.err"); + + /* Use -x without -T to dearchive the files (ensure -r worked) */ + if (!assertMakeDir("test3", 0755)) return; + systemf("%s -x -f test1.tar -C test3" + " > test3.out 2> test3.err", testprog); + assertEmptyFile("test3.out"); + assertEmptyFile("test3.err"); + /* Verify the files were extracted.*/ + assertFileExists("test3/f"); + assertFileExists("test3/d1/f1"); + assertFileNotExists("test3/d1/f2"); + assertFileExists("test3/d1/d2/f3"); + assertFileExists("test3/d1/d2/f4"); + assertFileExists("test3/d1/d2/f5"); + assertFileExists("test3/d1/d2/f6"); + if (gnarlyFilesSupported) { + assertFileExists("test3/d1/d2/f\x0a"); + } + + /* Use -x -T to dearchive the files (verify -x -T together) */ + if (!assertMakeDir("test2", 0755)) return; + systemf("%s -x -f test1.tar -T filelist -C test2" + " > test2b.out 2> test2b.err", testprog); + assertEmptyFile("test2b.out"); + assertEmptyFile("test2b.err"); + /* Verify the files were extracted.*/ + assertFileExists("test2/f"); + assertFileExists("test2/d1/f1"); + assertFileNotExists("test2/d1/f2"); + assertFileNotExists("test2/d1/d2/f3"); + assertFileExists("test2/d1/d2/f4"); + assertFileNotExists("test2/d1/d2/f5"); + assertFileExists("test2/d1/d2/f6"); + if (gnarlyFilesSupported) { + assertFileNotExists("test2/d1/d2/f\x0a"); + } + + assertMakeDir("test4", 0755); + assertMakeDir("test4_out", 0755); + assertMakeDir("test4_out2", 0755); + assertMakeDir("test4/d1", 0755); + assertEqualInt(1, touch("test4/d1/foo", 0)); + + /* Does bsdtar support -s option ? */ + systemf("%s -cf - -s /foo/bar/ test4/d1/foo > check.out 2> check.err", + testprog); + assertEqualInt(0, stat("check.err", &st)); + if (st.st_size == 0) { + systemf("%s -cf - -s /foo/bar/ test4/d1/foo | %s -xf - -C test4_out", + testprog, testprog); + assertEmptyFile("test4_out/test4/d1/bar"); + systemf("%s -cf - -s /d1/d2/ test4/d1/foo | %s -xf - -C test4_out", + testprog, testprog); + assertEmptyFile("test4_out/test4/d2/foo"); + systemf("%s -cf - -s ,test4/d1/foo,, test4/d1/foo | %s -tvf - > test4.lst", + testprog, testprog); + assertEmptyFile("test4.lst"); + systemf("%s -cf - test4/d1/foo | %s -xf - -s /foo/bar/ -C test4_out2", + testprog, testprog); + assertEmptyFile("test4_out2/test4/d1/bar"); + } else { + skipping("bsdtar does not support -s option on this platform"); + } + + /* TODO: Include some use of -C directory-changing within the filelist. */ + /* I'm pretty sure -C within the filelist is broken on extract. */ +} diff --git a/Utilities/cmlibarchive/tar/test/test_option_q.c b/Utilities/cmlibarchive/tar/test/test_option_q.c new file mode 100644 index 000000000..0b9944276 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_option_q.c @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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) +{ + FILE *f; + int r; + + /* + * Create an archive with several different versions of the + * same files. By default, the last version will overwrite + * any earlier versions. The -q/--fast-read option will + * stop early, so we can verify -q/--fast-read by seeing + * which version of each file actually ended up being + * extracted. This also exercises -r mode, since that's + * what we use to build up the test archive. + */ + + f = fopen("foo", "w"); + assert(f != NULL); + fprintf(f, "foo1"); + fclose(f); + + assertEqualInt(0, systemf("%s -cf archive.tar foo", testprog)); + + f = fopen("foo", "w"); + assert(f != NULL); + fprintf(f, "foo2"); + fclose(f); + + assertEqualInt(0, systemf("%s -rf archive.tar foo", testprog)); + + f = fopen("bar", "w"); + assert(f != NULL); + fprintf(f, "bar1"); + fclose(f); + + assertEqualInt(0, systemf("%s -rf archive.tar bar", testprog)); + + f = fopen("foo", "w"); + assert(f != NULL); + fprintf(f, "foo3"); + fclose(f); + + assertEqualInt(0, systemf("%s -rf archive.tar foo", testprog)); + + f = fopen("bar", "w"); + assert(f != NULL); + fprintf(f, "bar2"); + fclose(f); + + assertEqualInt(0, systemf("%s -rf archive.tar bar", testprog)); + + /* + * Now, try extracting from the test archive with various + * combinations of -q. + */ + + /* Test 1: -q foo should only extract the first foo. */ + assertMakeDir("test1", 0755); + assertChdir("test1"); + r = systemf("%s -xf ../archive.tar -q foo >test.out 2>test.err", + testprog); + failure("Fatal error trying to use -q option"); + if (!assertEqualInt(0, r)) + return; + + assertFileContents("foo1", 4, "foo"); + assertEmptyFile("test.out"); + assertEmptyFile("test.err"); + assertChdir(".."); + + /* Test 2: -q foo bar should extract up to the first bar. */ + assertMakeDir("test2", 0755); + assertChdir("test2"); + assertEqualInt(0, + systemf("%s -xf ../archive.tar -q foo bar >test.out 2>test.err", testprog)); + assertFileContents("foo2", 4, "foo"); + assertFileContents("bar1", 4, "bar"); + assertEmptyFile("test.out"); + assertEmptyFile("test.err"); + assertChdir(".."); + + /* Test 3: Same as test 2, but use --fast-read spelling. */ + assertMakeDir("test3", 0755); + assertChdir("test3"); + assertEqualInt(0, + systemf("%s -xf ../archive.tar --fast-read foo bar >test.out 2>test.err", testprog)); + assertFileContents("foo2", 4, "foo"); + assertFileContents("bar1", 4, "bar"); + assertEmptyFile("test.out"); + assertEmptyFile("test.err"); + assertChdir(".."); + + /* Test 4: Without -q, should extract everything. */ + assertMakeDir("test4", 0755); + assertChdir("test4"); + assertEqualInt(0, + systemf("%s -xf ../archive.tar foo bar >test.out 2>test.err", testprog)); + assertFileContents("foo3", 4, "foo"); + assertFileContents("bar2", 4, "bar"); + assertEmptyFile("test.out"); + assertEmptyFile("test.err"); + assertChdir(".."); +} diff --git a/Utilities/cmlibarchive/tar/test/test_option_r.c b/Utilities/cmlibarchive/tar/test/test_option_r.c new file mode 100644 index 000000000..b6d310add --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_option_r.c @@ -0,0 +1,117 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD$"); + +/* + * Also see test_option_q for additional validation of -r support. + */ +DEFINE_TEST(test_option_r) +{ + char buff[15]; + char *p0, *p1; + size_t s; + FILE *f; + int r; + + /* Create a file */ + f = fopen("f1", "w"); + if (!assert(f != NULL)) + return; + assertEqualInt(3, fwrite("abc", 1, 3, f)); + fclose(f); + + /* Archive that one file. */ + r = systemf("%s cf archive.tar f1 >step1.out 2>step1.err", testprog); + failure("Error invoking %s cf archive.tar f1", testprog); + assertEqualInt(r, 0); + + /* Verify that nothing went to stdout or stderr. */ + assertEmptyFile("step1.out"); + assertEmptyFile("step1.err"); + + + /* Do some basic validation of the constructed archive. */ + p0 = slurpfile(&s, "archive.tar"); + if (!assert(p0 != NULL)) + return; + if (!assert(s >= 2048)) { + free(p0); + return; + } + assertEqualMem(p0 + 0, "f1", 3); + assertEqualMem(p0 + 512, "abc", 3); + assertEqualMem(p0 + 1024, "\0\0\0\0\0\0\0\0", 8); + assertEqualMem(p0 + 1536, "\0\0\0\0\0\0\0\0", 8); + + /* Edit that file */ + f = fopen("f1", "w"); + if (!assert(f != NULL)) + return; + assertEqualInt(3, fwrite("123", 1, 3, f)); + fclose(f); + + /* Update the archive. */ + r = systemf("%s rf archive.tar f1 >step2.out 2>step2.err", testprog); + failure("Error invoking %s rf archive.tar f1", testprog); + assertEqualInt(r, 0); + + /* Verify that nothing went to stdout or stderr. */ + assertEmptyFile("step2.out"); + assertEmptyFile("step2.err"); + + /* Do some basic validation of the constructed archive. */ + p1 = slurpfile(&s, "archive.tar"); + if (!assert(p1 != NULL)) { + free(p0); + return; + } + assert(s >= 3072); + /* Verify first entry is unchanged. */ + assertEqualMem(p0, p1, 1024); + /* Verify that second entry is correct. */ + assertEqualMem(p1 + 1024, "f1", 3); + assertEqualMem(p1 + 1536, "123", 3); + /* Verify end-of-archive marker. */ + assertEqualMem(p1 + 2048, "\0\0\0\0\0\0\0\0", 8); + assertEqualMem(p1 + 2560, "\0\0\0\0\0\0\0\0", 8); + free(p0); + free(p1); + + /* Unpack both items */ + assertMakeDir("step3", 0775); + assertChdir("step3"); + r = systemf("%s xf ../archive.tar", testprog); + failure("Error invoking %s xf archive.tar", testprog); + assertEqualInt(r, 0); + + /* Verify that the second one overwrote the first. */ + f = fopen("f1", "r"); + if (assert(f != NULL)) { + assertEqualInt(3, fread(buff, 1, 3, f)); + assertEqualMem(buff, "123", 3); + fclose(f); + } +} diff --git a/Utilities/cmlibarchive/tar/test/test_option_s.c b/Utilities/cmlibarchive/tar/test/test_option_s.c new file mode 100644 index 000000000..3bddbcf75 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_option_s.c @@ -0,0 +1,107 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_option_T.c,v 1.3 2008/08/15 06:12:02 kientzle Exp $"); + +static int +mkfile(const char *fn, const char *contents) +{ + FILE *f = fopen(fn, "w"); + failure("Couldn't create file '%s', errno=%d (%s)\n", + fn, errno, strerror(errno)); + if (!assert(f != NULL)) + return (1); /* Failure. */ + if (contents != NULL) + assertEqualInt(strlen(contents), + fwrite(contents, 1, strlen(contents), f)); + assertEqualInt(0, fclose(f)); + return (0); /* Success */ +} + +DEFINE_TEST(test_option_s) +{ + struct stat st; + + /* Create a sample file heirarchy. */ + assertMakeDir("in", 0755); + assertMakeDir("in/d1", 0755); + assertEqualInt(0, mkfile("in/d1/foo", "foo")); + assertEqualInt(0, mkfile("in/d1/bar", "bar")); + + /* Does bsdtar support -s option ? */ + systemf("%s -cf - -s /foo/bar/ in/d1/foo > NUL 2> check.err", + testprog); + assertEqualInt(0, stat("check.err", &st)); + if (st.st_size != 0) { + skipping("%s does not support -s option on this platform", + testprog); + return; + } + + /* + * Test 1: Filename substitution when creating archives. + */ + assertMakeDir("test1", 0755); + systemf("%s -cf - -s /foo/bar/ in/d1/foo | %s -xf - -C test1", + testprog, testprog); + assertFileContents("foo", 3, "test1/in/d1/bar"); + systemf("%s -cf - -s /d1/d2/ in/d1/foo | %s -xf - -C test1", + testprog, testprog); + assertFileContents("foo", 3, "test1/in/d2/foo"); + + + /* + * Test 2: Basic substitution when extracting archive. + */ + assertMakeDir("test2", 0755); + systemf("%s -cf - in/d1/foo | %s -xf - -s /foo/bar/ -C test2", + testprog, testprog); + assertFileContents("foo", 3, "test2/in/d1/bar"); + + /* + * Test 3: Files with empty names shouldn't be archived. + */ + systemf("%s -cf - -s ,in/d1/foo,, in/d1/foo | %s -tvf - > in.lst", + testprog, testprog); + assertEmptyFile("in.lst"); + + /* + * Test 4: Multiple substitutions when extracting archive. + */ + assertMakeDir("test4", 0755); + systemf("%s -cf - in/d1/foo in/d1/bar | %s -xf - -s /foo/bar/ -s }bar}baz} -C test4", + testprog, testprog); + assertFileContents("foo", 3, "test4/in/d1/bar"); + assertFileContents("bar", 3, "test4/in/d1/baz"); + + /* + * Test 5: Name-switching substitutions when extracting archive. + */ + assertMakeDir("test5", 0755); + systemf("%s -cf - in/d1/foo in/d1/bar | %s -xf - -s /foo/bar/ -s }bar}foo} -C test5", + testprog, testprog); + assertFileContents("foo", 3, "test5/in/d1/bar"); + assertFileContents("bar", 3, "test5/in/d1/foo"); +} diff --git a/Utilities/cmlibarchive/tar/test/test_patterns.c b/Utilities/cmlibarchive/tar/test/test_patterns.c new file mode 100644 index 000000000..fb84f7a91 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_patterns.c @@ -0,0 +1,184 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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) +{ + FILE *f; + int r; + const char *reffile2 = "test_patterns_2.tar"; + const char *reffile3 = "test_patterns_3.tar"; + const char *reffile4 = "test_patterns_4.tar"; + const char *p; + + /* + * Test basic command-line pattern handling. + */ + + /* + * Test 1: Files on the command line that don't get matched + * didn't produce an error. + * + * John Baldwin reported this problem in PR bin/121598 + */ + f = fopen("foo", "w"); + assert(f != NULL); + fclose(f); + r = systemf("%s cfv tar1.tgz foo > tar1a.out 2> tar1a.err", testprog); + assertEqualInt(r, 0); + r = systemf("%s xv --no-same-owner -f tar1.tgz foo bar > tar1b.out 2> tar1b.err", testprog); + failure("tar should return non-zero because a file was given on the command line that's not in the archive"); + assert(r != 0); + + /* + * Test 2: Check basic matching of full paths that start with / + */ + extract_reference_file(reffile2); + + r = systemf("%s tf %s /tmp/foo/bar > tar2a.out 2> tar2a.err", + testprog, reffile2); + assertEqualInt(r, 0); +#if !defined(_WIN32) || defined(__CYGWIN__) + p = "/tmp/foo/bar/\n/tmp/foo/bar/baz\n"; +#else + p = "/tmp/foo/bar/\r\n/tmp/foo/bar/baz\r\n"; +#endif + assertFileContents(p, strlen(p), "tar2a.out"); + assertEmptyFile("tar2a.err"); + + /* + * Test 3 archive has some entries starting with '/' and some not. + */ + extract_reference_file(reffile3); + + /* Test 3a: Pattern tmp/foo/bar should not match /tmp/foo/bar */ + r = systemf("%s x --no-same-owner -f %s tmp/foo/bar > tar3a.out 2> tar3a.err", + testprog, reffile3); + assert(r != 0); + assertEmptyFile("tar3a.out"); + + /* Test 3b: Pattern /tmp/foo/baz should not match tmp/foo/baz */ + assertNonEmptyFile("tar3a.err"); + /* Again, with the '/' */ + r = systemf("%s x --no-same-owner -f %s /tmp/foo/baz > tar3b.out 2> tar3b.err", + testprog, reffile3); + assert(r != 0); + assertEmptyFile("tar3b.out"); + assertNonEmptyFile("tar3b.err"); + + /* Test 3c: ./tmp/foo/bar should not match /tmp/foo/bar */ + r = systemf("%s x --no-same-owner -f %s ./tmp/foo/bar > tar3c.out 2> tar3c.err", + testprog, reffile3); + assert(r != 0); + assertEmptyFile("tar3c.out"); + assertNonEmptyFile("tar3c.err"); + + /* Test 3d: ./tmp/foo/baz should match tmp/foo/baz */ + r = systemf("%s x --no-same-owner -f %s ./tmp/foo/baz > tar3d.out 2> tar3d.err", + testprog, reffile3); + assertEqualInt(r, 0); + assertEmptyFile("tar3d.out"); + assertEmptyFile("tar3d.err"); + assertFileExists("tmp/foo/baz/bar"); + + /* + * Test 4 archive has some entries starting with windows drive letters + * such as 'c:\', '//./c:/' or '//?/c:/'. + */ + extract_reference_file(reffile4); + + r = systemf("%s x --no-same-owner -f %s -C tmp > tar4.out 2> tar4.err", + testprog, reffile4); + assert(r != 0); + assertEmptyFile("tar4.out"); + assertNonEmptyFile("tar4.err"); + + for (r = 1; r <= 54; r++) { + char file_a[] = "tmp/fileXX"; + char file_b1[] = "tmp/server/share/fileXX"; + char file_b2[] = "tmp/server\\share\\fileXX"; + char file_c[] = "tmp/../fileXX"; + char *filex; + int xsize; + + switch (r) { + case 15: case 18: + /* + * Including server and share names. + * //?/UNC/server/share/file15 + * //?/unc/server/share/file18 + */ + filex = file_b1; + xsize = sizeof(file_b1); + break; + case 35: case 38: case 52: + /* + * Including server and share names. + * \\?\UNC\server\share\file35 + * \\?\unc\server\share\file38 + * \/?/uNc/server\share\file52 + */ + filex = file_b2; + xsize = sizeof(file_b2); + break; + default: + filex = file_a; + xsize = sizeof(file_a); + break; + } + filex[xsize-3] = '0' + r / 10; + filex[xsize-2] = '0' + r % 10; + switch (r) { + case 5: case 6: case 17: case 20: case 25: + case 26: case 37: case 40: case 43: case 54: + /* + * Not extracted patterns. + * D:../file05 + * c:../../file06 + * //?/UNC/../file17 + * //?/unc/../file20 + * z:..\file25 + * c:..\..\file26 + * \\?\UNC\..\file37 + * \\?\unc\..\file40 + * c:../..\file43 + * \/?\UnC\../file54 + */ + assertFileNotExists(filex); + filex = file_c; + xsize = sizeof(file_c); + filex[xsize-3] = '0' + r / 10; + filex[xsize-2] = '0' + r % 10; + assertFileNotExists(filex); + break; + default: + /* Extracted patterns. */ + assertFileExists(filex); + break; + } + } +} diff --git a/Utilities/cmlibarchive/tar/test/test_patterns_2.tar.uu b/Utilities/cmlibarchive/tar/test/test_patterns_2.tar.uu new file mode 100644 index 000000000..eba2daece --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_patterns_2.tar.uu @@ -0,0 +1,231 @@ +begin 644 test_patterns_2.tar +M+W1M<"]F;V\O```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#@`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````P +M,#`V-#0@`#`P,3@`````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````#`P,#8T-"``,#`Q-S4P(``P,#`P,#`@`#`P,#`P +M,#`P,#`P(#$Q,#4Q,C$R-C4S(#`Q,S8V-P`@,``````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````!UCHN+EQF:6QE,C4````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````#`P,#8T-"``,#`Q-S4Q(``P,#$W-3$@`#`P,#`P,#`P +M,#`P(#$Q,34P-Ccf.out 2>cf.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("cf.out"); + assertEmptyFile("cf.err"); + + /* 'cvf' should generate file list on stderr, empty stdout. */ + r = systemf("%s cvf archive f l >cvf.out 2>cvf.err", testprog); + assertEqualInt(r, 0); + failure("'cv' writes filenames to stderr, nothing to stdout (SUSv2)\n" + "Note that GNU tar writes the file list to stdout by default."); + assertEmptyFile("cvf.out"); + /* TODO: Verify cvf.err has file list in SUSv2-prescribed format. */ + + /* 'cvf -' should generate file list on stderr, archive on stdout. */ + r = systemf("%s cvf - f l >cvf-.out 2>cvf-.err", testprog); + assertEqualInt(r, 0); + failure("cvf - should write archive to stdout"); + /* TODO: Verify cvf-.out has archive. */ + failure("cvf - should write file list to stderr (SUSv2)"); + /* TODO: Verify cvf-.err has verbose file list. */ + + /* 'tf' should generate file list on stdout, empty stderr. */ + r = systemf("%s tf archive >tf.out 2>tf.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("tf.err"); + failure("'t' mode should write results to stdout"); + /* TODO: Verify tf.out has file list. */ + + /* 'tvf' should generate file list on stdout, empty stderr. */ + r = systemf("%s tvf archive >tvf.out 2>tvf.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("tvf.err"); + failure("'tv' mode should write results to stdout"); + /* TODO: Verify tvf.out has file list. */ + + /* 'tvf -' uses stdin, file list on stdout, empty stderr. */ + r = systemf("%s tvf - < archive >tvf-.out 2>tvf-.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("tvf-.err"); + /* TODO: Verify tvf-.out has file list. */ + + /* Basic 'xf' should generate no output on stdout or stderr. */ + r = systemf("%s xf archive >xf.out 2>xf.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("xf.err"); + assertEmptyFile("xf.out"); + + /* 'xvf' should generate list on stderr, empty stdout. */ + r = systemf("%s xvf archive >xvf.out 2>xvf.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("xvf.out"); + /* TODO: Verify xvf.err */ + + /* 'xvOf' should generate list on stderr, file contents on stdout. */ + r = systemf("%s xvOf archive >xvOf.out 2>xvOf.err", testprog); + assertEqualInt(r, 0); + /* Verify xvOf.out is the file contents */ + p = slurpfile(&s, "xvOf.out"); + assert(p != NULL); + assert(s = 2); + assertEqualMem(p, "f\n", 2); + /* TODO: Verify xvf.err */ + + /* 'xvf -' should generate list on stderr, empty stdout. */ + r = systemf("%s xvf - < archive >xvf-.out 2>xvf-.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("xvf-.out"); + /* TODO: Verify xvf-.err */ +} diff --git a/Utilities/cmlibarchive/tar/test/test_strip_components.c b/Utilities/cmlibarchive/tar/test/test_strip_components.c new file mode 100644 index 000000000..6d258e49d --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_strip_components.c @@ -0,0 +1,109 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_strip_components.c,v 1.2 2008/11/10 05:24:13 kientzle Exp $"); + +static int +touch(const char *fn) +{ + FILE *f = fopen(fn, "w"); + failure("Couldn't create file '%s', errno=%d (%s)\n", + fn, errno, strerror(errno)); + if (!assert(f != NULL)) + return (0); /* Failure. */ + fclose(f); + return (1); /* Success */ +} + +DEFINE_TEST(test_strip_components) +{ + assertMakeDir("d0", 0755); + assertChdir("d0"); + assertMakeDir("d1", 0755); + assertMakeDir("d1/d2", 0755); + assertMakeDir("d1/d2/d3", 0755); + assertEqualInt(1, touch("d1/d2/f1")); + assertMakeHardlink("l1", "d1/d2/f1"); + assertMakeHardlink("d1/l2", "d1/d2/f1"); + if (canSymlink()) { + assertMakeSymlink("s1", "d1/d2/f1"); + assertMakeSymlink("d1/s2", "d2/f1"); + } + assertChdir(".."); + + assertEqualInt(0, systemf("%s -cf test.tar d0", testprog)); + + assertMakeDir("target", 0755); + assertEqualInt(0, systemf("%s -x -C target --strip-components 2 " + "-f test.tar", testprog)); + + failure("d0/ is too short and should not get restored"); + assertFileNotExists("target/d0"); + failure("d0/d1/ is too short and should not get restored"); + assertFileNotExists("target/d1"); + failure("d0/d1/s2 is a symlink to something that won't be extracted"); + /* If platform supports symlinks, target/s2 is a broken symlink. */ + /* If platform does not support symlink, target/s2 doesn't exist. */ + assertFileNotExists("target/s2"); + if (canSymlink()) + assertIsSymlink("target/s2", "d2/f1"); + failure("d0/d1/d2 should be extracted"); + assertIsDir("target/d2", -1); + + /* + * This next is a complicated case. d0/l1, d0/d1/l2, and + * d0/d1/d2/f1 are all hardlinks to the same file; d0/l1 can't + * be extracted with --strip-components=2 and the other two + * can. Remember that tar normally stores the first file with + * a body and the other as hardlink entries to the first + * appearance. So the final result depends on the order in + * which these three names get archived. If d0/l1 is first, + * none of the three can be restored. If either of the longer + * names are first, then the two longer ones can both be + * restored. + * + * The tree-walking code used by bsdtar always visits files + * before subdirectories, so bsdtar's behavior is fortunately + * deterministic: d0/l1 will always get stored first and the + * other two will be stored as hardlinks to d0/l1. Since + * d0/l1 can't be extracted, none of these three will be + * extracted. + * + * It may be worth extending this test to force a particular + * archiving order so as to exercise both of the cases described + * above. + * + * Of course, this is all totally different for cpio and newc + * formats because the hardlink management is different. + * TODO: Rename this to test_strip_components_tar and create + * parallel tests for cpio and newc formats. + */ + failure("d0/l1 is too short and should not get restored"); + assertFileNotExists("target/l1"); + failure("d0/d1/l2 is a hardlink to file whose name was too short"); + assertFileNotExists("target/l2"); + failure("d0/d1/d2/f1 is a hardlink to file whose name was too short"); + assertFileNotExists("target/d2/f1"); +} diff --git a/Utilities/cmlibarchive/tar/test/test_symlink_dir.c b/Utilities/cmlibarchive/tar/test/test_symlink_dir.c new file mode 100644 index 000000000..04e0a4baa --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_symlink_dir.c @@ -0,0 +1,160 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__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 + * content. Plain tar -x should remove symlinks when they're in the + * way of a dir extraction. + */ + +static int +mkfile(const char *name, int mode, const char *contents, size_t size) +{ + FILE *f = fopen(name, "wb"); + size_t written; + + (void)mode; /* UNUSED */ + if (f == NULL) + return (-1); + written = fwrite(contents, 1, size, f); + fclose(f); + if (size != written) + return (-1); + return (0); +} + +DEFINE_TEST(test_symlink_dir) +{ + assertUmask(0); + + assertMakeDir("source", 0755); + assertEqualInt(0, mkfile("source/file", 0755, "a", 1)); + assertEqualInt(0, mkfile("source/file2", 0755, "ab", 2)); + assertMakeDir("source/dir", 0755); + assertMakeDir("source/dir/d", 0755); + assertEqualInt(0, mkfile("source/dir/f", 0755, "abc", 3)); + assertMakeDir("source/dir2", 0755); + assertMakeDir("source/dir2/d2", 0755); + assertEqualInt(0, mkfile("source/dir2/f2", 0755, "abcd", 4)); + assertMakeDir("source/dir3", 0755); + assertMakeDir("source/dir3/d3", 0755); + assertEqualInt(0, mkfile("source/dir3/f3", 0755, "abcde", 5)); + + assertEqualInt(0, + systemf("%s -cf test.tar -C source dir dir2 dir3 file file2", + testprog)); + + /* + * Extract with -x and without -P. + */ + assertMakeDir("dest1", 0755); + /* "dir" is a symlink to an existing "dest1/real_dir" */ + assertMakeDir("dest1/real_dir", 0755); + if (canSymlink()) { + assertMakeSymlink("dest1/dir", "real_dir"); + /* "dir2" is a symlink to a non-existing "real_dir2" */ + assertMakeSymlink("dest1/dir2", "real_dir2"); + } else { + skipping("some symlink checks"); + } + /* "dir3" is a symlink to an existing "non_dir3" */ + assertEqualInt(0, mkfile("dest1/non_dir3", 0755, "abcdef", 6)); + if (canSymlink()) + assertMakeSymlink("dest1/dir3", "non_dir3"); + /* "file" is a symlink to existing "real_file" */ + assertEqualInt(0, mkfile("dest1/real_file", 0755, "abcdefg", 7)); + if (canSymlink()) { + assertMakeSymlink("dest1/file", "real_file"); + /* "file2" is a symlink to non-existing "real_file2" */ + assertMakeSymlink("dest1/file2", "real_file2"); + } + assertEqualInt(0, systemf("%s -xf test.tar -C dest1", testprog)); + + /* dest1/dir symlink should be replaced */ + failure("symlink to dir was followed when it shouldn't be"); + assertIsDir("dest1/dir", -1); + /* dest1/dir2 symlink should be replaced */ + failure("Broken symlink wasn't replaced with dir"); + assertIsDir("dest1/dir2", -1); + /* dest1/dir3 symlink should be replaced */ + failure("Symlink to non-dir wasn't replaced with dir"); + assertIsDir("dest1/dir3", -1); + /* dest1/file symlink should be replaced */ + failure("Symlink to existing file should be replaced"); + assertIsReg("dest1/file", -1); + /* dest1/file2 symlink should be replaced */ + failure("Symlink to non-existing file should be replaced"); + assertIsReg("dest1/file2", -1); + + /* + * Extract with both -x and -P + */ + assertMakeDir("dest2", 0755); + /* "dir" is a symlink to existing "real_dir" */ + assertMakeDir("dest2/real_dir", 0755); + if (canSymlink()) + assertMakeSymlink("dest2/dir", "real_dir"); + /* "dir2" is a symlink to a non-existing "real_dir2" */ + if (canSymlink()) + assertMakeSymlink("dest2/dir2", "real_dir2"); + /* "dir3" is a symlink to an existing "non_dir3" */ + assertEqualInt(0, mkfile("dest2/non_dir3", 0755, "abcdefgh", 8)); + if (canSymlink()) + assertMakeSymlink("dest2/dir3", "non_dir3"); + /* "file" is a symlink to existing "real_file" */ + assertEqualInt(0, mkfile("dest2/real_file", 0755, "abcdefghi", 9)); + if (canSymlink()) + assertMakeSymlink("dest2/file", "real_file"); + /* "file2" is a symlink to non-existing "real_file2" */ + if (canSymlink()) + assertMakeSymlink("dest2/file2", "real_file2"); + assertEqualInt(0, systemf("%s -xPf test.tar -C dest2", testprog)); + + /* dest2/dir symlink should be followed */ + if (canSymlink()) { + assertIsSymlink("dest2/dir", "real_dir"); + assertIsDir("dest2/real_dir", -1); + } + + /* Contents of 'dir' should be restored */ + assertIsDir("dest2/dir/d", -1); + assertIsReg("dest2/dir/f", -1); + assertFileSize("dest2/dir/f", 3); + /* dest2/dir2 symlink should be removed */ + failure("Broken symlink wasn't replaced with dir"); + assertIsDir("dest2/dir2", -1); + /* dest2/dir3 symlink should be removed */ + failure("Symlink to non-dir wasn't replaced with dir"); + assertIsDir("dest2/dir3", -1); + /* dest2/file symlink should be removed; + * even -P shouldn't follow symlinks for files */ + failure("Symlink to existing file should be removed"); + assertIsReg("dest2/file", -1); + /* dest2/file2 symlink should be removed */ + failure("Symlink to non-existing file should be removed"); + assertIsReg("dest2/file2", -1); +} diff --git a/Utilities/cmlibarchive/tar/test/test_version.c b/Utilities/cmlibarchive/tar/test/test_version.c new file mode 100644 index 000000000..518dd413e --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_version.c @@ -0,0 +1,97 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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" +__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_version.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); + +/* + * Test that --version option works and generates reasonable output. + */ + +DEFINE_TEST(test_version) +{ + int r; + char *p, *q; + size_t s; + + + r = systemf("%s --version >version.stdout 2>version.stderr", testprog); + if (r != 0) + r = systemf("%s -W version >version.stdout 2>version.stderr", + testprog); + failure("Unable to run either %s --version or %s -W version", + testprog, testprog); + if (!assert(r == 0)) + return; + + /* --version should generate nothing to stdout. */ + assertEmptyFile("version.stderr"); + /* Verify format of version message. */ + q = p = slurpfile(&s, "version.stdout"); + /* Version message should start with name of program, then space. */ + assert(s > 6); + failure("Version must start with 'bsdtar': ``%s''", p); + if (!assertEqualMem(q, "bsdtar ", 7)) + return; + q += 7; s -= 7; + /* Version number is a series of digits and periods. */ + while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) { + ++q; + --s; + } + /* Version number terminated by space. */ + failure("No space after bsdtar version: ``%s''", p); + assert(s > 1); + /* Skip a single trailing a,b,c, or d. */ + if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd') + ++q; + failure("No space after bsdtar version: ``%s''", p); + assert(*q == ' '); + ++q; --s; + /* Separator. */ + failure("No `-' between bsdtar and libarchive versions: ``%s''", p); + assertEqualMem(q, "- ", 2); + q += 2; s -= 2; + /* libarchive name and version number */ + failure("Not long enough for libarchive version: ``%s''", p); + assert(s > 11); + failure("Libarchive version must start with `libarchive': ``%s''", p); + assertEqualMem(q, "libarchive ", 11); + q += 11; s -= 11; + /* Version number is a series of digits and periods. */ + while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) { + ++q; + --s; + } + /* Skip a single trailing a,b,c, or d. */ + if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd') + ++q; + /* All terminated by end-of-line. */ + assert(s >= 1); + /* Skip an optional CR character (e.g., Windows) */ + failure("Version output must end with \\n or \\r\\n"); + if (*q == '\r') { ++q; --s; } + assertEqualMem(q, "\n", 1); + free(p); +} diff --git a/Utilities/cmlibarchive/tar/test/test_windows.c b/Utilities/cmlibarchive/tar/test/test_windows.c new file mode 100644 index 000000000..b0eefff45 --- /dev/null +++ b/Utilities/cmlibarchive/tar/test/test_windows.c @@ -0,0 +1,324 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * 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" + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include + +static void +mkfile(const char *name) +{ + FILE *f; + + f = fopen(name, "wb"); + assert(f != NULL); + assertEqualInt(5, fwrite("01234", 1, 5, f)); + fclose(f); +} + +static void +mkfullpath(char **path1, char **path2, const char *tpath, int type) +{ + char *fp1 = NULL, *fp2 = NULL, *p1 = NULL, *p2 = NULL; + size_t l; + + /* + * Get full path name of "tpath" + */ + l = GetFullPathNameA(tpath, 0, NULL, NULL); + assert(0 != l); + fp1 = malloc(l); + assert(NULL != fp1); + fp2 = malloc(l*2); + assert(NULL != fp2); + l = GetFullPathNameA(tpath, l, fp1, NULL); + if ((type & 0x01) == 0) { + for (p1 = fp1; *p1 != '\0'; p1++) + if (*p1 == '\\') + *p1 = '/'; + } + + switch(type) { + case 0: /* start with "/" */ + case 1: /* start with "\" */ + /* strip "c:" */ + memmove(fp1, fp1 + 2, l - 2); + fp1[l -2] = '\0'; + p1 = fp1 + 1; + break; + case 2: /* start with "c:/" */ + case 3: /* start with "c:\" */ + p1 = fp1 + 3; + break; + case 4: /* start with "//./c:/" */ + case 5: /* start with "\\.\c:\" */ + case 6: /* start with "//?/c:/" */ + case 7: /* start with "\\?\c:\" */ + p1 = malloc(l + 4 + 1); + assert(NULL != p1); + if (type & 0x1) + memcpy(p1, "\\\\.\\", 4); + else + memcpy(p1, "//./", 4); + if (type == 6 || type == 7) + p1[2] = '?'; + memcpy(p1 + 4, fp1, l); + p1[l + 4] = '\0'; + free(fp1); + fp1 = p1; + p1 = fp1 + 7; + break; + } + + /* + * Strip leading drive names and converting "\" to "\\" + */ + p2 = fp2; + while (*p1 != '\0') { + if (*p1 == '\\') + *p2++ = *p1; + *p2++ = *p1++; + } + *p2++ = '\r'; + *p2++ = '\n'; + *p2 = '\0'; + + *path1 = fp1; + *path2 = fp2; +} + +static const char list1[] = + "aaa/\r\naaa/file1\r\naaa/xxa/\r\naaa/xxb/\r\naaa/zzc/\r\n" + "aaa/zzc/file1\r\naaa/xxb/file1\r\naaa/xxa/file1\r\naab/\r\n" + "aac/\r\nabb/\r\nabc/\r\nabd/\r\n"; +static const char list2[] = + "bbb/\r\nbbb/file1\r\nbbb/xxa/\r\nbbb/xxb/\r\nbbb/zzc/\r\n" + "bbb/zzc/file1\r\nbbb/xxb/file1\r\nbbb/xxa/file1\r\nbbc/\r\n" + "bbd/\r\nbcc/\r\nbcd/\r\nbce/\r\n"; +static const char list3[] = + "aac/\r\nabc/\r\nbbc/\r\nbcc/\r\nccc/\r\n"; +static const char list4[] = + "fff/abca\r\nfff/acca\r\n"; +static const char list5[] = + "aaa/file1\r\naaa/xxa/\r\naaa/xxa/file1\r\naaa/xxb/\r\n" + "aaa/xxb/file1\r\naaa/zzc/\r\naaa/zzc/file1\r\n"; +static const char list6[] = + "fff/abca\r\nfff/acca\r\naaa/xxa/\r\naaa/xxa/file1\r\n" + "aaa/xxb/\r\naaa/xxb/file1\r\n"; +#endif /* _WIN32 && !__CYGWIN__ */ + +DEFINE_TEST(test_windows) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + char *fp1, *fp2; + + /* + * Preparre tests. + * Create directories and files. + */ + assertMakeDir("tmp", 0775); + assertChdir("tmp"); + + assertMakeDir("aaa", 0775); + assertMakeDir("aaa/xxa", 0775); + assertMakeDir("aaa/xxb", 0775); + assertMakeDir("aaa/zzc", 0775); + mkfile("aaa/file1"); + mkfile("aaa/xxa/file1"); + mkfile("aaa/xxb/file1"); + mkfile("aaa/zzc/file1"); + assertMakeDir("aab", 0775); + assertMakeDir("aac", 0775); + assertMakeDir("abb", 0775); + assertMakeDir("abc", 0775); + assertMakeDir("abd", 0775); + assertMakeDir("bbb", 0775); + assertMakeDir("bbb/xxa", 0775); + assertMakeDir("bbb/xxb", 0775); + assertMakeDir("bbb/zzc", 0775); + mkfile("bbb/file1"); + mkfile("bbb/xxa/file1"); + mkfile("bbb/xxb/file1"); + mkfile("bbb/zzc/file1"); + assertMakeDir("bbc", 0775); + assertMakeDir("bbd", 0775); + assertMakeDir("bcc", 0775); + assertMakeDir("bcd", 0775); + assertEqualInt(0, _mkdir("bce")); + assertEqualInt(0, _mkdir("ccc")); + assertEqualInt(0, _mkdir("fff")); + mkfile("fff/aaaa"); + mkfile("fff/abba"); + mkfile("fff/abca"); + mkfile("fff/acba"); + mkfile("fff/acca"); + + /* + * Test1: Command line pattern matching. + */ + assertEqualInt(0, + systemf("%s -cf ../archive1.tar a*", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive1.tar > ../list1", testprog)); + assertFileContents(list1, strlen(list1), "../list1"); + + assertEqualInt(0, + systemf("%s -cf ../archive2.tar b*", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive2.tar > ../list2", testprog)); + assertFileContents(list2, strlen(list2), "../list2"); + + assertEqualInt(0, + systemf("%s -cf ../archive3.tar ??c", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive3.tar > ../list3", testprog)); + assertFileContents(list3, strlen(list3), "../list3"); + + assertEqualInt(0, + systemf("%s -cf ../archive3b.tar *c", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive3b.tar > ../list3b", testprog)); + assertFileContents(list3, strlen(list3), "../list3b"); + + assertEqualInt(0, + systemf("%s -cf ../archive4.tar fff/a?ca", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive4.tar > ../list4", testprog)); + assertFileContents(list4, strlen(list4), "../list4"); + + assertEqualInt(0, + systemf("%s -cf ../archive5.tar aaa\\*", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive5.tar > ../list5", testprog)); + assertFileContents(list5, strlen(list5), "../list5"); + + assertEqualInt(0, + systemf("%s -cf ../archive6.tar fff\\a?ca aaa\\xx*", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive6.tar > ../list6", testprog)); + assertFileContents(list6, strlen(list6), "../list6"); + + /* + * Test2: Archive the file start with drive letters. + */ + /* Test2a: start with "/" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 0); + assertEqualInt(0, + systemf("%s -cf ../archive10.tar %s > ../out10 2> ../err10", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive10.tar > ../list10", testprog)); + /* Check drive letters have been stripped. */ + assertFileContents(fp2, strlen(fp2), "../list10"); + free(fp1); + free(fp2); + + /* Test2b: start with "\" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 1); + assertEqualInt(0, + systemf("%s -cf ../archive11.tar %s > ../out11 2> ../err11", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive11.tar > ../list11", testprog)); + /* Check drive letters have been stripped. */ + assertFileContents(fp2, strlen(fp2), "../list11"); + free(fp1); + free(fp2); + + /* Test2c: start with "c:/" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 2); + assertEqualInt(0, + systemf("%s -cf ../archive12.tar %s > ../out12 2> ../err12", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive12.tar > ../list12", testprog)); + /* Check drive letters have been stripped. */ + assertFileContents(fp2, strlen(fp2), "../list12"); + free(fp1); + free(fp2); + + /* Test2d: start with "c:\" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 3); + assertEqualInt(0, + systemf("%s -cf ../archive13.tar %s > ../out13 2> ../err13", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive13.tar > ../list13", testprog)); + /* Check drive letters have been stripped. */ + assertFileContents(fp2, strlen(fp2), "../list13"); + free(fp1); + free(fp2); + + /* Test2e: start with "//./c:/" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 4); + assertEqualInt(0, + systemf("%s -cf ../archive14.tar %s > ../out14 2> ../err14", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive14.tar > ../list14", testprog)); + /* Check drive letters have been stripped. */ + assertFileContents(fp2, strlen(fp2), "../list14"); + free(fp1); + free(fp2); + + /* Test2f: start with "\\.\c:\" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 5); + assertEqualInt(0, + systemf("%s -cf ../archive15.tar %s > ../out15 2> ../err15", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive15.tar > ../list15", testprog)); + /* Check drive letters have been stripped. */ + assertFileContents(fp2, strlen(fp2), "../list15"); + free(fp1); + free(fp2); + + /* Test2g: start with "//?/c:/" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 6); + assertEqualInt(0, + systemf("%s -cf ../archive16.tar %s > ../out16 2> ../err16", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive16.tar > ../list16", testprog)); + /* Check drive letters have been stripped. */ + assertFileContents(fp2, strlen(fp2), "../list16"); + free(fp1); + free(fp2); + + /* Test2h: start with "\\?\c:\" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 7); + assertEqualInt(0, + systemf("%s -cf ../archive17.tar %s > ../out17 2> ../err17", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive17.tar > ../list17", testprog)); + /* Check drive letters have been stripped. */ + assertFileContents(fp2, strlen(fp2), "../list17"); + free(fp1); + free(fp2); +#else + skipping("Windows specific test"); +#endif /* _WIN32 && !__CYGWIN__ */ +} diff --git a/Utilities/cmlibarchive/tar/tree.c b/Utilities/cmlibarchive/tar/tree.c new file mode 100644 index 000000000..360b2a037 --- /dev/null +++ b/Utilities/cmlibarchive/tar/tree.c @@ -0,0 +1,795 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + */ + +/*- + * This is a new directory-walking system that addresses a number + * of problems I've had with fts(3). In particular, it has no + * pathname-length limits (other than the size of 'int'), handles + * deep logical traversals, uses considerably less memory, and has + * an opaque interface (easier to modify in the future). + * + * Internally, it keeps a single list of "tree_entry" items that + * represent filesystem objects that require further attention. + * Non-directories are not kept in memory: they are pulled from + * readdir(), returned to the client, then freed as soon as possible. + * Any directory entry to be traversed gets pushed onto the stack. + * + * There is surprisingly little information that needs to be kept for + * each item on the stack. Just the name, depth (represented here as the + * string length of the parent directory's pathname), and some markers + * indicating how to get back to the parent (via chdir("..") for a + * regular dir or via fchdir(2) for a symlink). + */ +#include "bsdtar_platform.h" +__FBSDID("$FreeBSD: src/usr.bin/tar/tree.c,v 1.9 2008/11/27 05:49:52 kientzle Exp $"); + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_DIRECT_H +#include +#endif +#ifdef HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#if defined(HAVE_WINDOWS_H) && !defined(__CYGWIN__) +#include +#endif + +#include "tree.h" + +/* + * TODO: + * 1) Loop checking. + * 3) Arbitrary logical traversals by closing/reopening intermediate fds. + */ + +struct tree_entry { + int depth; + struct tree_entry *next; + struct tree_entry *parent; + char *name; + size_t dirname_length; + dev_t dev; + ino_t ino; + int flags; + /* How to return back to the parent of a symlink. */ +#ifdef HAVE_FCHDIR + int symlink_parent_fd; +#elif defined(_WIN32) && !defined(__CYGWIN__) + char *symlink_parent_path; +#else +#error fchdir function required. +#endif +}; + +/* Definitions for tree_entry.flags bitmap. */ +#define isDir 1 /* This entry is a regular directory. */ +#define isDirLink 2 /* This entry is a symbolic link to a directory. */ +#define needsFirstVisit 4 /* This is an initial entry. */ +#define needsDescent 8 /* This entry needs to be previsited. */ +#define needsOpen 16 /* This is a directory that needs to be opened. */ +#define needsAscent 32 /* This entry needs to be postvisited. */ + +/* + * On Windows, "first visit" is handled as a pattern to be handed to + * _findfirst(). This is consistent with Windows conventions that + * file patterns are handled within the application. On Posix, + * "first visit" is just returned to the client. + */ + +/* + * Local data for this package. + */ +struct tree { + struct tree_entry *stack; + struct tree_entry *current; +#if defined(HAVE_WINDOWS_H) && !defined(__CYGWIN__) + HANDLE d; + BY_HANDLE_FILE_INFORMATION fileInfo; +#define INVALID_DIR_HANDLE INVALID_HANDLE_VALUE + WIN32_FIND_DATA _findData; + WIN32_FIND_DATA *findData; +#else + DIR *d; +#define INVALID_DIR_HANDLE NULL + struct dirent *de; +#endif + int flags; + int visit_type; + int tree_errno; /* Error code from last failed operation. */ + + /* Dynamically-sized buffer for holding path */ + char *buff; + size_t buff_length; + + const char *basename; /* Last path element */ + size_t dirname_length; /* Leading dir length */ + size_t path_length; /* Total path length */ + + int depth; + int openCount; + int maxOpenCount; + + struct stat lst; + struct stat st; +}; + +/* Definitions for tree.flags bitmap. */ +#define hasStat 16 /* The st entry is valid. */ +#define hasLstat 32 /* The lst entry is valid. */ +#define hasFileInfo 64 /* The Windows fileInfo entry is valid. */ + +#if defined(_WIN32) && !defined(__CYGWIN__) +static int +tree_dir_next_windows(struct tree *t, const char *pattern); +#else +static int +tree_dir_next_posix(struct tree *t); +#endif + +#ifdef HAVE_DIRENT_D_NAMLEN +/* BSD extension; avoids need for a strlen() call. */ +#define D_NAMELEN(dp) (dp)->d_namlen +#else +#define D_NAMELEN(dp) (strlen((dp)->d_name)) +#endif + +#include +void +tree_dump(struct tree *t, FILE *out) +{ + char buff[300]; + struct tree_entry *te; + + fprintf(out, "\tdepth: %d\n", t->depth); + fprintf(out, "\tbuff: %s\n", t->buff); + fprintf(out, "\tpwd: %s\n", getcwd(buff, sizeof(buff))); + fprintf(out, "\tbasename: %s\n", t->basename); + fprintf(out, "\tstack:\n"); + for (te = t->stack; te != NULL; te = te->next) { + fprintf(out, "\t\t%s%d:\"%s\" %s%s%s%s%s\n", + t->current == te ? "*" : " ", + te->depth, + te->name, + te->flags & needsFirstVisit ? "V" : "", + te->flags & needsDescent ? "D" : "", + te->flags & needsOpen ? "O" : "", + te->flags & needsAscent ? "A" : "", + (t->current == te && t->d) ? "+" : "" + ); + } +} + +/* + * Add a directory path to the current stack. + */ +static void +tree_push(struct tree *t, const char *path) +{ + struct tree_entry *te; + + te = malloc(sizeof(*te)); + memset(te, 0, sizeof(*te)); + te->next = t->stack; + te->parent = t->current; + if (te->parent) + te->depth = te->parent->depth + 1; + t->stack = te; +#ifdef HAVE_FCHDIR + te->symlink_parent_fd = -1; + te->name = strdup(path); +#elif defined(_WIN32) && !defined(__CYGWIN__) + te->symlink_parent_path = NULL; + te->name = _strdup(path); +#endif + te->flags = needsDescent | needsOpen | needsAscent; + te->dirname_length = t->dirname_length; +} + +/* + * Append a name to the current dir path. + */ +static void +tree_append(struct tree *t, const char *name, size_t name_length) +{ + char *p; + + if (t->buff != NULL) + t->buff[t->dirname_length] = '\0'; + /* Strip trailing '/' from name, unless entire name is "/". */ + while (name_length > 1 && + (name[name_length - 1] == '/' || name[name_length - 1] == '/')) + name_length--; + + /* Resize pathname buffer as needed. */ + while (name_length + 1 + t->dirname_length >= t->buff_length) { + t->buff_length *= 2; + if (t->buff_length < 1024) + t->buff_length = 1024; + t->buff = realloc(t->buff, t->buff_length); + if (t->buff == NULL) + abort(); + } + p = t->buff + t->dirname_length; + t->path_length = t->dirname_length + name_length; + /* Add a separating '/' if it's needed. */ + if (t->dirname_length > 0 && p[-1] != '/') { + *p++ = '/'; + t->path_length ++; + } +#if HAVE_STRNCPY_S + strncpy_s(p, t->buff_length - (p - t->buff), name, name_length); +#else + strncpy(p, name, name_length); +#endif + p[name_length] = '\0'; + t->basename = p; +} + +/* + * Open a directory tree for traversal. + */ +struct tree * +tree_open(const char *path) +{ + struct tree *t; + + t = malloc(sizeof(*t)); + memset(t, 0, sizeof(*t)); +// tree_append(t, path, strlen(path)); + /* First item is set up a lot like a symlink traversal. */ + tree_push(t, path); + t->stack->flags = needsFirstVisit | isDirLink; +#ifdef HAVE_FCHDIR + t->stack->symlink_parent_fd = open(".", O_RDONLY); + t->openCount++; +#elif defined(_WIN32) && !defined(__CYGWIN__) + t->stack->symlink_parent_path = _getcwd(NULL, 0); +#endif + t->d = INVALID_DIR_HANDLE; + return (t); +} + +/* + * We've finished a directory; ascend back to the parent. + */ +static int +tree_ascend(struct tree *t) +{ + struct tree_entry *te; + int r = 0; + + te = t->stack; + t->depth--; + if (te->flags & isDirLink) { +#ifdef HAVE_FCHDIR + if (fchdir(te->symlink_parent_fd) != 0) { + t->tree_errno = errno; + r = TREE_ERROR_FATAL; + } + close(te->symlink_parent_fd); +#elif defined(_WIN32) && !defined(__CYGWIN__) + if (SetCurrentDirectory(te->symlink_parent_path) == 0) { + t->tree_errno = errno; + r = TREE_ERROR_FATAL; + } + free(te->symlink_parent_path); + te->symlink_parent_path = NULL; +#endif + t->openCount--; + } else { +#if defined(_WIN32) && !defined(__CYGWIN__) + if (SetCurrentDirectory("..") == 0) { +#else + if (chdir("..") != 0) { +#endif + t->tree_errno = errno; + r = TREE_ERROR_FATAL; + } + } + return (r); +} + +/* + * Pop the working stack. + */ +static void +tree_pop(struct tree *t) +{ + struct tree_entry *te; + + if (t->buff) + t->buff[t->dirname_length] = '\0'; + if (t->stack == t->current && t->current != NULL) + t->current = t->current->parent; + te = t->stack; + t->stack = te->next; + t->dirname_length = te->dirname_length; + if (t->buff) { + t->basename = t->buff + t->dirname_length; + while (t->basename[0] == '/') + t->basename++; + } + free(te->name); + free(te); +} + +/* + * Get the next item in the tree traversal. + */ +int +tree_next(struct tree *t) +{ + int r; + + /* If we're called again after a fatal error, that's an API + * violation. Just crash now. */ + if (t->visit_type == TREE_ERROR_FATAL) { + fprintf(stderr, "Unable to continue traversing" + " directory heirarchy after a fatal error."); + abort(); + } + + while (t->stack != NULL) { + /* If there's an open dir, get the next entry from there. */ + if (t->d != INVALID_DIR_HANDLE) { +#if defined(_WIN32) && !defined(__CYGWIN__) + r = tree_dir_next_windows(t, NULL); +#else + r = tree_dir_next_posix(t); +#endif + if (r == 0) + continue; + return (r); + } + + if (t->stack->flags & needsFirstVisit) { +#if defined(_WIN32) && !defined(__CYGWIN__) + char *d = strdup(t->stack->name); + char *p, *pattern; + //tree_pop(t); + t->stack->flags &= ~needsFirstVisit; + if (strchr(d, '*') || strchr(d, '?')) { + // It has a wildcard in it... + if ((p = strrchr(d, '\\')) != NULL) { + pattern = strdup(p + 1); + p[1] = '\0'; + chdir(d); + tree_append(t, d, strlen(d)); + free(d); + } else { + pattern = d; + } + r = tree_dir_next_windows(t, pattern); + free(pattern); + if (r == 0) + continue; + return (r); + } + // Not a pattern, handle it as-is... +#endif + /* Top stack item needs a regular visit. */ + t->current = t->stack; + tree_append(t, t->stack->name, strlen(t->stack->name)); + //t->dirname_length = t->path_length; + //tree_pop(t); + t->stack->flags &= ~needsFirstVisit; + return (t->visit_type = TREE_REGULAR); + } else if (t->stack->flags & needsDescent) { + /* Top stack item is dir to descend into. */ + t->current = t->stack; + tree_append(t, t->stack->name, strlen(t->stack->name)); + t->stack->flags &= ~needsDescent; + /* If it is a link, set up fd for the ascent. */ + if (t->stack->flags & isDirLink) { +#ifdef HAVE_FCHDIR + t->stack->symlink_parent_fd = open(".", O_RDONLY); + t->openCount++; + if (t->openCount > t->maxOpenCount) + t->maxOpenCount = t->openCount; +#elif defined(_WIN32) && !defined(__CYGWIN__) + t->stack->symlink_parent_path = _getcwd(NULL, 0); +#endif + } + t->dirname_length = t->path_length; +#if defined(_WIN32) && !defined(__CYGWIN__) + if (t->path_length == 259 || !SetCurrentDirectory(t->stack->name) != 0) +#else + if (chdir(t->stack->name) != 0) +#endif + { + /* chdir() failed; return error */ + tree_pop(t); + t->tree_errno = errno; + return (t->visit_type = TREE_ERROR_DIR); + } + t->depth++; + return (t->visit_type = TREE_POSTDESCENT); + } else if (t->stack->flags & needsOpen) { + t->stack->flags &= ~needsOpen; +#if defined(_WIN32) && !defined(__CYGWIN__) + r = tree_dir_next_windows(t, "*"); +#else + r = tree_dir_next_posix(t); +#endif + if (r == 0) + continue; + return (r); + } else if (t->stack->flags & needsAscent) { + /* Top stack item is dir and we're done with it. */ + r = tree_ascend(t); + tree_pop(t); + t->visit_type = r != 0 ? r : TREE_POSTASCENT; + return (t->visit_type); + } else { + /* Top item on stack is dead. */ + tree_pop(t); + t->flags &= ~hasLstat; + t->flags &= ~hasStat; + } + } + return (t->visit_type = 0); +} + +#if defined(_WIN32) && !defined(__CYGWIN__) +static int +tree_dir_next_windows(struct tree *t, const char *pattern) +{ + const char *name; + size_t namelen; + int r; + + for (;;) { + if (pattern != NULL) { + t->d = FindFirstFile(pattern, &t->_findData); + if (t->d == INVALID_DIR_HANDLE) { + r = tree_ascend(t); /* Undo "chdir" */ + tree_pop(t); + t->tree_errno = errno; + t->visit_type = r != 0 ? r : TREE_ERROR_DIR; + return (t->visit_type); + } + t->findData = &t->_findData; + pattern = NULL; + } else if (!FindNextFile(t->d, &t->_findData)) { + FindClose(t->d); + t->d = INVALID_DIR_HANDLE; + t->findData = NULL; + return (0); + } + name = t->findData->cFileName; + namelen = strlen(name); + t->flags &= ~hasLstat; + t->flags &= ~hasStat; + if (name[0] == '.' && name[1] == '\0') + continue; + if (name[0] == '.' && name[1] == '.' && name[2] == '\0') + continue; + tree_append(t, name, namelen); + return (t->visit_type = TREE_REGULAR); + } +} +#else +static int +tree_dir_next_posix(struct tree *t) +{ + int r; + const char *name; + size_t namelen; + + if (t->d == NULL) { + if ((t->d = opendir(".")) == NULL) { + r = tree_ascend(t); /* Undo "chdir" */ + tree_pop(t); + t->tree_errno = errno; + t->visit_type = r != 0 ? r : TREE_ERROR_DIR; + return (t->visit_type); + } + } + for (;;) { + t->de = readdir(t->d); + if (t->de == NULL) { + closedir(t->d); + t->d = INVALID_DIR_HANDLE; + return (0); + } + name = t->de->d_name; + namelen = D_NAMELEN(t->de); + t->flags &= ~hasLstat; + t->flags &= ~hasStat; + if (name[0] == '.' && name[1] == '\0') + continue; + if (name[0] == '.' && name[1] == '.' && name[2] == '\0') + continue; + tree_append(t, name, namelen); + return (t->visit_type = TREE_REGULAR); + } +} +#endif + +/* + * Return error code. + */ +int +tree_errno(struct tree *t) +{ + return (t->tree_errno); +} + +/* + * Called by the client to mark the directory just returned from + * tree_next() as needing to be visited. + */ +void +tree_descend(struct tree *t) +{ + if (t->visit_type != TREE_REGULAR) + return; + + if (tree_current_is_physical_dir(t)) { + tree_push(t, t->basename); + t->stack->flags |= isDir; + } else if (tree_current_is_dir(t)) { + tree_push(t, t->basename); + t->stack->flags |= isDirLink; + } +} + +/* + * Get the stat() data for the entry just returned from tree_next(). + */ +const struct stat * +tree_current_stat(struct tree *t) +{ + if (!(t->flags & hasStat)) { + if (stat(tree_current_access_path(t), &t->st) != 0) + return NULL; + t->flags |= hasStat; + } + return (&t->st); +} + +#if defined(HAVE_WINDOWS_H) && !defined(__CYGWIN__) +const BY_HANDLE_FILE_INFORMATION * +tree_current_file_information(struct tree *t) +{ + if (!(t->flags & hasFileInfo)) { + HANDLE h = CreateFile(tree_current_access_path(t), + 0, 0, NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, + NULL); + if (h == INVALID_HANDLE_VALUE) + return NULL; + if (!GetFileInformationByHandle(h, &t->fileInfo)) { + CloseHandle(h); + return NULL; + } + CloseHandle(h); + t->flags |= hasFileInfo; + } + return (&t->fileInfo); +} +#endif +/* + * Get the lstat() data for the entry just returned from tree_next(). + */ +const struct stat * +tree_current_lstat(struct tree *t) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + return (tree_current_stat(t)); +#else + if (!(t->flags & hasLstat)) { + if (lstat(tree_current_access_path(t), &t->lst) != 0) + return NULL; + t->flags |= hasLstat; + } + return (&t->lst); +#endif +} + +/* + * Test whether current entry is a dir or link to a dir. + */ +int +tree_current_is_dir(struct tree *t) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + if (t->findData) + return (t->findData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); + if (tree_current_file_information(t)) + return (t->fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); + return (0); +#else + const struct stat *st; + /* + * If we already have lstat() info, then try some + * cheap tests to determine if this is a dir. + */ + if (t->flags & hasLstat) { + /* If lstat() says it's a dir, it must be a dir. */ + if (S_ISDIR(tree_current_lstat(t)->st_mode)) + return 1; + /* Not a dir; might be a link to a dir. */ + /* If it's not a link, then it's not a link to a dir. */ + if (!S_ISLNK(tree_current_lstat(t)->st_mode)) + return 0; + /* + * It's a link, but we don't know what it's a link to, + * so we'll have to use stat(). + */ + } + + st = tree_current_stat(t); + /* If we can't stat it, it's not a dir. */ + if (st == NULL) + return 0; + /* Use the definitive test. Hopefully this is cached. */ + return (S_ISDIR(st->st_mode)); +#endif +} + +/* + * Test whether current entry is a physical directory. Usually, we + * already have at least one of stat() or lstat() in memory, so we + * use tricks to try to avoid an extra trip to the disk. + */ +int +tree_current_is_physical_dir(struct tree *t) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + if (tree_current_is_physical_link(t)) + return (0); + return (tree_current_is_dir(t)); +#else + const struct stat *st; + + /* + * If stat() says it isn't a dir, then it's not a dir. + * If stat() data is cached, this check is free, so do it first. + */ + if ((t->flags & hasStat) + && (!S_ISDIR(tree_current_stat(t)->st_mode))) + return 0; + + /* + * Either stat() said it was a dir (in which case, we have + * to determine whether it's really a link to a dir) or + * stat() info wasn't available. So we use lstat(), which + * hopefully is already cached. + */ + + st = tree_current_lstat(t); + /* If we can't stat it, it's not a dir. */ + if (st == NULL) + return 0; + /* Use the definitive test. Hopefully this is cached. */ + return (S_ISDIR(st->st_mode)); +#endif +} + +/* + * Test whether current entry is a symbolic link. + */ +int +tree_current_is_physical_link(struct tree *t) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + if (t->findData) + return ((t->findData->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + && (t->findData->dwReserved0 == IO_REPARSE_TAG_SYMLINK)); + return (0); +#else + const struct stat *st = tree_current_lstat(t); + if (st == NULL) + return 0; + return (S_ISLNK(st->st_mode)); +#endif +} + +/* + * Return the access path for the entry just returned from tree_next(). + */ +const char * +tree_current_access_path(struct tree *t) +{ + return (t->basename); +} + +/* + * Return the full path for the entry just returned from tree_next(). + */ +const char * +tree_current_path(struct tree *t) +{ + return (t->buff); +} + +/* + * Return the length of the path for the entry just returned from tree_next(). + */ +size_t +tree_current_pathlen(struct tree *t) +{ + return (t->path_length); +} + +/* + * Return the nesting depth of the entry just returned from tree_next(). + */ +int +tree_current_depth(struct tree *t) +{ + return (t->depth); +} + +/* + * Terminate the traversal and release any resources. + */ +void +tree_close(struct tree *t) +{ + /* Release anything remaining in the stack. */ + while (t->stack != NULL) + tree_pop(t); + if (t->buff) + free(t->buff); + /* TODO: Ensure that premature close() resets cwd */ +#if 0 +#ifdef HAVE_FCHDIR + if (t->initialDirFd >= 0) { + int s = fchdir(t->initialDirFd); + (void)s; /* UNUSED */ + close(t->initialDirFd); + t->initialDirFd = -1; + } +#elif defined(_WIN32) && !defined(__CYGWIN__) + if (t->initialDir != NULL) { + SetCurrentDir(t->initialDir); + free(t->initialDir); + t->initialDir = NULL; + } +#endif +#endif + free(t); +} diff --git a/Utilities/cmlibarchive/tar/tree.h b/Utilities/cmlibarchive/tar/tree.h new file mode 100644 index 000000000..a99edf27c --- /dev/null +++ b/Utilities/cmlibarchive/tar/tree.h @@ -0,0 +1,141 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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. + * + * $FreeBSD: src/usr.bin/tar/tree.h,v 1.4 2008/11/27 05:49:52 kientzle Exp $ + */ + +/*- + * A set of routines for traversing directory trees. + * Similar in concept to the fts library, but with a few + * important differences: + * * Uses less memory. In particular, fts stores an entire directory + * in memory at a time. This package only keeps enough subdirectory + * information in memory to track the traversal. Information + * about non-directories is discarded as soon as possible. + * * Supports very deep logical traversals. The fts package + * uses "non-chdir" approach for logical traversals. This + * package does use a chdir approach for logical traversals + * and can therefore handle pathnames much longer than PATH_MAX. + * * Supports deep physical traversals "out of the box." + * Due to the memory optimizations above, there's no need to + * limit dir names to 32k. + */ + +#include +#include + +struct tree; + +/* Initiate/terminate a tree traversal. */ +struct tree *tree_open(const char * /* pathname */); +void tree_close(struct tree *); + +/* + * tree_next() returns Zero if there is no next entry, non-zero if + * there is. Note that directories are visited three times. + * Directories are always visited first as part of enumerating their + * parent; that is a "regular" visit. If tree_descend() is invoked at + * that time, the directory is added to a work list and will + * subsequently be visited two more times: once just after descending + * into the directory ("postdescent") and again just after ascending + * back to the parent ("postascent"). + * + * TREE_ERROR_DIR is returned if the descent failed (because the + * directory couldn't be opened, for instance). This is returned + * instead of TREE_POSTDESCENT/TREE_POSTASCENT. TREE_ERROR_DIR is not a + * fatal error, but it does imply that the relevant subtree won't be + * visited. TREE_ERROR_FATAL is returned for an error that left the + * traversal completely hosed. Right now, this is only returned for + * chdir() failures during ascent. + */ +#define TREE_REGULAR 1 +#define TREE_POSTDESCENT 2 +#define TREE_POSTASCENT 3 +#define TREE_ERROR_DIR -1 +#define TREE_ERROR_FATAL -2 + +int tree_next(struct tree *); + +/* Errno value associated with the last traversal error. */ +int tree_errno(struct tree *); + +/* + * Request that current entry be visited. If you invoke it on every + * directory, you'll get a physical traversal. This is ignored if the + * current entry isn't a directory or a link to a directory. So, if + * you invoke this on every returned path, you'll get a full logical + * traversal. + */ +void tree_descend(struct tree *); + +/* + * Return information about the current entry. + */ + +/* Current depth in the traversal. */ +int tree_current_depth(struct tree *); + +/* + * The current full pathname, length of the full pathname, and a name + * that can be used to access the file. Because tree does use chdir + * extensively, the access path is almost never the same as the full + * current path. + * + * TODO: Flesh out this interface to provide other information. In + * particular, Windows can provide file size, mode, and some permission + * information without invoking stat() at all. + * + * TODO: On platforms that support it, use openat()-style operations + * to eliminate the chdir() operations entirely while still supporting + * arbitrarily deep traversals. This makes access_path troublesome to + * support, of course, which means we'll need a rich enough interface + * that clients can function without it. (In particular, we'll need + * tree_current_open() that returns an open file descriptor.) + * + * TODO: Provide tree_current_archive_entry(). + */ +const char *tree_current_path(struct tree *); +size_t tree_current_pathlen(struct tree *); +const char *tree_current_access_path(struct tree *); + +/* + * Request the lstat() or stat() data for the current path. Since the + * tree package needs to do some of this anyway, and caches the + * results, you should take advantage of it here if you need it rather + * than make a redundant stat() or lstat() call of your own. + */ +const struct stat *tree_current_stat(struct tree *); +const struct stat *tree_current_lstat(struct tree *); + +/* The following functions use tricks to avoid a certain number of + * stat()/lstat() calls. */ +/* "is_physical_dir" is equivalent to S_ISDIR(tree_current_lstat()->st_mode) */ +int tree_current_is_physical_dir(struct tree *); +/* "is_physical_link" is equivalent to S_ISLNK(tree_current_lstat()->st_mode) */ +int tree_current_is_physical_link(struct tree *); +/* "is_dir" is equivalent to S_ISDIR(tree_current_stat()->st_mode) */ +int tree_current_is_dir(struct tree *); + +/* For testing/debugging: Dump the internal status to the given filehandle. */ +void tree_dump(struct tree *, FILE *); diff --git a/Utilities/cmlibarchive/tar/util.c b/Utilities/cmlibarchive/tar/util.c new file mode 100644 index 000000000..82b938e25 --- /dev/null +++ b/Utilities/cmlibarchive/tar/util.c @@ -0,0 +1,530 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_SYS_TYPES_H +#include /* Linux doesn't define mode_t, etc. in sys/stat.h. */ +#endif +#include +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_STDARG_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_WCTYPE_H +#include +#else +/* If we don't have wctype, we need to hack up some version of iswprint(). */ +#define iswprint isprint +#endif + +#include "bsdtar.h" +#include "err.h" + +static size_t bsdtar_expand_char(char *, size_t, char); +static const char *strip_components(const char *path, int elements); + +/* TODO: Hack up a version of mbtowc for platforms with no wide + * character support at all. I think the following might suffice, + * but it needs careful testing. + * #if !HAVE_MBTOWC + * #define mbtowc(wcp, p, n) ((*wcp = *p), 1) + * #endif + */ + +/* + * Print a string, taking care with any non-printable characters. + * + * Note that we use a stack-allocated buffer to receive the formatted + * string if we can. This is partly performance (avoiding a call to + * malloc()), partly out of expedience (we have to call vsnprintf() + * before malloc() anyway to find out how big a buffer we need; we may + * as well point that first call at a small local buffer in case it + * works), but mostly for safety (so we can use this to print messages + * about out-of-memory conditions). + */ + +void +safe_fprintf(FILE *f, const char *fmt, ...) +{ + char fmtbuff_stack[256]; /* Place to format the printf() string. */ + char outbuff[256]; /* Buffer for outgoing characters. */ + char *fmtbuff_heap; /* If fmtbuff_stack is too small, we use malloc */ + char *fmtbuff; /* Pointer to fmtbuff_stack or fmtbuff_heap. */ + int fmtbuff_length; + int length, n; + va_list ap; + const char *p; + unsigned i; + wchar_t wc; + char try_wc; + + /* Use a stack-allocated buffer if we can, for speed and safety. */ + fmtbuff_heap = NULL; + fmtbuff_length = sizeof(fmtbuff_stack); + fmtbuff = fmtbuff_stack; + + /* Try formatting into the stack buffer. */ + va_start(ap, fmt); + length = vsnprintf(fmtbuff, fmtbuff_length, fmt, ap); + va_end(ap); + + /* If the result was too large, allocate a buffer on the heap. */ + if (length >= fmtbuff_length) { + fmtbuff_length = length+1; + fmtbuff_heap = malloc(fmtbuff_length); + + /* Reformat the result into the heap buffer if we can. */ + if (fmtbuff_heap != NULL) { + fmtbuff = fmtbuff_heap; + va_start(ap, fmt); + length = vsnprintf(fmtbuff, fmtbuff_length, fmt, ap); + va_end(ap); + } else { + /* Leave fmtbuff pointing to the truncated + * string in fmtbuff_stack. */ + length = sizeof(fmtbuff_stack) - 1; + } + } + + /* Note: mbrtowc() has a cleaner API, but mbtowc() seems a bit + * more portable, so we use that here instead. */ + n = mbtowc(NULL, NULL, 1); /* Reset the shift state. */ + + /* Write data, expanding unprintable characters. */ + p = fmtbuff; + i = 0; + try_wc = 1; + while (*p != '\0') { + + /* Convert to wide char, test if the wide + * char is printable in the current locale. */ + if (try_wc && (n = mbtowc(&wc, p, length)) != -1) { + length -= n; + if (iswprint(wc) && wc != L'\\') { + /* Printable, copy the bytes through. */ + while (n-- > 0) + outbuff[i++] = *p++; + } else { + /* Not printable, format the bytes. */ + while (n-- > 0) + i += bsdtar_expand_char( + outbuff, i, *p++); + } + } else { + /* After any conversion failure, don't bother + * trying to convert the rest. */ + i += bsdtar_expand_char(outbuff, i, *p++); + try_wc = 0; + } + + /* If our output buffer is full, dump it and keep going. */ + if (i > (sizeof(outbuff) - 20)) { + outbuff[i++] = '\0'; + fprintf(f, "%s", outbuff); + i = 0; + } + } + outbuff[i++] = '\0'; + fprintf(f, "%s", outbuff); + + /* If we allocated a heap-based formatting buffer, free it now. */ + if (fmtbuff_heap != NULL) + free(fmtbuff_heap); +} + +/* + * Render an arbitrary sequence of bytes into printable ASCII characters. + */ +static size_t +bsdtar_expand_char(char *buff, size_t offset, char c) +{ + size_t i = offset; + + if (isprint((unsigned char)c) && c != '\\') + buff[i++] = c; + else { + buff[i++] = '\\'; + switch (c) { + case '\a': buff[i++] = 'a'; break; + case '\b': buff[i++] = 'b'; break; + case '\f': buff[i++] = 'f'; break; + case '\n': buff[i++] = 'n'; break; +#if '\r' != '\n' + /* On some platforms, \n and \r are the same. */ + case '\r': buff[i++] = 'r'; break; +#endif + case '\t': buff[i++] = 't'; break; + case '\v': buff[i++] = 'v'; break; + case '\\': buff[i++] = '\\'; break; + default: + sprintf(buff + i, "%03o", 0xFF & (int)c); + i += 3; + } + } + + return (i - offset); +} + +int +yes(const char *fmt, ...) +{ + char buff[32]; + char *p; + ssize_t l; + + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, " (y/N)? "); + fflush(stderr); + + l = read(2, buff, sizeof(buff) - 1); + if (l <= 0) + return (0); + buff[l] = 0; + + for (p = buff; *p != '\0'; p++) { + if (isspace((unsigned char)*p)) + continue; + switch(*p) { + case 'y': case 'Y': + return (1); + case 'n': case 'N': + return (0); + default: + return (0); + } + } + + return (0); +} + +/*- + * The logic here for -C attempts to avoid + * chdir() as long as possible. For example: + * "-C /foo -C /bar file" needs chdir("/bar") but not chdir("/foo") + * "-C /foo -C bar file" needs chdir("/foo/bar") + * "-C /foo -C bar /file1" does not need chdir() + * "-C /foo -C bar /file1 file2" needs chdir("/foo/bar") before file2 + * + * The only correct way to handle this is to record a "pending" chdir + * request and combine multiple requests intelligently until we + * need to process a non-absolute file. set_chdir() adds the new dir + * to the pending list; do_chdir() actually executes any pending chdir. + * + * This way, programs that build tar command lines don't have to worry + * about -C with non-existent directories; such requests will only + * fail if the directory must be accessed. + * + * TODO: Make this handle Windows paths correctly. + */ +void +set_chdir(struct bsdtar *bsdtar, const char *newdir) +{ + if (newdir[0] == '/') { + /* The -C /foo -C /bar case; dump first one. */ + free(bsdtar->pending_chdir); + bsdtar->pending_chdir = NULL; + } + if (bsdtar->pending_chdir == NULL) + /* Easy case: no previously-saved dir. */ + bsdtar->pending_chdir = strdup(newdir); + else { + /* The -C /foo -C bar case; concatenate */ + char *old_pending = bsdtar->pending_chdir; + size_t old_len = strlen(old_pending); + bsdtar->pending_chdir = malloc(old_len + strlen(newdir) + 2); + if (old_pending[old_len - 1] == '/') + old_pending[old_len - 1] = '\0'; + if (bsdtar->pending_chdir != NULL) + sprintf(bsdtar->pending_chdir, "%s/%s", + old_pending, newdir); + free(old_pending); + } + if (bsdtar->pending_chdir == NULL) + lafe_errc(1, errno, "No memory"); +} + +void +do_chdir(struct bsdtar *bsdtar) +{ + if (bsdtar->pending_chdir == NULL) + return; + + if (chdir(bsdtar->pending_chdir) != 0) { + lafe_errc(1, 0, "could not chdir to '%s'\n", + bsdtar->pending_chdir); + } + free(bsdtar->pending_chdir); + bsdtar->pending_chdir = NULL; +} + +const char * +strip_components(const char *p, int elements) +{ + /* Skip as many elements as necessary. */ + while (elements > 0) { + switch (*p++) { + case '/': +#if defined(_WIN32) && !defined(__CYGWIN__) + case '\\': /* Support \ path sep on Windows ONLY. */ +#endif + elements--; + break; + case '\0': + /* Path is too short, skip it. */ + return (NULL); + } + } + + /* Skip any / characters. This handles short paths that have + * additional / termination. This also handles the case where + * the logic above stops in the middle of a duplicate // + * sequence (which would otherwise get converted to an + * absolute path). */ + for (;;) { + switch (*p) { + case '/': +#if defined(_WIN32) && !defined(__CYGWIN__) + case '\\': /* Support \ path sep on Windows ONLY. */ +#endif + ++p; + break; + case '\0': + return (NULL); + default: + return (p); + } + } +} + +/* + * Handle --strip-components and any future path-rewriting options. + * Returns non-zero if the pathname should not be extracted. + * + * TODO: Support pax-style regex path rewrites. + */ +int +edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) +{ + const char *name = archive_entry_pathname(entry); +#if HAVE_REGEX_H + char *subst_name; + int r; +#endif + +#if HAVE_REGEX_H + r = apply_substitution(bsdtar, name, &subst_name, 0); + if (r == -1) { + lafe_warnc(0, "Invalid substitution, skipping entry"); + return 1; + } + if (r == 1) { + archive_entry_copy_pathname(entry, subst_name); + if (*subst_name == '\0') { + free(subst_name); + return -1; + } else + free(subst_name); + name = archive_entry_pathname(entry); + } + + if (archive_entry_hardlink(entry)) { + r = apply_substitution(bsdtar, archive_entry_hardlink(entry), &subst_name, 1); + if (r == -1) { + lafe_warnc(0, "Invalid substitution, skipping entry"); + return 1; + } + if (r == 1) { + archive_entry_copy_hardlink(entry, subst_name); + free(subst_name); + } + } + if (archive_entry_symlink(entry) != NULL) { + r = apply_substitution(bsdtar, archive_entry_symlink(entry), &subst_name, 1); + if (r == -1) { + lafe_warnc(0, "Invalid substitution, skipping entry"); + return 1; + } + if (r == 1) { + archive_entry_copy_symlink(entry, subst_name); + free(subst_name); + } + } +#endif + + /* Strip leading dir names as per --strip-components option. */ + if (bsdtar->strip_components > 0) { + const char *linkname = archive_entry_hardlink(entry); + + name = strip_components(name, bsdtar->strip_components); + if (name == NULL) + return (1); + + if (linkname != NULL) { + linkname = strip_components(linkname, + bsdtar->strip_components); + if (linkname == NULL) + return (1); + archive_entry_copy_hardlink(entry, linkname); + } + } + + /* By default, don't write or restore absolute pathnames. */ + if (!bsdtar->option_absolute_paths) { + const char *rp, *p = name; + int slashonly = 1; + + /* Remove leading "//./" or "//?/" or "//?/UNC/" + * (absolute path prefixes used by Windows API) */ + if ((p[0] == '/' || p[0] == '\\') && + (p[1] == '/' || p[1] == '\\') && + (p[2] == '.' || p[2] == '?') && + (p[3] == '/' || p[3] == '\\')) + { + if (p[2] == '?' && + (p[4] == 'U' || p[4] == 'u') && + (p[5] == 'N' || p[5] == 'n') && + (p[6] == 'C' || p[6] == 'c') && + (p[7] == '/' || p[7] == '\\')) + p += 8; + else + p += 4; + slashonly = 0; + } + do { + rp = p; + /* Remove leading drive letter from archives created + * on Windows. */ + if (((p[0] >= 'a' && p[0] <= 'z') || + (p[0] >= 'A' && p[0] <= 'Z')) && + p[1] == ':') { + p += 2; + slashonly = 0; + } + /* Remove leading "/../", "//", etc. */ + while (p[0] == '/' || p[0] == '\\') { + if (p[1] == '.' && p[2] == '.' && + (p[3] == '/' || p[3] == '\\')) { + p += 3; /* Remove "/..", leave "/" + * for next pass. */ + slashonly = 0; + } else + p += 1; /* Remove "/". */ + } + } while (rp != p); + + if (p != name && !bsdtar->warned_lead_slash) { + /* Generate a warning the first time this happens. */ + if (slashonly) + lafe_warnc(0, + "Removing leading '%c' from member names", + name[0]); + else + lafe_warnc(0, + "Removing leading drive letter from " + "member names"); + bsdtar->warned_lead_slash = 1; + } + + /* Special case: Stripping everything yields ".". */ + if (*p == '\0') + name = "."; + else + name = p; + } else { + /* Strip redundant leading '/' characters. */ + while (name[0] == '/' && name[1] == '/') + name++; + } + + /* Safely replace name in archive_entry. */ + if (name != archive_entry_pathname(entry)) { + char *q = strdup(name); + archive_entry_copy_pathname(entry, q); + free(q); + } + return (0); +} + +/* + * Like strcmp(), but try to be a little more aware of the fact that + * we're comparing two paths. Right now, it just handles leading + * "./" and trailing '/' specially, so that "a/b/" == "./a/b" + * + * TODO: Make this better, so that "./a//b/./c/" == "a/b/c" + * TODO: After this works, push it down into libarchive. + * TODO: Publish the path normalization routines in libarchive so + * that bsdtar can normalize paths and use fast strcmp() instead + * of this. + * + * Note: This is currently only used within write.c, so should + * not handle \ path separators. + */ + +int +pathcmp(const char *a, const char *b) +{ + /* Skip leading './' */ + if (a[0] == '.' && a[1] == '/' && a[2] != '\0') + a += 2; + if (b[0] == '.' && b[1] == '/' && b[2] != '\0') + b += 2; + /* Find the first difference, or return (0) if none. */ + while (*a == *b) { + if (*a == '\0') + return (0); + a++; + b++; + } + /* + * If one ends in '/' and the other one doesn't, + * they're the same. + */ + if (a[0] == '/' && a[1] == '\0' && b[0] == '\0') + return (0); + if (a[0] == '\0' && b[0] == '/' && b[1] == '\0') + return (0); + /* They're really different, return the correct sign. */ + return (*(const unsigned char *)a - *(const unsigned char *)b); +} diff --git a/Utilities/cmlibarchive/tar/write.c b/Utilities/cmlibarchive/tar/write.c new file mode 100644 index 000000000..43c5dfe52 --- /dev/null +++ b/Utilities/cmlibarchive/tar/write.c @@ -0,0 +1,1129 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 "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 +#endif +#ifdef HAVE_SYS_IOCTL_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_ATTR_XATTR_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_LINUX_FS_H +#include /* for Linux file flags */ +#endif +/* + * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h. + * As the include guards don't agree, the order of include is important. + */ +#ifdef HAVE_LINUX_EXT2_FS_H +#include /* for Linux file flags */ +#endif +#if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__) +/* This header exists but is broken on Cygwin. */ +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_WINDOWS_H +#include +#endif + +#include "bsdtar.h" +#include "err.h" +#include "line_reader.h" +#include "tree.h" + +/* Size of buffer for holding file data prior to writing. */ +#define FILEDATABUFLEN 65536 + +/* Fixed size of uname/gname caches. */ +#define name_cache_size 101 + +static const char * const NO_NAME = "(noname)"; + +struct archive_dir_entry { + struct archive_dir_entry *next; + time_t mtime_sec; + int mtime_nsec; + char *name; +}; + +struct archive_dir { + struct archive_dir_entry *head, *tail; +}; + +struct name_cache { + int probes; + int hits; + size_t size; + struct { + id_t id; + const char *name; + } cache[name_cache_size]; +}; + +static void add_dir_list(struct bsdtar *bsdtar, const char *path, + time_t mtime_sec, int mtime_nsec); +static int append_archive(struct bsdtar *, struct archive *, + struct archive *ina); +static int append_archive_filename(struct bsdtar *, + struct archive *, const char *fname); +static void archive_names_from_file(struct bsdtar *bsdtar, + struct archive *a); +static int copy_file_data(struct bsdtar *, struct archive *a, + struct archive *ina, struct archive_entry *); +static int new_enough(struct bsdtar *, const char *path, + const struct stat *); +static void report_write(struct bsdtar *, struct archive *, + struct archive_entry *, int64_t progress); +static void test_for_append(struct bsdtar *); +static void write_archive(struct archive *, struct bsdtar *); +static void write_entry_backend(struct bsdtar *, struct archive *, + struct archive_entry *); +static int write_file_data(struct bsdtar *, struct archive *, + struct archive_entry *, int fd); +static void write_hierarchy(struct bsdtar *, struct archive *, + const char *); + +#if defined(_WIN32) && !defined(__CYGWIN__) +/* Not a full lseek() emulation, but enough for our needs here. */ +static int +seek_file(int fd, int64_t offset, int whence) +{ + LARGE_INTEGER distance; + (void)whence; /* UNUSED */ + distance.QuadPart = offset; + return (SetFilePointerEx((HANDLE)_get_osfhandle(fd), + distance, NULL, FILE_BEGIN) ? 1 : -1); +} +#define open _open +#define close _close +#define read _read +#define lseek seek_file +#endif + +void +tar_mode_c(struct bsdtar *bsdtar) +{ + struct archive *a; + int r; + + if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL) + lafe_errc(1, 0, "no files or directories specified"); + + a = archive_write_new(); + + /* Support any format that the library supports. */ + if (bsdtar->create_format == NULL) { + r = archive_write_set_format_pax_restricted(a); + bsdtar->create_format = "pax restricted"; + } else { + r = archive_write_set_format_by_name(a, bsdtar->create_format); + } + if (r != ARCHIVE_OK) { + fprintf(stderr, "Can't use format %s: %s\n", + bsdtar->create_format, + archive_error_string(a)); + usage(); + } + + /* + * If user explicitly set the block size, then assume they + * want the last block padded as well. Otherwise, use the + * default block size and accept archive_write_open_file()'s + * default padding decisions. + */ + if (bsdtar->bytes_per_block != 0) { + archive_write_set_bytes_per_block(a, bsdtar->bytes_per_block); + archive_write_set_bytes_in_last_block(a, + bsdtar->bytes_per_block); + } else + archive_write_set_bytes_per_block(a, DEFAULT_BYTES_PER_BLOCK); + + if (bsdtar->compress_program) { + archive_write_set_compression_program(a, bsdtar->compress_program); + } else { + switch (bsdtar->create_compression) { + case 0: + r = archive_write_set_compression_none(a); + break; + case 'j': case 'y': + r = archive_write_set_compression_bzip2(a); + break; + case 'J': + r = archive_write_set_compression_xz(a); + break; + case OPTION_LZMA: + archive_write_set_compression_lzma(a); + break; + case 'z': + r = archive_write_set_compression_gzip(a); + break; + case 'Z': + r = archive_write_set_compression_compress(a); + break; + default: + lafe_errc(1, 0, + "Unrecognized compression option -%c", + bsdtar->create_compression); + } + if (r != ARCHIVE_OK) { + lafe_errc(1, 0, + "Unsupported compression option -%c", + bsdtar->create_compression); + } + } + + if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options)) + lafe_errc(1, 0, archive_error_string(a)); + if (ARCHIVE_OK != archive_write_open_file(a, bsdtar->filename)) + lafe_errc(1, 0, archive_error_string(a)); + write_archive(a, bsdtar); +} + +/* + * Same as 'c', except we only support tar or empty formats in + * uncompressed files on disk. + */ +void +tar_mode_r(struct bsdtar *bsdtar) +{ + int64_t end_offset; + int format; + struct archive *a; + struct archive_entry *entry; + int r; + + /* Sanity-test some arguments and the file. */ + test_for_append(bsdtar); + + format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED; + + bsdtar->fd = open(bsdtar->filename, O_RDWR | O_CREAT, 0666); + if (bsdtar->fd < 0) + lafe_errc(1, errno, + "Cannot open %s", bsdtar->filename); + + a = archive_read_new(); + archive_read_support_compression_all(a); + archive_read_support_format_tar(a); + archive_read_support_format_gnutar(a); + r = archive_read_open_fd(a, bsdtar->fd, 10240); + if (r != ARCHIVE_OK) + lafe_errc(1, archive_errno(a), + "Can't read archive %s: %s", bsdtar->filename, + archive_error_string(a)); + while (0 == archive_read_next_header(a, &entry)) { + if (archive_compression(a) != ARCHIVE_COMPRESSION_NONE) { + archive_read_finish(a); + close(bsdtar->fd); + lafe_errc(1, 0, + "Cannot append to compressed archive."); + } + /* Keep going until we hit end-of-archive */ + format = archive_format(a); + } + + end_offset = archive_read_header_position(a); + archive_read_finish(a); + + /* Re-open archive for writing */ + a = archive_write_new(); + archive_write_set_compression_none(a); + /* + * Set the format to be used for writing. To allow people to + * extend empty files, we need to allow them to specify the format, + * which opens the possibility that they will specify a format that + * doesn't match the existing format. Hence, the following bit + * of arcane ugliness. + */ + + if (bsdtar->create_format != NULL) { + /* If the user requested a format, use that, but ... */ + archive_write_set_format_by_name(a, + bsdtar->create_format); + /* ... complain if it's not compatible. */ + format &= ARCHIVE_FORMAT_BASE_MASK; + if (format != (int)(archive_format(a) & ARCHIVE_FORMAT_BASE_MASK) + && format != ARCHIVE_FORMAT_EMPTY) { + lafe_errc(1, 0, + "Format %s is incompatible with the archive %s.", + bsdtar->create_format, bsdtar->filename); + } + } else { + /* + * Just preserve the current format, with a little care + * for formats that libarchive can't write. + */ + if (format == ARCHIVE_FORMAT_TAR_GNUTAR) + /* TODO: When gtar supports pax, use pax restricted. */ + format = ARCHIVE_FORMAT_TAR_USTAR; + if (format == ARCHIVE_FORMAT_EMPTY) + format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED; + archive_write_set_format(a, format); + } + if (lseek(bsdtar->fd, end_offset, SEEK_SET) < 0) + lafe_errc(1, errno, "Could not seek to archive end"); + if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options)) + lafe_errc(1, 0, archive_error_string(a)); + if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd)) + lafe_errc(1, 0, archive_error_string(a)); + + write_archive(a, bsdtar); /* XXX check return val XXX */ + + close(bsdtar->fd); + bsdtar->fd = -1; +} + +void +tar_mode_u(struct bsdtar *bsdtar) +{ + int64_t end_offset; + struct archive *a; + struct archive_entry *entry; + int format; + struct archive_dir_entry *p; + struct archive_dir archive_dir; + + bsdtar->archive_dir = &archive_dir; + memset(&archive_dir, 0, sizeof(archive_dir)); + + format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED; + + /* Sanity-test some arguments and the file. */ + test_for_append(bsdtar); + + bsdtar->fd = open(bsdtar->filename, O_RDWR); + if (bsdtar->fd < 0) + lafe_errc(1, errno, + "Cannot open %s", bsdtar->filename); + + a = archive_read_new(); + archive_read_support_compression_all(a); + archive_read_support_format_tar(a); + archive_read_support_format_gnutar(a); + if (archive_read_open_fd(a, bsdtar->fd, + bsdtar->bytes_per_block != 0 ? bsdtar->bytes_per_block : + DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) { + lafe_errc(1, 0, + "Can't open %s: %s", bsdtar->filename, + archive_error_string(a)); + } + + /* Build a list of all entries and their recorded mod times. */ + while (0 == archive_read_next_header(a, &entry)) { + if (archive_compression(a) != ARCHIVE_COMPRESSION_NONE) { + archive_read_finish(a); + close(bsdtar->fd); + lafe_errc(1, 0, + "Cannot append to compressed archive."); + } + add_dir_list(bsdtar, archive_entry_pathname(entry), + archive_entry_mtime(entry), + archive_entry_mtime_nsec(entry)); + /* Record the last format determination we see */ + format = archive_format(a); + /* Keep going until we hit end-of-archive */ + } + + end_offset = archive_read_header_position(a); + archive_read_finish(a); + + /* Re-open archive for writing. */ + a = archive_write_new(); + archive_write_set_compression_none(a); + /* + * Set format to same one auto-detected above, except that + * we don't write GNU tar format, so use ustar instead. + */ + if (format == ARCHIVE_FORMAT_TAR_GNUTAR) + format = ARCHIVE_FORMAT_TAR_USTAR; + archive_write_set_format(a, format); + if (bsdtar->bytes_per_block != 0) { + archive_write_set_bytes_per_block(a, bsdtar->bytes_per_block); + archive_write_set_bytes_in_last_block(a, + bsdtar->bytes_per_block); + } else + archive_write_set_bytes_per_block(a, DEFAULT_BYTES_PER_BLOCK); + if (lseek(bsdtar->fd, end_offset, SEEK_SET) < 0) + lafe_errc(1, errno, "Could not seek to archive end"); + if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options)) + lafe_errc(1, 0, archive_error_string(a)); + if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd)) + lafe_errc(1, 0, archive_error_string(a)); + + write_archive(a, bsdtar); + + close(bsdtar->fd); + bsdtar->fd = -1; + + while (bsdtar->archive_dir->head != NULL) { + p = bsdtar->archive_dir->head->next; + free(bsdtar->archive_dir->head->name); + free(bsdtar->archive_dir->head); + bsdtar->archive_dir->head = p; + } + bsdtar->archive_dir->tail = NULL; +} + + +/* + * Write user-specified files/dirs to opened archive. + */ +static void +write_archive(struct archive *a, struct bsdtar *bsdtar) +{ + const char *arg; + struct archive_entry *entry, *sparse_entry; + + /* Allocate a buffer for file data. */ + if ((bsdtar->buff = malloc(FILEDATABUFLEN)) == NULL) + lafe_errc(1, 0, "cannot allocate memory"); + + if ((bsdtar->resolver = archive_entry_linkresolver_new()) == NULL) + lafe_errc(1, 0, "cannot create link resolver"); + archive_entry_linkresolver_set_strategy(bsdtar->resolver, + archive_format(a)); + if ((bsdtar->diskreader = archive_read_disk_new()) == NULL) + lafe_errc(1, 0, "Cannot create read_disk object"); + archive_read_disk_set_standard_lookup(bsdtar->diskreader); + + if (bsdtar->names_from_file != NULL) + archive_names_from_file(bsdtar, a); + + while (*bsdtar->argv) { + arg = *bsdtar->argv; + if (arg[0] == '-' && arg[1] == 'C') { + arg += 2; + if (*arg == '\0') { + bsdtar->argv++; + arg = *bsdtar->argv; + if (arg == NULL) { + lafe_warnc(1, 0, + "Missing argument for -C"); + bsdtar->return_value = 1; + goto cleanup; + } + } + set_chdir(bsdtar, arg); + } else { + if (*arg != '/' && (arg[0] != '@' || arg[1] != '/')) + do_chdir(bsdtar); /* Handle a deferred -C */ + if (*arg == '@') { + if (append_archive_filename(bsdtar, a, + arg + 1) != 0) + break; + } else + write_hierarchy(bsdtar, a, arg); + } + bsdtar->argv++; + } + + entry = NULL; + archive_entry_linkify(bsdtar->resolver, &entry, &sparse_entry); + while (entry != NULL) { + write_entry_backend(bsdtar, a, entry); + archive_entry_free(entry); + entry = NULL; + archive_entry_linkify(bsdtar->resolver, &entry, &sparse_entry); + } + + if (archive_write_close(a)) { + lafe_warnc(0, "%s", archive_error_string(a)); + bsdtar->return_value = 1; + } + +cleanup: + /* Free file data buffer. */ + free(bsdtar->buff); + archive_entry_linkresolver_free(bsdtar->resolver); + bsdtar->resolver = NULL; + archive_read_finish(bsdtar->diskreader); + bsdtar->diskreader = NULL; + + if (bsdtar->option_totals) { + fprintf(stderr, "Total bytes written: " BSDTAR_FILESIZE_PRINTF "\n", + (BSDTAR_FILESIZE_TYPE)archive_position_compressed(a)); + } + + archive_write_finish(a); +} + +/* + * Archive names specified in file. + * + * Unless --null was specified, a line containing exactly "-C" will + * cause the next line to be a directory to pass to chdir(). If + * --null is specified, then a line "-C" is just another filename. + */ +void +archive_names_from_file(struct bsdtar *bsdtar, struct archive *a) +{ + struct lafe_line_reader *lr; + const char *line; + + bsdtar->next_line_is_dir = 0; + + lr = lafe_line_reader(bsdtar->names_from_file, bsdtar->option_null); + while ((line = lafe_line_reader_next(lr)) != NULL) { + if (bsdtar->next_line_is_dir) { + set_chdir(bsdtar, line); + bsdtar->next_line_is_dir = 0; + } else if (!bsdtar->option_null && strcmp(line, "-C") == 0) + bsdtar->next_line_is_dir = 1; + else { + if (*line != '/') + do_chdir(bsdtar); /* Handle a deferred -C */ + write_hierarchy(bsdtar, a, line); + } + } + lafe_line_reader_free(lr); + if (bsdtar->next_line_is_dir) + lafe_errc(1, errno, + "Unexpected end of filename list; " + "directory expected after -C"); +} + +/* + * Copy from specified archive to current archive. Returns non-zero + * for write errors (which force us to terminate the entire archiving + * operation). If there are errors reading the input archive, we set + * bsdtar->return_value but return zero, so the overall archiving + * operation will complete and return non-zero. + */ +static int +append_archive_filename(struct bsdtar *bsdtar, struct archive *a, + const char *filename) +{ + struct archive *ina; + int rc; + + if (strcmp(filename, "-") == 0) + filename = NULL; /* Library uses NULL for stdio. */ + + ina = archive_read_new(); + archive_read_support_format_all(ina); + archive_read_support_compression_all(ina); + if (archive_read_open_file(ina, filename, 10240)) { + lafe_warnc(0, "%s", archive_error_string(ina)); + bsdtar->return_value = 1; + return (0); + } + + rc = append_archive(bsdtar, a, ina); + + if (archive_errno(ina)) { + lafe_warnc(0, "Error reading archive %s: %s", + filename, archive_error_string(ina)); + bsdtar->return_value = 1; + } + archive_read_finish(ina); + + return (rc); +} + +static int +append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina) +{ + struct archive_entry *in_entry; + int e; + + while (0 == archive_read_next_header(ina, &in_entry)) { + if (!new_enough(bsdtar, archive_entry_pathname(in_entry), + archive_entry_stat(in_entry))) + continue; + if (lafe_excluded(bsdtar->matching, archive_entry_pathname(in_entry))) + continue; + if (bsdtar->option_interactive && + !yes("copy '%s'", archive_entry_pathname(in_entry))) + continue; + if (bsdtar->verbose) + safe_fprintf(stderr, "a %s", + archive_entry_pathname(in_entry)); + if (need_report()) + report_write(bsdtar, a, in_entry, 0); + + e = archive_write_header(a, in_entry); + if (e != ARCHIVE_OK) { + if (!bsdtar->verbose) + lafe_warnc(0, "%s: %s", + archive_entry_pathname(in_entry), + archive_error_string(a)); + else + fprintf(stderr, ": %s", archive_error_string(a)); + } + if (e == ARCHIVE_FATAL) + exit(1); + + if (e >= ARCHIVE_WARN) { + if (archive_entry_size(in_entry) == 0) + archive_read_data_skip(ina); + else if (copy_file_data(bsdtar, a, ina, in_entry)) + exit(1); + } + + if (bsdtar->verbose) + fprintf(stderr, "\n"); + } + + /* Note: If we got here, we saw no write errors, so return success. */ + return (0); +} + +/* Helper function to copy data between archives. */ +static int +copy_file_data(struct bsdtar *bsdtar, struct archive *a, + struct archive *ina, struct archive_entry *entry) +{ + ssize_t bytes_read; + ssize_t bytes_written; + int64_t progress = 0; + + bytes_read = archive_read_data(ina, bsdtar->buff, FILEDATABUFLEN); + while (bytes_read > 0) { + if (need_report()) + report_write(bsdtar, a, entry, progress); + + bytes_written = archive_write_data(a, bsdtar->buff, + bytes_read); + if (bytes_written < bytes_read) { + lafe_warnc(0, "%s", archive_error_string(a)); + return (-1); + } + progress += bytes_written; + bytes_read = archive_read_data(ina, bsdtar->buff, + FILEDATABUFLEN); + } + + return (0); +} + +/* + * Add the file or dir hierarchy named by 'path' to the archive + */ +static void +write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) +{ + struct archive_entry *entry = NULL, *spare_entry = NULL; + struct tree *tree; + char symlink_mode = bsdtar->symlink_mode; + dev_t first_dev = 0; + int dev_recorded = 0; + int tree_ret; + + tree = tree_open(path); + + if (!tree) { + lafe_warnc(errno, "%s: Cannot open", path); + bsdtar->return_value = 1; + return; + } + + while ((tree_ret = tree_next(tree))) { + int r; + const char *name = tree_current_path(tree); + const struct stat *st = NULL; /* info to use for this entry */ + const struct stat *lst = NULL; /* lstat() information */ + int descend; + + if (tree_ret == TREE_ERROR_FATAL) + lafe_errc(1, tree_errno(tree), + "%s: Unable to continue traversing directory tree", + name); + if (tree_ret == TREE_ERROR_DIR) { + lafe_warnc(errno, + "%s: Couldn't visit directory", name); + bsdtar->return_value = 1; + } + if (tree_ret != TREE_REGULAR) + continue; + + /* + * If this file/dir is excluded by a filename + * pattern, skip it. + */ + if (lafe_excluded(bsdtar->matching, name)) + continue; + + /* + * Get lstat() info from the tree library. + */ + lst = tree_current_lstat(tree); + if (lst == NULL) { + /* Couldn't lstat(); must not exist. */ + lafe_warnc(errno, "%s: Cannot stat", name); + /* Return error if files disappear during traverse. */ + bsdtar->return_value = 1; + continue; + } + + /* + * Distinguish 'L'/'P'/'H' symlink following. + */ + switch(symlink_mode) { + case 'H': + /* 'H': After the first item, rest like 'P'. */ + symlink_mode = 'P'; + /* 'H': First item (from command line) like 'L'. */ + /* FALLTHROUGH */ + case 'L': + /* 'L': Do descend through a symlink to dir. */ + descend = tree_current_is_dir(tree); + /* 'L': Follow symlinks to files. */ + archive_read_disk_set_symlink_logical(bsdtar->diskreader); + /* 'L': Archive symlinks as targets, if we can. */ + st = tree_current_stat(tree); + if (st != NULL) + break; + /* If stat fails, we have a broken symlink; + * in that case, don't follow the link. */ + /* FALLTHROUGH */ + default: + /* 'P': Don't descend through a symlink to dir. */ + descend = tree_current_is_physical_dir(tree); + /* 'P': Don't follow symlinks to files. */ + archive_read_disk_set_symlink_physical(bsdtar->diskreader); + /* 'P': Archive symlinks as symlinks. */ + st = lst; + break; + } + + /* + * Are we about to cross to a new filesystem? + */ + if (!dev_recorded) { + /* This is the initial file system. */ + first_dev = lst->st_dev; + dev_recorded = 1; + } else if (lst->st_dev == first_dev) { + /* The starting file system is always acceptable. */ + } else if (descend == 0) { + /* We're not descending, so no need to check. */ + } else if (bsdtar->option_dont_traverse_mounts) { + /* User has asked us not to cross mount points. */ + descend = 0; + } else { + /* We're prepared to cross a mount point. */ + + /* XXX TODO: check whether this filesystem is + * synthetic and/or local. Add a new + * --local-only option to skip non-local + * filesystems. Skip synthetic filesystems + * regardless. + * + * The results should be cached, since + * tree.c doesn't usually visit a directory + * and the directory contents together. A simple + * move-to-front list should perform quite well. + * + * This is going to be heavily OS dependent: + * FreeBSD's statfs() in conjunction with getvfsbyname() + * provides all of this; NetBSD's statvfs() does + * most of it; other systems will vary. + */ + } + + /* + * In -u mode, check that the file is newer than what's + * already in the archive; in all modes, obey --newerXXX flags. + */ + if (!new_enough(bsdtar, name, st)) + continue; + + archive_entry_free(entry); + entry = archive_entry_new(); + + archive_entry_set_pathname(entry, name); + archive_entry_copy_sourcepath(entry, + tree_current_access_path(tree)); + + /* Populate the archive_entry with metadata from the disk. */ + /* XXX TODO: Arrange to open a regular file before + * calling this so we can pass in an fd and shorten + * the race to query metadata. The linkify dance + * makes this more complex than it might sound. */ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* TODO: tree.c uses stat(), which is badly broken + * on Windows. To fix this, we should + * deprecate tree_current_stat() and provide a new + * call tree_populate_entry(t, entry). This call + * would use stat() internally on POSIX and + * GetInfoByFileHandle() internally on Windows. + * This would be another step towards a tree-walker + * that can be integrated deep into libarchive. + * For now, just set st to NULL on Windows; + * archive_read_disk_entry_from_file() should + * be smart enough to use platform-appropriate + * ways to probe file information. + */ + st = NULL; +#endif + r = archive_read_disk_entry_from_file(bsdtar->diskreader, + entry, -1, st); + if (r != ARCHIVE_OK) + lafe_warnc(archive_errno(bsdtar->diskreader), + archive_error_string(bsdtar->diskreader)); + if (r < ARCHIVE_WARN) + continue; + + /* XXX TODO: Just use flag data from entry; avoid the + * duplicate check here. */ + + /* + * If this file/dir is flagged "nodump" and we're + * honoring such flags, skip this file/dir. + */ +#ifdef HAVE_STRUCT_STAT_ST_FLAGS + /* BSD systems store flags in struct stat */ + if (bsdtar->option_honor_nodump && + (lst->st_flags & UF_NODUMP)) + continue; +#endif + +#if defined(EXT2_IOC_GETFLAGS) && defined(EXT2_NODUMP_FL) + /* Linux uses ioctl to read flags. */ + if (bsdtar->option_honor_nodump) { + int fd = open(name, O_RDONLY | O_NONBLOCK); + if (fd >= 0) { + unsigned long fflags; + int r = ioctl(fd, EXT2_IOC_GETFLAGS, &fflags); + close(fd); + if (r >= 0 && (fflags & EXT2_NODUMP_FL)) + continue; + } + } +#endif + + /* + * If the user vetoes this file/directory, skip it. + * We want this to be fairly late; if some other + * check would veto this file, we shouldn't bother + * the user with it. + */ + if (bsdtar->option_interactive && + !yes("add '%s'", name)) + continue; + + /* Note: if user vetoes, we won't descend. */ + if (descend && !bsdtar->option_no_subdirs) + tree_descend(tree); + + /* + * Rewrite the pathname to be archived. If rewrite + * fails, skip the entry. + */ + if (edit_pathname(bsdtar, entry)) + continue; + + /* Display entry as we process it. + * This format is required by SUSv2. */ + if (bsdtar->verbose) + safe_fprintf(stderr, "a %s", + archive_entry_pathname(entry)); + + /* Non-regular files get archived with zero size. */ + if (archive_entry_filetype(entry) != AE_IFREG) + archive_entry_set_size(entry, 0); + + archive_entry_linkify(bsdtar->resolver, &entry, &spare_entry); + + while (entry != NULL) { + write_entry_backend(bsdtar, a, entry); + archive_entry_free(entry); + entry = spare_entry; + spare_entry = NULL; + } + + if (bsdtar->verbose) + fprintf(stderr, "\n"); + } + archive_entry_free(entry); + tree_close(tree); +} + +/* + * Backend for write_entry. + */ +static void +write_entry_backend(struct bsdtar *bsdtar, struct archive *a, + struct archive_entry *entry) +{ + int fd = -1; + int e; + + if (archive_entry_size(entry) > 0) { + const char *pathname = archive_entry_sourcepath(entry); + fd = open(pathname, O_RDONLY); + if (fd == -1) { + if (!bsdtar->verbose) + lafe_warnc(errno, + "%s: could not open file", pathname); + else + fprintf(stderr, ": %s", strerror(errno)); + return; + } + } + + e = archive_write_header(a, entry); + if (e != ARCHIVE_OK) { + if (!bsdtar->verbose) + lafe_warnc(0, "%s: %s", + archive_entry_pathname(entry), + archive_error_string(a)); + else + fprintf(stderr, ": %s", archive_error_string(a)); + } + + if (e == ARCHIVE_FATAL) + exit(1); + + /* + * If we opened a file earlier, write it out now. Note that + * the format handler might have reset the size field to zero + * to inform us that the archive body won't get stored. In + * that case, just skip the write. + */ + if (e >= ARCHIVE_WARN && fd >= 0 && archive_entry_size(entry) > 0) { + if (write_file_data(bsdtar, a, entry, fd)) + exit(1); + } + + /* + * If we opened a file, close it now even if there was an error + * which made us decide not to write the archive body. + */ + if (fd >= 0) + close(fd); +} + +static void +report_write(struct bsdtar *bsdtar, struct archive *a, + struct archive_entry *entry, int64_t progress) +{ + uintmax_t comp, uncomp; + if (bsdtar->verbose) + fprintf(stderr, "\n"); + comp = archive_position_compressed(a); + uncomp = archive_position_uncompressed(a); + fprintf(stderr, "In: %d files, %ju bytes;", + archive_file_count(a), uncomp); + fprintf(stderr, + " Out: %ju bytes, compression %d%%\n", + comp, (int)((uncomp - comp) * 100 / uncomp)); + safe_fprintf(stderr, "Current: %s (%ju/%ju bytes)", + archive_entry_pathname(entry), + (uintmax_t)progress, + (uintmax_t)archive_entry_size(entry)); + fprintf(stderr, "\n"); +} + + +/* Helper function to copy file to archive. */ +static int +write_file_data(struct bsdtar *bsdtar, struct archive *a, + struct archive_entry *entry, int fd) +{ + ssize_t bytes_read; + ssize_t bytes_written; + int64_t progress = 0; + + bytes_read = read(fd, bsdtar->buff, FILEDATABUFLEN); + while (bytes_read > 0) { + if (need_report()) + report_write(bsdtar, a, entry, progress); + + bytes_written = archive_write_data(a, bsdtar->buff, + bytes_read); + if (bytes_written < 0) { + /* Write failed; this is bad */ + lafe_warnc(0, "%s", archive_error_string(a)); + return (-1); + } + if (bytes_written < bytes_read) { + /* Write was truncated; warn but continue. */ + lafe_warnc(0, + "%s: Truncated write; file may have grown while being archived.", + archive_entry_pathname(entry)); + return (0); + } + progress += bytes_written; + bytes_read = read(fd, bsdtar->buff, FILEDATABUFLEN); + } + return 0; +} + +/* + * Test if the specified file is new enough to include in the archive. + */ +int +new_enough(struct bsdtar *bsdtar, const char *path, const struct stat *st) +{ + struct archive_dir_entry *p; + + /* + * If this file/dir is excluded by a time comparison, skip it. + */ + if (bsdtar->newer_ctime_sec > 0) { + if (st->st_ctime < bsdtar->newer_ctime_sec) + return (0); /* Too old, skip it. */ + if (st->st_ctime == bsdtar->newer_ctime_sec + && ARCHIVE_STAT_CTIME_NANOS(st) + <= bsdtar->newer_ctime_nsec) + return (0); /* Too old, skip it. */ + } + if (bsdtar->newer_mtime_sec > 0) { + if (st->st_mtime < bsdtar->newer_mtime_sec) + return (0); /* Too old, skip it. */ + if (st->st_mtime == bsdtar->newer_mtime_sec + && ARCHIVE_STAT_MTIME_NANOS(st) + <= bsdtar->newer_mtime_nsec) + return (0); /* Too old, skip it. */ + } + + /* + * In -u mode, we only write an entry if it's newer than + * what was already in the archive. + */ + if (bsdtar->archive_dir != NULL && + bsdtar->archive_dir->head != NULL) { + for (p = bsdtar->archive_dir->head; p != NULL; p = p->next) { + if (pathcmp(path, p->name)==0) + return (p->mtime_sec < st->st_mtime || + (p->mtime_sec == st->st_mtime && + p->mtime_nsec + < ARCHIVE_STAT_MTIME_NANOS(st))); + } + } + + /* If the file wasn't rejected, include it. */ + return (1); +} + +/* + * Add an entry to the dir list for 'u' mode. + * + * XXX TODO: Make this fast. + */ +static void +add_dir_list(struct bsdtar *bsdtar, const char *path, + time_t mtime_sec, int mtime_nsec) +{ + struct archive_dir_entry *p; + + /* + * Search entire list to see if this file has appeared before. + * If it has, override the timestamp data. + */ + p = bsdtar->archive_dir->head; + while (p != NULL) { + if (strcmp(path, p->name)==0) { + p->mtime_sec = mtime_sec; + p->mtime_nsec = mtime_nsec; + return; + } + p = p->next; + } + + p = malloc(sizeof(*p)); + if (p == NULL) + lafe_errc(1, ENOMEM, "Can't read archive directory"); + + p->name = strdup(path); + if (p->name == NULL) + lafe_errc(1, ENOMEM, "Can't read archive directory"); + p->mtime_sec = mtime_sec; + p->mtime_nsec = mtime_nsec; + p->next = NULL; + if (bsdtar->archive_dir->tail == NULL) { + bsdtar->archive_dir->head = bsdtar->archive_dir->tail = p; + } else { + bsdtar->archive_dir->tail->next = p; + bsdtar->archive_dir->tail = p; + } +} + +void +test_for_append(struct bsdtar *bsdtar) +{ + struct stat s; + + if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL) + lafe_errc(1, 0, "no files or directories specified"); + if (bsdtar->filename == NULL) + lafe_errc(1, 0, "Cannot append to stdout."); + + if (bsdtar->create_compression != 0) + lafe_errc(1, 0, + "Cannot append to %s with compression", bsdtar->filename); + + if (stat(bsdtar->filename, &s) != 0) + return; + + if (!S_ISREG(s.st_mode) && !S_ISBLK(s.st_mode)) + lafe_errc(1, 0, + "Cannot append to %s: not a regular file.", + bsdtar->filename); + +/* Is this an appropriate check here on Windows? */ +/* + if (GetFileType(handle) != FILE_TYPE_DISK) + lafe_errc(1, 0, "Cannot append"); +*/ + +}

    kR5+A2=Trl}Per=I2;c3{of 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 literal 0 HcmV?d00001 diff --git a/Utilities/cmbzip2/sample2.ref b/Utilities/cmbzip2/sample2.ref new file mode 100644 index 0000000000000000000000000000000000000000..40e5b58f2ef897f74fcc64df10991e5f23e024d2 GIT binary patch literal 212610 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