úÎ!sFn`%      !"#$Safe0;=Mî'df1: represents the hierarchical structure of logged messages.For example, consider a df1 log line as like the following: P1999-12-20T07:11:39.230553031Z /foo x=a y=b /bar /qux z=c z=d WARNING Something For that line, the  attribute of the & datatype will contain the following: [  (  "foo") ,  ( "x") ( "a") ,  ( "y") ( "b") ,  (  "bar") ,  (  "qux") ,  ( "z") ( "c") ,  ( "z") ( "d") ] :: %  Please notice that [] :: %  is a valid path insofar as df1 is concerned, and that  and % can be juxtapositioned in any order.df1Convert an arbitrary type to a .$You are encouraged to create custom  instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.ŠAny characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here.df1An attribute value (see ).If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use & or . Notice that "" :: @ is acceptable, and will be correctly rendered and parsed back.df1Convert an arbitrary type to a .$You are encouraged to create custom  instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.ŠAny characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here.df1An attribute key (see ).If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use & or . Notice that "" :: @ is acceptable, and will be correctly rendered and parsed back. df1Convert an arbitrary type to a  .$You are encouraged to create custom   instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.ŠAny characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here. df1A path segment.If you have the OverloadedStrings) GHC extension enabled, you can build a   using a string literal:  "foo" ::   Otherwise, you can use & or  . Notice that "" ::  @ is acceptable, and will be correctly rendered and parsed back. df1!Importance of the logged message.ZThese levels, listed in increasing order of importance, correspond to the levels used by  "https://linux.die.net/man/3/syslog syslog(3). df1IMessage intended to be useful only when deliberately debugging a program.df1Informational message.df1LA condition that is not an error, but should possibly be handled specially.df1‰A warning condition, such as an exception being gracefully handled or some missing configuration setting being assigned a default value.df10Error condition, such as an unhandled exception.df1]Critical condition that could result in system failure, such as a disk running out of space.df1PA condition that should be corrected immediately, such as a corrupted database.df1System is unusable.df1Convert an arbitrary type to a .$You are encouraged to create custom  instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.ŠAny characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here.df1A message text.If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use & or . Notice that "" :: @ is acceptable, and will be correctly rendered and parsed back.df11First known timestamp when the log was generated.We use ' rather than > because it is cheaper to obtain and to render. You can use  to convert it if necessary.df1'Importance level of the logged message.df1+ where the logged message was created from. The leftmost + is the closest to the root. The rightmost 4 is the one closest to where the log was generated.An ( %7 is acceptable, conveying the idea of the root path .df1Human-readable message itself.)df1 x :: * == + ( ( x)) ,df1 x :: - == . ( ( x)) /df1 x :: 0 ==  ( x) 1df1 Identity.2df1 x :: * == + ( (  x)) 3df1 x :: - == . ( (  x)) 4df1 x :: 0 ==  (  x) 5df1 Identity.6df1 x :: * == + (  ( x)) 7df1 x :: - == . (  ( x)) 8df1 x :: 0 ==   ( x) 9df1 Identity.:df1 x :: * == + (! ( x)) ;df1 x :: - == . (! ( x)) <df1 x :: 0 == ! ( x) =df1 Identity.>df1"Order of importance. For example,  is more important than  :  >   == ? "  !Safe]^g#df1Like ", but without color.@df1@ a b c p renders p using aI as the default color (for things like whitespace or attribute values), b# as the color for path names, and cP as the color for attribute keys. This adds a trailing whitespace if necessary.Adf1Like @, but without color.Bdf1Escaping rules for  :1A '%' anywhere is always percent-escaped ("%25")"A C) char anywhere is always percent-escaped.Ddf1Escaping rules for  :A E2 in the first character is always percent-escaped.A EE anywhere else is always percent-escaped, unless it is '-' or '_'.A C) char anywhere is always percent-escaped.Fdf1Escaping rules for :A C) char anywhere is always percent-escaped.A E2 in the first character is always percent-escaped.A EE anywhere else is always percent-escaped, unless it is '-' or '_'.Gdf1Escaping rules for :1A ' ' anywhere is always percent-escaped ("%20").1A '%' anywhere is always percent-escaped ("%25")"1A '=' anywhere is always percent-escaped ("%3d").A C) char anywhere is always percent-escaped.Hdf1 Reset allIdf1Default foregroundJdf1Reset backgroundKdf1green foregroundLdf1green foregroundMdf1Yellow foregroundNdf1Cyan foregroundOdf1Blue foregroundPdf1Black foregroundQdf1White foregroundRdf1Red backgroundSdf1Render % followed by the given T& rendered as two hexadecimal nibbles.Udf1Renders YYYY-MM-DDThh:mm:ss.sssssssssZ (nanosecond precision).DThe rendered string is a 30 characters long, and it's ASCII-encoded.Edf1?( for all ASCII-7 punctuation characters.Cdf1? for ASCII-7 control characters."#Safe]lų$df1uIf sucessful, parsing will stop after the first CR or LF newline marker if any, otherwise it will consume all input.Vdf1Parse "%FF"8. Always consumes 3 bytes from the input, if successful.Wdf1Like X but takes strict bytes.Xdf1 Decodes all V! occurences from the given input.+TODO: Make faster and more space efficient.$Safem4%  !"#$%    !$#"Y      !!"#$%&'()*+,-./012345-.67089:;<=:>?:;@A:B?CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg0hijklmndf1-0.3-1ZvJB72VwsKBZ1qyTJrm44Df1 Df1.TypesTimeUTCTimeData.Time.Clock.SystemsystemToUTCTime Df1.Render Df1.ParsePathPushAttrToValuevalueValueToKeykeyKey ToSegmentsegmentSegmentLevelDebugInfoNoticeWarningErrorCriticalAlert Emergency ToMessagemessageMessageLoglog_time log_levellog_path log_message unMessage unSegmentunKeyunValue renderColorrenderparsecontainers-0.5.11.0Data.Sequence.InternalSeqbase Data.String fromString time-1.8.0.2#Data.Time.Clock.Internal.SystemTime SystemTimeempty $fToMessage[]GHC.BaseString text-1.2.3.0Data.Text.Lazyunpack$fToMessageTextData.Text.InternalTexttoStrict$fToMessageText0Data.Text.Internal.Lazy$fToMessageMessage $fToSegment[]$fToSegmentText$fToSegmentText0$fToSegmentSegment $fToKey[] $fToKeyText $fToKeyText0 $fToKeyKey $fToValue[] $fToValueText$fToValueText0$fToValueValue $fOrdLevelghc-prim GHC.TypesTruerenderPathColor renderPath renderMessage isControl7 renderSegmentisPunctuation7 renderKey renderValuereset fgDefault bgDefaultfgGreenfgRedfgYellowfgCyanfgBluefgBlackfgWhitebgRedword8HexPercentGHC.WordWord8 renderIso8601 pNumPercentpDecodePercentspDecodePercentsL