/snap/core20/2769/usr/lib/python3.8/__pycache__
NameSizeModeActions
abc.cpython-38.pyc53340644editdlrm
aifc.cpython-38.pyc254740644editdlrm
antigravity.cpython-38.pyc7970644editdlrm
argparse.cpython-38.pyc625910644editdlrm
ast.cpython-38.pyc167630644editdlrm
asynchat.cpython-38.pyc68510644editdlrm
asyncore.cpython-38.pyc160280644editdlrm
base64.cpython-38.pyc170710644editdlrm
bdb.cpython-38.pyc249210644editdlrm
binhex.cpython-38.pyc121340644editdlrm
bisect.cpython-38.pyc23540644editdlrm
bz2.cpython-38.pyc114450644editdlrm
calendar.cpython-38.pyc270640644editdlrm
cgi.cpython-38.pyc265440644editdlrm
cgitb.cpython-38.pyc101500644editdlrm
chunk.cpython-38.pyc48390644editdlrm
cmd.cpython-38.pyc126260644editdlrm
code.cpython-38.pyc99130644editdlrm
codecs.cpython-38.pyc339560644editdlrm
codeop.cpython-38.pyc64170644editdlrm
colorsys.cpython-38.pyc32400644editdlrm
compileall.cpython-38.pyc94100644editdlrm
configparser.cpython-38.pyc457180644editdlrm
contextlib.cpython-38.pyc202290644editdlrm
contextvars.cpython-38.pyc2430644editdlrm
copy.cpython-38.pyc69870644editdlrm
copyreg.cpython-38.pyc43180644editdlrm
cProfile.cpython-38.pyc54800644editdlrm
crypt.cpython-38.pyc33870644editdlrm
csv.cpython-38.pyc119100644editdlrm
dataclasses.cpython-38.pyc236530644editdlrm
datetime.cpython-38.pyc571730644editdlrm
decimal.cpython-38.pyc3590644editdlrm
difflib.cpython-38.pyc594380644editdlrm
dis.cpython-38.pyc158080644editdlrm
doctest.cpython-38.pyc759740644editdlrm
dummy_threading.cpython-38.pyc11100644editdlrm
enum.cpython-38.pyc259620644editdlrm
filecmp.cpython-38.pyc84270644editdlrm
fileinput.cpython-38.pyc133730644editdlrm
fnmatch.cpython-38.pyc33550644editdlrm
formatter.cpython-38.pyc175450644editdlrm
fractions.cpython-38.pyc187390644editdlrm
ftplib.cpython-38.pyc280070644editdlrm
functools.cpython-38.pyc279010644editdlrm
genericpath.cpython-38.pyc40010644editdlrm
getopt.cpython-38.pyc62710644editdlrm
getpass.cpython-38.pyc41780644editdlrm
gettext.cpython-38.pyc180000644editdlrm
glob.cpython-38.pyc43430644editdlrm
gzip.cpython-38.pyc181840644editdlrm
hashlib.cpython-38.pyc67270644editdlrm
heapq.cpython-38.pyc140700644editdlrm
hmac.cpython-38.pyc63880644editdlrm
imaplib.cpython-38.pyc414640644editdlrm
imghdr.cpython-38.pyc41180644editdlrm
imp.cpython-38.pyc98090644editdlrm
inspect.cpython-38.pyc805930644editdlrm
io.cpython-38.pyc34540644editdlrm
ipaddress.cpython-38.pyc628290644editdlrm
keyword.cpython-38.pyc9980644editdlrm
linecache.cpython-38.pyc38670644editdlrm
locale.cpython-38.pyc346740644editdlrm
lzma.cpython-38.pyc120180644editdlrm
mailbox.cpython-38.pyc602640644editdlrm
mailcap.cpython-38.pyc72060644editdlrm
mimetypes.cpython-38.pyc160310644editdlrm
modulefinder.cpython-38.pyc161150644editdlrm
netrc.cpython-38.pyc37770644editdlrm
nntplib.cpython-38.pyc339740644editdlrm
ntpath.cpython-38.pyc140910644editdlrm
nturl2path.cpython-38.pyc17440644editdlrm
numbers.cpython-38.pyc122020644editdlrm
opcode.cpython-38.pyc54200644editdlrm
operator.cpython-38.pyc136910644editdlrm
optparse.cpython-38.pyc480570644editdlrm
os.cpython-38.pyc313970644editdlrm
pathlib.cpython-38.pyc442090644editdlrm
pdb.cpython-38.pyc472260644editdlrm
pickle.cpython-38.pyc469080644editdlrm
pickletools.cpython-38.pyc672040644editdlrm
pipes.cpython-38.pyc77950644editdlrm
pkgutil.cpython-38.pyc163090644editdlrm
platform.cpython-38.pyc243260644editdlrm
plistlib.cpython-38.pyc273740644editdlrm
poplib.cpython-38.pyc135560644editdlrm
posixpath.cpython-38.pyc104610644editdlrm
pprint.cpython-38.pyc162810644editdlrm
profile.cpython-38.pyc147580644editdlrm
pstats.cpython-38.pyc220660644editdlrm
pty.cpython-38.pyc39550644editdlrm
pyclbr.cpython-38.pyc104510644editdlrm
pydoc.cpython-38.pyc836460644editdlrm
py_compile.cpython-38.pyc73520644editdlrm
queue.cpython-38.pyc106260644editdlrm
quopri.cpython-38.pyc57480644editdlrm
random.cpython-38.pyc201080644editdlrm
re.cpython-38.pyc144220644editdlrm
reprlib.cpython-38.pyc53030644editdlrm
rlcompleter.cpython-38.pyc57550644editdlrm
runpy.cpython-38.pyc81810644editdlrm
sched.cpython-38.pyc65320644editdlrm
secrets.cpython-38.pyc21900644editdlrm
selectors.cpython-38.pyc169350644editdlrm
shelve.cpython-38.pyc94900644editdlrm
shlex.cpython-38.pyc75360644editdlrm
shutil.cpython-38.pyc372190644editdlrm
signal.cpython-38.pyc28430644editdlrm
site.cpython-38.pyc171680644editdlrm
sitecustomize.cpython-38.pyc2200644editdlrm
smtpd.cpython-38.pyc264630644editdlrm
smtplib.cpython-38.pyc355320644editdlrm
sndhdr.cpython-38.pyc69890644editdlrm
socket.cpython-38.pyc277870644editdlrm
socketserver.cpython-38.pyc253610644editdlrm
sre_compile.cpython-38.pyc151420644editdlrm
sre_constants.cpython-38.pyc63590644editdlrm
sre_parse.cpython-38.pyc216470644editdlrm
ssl.cpython-38.pyc450370644editdlrm
stat.cpython-38.pyc43720644editdlrm
statistics.cpython-38.pyc336530644editdlrm
string.cpython-38.pyc73000644editdlrm
stringprep.cpython-38.pyc110170644editdlrm
struct.cpython-38.pyc3300644editdlrm
subprocess.cpython-38.pyc419670644editdlrm
sunau.cpython-38.pyc170800644editdlrm
symbol.cpython-38.pyc24040644editdlrm
symtable.cpython-38.pyc113220644editdlrm
sysconfig.cpython-38.pyc158370644editdlrm
tabnanny.cpython-38.pyc70300644editdlrm
tarfile.cpython-38.pyc630430644editdlrm
telnetlib.cpython-38.pyc182370644editdlrm
tempfile.cpython-38.pyc266530644editdlrm
textwrap.cpython-38.pyc135190644editdlrm
this.cpython-38.pyc12610644editdlrm
threading.cpython-38.pyc399760644editdlrm
timeit.cpython-38.pyc117770644editdlrm
token.cpython-38.pyc24850644editdlrm
tokenize.cpython-38.pyc171600644editdlrm
trace.cpython-38.pyc200260644editdlrm
traceback.cpython-38.pyc199380644editdlrm
tracemalloc.cpython-38.pyc173630644editdlrm
tty.cpython-38.pyc10760644editdlrm
turtle.cpython-38.pyc1300220644editdlrm
types.cpython-38.pyc91770644editdlrm
typing.cpython-38.pyc624200644editdlrm
uu.cpython-38.pyc36050644editdlrm
uuid.cpython-38.pyc236830644editdlrm
warnings.cpython-38.pyc136520644editdlrm
wave.cpython-38.pyc181490644editdlrm
weakref.cpython-38.pyc195180644editdlrm
webbrowser.cpython-38.pyc171200644editdlrm
xdrlib.cpython-38.pyc82210644editdlrm
zipapp.cpython-38.pyc58540644editdlrm
zipfile.cpython-38.pyc593360644editdlrm
zipimport.cpython-38.pyc172750644editdlrm
_bootlocale.cpython-38.pyc12430644editdlrm
_collections_abc.cpython-38.pyc287410644editdlrm
_compat_pickle.cpython-38.pyc55010644editdlrm
_compression.cpython-38.pyc41460644editdlrm
_dummy_thread.cpython-38.pyc60370644editdlrm
_markupbase.cpython-38.pyc77900644editdlrm
_osx_support.cpython-38.pyc115930644editdlrm
_pydecimal.cpython-38.pyc1607350644editdlrm
_pyio.cpython-38.pyc740790644editdlrm
_py_abc.cpython-38.pyc46700644editdlrm
_sitebuiltins.cpython-38.pyc34810644editdlrm
_strptime.cpython-38.pyc160440644editdlrm
_sysconfigdata__linux_x86_64-linux-gnu.cpython-38.pyc211210644editdlrm
_sysconfigdata__x86_64-linux-gnu.cpython-38.pyc211150644editdlrm
_threading_local.cpython-38.pyc64460644editdlrm
_weakrefset.cpython-38.pyc76000644editdlrm
__future__.cpython-38.pyc41580644editdlrm
__phello__.foo.cpython-38.pyc1270644editdlrm
Edit: /snap/core20/2769/usr/lib/python3.8/__pycache__/zipfile.cpython-38.pyc (59336B)
U yi/\@sdZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZzddlZejZWnek rdZejZYnXz ddlZWnek rdZYnXz ddlZWnek rdZYnXddddddd d d d d ddg ZGdddeZGdddeZeZZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(e )e'Z*dZ+dZ,dZ-dZ.d Z/d!Z0d"Z1d#Z2dZ3d$Z4d%Z5d&Z6e )e5Z7dZ8dZ9dZ:dZ;d Zd#Z?dZ@d$ZAd'ZBd(ZCdZDd)ZEdZFd*ZGd+ZHd,ZId-ZJd.ZKd/ZLe )eKZMdZNdZOdZPdZQd ZRd!ZSd"ZTd#ZUdZVd$ZWd'ZXd(ZYd0ZZd1Z[e )eZZ\d2Z]d3Z^e )e]Z_dZ`dZadZbdZcd Zdd!Zed"Zfd#ZgdZhd$Zid4Zje kd5Zld6d7Zmd8d9Znd:d Zod;d<Zpd=d>ZqGd?d d erZsdatd@dAZudBdCZvGdDdEdEZwGdFdGdGZxdHdIdJdJdJdJdKdLdMdNdKdOdPdQdRdSdTdUZydVdWZzdtdXdYZ{dZd[Z|Gd\d]d]Z}Gd^d_d_Z~Gd`dadaejZGdbdcdcejZGddd d ZGded d eZdfdgZdhdiZejZdjdkZGdldmdmeZGdndodoeZGdpddZdudqdrZedskr edS)vzP Read and write ZIP files. XXX references to utf-8 need further investigation. N BadZipFile BadZipfileerror ZIP_STORED ZIP_DEFLATED ZIP_BZIP2ZIP_LZMA is_zipfileZipInfoZipFile PyZipFile LargeZipFilePathc@s eZdZdS)rN)__name__ __module__ __qualname__rr/usr/lib/python3.8/zipfile.pyr+sc@seZdZdZdS)r zu Raised when writing a zipfile, the zipfile requires ZIP64 extensions and those extensions are disabled. N)rrr__doc__rrrrr /si -.?s<4s4H2LHsPK z<4s4B4HL2L5H2LsPK z <4s2B4HL2L2HsPKz<4sLQLsPKz <4sQ2H2L4QsPKiPKr0r:structr/structEndArchive64LocatorstringEndArchive64LocatorrsizeEndCentDir64 startswithstringEndArchive64structEndArchive64_ECD_SIGNATURE_ECD_DISK_NUMBER_ECD_DISK_START_ECD_ENTRIES_THIS_DISK_ECD_ENTRIES_TOTAL _ECD_SIZE _ECD_OFFSET _ECD_LOCATION)fpinoffsetendrecdataZsigZdisknoZreloffZdisksZextraszZszcreate_versionZ read_versionZdisk_numZdisk_dirZdircountZ dircount2ZdirsizeZ diroffsetrrr _EndRecData64s^            rZc Csf|dd|}z|t dWntk r<YdSX|}t|tkr|ddtkr|dddkrtt |}t |}| d| |tt ||t|St |dtd}||d|}|t}|dkrb|||t}t|tkr dSt tt |}|t}||t|t|}| || ||t ||||SdS) zReturn data from the "End of Central Directory" record, or None. The data is a list of the nine items in the ZIP "End of central dir" record followed by a tenth item, the file seek offset of this record.rrNr sr-i)rEtellsizeEndCentDirr:r>r0stringEndArchiverFr/structEndArchivelistr1rZmaxrfind_ECD_COMMENT_SIZE) rUZfilesizerXrWZmaxCommentStartr5ZrecDataZ commentSizecommentrrrr9s@        r9c@s\eZdZdZdZdddZddZdd d Zd d ZddZ e dddddZ ddZ d S)r z>Class with attributes describing each file in the ZIP archive.) orig_filenamerB date_time compress_type_compresslevelrdr3 create_systemrYextract_versionreserved flag_bitsvolume internal_attr external_attr header_offsetCRC compress_size file_size _raw_time _end_offsetNoNamerrrrrcCs||_|td}|dkr(|d|}tjdkrJtj|krJ|tjd}||_||_|ddkrjtdt |_ d|_ d|_ d|_ tjdkrd|_nd|_t|_t|_d|_d|_d|_d|_d|_d|_dS)Nr/rxz+ZIP does not support timestamps before 1980r-Zwin32r)refindchrossepreplacerBrf ValueErrorrrgrhrdr3sysplatformriDEFAULT_VERSIONrYrjrkrlrmrnroru)selfrBrfZ null_byterrr__init__is2   zZipInfo.__init__cCsd|jj|jfg}|jtkr8|dt|j|j|jd?}|jd@}|rd|dt ||rv|d|| }|r|j r|d|j |r|j r|jtks|j |j kr|d|j |d d |S) Nz<%s filename=%r compress_type=%sr)rz filemode=%rz external_attr=%#xz file_size=%rz compress_size=%r>) __class__rrBrgrr1compressor_namesgetrostatfilemodeis_dirrsrrr2)rrChiloisdirrrr__repr__s0       zZipInfo.__repr__NcCs||j}|ddd>|dd>B|dB}|dd>|d d>B|ddB}|jd @rfd}}}n|j}|j}|j}|j}d} |d kr|tkp|tk}|rd } |t| dt | d ||}|tks|tkr|st d d}d}t } |j t krtt| } n|j tkrtt| } t| |j|_t| |j|_|\} } ttt|j|j| |j |||||t| t| } | | |S)z-Return the per-file header as a bytes object.rrxr$rr!rrr&r rNz|jd|jdBfYSXdS)Nasciiutf-8)rBencoderlUnicodeEncodeErrorrrrrrszZipInfo._encodeFilenameFlagscCs|j}tj}t|dkr|d|dd\}}|dt|krPtd||f|dkrp|dkrv|d|dd}nV|dkr|d |dd }n:|d kr|d |dd }n|dkrd}ntd||fd}|jdkrt||krtd|||_|d7}|jdkr6t||kr$td|||_|d7}|jdkrpt||krXtd|j}|||_|d7}||dd}q dS)Nr r,z"Corrupt extra field %04x (size=%d)rz|_|rd|_|jd O_n|j|_|S) a_Construct an appropriate ZipInfo for a file on the filesystem. filename should be the path to a file or directory on the filesystem. arcname is the name which it will have within the archive (by default, this will be the same as filename, but without a drive letter and with leading path separators removed). rr"rxrw;)rr;rNrryrr)) isinstancer|PathLikefspathrS_ISDIRst_modetime localtimest_mtimepathnormpath splitdriver}altseprorsst_size) clsrBarcnamerstrmtimerfzinforrr from_files0       zZipInfo.from_filecCs|jddkS)z2Return True if this archive member is a directory.ryrBrrrrr7szZipInfo.is_dir)rvrw)N)N) rrrr __slots__rrrrr classmethodrrrrrrr Ns , .2%cCs0tdD]"}|d@r"|d?dA}q|dL}q|S)Nrrl q[)range)crcr7rrr_gen_crcAs   rcsldddtdkr&ttttdatfddfdd|D] }|qLfd d }|S) NixV4igE#ixV4cs|d?||Ad@AS)z(Compute the CRC32 primitive on one byte.rr)Zchr)crctablerrcrc32[sz_ZipDecrypter..crc32cs<|d@d@ddd@d?dS)Nrrirrr)c)rkey0key1key2rr update_keys_s z"_ZipDecrypter..update_keyscsNt}|j}|D]4}dB}|||dAd?d@N}|||qt|S)zDecrypt a bytes object.rrrr) bytearrayr1bytes)rXrCr1rk)rrrr decrypteris z _ZipDecrypter..decrypter) _crctabler`maprr)pwdprr)rrrrrrr _ZipDecrypterQs   rc@s,eZdZddZddZddZddZd S) LZMACompressorcCs d|_dSN)_comprrrrryszLZMACompressor.__init__cCsFtdtji}tjtjttj|gd|_tdddt ||S)Nidfiltersz|rtd|j|||j|_|jW5QRSQRXdS)Nz}Can't reposition in the ZIP file while there is an open writing handle on it. Close the writing handle before trying to read.)rrrrrEr\r)rrVwhencerrrrEs  z_SharedFile.seekrc CsX|jH|rtd|j|j|j|}|j|_|W5QRSQRXdS)NyCan't read from the ZIP file while there is an open writing handle on it. Close the writing handle before trying to read.)rrrrrErr>r\rnrXrrrr>s  z_SharedFile.readcCs$|jdk r |j}d|_||dSr)rr)rfileobjrrrr s z_SharedFile.closeN)r)r)rrrrrEr>r rrrrrs rc@s4eZdZddZddZddZddZd d Zd S) _TellablecCs||_d|_dSNr)r<rVrr<rrrrsz_Tellable.__init__cCs|j|}|j|7_|Sr)r<writerV)rrXrrrrrs z_Tellable.writecCs|jSr)rVrrrrr\#sz_Tellable.tellcCs|jdSr)r<rrrrrr&sz_Tellable.flushcCs|jdSr)r<r rrrrr )sz_Tellable.closeN)rrrrrr\rr rrrrrs rcseZdZdZdZdZdZd(ddZd d Zd d Z d)ddZ d*ddZ ddZ d+ddZ ddZddZddZddZfdd Zd!d"Zd,d$d%Zd&d'ZZS)- ZipExtFilezZFile-like object for reading an archive member. Is returned by ZipFile.open(). i@iiNFcCs(||_||_||_|j|_|j|_|j|_t |j|_ d|_ d|_ d|_ d|_||_|j|_t|drz|j|_td|_nd|_d|_z4|r||_|j|_|j|_|j|_d|_Wntk rYnXd|_|r$|j d@r|j!d?d@}n|jd?d@}|"}||kr$t#d |j$dS) NFr-rrqTrrrzBad password for file %r)%_fileobj_pwd_close_fileobjrg_compress_typerr_compress_leftrs_leftr _decompressor_eof _readbuffer_offsetnewlinesmoderBnamer@rq _expected_crcr _running_crc _seekabler r\_orig_compress_start_orig_compress_size_orig_file_size_orig_start_crcAttributeError _decrypterrlrt_init_decrypterrre)rrr#zipinforZ close_fileobjZ check_bytehrrrr;sF       zZipExtFile.__init__cCs4t|j|_|jd}|jd8_||dS)Nrr&)rrr-rr>r)rrrrrr.ns  zZipExtFile._init_decryptercCsvd|jj|jjfg}|jsX|d|j|jf|jtkrb|dt |j|jn |d|dd |S)N<%s.%sz name=%r mode=%rr [closed]rr) rrrclosedr1r$r#rrrrr2rrCrrrrys   zZipExtFile.__repr__rcCsL|dkr>|jd|jd}|dkr>|j|j|}||_|Stj||S)zrRead and return a line from the stream. If limit is specified, at most limit bytes will be read. r r)r rzr!ioBufferedIOBasereadline)rlimitr6linerrrr8szZipExtFile.readlinercCsr|t|j|jkr\||}t||jkrJ||j|jd|_d|_n|jt|8_|j|j|jdS)z6Returns buffered bytes without advancing the position.Nri)r0r r!r>)rrchunkrrrpeeks zZipExtFile.peekcCsdSNTrrrrrreadableszZipExtFile.readablecCs|dks|dkrH|j|jd}d|_d|_|jsD|||j7}q,|S||j}|t|jkrz|j|j|}||_|S|t|j}|j|jd}d|_d|_|dkr|js||}|t|kr||_||_||d|7}q||7}|t|8}q|S)zRead and return up to n bytes. If the argument is omitted, None, or negative, data is read and returned until EOF is reached. Nrr-r r!r_read1MAX_Nr0)rrbufendrXrrrr>s4   zZipExtFile.readcCs@|jdkrdSt||j|_|jr<|j|jkr     zZipExtFile.read1cCs"|js|dkrdS|jtkrH|jj}|t|krR|||t|7}n ||}|jtkrj|jdk|_nx|jtkrt ||j }|j ||}|jj p|jdko|jj |_|jr||j 7}n |j |}|jj p|jdk|_|d|j}|jt|8_|jdkrd|_|||S)Nrr-T)rrrrZunconsumed_tailr0_read2rrra MIN_READ_SIZErrrrrErrrrr@s4          zZipExtFile._read1cCsd|jdkrdSt||j}t||j}|j|}|jt|8_|sLt|jdk r`||}|S)Nrr-) rrarHminrr>r0EOFErrorr-rrrrrGs      zZipExtFile._read2cs&z|jr|jW5tXdSr)superr rrrrrrr +szZipExtFile.closecCs|jSr)r'rrrrr 2szZipExtFile.seekablercCs>|jstd|}|dkr&|}n.|dkr8||}n|dkrL|j|}ntd||jkrd|j}|dkrpd}||}||j}|dkr|t|jkr||_d}nf|dkr |j |j |j |_ |j|_|j|_d|_d|_t|j|_d|_|}|jdk r ||dkr6t|j|}||||8}q |S)N!underlying stream is not seekablerrrzCwhence must be os.SEEK_SET (0), os.SEEK_CUR (1), or os.SEEK_END (2)r-F)r'r6UnsupportedOperationr\r*rr!r0r rrEr(r+r&r)rrrrrrr-r.rI MAX_SEEK_READr>)rrVrZcurr_posZnew_posZ read_offsetZ buff_offsetZread_lenrrrrE5sH            zZipExtFile.seekcCs0|jstd|j|jt|j|j}|S)NrM)r'r6rNr*rr0r r!)rZfileposrrrr\es zZipExtFile.tell)NF)r)r)r)r)rrrrrArHrOrr.rr8r<r>r>rErFr@rGr r rEr\ __classcell__rrrLrr-s* 3    ! %$  0rcs@eZdZddZeddZddZddZfd d ZZ S) _ZipWriteFilecCs8||_||_||_t|j|j|_d|_d|_d|_ dSr) _zinfo_zip64_zipfilerrgrh _compressor _file_size_compress_size_crc)rzfrrrrrrmsz_ZipWriteFile.__init__cCs|jjSr)rTr<rrrrrwsz_ZipWriteFile._fileobjcCsdSr=rrrrrwritable{sz_ZipWriteFile.writablecCsf|jrtdt|}|j|7_t||j|_|jrV|j|}|jt|7_|j ||S)NzI/O operation on closed file.) r3rr0rVrrXrUrrWrr)rrXnbytesrrrr~s  z_ZipWriteFile.writec sb|jr dSzFt|jrR|j}|jt|7_|j ||j|j _ n |j |j _ |j|j _|j |j _|j jd@r|jrdnd}|j t|t|j j|j j |j j|j |j_nn|js|j tkrtd|jtkrtd|j |j_|j |j j|j |j |j|j |jj|jj|j |j |jj|j j <W5d|j_XdS)NFrzdd Zd?d!d"d#d$Zd@d%d&ZdAd'd(ZdBd)d*Zed+d,Zd-d.Zd/d0ZdCd1d2ZdDd3d4Zd5d6Z d7d8Z!d9d:Z"d;d<Z#dS)Er ai Class with methods to open, read, write, close, list zip files. z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=True, compresslevel=None) file: Either the path to the file, or a file-like object. If it is a path, the file will be opened and closed by ZipFile. mode: The mode can be either read 'r', write 'w', exclusive create 'x', or append 'a'. compression: ZIP_STORED (no compression), ZIP_DEFLATED (requires zlib), ZIP_BZIP2 (requires bz2) or ZIP_LZMA (requires lzma). allowZip64: if True ZipFile will create files with ZIP64 extensions when needed, otherwise it will raise an exception when this would be necessary. compresslevel: None (default for the given compression type) or an integer specifying the level to pass to the compressor. When using ZIP_STORED or ZIP_LZMA this keyword has no effect. When using ZIP_DEFLATED integers 0 through 9 are accepted. When using ZIP_BZIP2 integers 1 through 9 are accepted. NrTrc CsP|dkrtdt|||_d|_d|_i|_g|_||_||_||_ d|_ d|_ ||_ t |tjrpt|}t |trd|_||_ddd d dd d d }||}zt|||_Wqtk r||kr||}YqYqXqqnd|_||_t|dd|_d|_t|_d|_d|_z|dkr4|n|dkrd|_z|j |_!Wn2t"tfk rt#|j|_d|_!d|_Yn6Xz|j$|j!Wn t"tfk rd|_YnXnf|dkrz||j$|j!Wn6t%k r|j$ddd|_|j |_!YnXntdWn$|j} d|_|&| YnXdS)z]Open the ZIP file with mode read 'r', write 'w', exclusive create 'x', or append 'a'.)rawxaz+ZipFile requires mode 'r', 'w', 'x', or 'a'FrNr-r?w+bx+br+bwbZxb)rarbrcrdrgrerfrr$Tra)rbrcrdrz"Mode must be 'r', 'w', 'x', or 'a')'rr _allowZip64 _didModifydebugr_r^rrr#r_comment_strict_timestampsrr|rrstr _filePassedrBr6rAr<r:getattr _fileRefCnt threadingRLockrr'r_RealGetContentsr\r]r,rrEr_fpclose) rr r#r allowZip64rrZmodeDictrr<rrrrs            zZipFile.__init__cCs|Srrrrrr __enter__.szZipFile.__enter__cCs |dSrr )rtypevalue tracebackrrr__exit__1szZipFile.__exit__cCsd|jj|jjfg}|jdk rd|jr8|d|jn|jdk rR|d|j|d|jn |d|dd|S)Nr1z file=%rz filename=%rz mode=%rr2rr) rrrr<ror1rBr#r2r4rrrr4s    zZipFile.__repr__c Cs|j}z t|}Wntk r.tdYnX|sr-z*ZipFile._RealGetContents..T)keyreverseN)7r<r9r:rrkprintrRrS _ECD_COMMENTrlrTr]rEr>r6BytesIOsizeCentralDirr0rFr/structCentralDir _CD_SIGNATUREstringCentralDir_CD_FILENAME_LENGTHdecoder _CD_EXTRA_FIELD_LENGTHr3_CD_COMMENT_LENGTHrd_CD_LOCAL_HEADER_OFFSETrprYrirjrkrlrgrqrrrsMAX_EXTRACT_VERSIONrrmrnrortrfrr^r1r_rBsortedru)rr<rWZsize_cdZ offset_cdconcatZinferredrXr~centdirrBflagsrctdZ end_offsetrrrrrtBs                         zZipFile._RealGetContentscCsdd|jDS)z+Return a list of file names in the archive.cSsg|] }|jqSrr).0rXrrr sz$ZipFile.namelist..r^rrrrnamelistszZipFile.namelistcCs|jS)zJReturn a list of class ZipInfo instances for files in the archive.rrrrrinfolistszZipFile.infolistcCsLtdd|d|jD]0}d|jdd}td|j||jf|dqdS)z+Print a table of contents for the zip file.z%-46s %19s %12s)z File Namez Modified ZSizer z%d-%02d-%02d %02d:%02d:%02dNr"z %-46s %s %12d)rr^rfrBrs)rr rdaterrrprintdirs zZipFile.printdirc Cs^d}|jD]N}z*||jd}||r,q W5QRXWq tk rV|jYSXq dS)z%Read all the files and check the CRC.iraN)r^rArBr>r)rZ chunk_sizerfrrrtestzips  zZipFile.testzipcCs$|j|}|dkr td||S)z,Return the instance of ZipInfo given 'name'.Nz(There is no item named %r in the archive)r_rKeyError)rr$inforrrgetinfos  zZipFile.getinfocCs6|r t|ts tdt|j|r,||_nd|_dS)z)Set default password for encrypted files.pwd: expected bytes, got %sN)rr TypeErrorryrr)rrrrr setpasswords zZipFile.setpasswordcCs|jS)z.The comment text associated with the ZIP file.)rlrrrrrdszZipFile.commentcCs^t|tstdt|jt|tkrNddl}|jdtdd|dt}||_ d|_ dS)Nzcomment: expected bytes, got %srz3Archive comment is too long; truncating to %d bytesr stacklevelT) rrrryrr0ZIP_MAX_COMMENTwarningswarnrlrj)rrdrrrrrds   c Cs.||d|}|W5QRSQRXdS)zReturn file bytes for name.raNrAr>)rr$rr<rrrr>sz ZipFile.readF force_zip64c sJ|dkrtd|r0t|ts0tdt|j|rD|dkrDtdjsRtdt|trb|}n,|dkrt|}j|_ j |_ n |}|dkrj ||dSjrtdjd 7_tj|jjjfd d }zL|t}t|tkrtd tt|}|ttkr&td ||t}|trL||t|jd@r`t d|jd@rtt d|t!d@r|"d} n |"d} | |j#krtd|j#|f|j$dk r|%|j&|j$krtd|j#d|jd @} | r|sj'}|st(d|nd}t)||||dWS|*YnXdS)auReturn file-like object for 'name'. name is a string for the file name within the ZIP file, or a ZipInfo object. mode should be 'r' to read a file already in the ZIP file, or 'w' to write to a file newly added to the archive. pwd is the password to decrypt files (only used for reading). When writing, if the file size is not known in advance but may exceed 2 GiB, pass force_zip64 to use the ZIP64 format, which can handle large files. If the size is known in advance, it is best to pass a ZipInfo instance for name, with zinfo.file_size set. >rbrazopen() requires mode "r" or "w"rrbz'pwd is only supported for reading filesz2Attempt to use ZIP archive that was already closedrrrcsjSr)rrrrrr r-zZipFile.open..zTruncated file headerz Bad magic number for file header z$compressed patched data (flag bit 5)@zstrong encryption (flag bit 6)rrr}z/File name in directory %r and header %r differ.NzOverlapped entries: z (possible zip bomb)z6File %r is encrypted, password required for extractionT)+rrrrryrr<r rrgrrhr_open_to_writerrqrrprurr>sizeFileHeaderr0rrFr/r _FH_SIGNATUREr_FH_FILENAME_LENGTH_FH_EXTRA_FIELD_LENGTHrlr_FH_GENERAL_PURPOSE_FLAG_BITSrrerur\rrrrrr ) rr$r#rrrZzef_fileZfheaderfnameZ fname_strZ is_encryptedrrrrAs                z ZipFile.opencCs|r|jstd|jr tdt|ds0d|_d|_d|_d|_|jt krZ|jdO_|j sn|jdO_|j szd|_ |jo|p|jdt k}|j r|j |j|j |_||d |_|j ||d |_t|||S) NzHforce_zip64 is True, but allowZip64 was False when opening the ZIP file.zzCan't write to the ZIP file while there is another write handle open on it. Close the first handle before opening another.rsrrrg?T)rirrr@rsrrrqrlrgrr'rorr<rEr]r\rp _writecheckrjrrrQ)rrrrrrrrAs8     zZipFile._open_to_writecCs*|dkrt}n t|}||||S)a#Extract a member from the archive to the current working directory, using its full name. Its file information is extracted as accurately as possible. `member' may be a filename or a ZipInfo object. You can specify a different directory using `path'. N)r|getcwdr_extract_member)rmemberrrrrrextractls  zZipFile.extractcCsH|dkr|}|dkr"t}n t|}|D]}||||q0dS)zExtract all members from the archive to the current working directory. `path' specifies a different directory to extract to. `members' is optional and must be a subset of the list returned by namelist(). N)rr|rrr)rrmembersrr/rrr extractallys  zZipFile.extractallcCs^|j}|s(d}t|dt|}||_||}dd||D}|dd|D}|S)z;Replace bad characters and remove trailing dots from parts.z:<>|"?*_css|]}|dVqdS).N)rstriprrcrrr sz1ZipFile._sanitize_windows_name..css|]}|r|VqdSrrrrrrrs)!_windows_illegal_name_trans_tablern maketransr0 translatesplitr2)rrpathseptableZillegalrrr_sanitize_windows_names zZipFile._sanitize_windows_namec sLt|ts||}|jdtjj}tjjrB|tjjtjj}tj |d}dtjj tjj ftjj fdd| tjjD}tjjdkr||tjj}tj ||}tj|}tj|}|rtj|st||r tj|st||S|j||d(}t|d}t||W5QRXW5QRX|S) zbExtract the ZipInfo object 'member' to a physical file on the path targetpath. ryrrc3s|]}|kr|VqdSrrrZinvalid_path_partsrrrsz*ZipFile._extract_member..\)rrh)rr rrBr~r|rr}rrcurdirpardirr2rrrdirnameexistsmakedirsrrmkdirrAshutil copyfileobj)rrZ targetpathrrZ upperdirssourcetargetrrrrs2  &       zZipFile._extract_membercCs|j|jkr(ddl}|jd|jdd|jdkr:td|jsHtdt|j|j sd}t |j t krpd }n|j tkrd }n|jtkrd }|rt|d dS) z6Check for errors before writing a file to the archive.rNzDuplicate name: %rrrrbrcrdz&write() requires mode 'w', 'x', or 'a'z4Attempt to write ZIP archive that was already closed Files countZFilesizez Zipfile size would require ZIP64 extensions)rBr_rrr#rr<rrgrir0r^ZIP_FILECOUNT_LIMITrsrrpr )rrrrequires_zip64rrrrs,     zZipFile._writecheckc CsP|jstd|jrtdtj|||jd}|rDd|_d|_n0|dk rT||_ n|j |_ |dk rl||_ n|j |_ |r|j |jr|j|j|j|_|j tkr|jdO_||d|_|j|||j|j<|j|d|j|_W5QRXnCan't write to ZIP archive while an open writing handle existsrrNrTFr?rbi ) r<rrr rrmrrrrqrgrrhrrr'rEr]r\rprrlrrjr^r1r_rBrrrArr)rrBrrgrrsrcdestrrrrsF      z ZipFile.writec Cst|tr|d}t|tsxt|ttddd}|j|_|j|_ |j ddkrpd|_ |j dO_ q|d |_ n|}|j st d |jrt d |dk r||_|dk r||_ t||_|j*|j|d d }||W5QRXW5QRXdS)aWrite a file into the archive. The contents is 'data', which may be either a 'str' or a 'bytes' instance; if it is a 'str', it is encoded as UTF-8 first. 'zinfo_or_arcname' is either a ZipInfo instance or the name of the file in the archive.rNr")rBrfrryiAr)rrz?Can't write to ZIP archive while an open writing handle exists.rb)r#)rrnrr rrrrgrrhrBror<rrr0rsrrAr)rZzinfo_or_arcnamerXrgrrrrrrwritestr s:    zZipFile.writestrcCs |dS)z2Call the "close()" method in case the user forgot.Nrxrrrr__del__4szZipFile.__del__c Cs||jdkrdS|jrtdzB|jdkr\|jr\|j"|jrJ|j|j | W5QRXW5|j}d|_||XdS)zOClose the file, and for mode 'w', 'x' and 'a' write the ending records.NzvCan't close the ZIP file while there is an open writing handle on it. Close the writing handle before closing the zip.r) r<rrrur#rjrr'rEr]_write_end_recordrrrrr 8s z ZipFile.closecCs|jD]D}|j}|ddd>|dd>B|dB}|dd>|d d>B|ddB}g}|jtksr|jtkr||j||jd }d }n |j}|j}|jtkr||jd }n|j}|j} d} |r t| d } t j d d t |ddt |f|| } t } |j tkr$tt| } n|j tkr:tt| } t| |j} t| |j} zZ|\} }t tt| |j| |j||j |||j||t | t | t |jd|j|j|}Wnltk rttt| |j| |j|j |j |||j||t |j!t | t |jd|j|j|ft"j#dYnX|j$%||j$%| |j$%| |j$%|jq|j$&}t |j}||j'}|j'}d}|t(krd}n|tkrd}n|tkrd}|r(|j)st*|dt t+t,t-ddddd|||| }|j$%|t t.t/d|d}|j$%|t0|d}t0|d }t0|d }t t1t2dd||||t |j3 }|j$%||j$%|j3|j4dkrx|j$5|j$6dS)Nrrxr$rr!rrr&r r)rr,QrrrzCentral directory offsetzCentral directory sizerrrrrd)7r^rfrsrrrr1rpr3r8rFrr0rrgrrarrrrjrYrrrrirkrqrdrnroDeprecationWarningrrlrBrstderrr<rr\r]rrir rLrKrIrGrHrIr_r^rlr#truncater)rrrrrr3rsrrrpZ extra_datarrjrYrBrlrZpos2Z centDirCountZ centDirSizeZ centDirOffsetrZ zip64endrecZ zip64locrecrWrrrrNs $$                               zZipFile._write_end_recordcCs4|jdkst|jd8_|js0|js0|dS)Nrr)rqAssertionErrorror rrrrrus zZipFile._fpclose)N)N)raN)F)NN)NNN)NNN)NN)$rrrrr<rrrrwr|rrtrrrrrrr`rdsetterr>rArrrrrrrrrrr rrurrrrr sT ZQ      f +  * 2 )hc@s4eZdZdZdeddfddZd d d Zd d ZdS)r zDClass to create ZIP archives with Python library files and packages.raTrcCstj|||||d||_dS)N)r#rrv)r r _optimize)rr r#rrvoptimizerrrrs zPyZipFile.__init__rNcCst|}|rD||sD|jr@tj|r,dnd}td||fdStj|\}}tj|rhtj|d}tj|r|rd||f}n|}|jrtd|d|| |d d |\}} |jrtd | | || t t |} | d| D]} tj|| } tj| \} }tj| rRtjtj| dr|j| ||d q|d kr|r~|| s~|jrtd| q| | d d |\}} |jrtd | | || qn|jrtd|t t |D]} tj|| } tj| \} }|d kr|r,|| s,|jrtd| q| | d d |\}} |jrVtd | | || qnP|d dd krtd| |d d |\}} |jrtd| | || dS)aAdd all files from "pathname" to the ZIP archive. If pathname is a package directory, search the directory and all package subdirectories recursively for all *.py and enter the modules into the archive. If pathname is a plain directory, listdir *.py and enter all modules. Else, pathname must be a Python *.py file and the module will be put into the archive. Added modules are always module.pyc. This method will compile the module.py into module.pyc if necessary. If filterfunc(pathname) is given, it is called with every argument. When it is False, the file or directory is skipped. rr z%s %r skipped by filterfuncNz __init__.py%s/%szAdding package inasrZAdding) filterfunc.pyzfile %r skipped by filterfunczAdding files from directoryz.Files added with writepy() must end with ".py"z Adding file)r|rrkrrrrr2isfile _get_codenamerrlistdirremovesplitextwritepyr)rpathnamebasenamerZlabeldirr$ZinitnamerrZdirlistrBrrootZextrrrrs            zPyZipFile.writepyc sdfdd }|d}|d}tjj|dd}tjj|dd}tjj|d d}jdkr\tj|rt|jt|jkr|} } ntj|rt|jt|jkr|} |} ntj|rt|jt|jkr|} |} nvtj|rt|jt|jkr|} |} nD||rRt j j d kr4|} nt j j dkrH|} n|} |} n|} } njd krr|} |} n<|} jdkr|} n&jd kr|} nd j} t | tj| rt| jt|jks||jd s|} } tj| d} |rd || f} | | fS)aReturn (filename, archivename) for the path. Given a module name path, return the correct file path and archive name, compiling if necessary. For example, given /python/lib/string, return (/python/lib/string.pyc, string). rc sfddl}jrtd|z|j|d|dWn4|jk r`}zt|jWYdSd}~XYnXdS)NrZ CompilingT)doraiserF) py_compilerkrcompilePyCompileErrormsg)r rrerrrrr_compiles  z)PyZipFile._get_codename.._compilerz.pycr) optimizationrrrz"invalid value for 'optimize': {!r})rr)r) importlibutilcache_from_sourcerr|rrrrrrrformatrr) rrrrZfile_pyZfile_pycZ pycache_opt0Z pycache_opt1Z pycache_opt2rrrZ archivenamerrrrsj             zPyZipFile._get_codename)rN)rrrrrrrrrrrrr s  RcCstt|ddS)a2 Given a path with elements separated by posixpath.sep, generate all parents of that path. >>> list(_parents('b/d')) ['b'] >>> list(_parents('/b/d/')) ['/b'] >>> list(_parents('b/d/f/')) ['b/d', 'b'] >>> list(_parents('b')) [] >>> list(_parents('')) [] rN) itertoolsislice _ancestry)rrrr_parentsksrccs2|tj}|tjr.|Vt|\}}q dS)a Given a path with elements separated by posixpath.sep, generate all elements of that path. >>> list(_ancestry('b/d')) ['b/d', 'b'] >>> list(_ancestry('/b/d/')) ['/b/d', '/b'] >>> list(_ancestry('b/d/f/')) ['b/d/f', 'b/d', 'b'] >>> list(_ancestry('b')) ['b'] >>> list(_ancestry('')) [] Multiple separators are treated like a single. >>> list(_ancestry('//b//d///f//')) ['//b//d///f', '//b//d', '//b'] N)r posixpathr}r)rtailrrrr~s  rcCstt|j|S)zZ Return items in minuend not in subtrahend, retaining order with O(1) lookup. )r filterfalseset __contains__)ZminuendZ subtrahendrrr _differencesr csHeZdZdZeddZfddZddZdd Ze d d Z Z S) CompleteDirszk A ZipFile subclass that ensures that implied directories are always included in the namelist. cCs.tjtt|}dd|D}tt||S)Ncss|]}|tjVqdSr)rr})rrrrrrsz-CompleteDirs._implied_dirs..)rchain from_iterablerr_deduper )namesparentsZas_dirsrrr _implied_dirsszCompleteDirs._implied_dirscs tt|}|t||Sr)rKrrr`r)rrrLrrrszCompleteDirs.namelistcCs t|Sr)r rrrrr _name_setszCompleteDirs._name_setcCs,|}|d}||ko||k}|r(|S|S)zx If the name represents a directory, return that name as a directory (with the trailing slash). ry)r)rr$rrZ dir_matchrrr resolve_dirszCompleteDirs.resolve_dircCsNt|tr|St|ts ||Sd|jkr.t}||}t|t||S)zl Given a source (filename or zipfile), return an appropriate CompleteDirs subclass. ra)rrr r#__new__varsupdate)rrresrrrmakes    zCompleteDirs.make) rrrr staticmethodrrrrrrrPrrrLrrs   rcs,eZdZdZfddZfddZZS) FastLookupzV ZipFile subclass to ensure implicit dirs exist and are resolved rapidly. c s:tt|jW5QRSQRXtt||_|jSr) contextlibsuppressr,Z_FastLookup__namesrKrrrrLrrrs zFastLookup.namelistc s:tt|jW5QRSQRXtt||_|jSr)rrr,Z_FastLookup__lookuprKrrrrLrrrs zFastLookup._name_set)rrrrrrrPrrrLrrs rc@seZdZdZdZd#ddZeddZedd Zd d Z d d Z ddZ ddZ ddZ ddZddZddZddZddZddZeZed d!Zd"S)$ru A pathlib-compatible interface for zip files. Consider a zip file with this structure:: . ├── a.txt └── b ├── c.txt └── d └── e.txt >>> data = io.BytesIO() >>> zf = ZipFile(data, 'w') >>> zf.writestr('a.txt', 'content of a') >>> zf.writestr('b/c.txt', 'content of c') >>> zf.writestr('b/d/e.txt', 'content of e') >>> zf.filename = 'abcde.zip' Path accepts the zipfile object itself or a filename >>> root = Path(zf) From there, several path operations are available. Directory iteration (including the zip file itself): >>> a, b = root.iterdir() >>> a Path('abcde.zip', 'a.txt') >>> b Path('abcde.zip', 'b/') name property: >>> b.name 'b' join with divide operator: >>> c = b / 'c.txt' >>> c Path('abcde.zip', 'b/c.txt') >>> c.name 'c.txt' Read text: >>> c.read_text() 'content of c' existence: >>> c.exists() True >>> (b / 'missing.txt').exists() False Coercion to string: >>> str(c) 'abcde.zip/b/c.txt' z>{self.__class__.__name__}({self.root.filename!r}, {self.at!r})rcCst||_||_dSr)rrrat)rrr rrrr, s z Path.__init__cCst|jj|jSr) functoolspartialrrAr rrrrrA0 sz Path.opencCst|jdSNry)rrr rrrrrr$4 sz Path.namec Os6|$}tj|f||W5QRSQRXdSr)rAr6 TextIOWrapperr>)rargskwargsstrmrrr read_text8 s zPath.read_textc Cs(|}|W5QRSQRXdSrr)rr'rrr read_bytes< s zPath.read_bytescCst|jd|jdkSr#)rrr r)rrrrr _is_child@ szPath._is_childcCs t|j|Sr)rr)rr rrr_nextC sz Path._nextcCs|j p|jdSr#)r endswithrrrrrF sz Path.is_dircCs | Sr)rrrrris_fileI sz Path.is_filecCs|j|jkSr)r rrrrrrrL sz Path.existscCs.|stdt|j|j}t|j|S)NzCan't listdir a file)rrrr+rrfilterr*)rZsubsrrriterdirO sz Path.iterdircCst|jj|jSr)rr2rrBr rrrr__str__U sz Path.__str__cCs|jj|dS)Nr) _Path__reprrrrrrrX sz Path.__repr__cCs t|j|}||j|Sr)rr2r r+rr)raddnextrrrjoinpath[ sz Path.joinpathcCs(t|jd}|r|d7}||Sr#)rrr rr+)rZ parent_atrrrparenta sz Path.parentN)r)rrrrr1rr`rAr$r(r)r*r+rr-rr/r0rr4 __truediv__r5rrrrrs*@   c sddl}d}|j|d}|jdd}|jdddd d |jd d d ddd|jdddddd|jddddd ||}|jdk r|j}t|d}|}W5QRX|rtd |tdn|j dk r|j }t|d}| W5QRXn|j dk r,|j \}}t|d}| |W5QRXn|jdk r|jd} |j} fddt| d\}| D]P} tj| } | stjtj| } | dtjtjfkrd} || | qfW5QRXdS) Nrz3A simple command-line interface for zipfile module.) descriptionT)Zrequiredz-lz--list zShow listing of a zipfile)metavarhelpz-ez --extractr)r8z zExtract zipfile into target dir)nargsr9r:z-cz--create+)zzzCreate zipfile from sourcesz-tz--testzTest if a zipfile is validraz.The following enclosed file is corrupted: {!r}z Done testingcsptj|r|||tnPtj|rl|r8|||tt|D]$}|tj||tj||qFdSr) r|rrrrrrrr2)rYrzippathZnmaddToZiprrr? s    zmain..addToZiprbr)argparseArgumentParserZadd_mutually_exclusive_group add_argument parse_argsZtestr rrrr`rrrZcreatepopr|rrrrr) r%r@r7parsergrouprrYZbadfilerZzip_namefilesrr=rr>rmaini s\                   rH__main__)N)N)rZbinasciir!importlib.utilrr6rr|rrrrFrrrrrrr ImportErrorrr__all__ Exceptionrr rrrrrrrrrrrrrrr_r^rr]rMrNrOrPrQrRrSrcrrTrrrrZ_CD_CREATE_VERSIONZ_CD_CREATE_SYSTEMZ_CD_EXTRACT_VERSIONZ_CD_EXTRACT_SYSTEMZ _CD_FLAG_BITSZ_CD_COMPRESS_TYPEZ_CD_TIMEZ_CD_DATEZ_CD_CRCZ_CD_COMPRESSED_SIZEZ_CD_UNCOMPRESSED_SIZErrrZ_CD_DISK_NUMBER_STARTZ_CD_INTERNAL_FILE_ATTRIBUTESZ_CD_EXTERNAL_FILE_ATTRIBUTESrrrrrZ_FH_EXTRACT_VERSIONZ_FH_EXTRACT_SYSTEMrZ_FH_COMPRESSION_METHODZ_FH_LAST_MOD_TIMEZ_FH_LAST_MOD_DATEZ_FH_CRCZ_FH_COMPRESSED_SIZEZ_FH_UNCOMPRESSED_SIZErrrGrHrDrLrKrIZ_CD64_SIGNATUREZ_CD64_DIRECTORY_RECSIZEZ_CD64_CREATE_VERSIONZ_CD64_EXTRACT_VERSIONZ_CD64_DISK_NUMBERZ_CD64_DISK_NUMBER_STARTZ_CD64_NUMBER_ENTRIES_THIS_DISKZ_CD64_NUMBER_ENTRIES_TOTALZ_CD64_DIRECTORY_SIZEZ_CD64_OFFSET_START_CENTDIRr\ZStructr.r8r=r rZr9objectr rrrrrrrrrrrr7rrQr r rrdictfromkeysrr rrrrHrrrrrsl             <<s& &AN /2 =