úÎ.Ý)I      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHNone #<=DIR4Image data, either 8 or 16 bits. TODO rename to PNMFor 8-bit PPMs.For 16-bit PPMs.For 1-bit PBMs.For 8-bit PGMs.For 16-bit PGMs.,A pixel containing a 16-bit greyscale value.,A pixel containing an 8-bit greyscale value. "A pixel containing black or white. 6A pixel containing three 16-bit color components, RGB.5A pixel containing three 8-bit color components, RGB.FMeta information about the image: The exact PPM format and dimensions.1A PPM file with type, dimensions, and image data."The netpbm image type of an image. ASCII bitmap ASCII greymapASCII pixmap (color) binary bitmapbinary greymapbinary pixmap (color) 6Converts a vector of pixels to a list for convenience.!*Converts pixel data to a list of positive Is.CHow big they can become depends on the bit depth of the pixel data.?The result of a PPM parse.See @.J=Parses a netpbm magic number. One of P1, P2, P3, P4, P5, P6.KrDecimal, possibly with comments interleaved, but starting and ending with a digit. See the notes about comments.LParses a SINGLE PPM file.Specification: *http://netpbm.sourceforge.net/doc/ppm.html@There can be multiple images in one file, each starting with a Pn magic number.Comments starting with #O can only be "before the whitespace character that delimits the raster" (see  +http://netpbm.sourceforge.net/doc/pbm.html)S. Nevertheless, I interpret that as "comments cannot be inside the magic number".See also the notes for M.NSee *http://netpbm.sourceforge.net/doc/pbm.htmlQWe ignore the "No line should be longer than 70 characters" here due to "should".M6Parses a full PPM file, containing one or more images.From the spec: ‹"A PPM file consists of a sequence of one or more PPM images. There are no data, delimiters, or padding before, after, or between images."LHowever, you can find PPM files that have trailing whitespace, especially a '\n', so we allow this.@!Parses a PPM file from the given O. On failure,  Left error* contains the error message. On success, Right (images, Maybe rest)F contains the parsed images and potentially an unparsable rest input.P  !"PQRSTUVWXYZ[?\]^_`abJcdKefghiLjkNlmnoM@ABCDEp$  !?@$   !@?/    !"RQPUTSXWV[ZY?^_`abJcdKefghiLjkNlmnoM@ABCDEp]\q           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop#netpbm-1.0.2-KmQdumfXPDh90hsbh4vK64Graphics.Netpbm PpmPixelDataPpmPixelDataRGB8PpmPixelDataRGB16 PbmPixelData PgmPixelData8PgmPixelData16 PgmPixel16 PgmPixel8PbmPixel PpmPixelRGB16 PpmPixelRGB8 PPMHeaderppmTypeppmWidth ppmHeightPPM ppmHeaderppmDataPPMTypeP1P2P3P4P5P6pixelVectorToListpixelDataToIntList $fShowPPM $fEqPPMType $fShowPPMType $fEnumPPMType $fOrdPPMType $fEqPPMHeader$fShowPPMHeader$fEqPpmPixelRGB8$fShowPpmPixelRGB8$fEqPpmPixelRGB16$fShowPpmPixelRGB16 $fEqPbmPixel$fShowPbmPixel $fEqPgmPixel8$fShowPgmPixel8$fEqPgmPixel16$fShowPgmPixel16$fVectorVectorPpmPixelRGB8$fMVectorMVectorPpmPixelRGB8$fUnboxPpmPixelRGB8$fVectorVectorPpmPixelRGB16$fMVectorMVectorPpmPixelRGB16$fUnboxPpmPixelRGB16$fVectorVectorPbmPixel$fMVectorMVectorPbmPixel$fUnboxPbmPixel$fVectorVectorPgmPixel8$fMVectorMVectorPgmPixel8$fUnboxPgmPixel8PpmParseResultparsePPM$fStorablePgmPixel16$fStorablePgmPixel8$fStorablePbmPixel$fStorablePpmPixelRGB16$fStorablePpmPixelRGB8$fVectorVectorPgmPixel16$fMVectorMVectorPgmPixel16$fUnboxPgmPixel16ghc-prim GHC.TypesIntmagicNumberParserdecimalC ppmBodyParser imagesParserpbmAsciiBodyParserbytestring-0.10.8.1Data.ByteString.Internal ByteStringV_PpmPixelRGB8MV_PpmPixelRGB8D:R:VectorPpmPixelRGB80V_PpmPixelRGB16MV_PpmPixelRGB16D:R:VectorPpmPixelRGB160 V_PbmPixel MV_PbmPixelD:R:VectorPbmPixel0 V_PgmPixel8 MV_PgmPixel8D:R:VectorPgmPixel80 V_PgmPixel16 MV_PgmPixel16storePpmPixel8storePpmPixel16 storePbmPixelstorePgmPixel8storePgmPixel16commentsep headerParserword8max word16max isValidMaxvalsingleWhitespace pgmBodyParser pbmBodyParserpgmAsciiBodyParserppmAsciiBodyParserimageParserOfType imageParserD:R:VectorPgmPixel160