-U"K      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ 2016 2018 Mark Karpov BSD 3 clause$Mark Karpov <markkarpov92@gmail.com> experimentalportableSafe"#N Decode a K containing CP 437 encoded text.L+Decode a single byte of CP437 encoded text. 2016 2018 Mark Karpov BSD 3 clause$Mark Karpov <markkarpov92@gmail.com> experimentalportableSafe"#1N08The bad things that can happen when you use the library.9Thrown when you try to get contents of non-existing entry.Thrown when archive structure cannot be parsed%Information about archive as a whole.Comment of entire archive-Absolute offset of start of central directory Size of central directory record Supported compression methods. Store file uncompressed Deflate  Compressed using BZip2 algorithm This record represents all information about archive entry that can be stored in a zip archive. It does not mirror local file header or central directory file header, but their binary representations can be built given this data structure and the actual archive contents.Version made byVersion needed to extractCompression methodLast modification date and timeCRC32 check sumSize of compressed entrySize of uncompressed entry$Absolute offset of local file header Entry commentAll extra fields found=The exception represents various troubles you can have with .! cannot be created from this path~This data type serves for naming and selection of archive entries. It can be created only with help of the smart constructor i, and it's the only key  that can be used to refer to files in archive or to name new archive entries.The abstraction is crucial for ensuring that created archives are portable across operating systems, file systems, and different platforms. Since on some operating systems, file paths are case-insensitive, this selector is also case-insensitive. It makes sure that only relative paths are used to name files inside archive, as it's recommended in the specification. It also guarantees that forward slashes are used when the path is stored inside archive for compatibility with Unix-like operating systems (as recommended in the specification). On the other hand, in can be rendered as an ordinary relative file path in OS-specific format when needed.M+Path pieces of relative path inside archive Create an  from a N. To avoid problems with distribution of the archive, characters that some operating systems do not expect in paths are not allowed. Argument to  should pass these checks:.it is a relative path without slash at the endVbinary representations of normalized path should be not longer than 65535 bytesThis function can throw an .Restore a relative path from . Every  corresponds to a single N.UGet an entry name in the from that is suitable for writing to file header, given an .   OM 2016 2018 Mark Karpov BSD 3 clause$Mark Karpov <markkarpov92@gmail.com> experimentalportableNone"#NVV@PMS-DOS date-time: a pair of Q, (date, time) with the following structure: DATE bit 0 - 4 5 - 8 9 - 15 value day (1 - 31) month (1 - 12) years from 1980 TIME bit 0 - 4 5 - 10 11 - 15 value seconds* minute hour *stored in two-second incrementsRFA temporary data structure to hold Zip64 extra data field information.SData descriptor representation.T0Type of file header: local or central directory.U4Origin of entries that can be streamed into archive.VVCollection of editing actions, that is, actions that modify already existing entries.WKCollection of maps describing how to produce entries in resulting archive.XNThe sum type describes all possible actions that can be performed on archive.YAdd entry given its SourceZ9Copy an entry form another archive without re-compression[$Change name the entry inside archive\Delete entry from archive]%Change compression method on an entry^"Set comment for a particular entry_"Delete comment of particular entry`)Set modification time of particular entrya%Add an extra field to specified entryb(Delete an extra filed of specified entrycSet comment for entire archived Delete comment of entire archivee: Version created by  to specify when writing archive data.fEScan the central directory of an archive and return its description ( as well as a collection of its entries.This operation may fail with:isAlreadyInUseError9 if the file is already open and cannot be reopened;isDoesNotExistError if the file does not exist;isPermissionError< if the user does not have permission to open the file;u when specified archive is something this library cannot parse (this includes multi-disk archives, for example).cPlease note that entries with invalid (non-portable) file names may be missing in the list of entries. Files that are compressed with unsupported compression methods are skipped as well. Also, if several entries would collide on some operating systems (such as Windows, because of its case-insensitivity), only one of them will be available, because  is case-insensitive. These are the consequences of the design decision to make it impossible to create non-portable archives with this library.gHGiven location of archive and information about specific archive entry   , return Source] of its data. Actual data can be compressed or uncompressed depending on the third argument.h Undertake all actions specified as the fourth argument of the function. This transforms given pending actions so they can be performed in one pass, and then they are performed in the most efficient way.iCreate a new file with the guarantee that in case of exception the old file will be preserved intact. The file is only updated/replaced if the second argument finishes without exceptions.jsDetermine what comment in new archive will look like given its original value and a collection of pending actions.kiTransform a map representing existing entries into a collection of actions that re-create those entires.lTransform a collection of Xs into W and V5 data that describes how to create resulting archive.mmCopy entries from another archive and write them into the file associated with given handle. This can throw , if there is no such entry in that archive.nBSink entry from given stream into the file associated with given o.pCreate Sink; to stream data there. Once streaming is finished, return S# for the streamed data. The action does not close given o.q]Append central directory entries and end of central directory record to the file that given o is associated with. Note that this automatically writes Zip64 end of central directory record and Zip64 end of central directory locator when necessary.raExtract the number of bytes between start of file name in local header and start of actual data.s7Parse central directory file headers and put them into t.u{Parse a single central directory file header. If it's a directory or file compressed with unsupported compression method, v is returned.wParse an extra-field.xOGet signature. If the extracted data is not equal to provided signature, fail.yParse R from its binary representation.z!Produce binary representation of R.{Create K representing an extra field.|Create K' representing entire central directory.}Create K: representing local file header if the first argument is ~- and central directory file header otherwise.Create K4 representing Zip64 end of central directory record.Create K6 representing Zip64 end of central directory locator.Parse end of central directory record or Zip64 end of central directory record depending on signature binary data begins with.Create K. representing end of central directory record.oFind absolute offset of end of central directory record or, if present, Zip64 end of central directory record.Rename an entry (key) in a t.Like 8, but with saturation when converting to bounded types.!Determine target entry of action.Decode K. The first argument indicates whether we should treat it as UTF-8 (in case bit 11 of general-purpose bit flag is set), otherwise the function assumes CP437. Note that since not every stream of bytes constitutes valid UTF-8 text, this function can fail. In that case v is returned._Detect if the given text needs newer Unicode-aware features to be properly encoded in archive.LConvert numeric representation (as per .ZIP specification) of version into .Covert : to its numeric representation as per .ZIP specification.7Get compression method form its numeric representation.Convert  : to its numeric representation as per .ZIP specification.>Check if an entry with these parameters needs Zip64 extension.|Determine version needed to extract  that should be written to headers given need of Zip64 feature and compression method.Return decompressing Conduit0 corresponding to the given compression method.9Sink that calculates CRC32 check sum for incoming stream.Convert  to MS-DOS time format.Convert MS-DOS date-time to .!We use the constants of the type L instead of literals to protect ourselves from overflows on 32 bit systems.!We use the constants of the type L instead of literals to protect ourselves from overflows on 32 bit systems.fPath to archive to scang'Path to archive that contains the entry/Information needed to extract entry of interest#Should we stream uncompressed data?Source of uncompressed datah*Location of archive file to edit or createArchive descriptionCurrent list of entiresCollection of pending actionsiName of file to createAction that writes to given ok0Name of the archive file where entires are foundActual list of entires)Actions that recreate the archive entrieslCollection of pending actionsOptimized datamOpened o of zip archive file)Path to the file to copy the entries fromt1 from original name to name to use in new archive)Additional info that can influence result5Info to generate central directory file headers laternOpened o of zip archive fileName of entry to add-Origin of entry (can contain additional info)Source of entry contents)Additional info that can influence result5Info to generate central directory file headers laterpOpened o of zip archive fileCompression method to applySink where to stream dataq!Opened handle of zip archive fileCommentary to entire archive7Info about already written local headers and entry datay/What is read from central directory file headerActual binary representationResultz.Is this for local or central directory header?Zip64 extra field's dataResulting representation}Type of header to generateName of entry to writeDescription of entryTotal number of entriesSize of the central directory"Offset of central directory record(Offset of Zip64 end of central directoryTotal number of entriesSize of the central directory"Offset of central directory recordZip file comment1Whether bit 11 of general-purpose bit flag is setBinary data to decodeDecoded  in case of successXYZ[\]^_`abcdfghPRSTUVWX YZ[\]^_`abcd 2016 2018 Mark Karpov BSD 3 clause$Mark Karpov <markkarpov92@gmail.com> experimentalportableNone "#>?FKNT] }/"Internal state record used by the  , monad. This is only exported for use with  methods, you can't look inside.Path to zip archiveActual collection of entriesInfo about the whole archivePending actions Monad that provides context necessary for performing operations on zip archives. It's intentionally opaque and not a monad transformer to limit the actions that can be performed in it to those provided by this module and their combinations.!Create a new archive given its location and an action that describes how to create contents of the archive. This will silently overwrite the specified file if it already exists. See "/ if you want to work with an existing archive."#Work with an existing archive. See !. if you want to create a new archive instead.This operation may fail with:isAlreadyInUseError9 if the file is already open and cannot be reopened;isDoesNotExistError if the file does not exist;isPermissionError< if the user does not have permission to open the file;u when specified archive is something this library cannot parse (this includes multi-disk archives, for example).cPlease note that entries with invalid (non-portable) file names may be missing in the list of entries. Files that are compressed with unsupported compression methods are skipped as well. Also, if several entries would collide on some operating systems (such as Windows, because of its case-insensitivity), only one of them will be available, because  is case-insensitive. These are the consequences of the design decision to make it impossible to create non-portable archives with this library.#Retrieve description of all archive entries. This is an efficient operation that can be used for example to list all entries in an archive. Do not hesitate to use the function frequently: scanning of archive happens only once anyway.Please note that the returned value only reflects actual contents of the archive in file system, non-committed actions do not influence the list of entries, see A for more information.$_Check whether the specified entry exists in the archive. This is a simple shortcut defined as: ,doesEntryExist s = M.member s <$> getEntries%Get  < for specified entry. This is a simple shortcut defined as: *getEntryDesc s = M.lookup s <$> getEntries&5Get contents of a specific archive entry as a strict K~. It's not recommended to use this on big entries, because it will suck out a lot of memory. For big entries, use conduits: (.Throws: .'Get an entry source.Throws: .(1Stream contents of an archive entry to the given Sink.Throws: .);Save a specific archive entry as a file in the file system.Throws: .*eCalculate CRC32 check sum and compare it with the value read from the archive. The function returns F when the check sums are the same that is, the data is not corrupted.Throws: .+lUnpack the entire archive into the specified directory. The directory will be created if it does not exist.,Get the archive comment.-#Get the archive description record..AAdd a new entry to the archive given its contents in binary form./:Stream data from the specified source to an archive entry.0 Load an entry from a given file.1^Copy an entry as is  from another zip archive. If the entry does not exist in that archive,  will be eventually thrown.2Add an entire directory to the archive. Please note that due to the design of the library, empty sub-directories won't be added.The action can throw .3RRename an entry in the archive. If the entry does not exist, nothing will happen.4MDelete an entry from the archive, if it does not exist, nothing will happen.5RChange compression method of an entry, if it does not exist, nothing will happen.6Set an entry comment, if that entry does not exist, nothing will happen. Note that if binary representation of the comment is longer than 65535 bytes, it will be truncated on writing.7NDelete an entry's comment, if that entry does not exist, nothing will happen.8rSet the last modification  date/time. The specified entry may be missing, in that case the action has no effect.9`Add an extra field. The specified entry may be missing, in that case this action has no effect.:uDelete an extra field by its type (tag). The specified entry may be missing, in that case this action has no effect.;0Perform an action on every entry in the archive.<"Set comment of the entire archive.=+Delete the archive comment if it's present.>)Undo changes to a specific archive entry.?;Undo changes to the archive as a whole (archive's comment).@.Undo all changes made in this editing session.AArchive contents are not modified instantly, but instead changes are collected as pending actions  that should be committed, in order to efficiently modify the archive in one pass. The actions are committed automatically when the program leaves the realm of   monad (i.e. as part of ! or "), or can be forced explicitly with the help of this function. Once committed, changes take place in the file system and cannot be undone.7Get the path of the actual archive file from inside of   monad.&Get the collection of pending actions.5Modify the collection of pending actions in some way.0Add a new action to the list of pending actions.GRecursively list a directory. Do not return paths to empty directories.6Perform an action ignoring IO exceptions it may throw.BC!"Location of archive file to create#Actions that form archive's content" Location of archive to work withActions on that archive&&Selector that identifies archive entryContents of the entry'&Selector that identifies archive entry(&Selector that identifies archive entry#Sink where to stream entry contents Contents of the entry (if found))&Selector that identifies archive entryWhere to save the file*&Selector that identifies archive entryIs the entry intact?.Compression method to useEntry contentsName of entry to add/Compression method to useSource of entry contentsName of entry to add0Compression method to useName of entry to addPath to file to add1Path to archive to copy from)Name of entry (in source archive) to copy,Name of entry to insert (in current archive)2Compression method to use How to get ; from a path relative to the root of the directory we packPath to directory to add3Original entry nameNew entry name5New compression methodName of entry to re-compress6Text of the commentName of entry to comment on8New modification timeName of entry to modify9%Tag (header id) of extra field to addBody of the fieldName of entry to modify:(Tag (header id) of extra field to deleteName of entry to modify;Action to performA  !"#$%&'()*+,-./0123456789:;<=>?@AA   !"#$%&'()*+,-./0123456789:;<=>?@A        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX!YVZ[\]^_`abcdefghijklmnop.Gqrstu5Vvwxyz{|}~VVVVY\]`a%& zip-1.1.0-HcpTYjdCBkb5gTQpKNS2vMCodec.Archive.Zip.CP437Codec.Archive.ZipCodec.Archive.Zip.TypeSystem.FilePath.PosixisValidSystem.FilePath.WindowsCodec.Archive.Zip.Internal decodeCP437 ZipExceptionEntryDoesNotExist ParsingFailedArchiveDescription adComment adCDOffsetadCDSizeCompressionMethodStoreDeflateBZip2EntryDescriptionedVersionMadeByedVersionNeeded edCompression edModTimeedCRC32edCompressedSizeedUncompressedSizeedOffset edComment edExtraFieldEntrySelectorExceptionInvalidEntrySelector EntrySelectormkEntrySelectorunEntrySelector getEntryNameZipState ZipArchive createArchive withArchive getEntriesdoesEntryExist getEntryDescgetEntrygetEntrySource sourceEntry saveEntry checkEntry unpackIntogetArchiveCommentgetArchiveDescriptionaddEntry sinkEntry loadEntry copyEntry packDirRecur renameEntry deleteEntry recompresssetEntryCommentdeleteEntryComment setModTime addExtraFielddeleteExtraField forEntriessetArchiveCommentdeleteArchiveCommentundoEntryChangesundoArchiveChangesundoAllcommit$fMonadBaseControlIOZipArchive$fMonadBaseIOZipArchive$fFunctorZipArchive$fApplicativeZipArchive$fMonadZipArchive$fMonadIOZipArchive$fMonadThrowZipArchive$fMonadCatchZipArchive$fMonadMaskZipArchivebytestring-0.10.8.2Data.ByteString.Internal ByteStringdecodeByteCP437unESbaseGHC.IOFilePath MsDosTimeGHC.WordWord16Zip64ExtraFieldDataDescriptor HeaderType EntryOriginEditingActionsProducingActions PendingAction SinkEntry CopyEntry RenameEntry DeleteEntry RecompressSetEntryCommentDeleteEntryComment SetModTime AddExtraFieldDeleteExtraFieldSetArchiveCommentDeleteArchiveComment zipVersion scanArchive withNewFilepredictCommenttoRecreatingActionsoptimize copyEntriesGHC.IO.Handle.TypesHandlesinkDatawriteCDgetLocalHeaderGapgetCDcontainers-0.5.10.2Data.Map.InternalMap getCDHeaderGHC.BaseNothing getExtraField getSignatureparseZip64ExtraFieldmakeZip64ExtraField putExtraFieldputCD putHeaderghc-prim GHC.TypesFalse putZip64ECDputZip64ECDLocatorgetECDputECD locateECD renameKeywithSaturationGHC.Real fromIntegral targetEntry decodeText needsUnicode toVersion Data.VersionVersion fromVersiontoCompressionMethodfromCompressionMethod needsZip64 getZipVersiondecompressingPipe crc32Sink toMsDosTime time-1.8.0.2 Data.Time.Clock.Internal.UTCTimeUTCTime fromMsDosTimeffff GHC.NaturalNaturalffffffff#text-1.2.2.2-EakMpasry3jA6OIwSZhq9MData.Text.InternalText msDosDate msDosTimez64efUncompressedSizez64efCompressedSize z64efOffsetddCRC32ddCompressedSizeddUncompressedSize LocalHeaderCentralDirHeader GenericOriginBorrowed eaCompressioneaEntryCommenteaDeleteComment eaModTime eaExtraField eaDeleteField paCopyEntry paSinkEntry,monad-control-1.0.2.3-2muMHtg8mYx8DwPZ9oyBonControl.Monad.Trans.ControlMonadBaseControl zsFilePath zsEntries zsArchive zsActionsTrue getFilePath getPending modifyActions addPending listDirRecurignoringAbsence unZipArchive