[K      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                  ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 { | } ~                                                              None&'.3456;<=>?BFQTV`d3 aPlacement of elements around (what is implicity but maybe shouldn't just be) a rectangular canvas<Orientation for an element. Watch this space for curvature! vertical alignmenthorizontal alignmentbA Chart is simply a type synonym for a typical Diagrams object. A close relation to this type is  B, but this usage tends to force a single backend (B comes from the backend libraries), so making Chart b's maintains backend polymorphism.aJust about everything - text, circles, lines, triangles, charts, axes, titles, legends etc - are fs, which means that most things are amenable to full use of the combinatorially-inclined diagrams-lib.<project a double-containered set of data to a new Rect range7determine the range of a double-containered set of data@the aspect of a chart expressed as a ratio of x-plane : y-plane. a 1:1 aspecta 1.5:1 aspect golden ratio a 3:1 aspecta skinny 5:1 aspectBconversion of horizontal alignment to (one :: Range Double) limits5svg text is forced to be lower left (-0.5) by default@conversion of vertical alignment to (one :: Range Double) limitssvg text is lower by defaultposition an element at a point !convert an R2 to a diagrams Point!convert an R2 to a V2"IfoldMap for beside; stacking chart elements in a direction, with a premap#*combine elements vertically, with a premap$,combine elements horizontally, with a premap%horizontal separator&vertical separator'&convert an rgba spec to an AlphaColour(the official chart-unit blue)the official chart-unit grey*Bthe diagrams scaleX with a zero divide guard to avoid error throws+Bthe diagrams scaleY with a zero divide guard to avoid error throws,Athe diagrams scale with a zero divide guard to avoid error throws.These are difficult to avoid+  !"#$%&'()*+,+   !"#$&%'()*+,  None.3456;<=>?BFQTV`dH7DAn arrow structure contains position, direction and size information;Dtodo: quite a clunky specification of what an arrow is (or could be)EArrowStyles based on diagramsBconversion between unit and diagrams ToDo: abstract ArrowHT usage]tEqualize the arrow space width with the data space one. this creates the right arrow sizing in physical chart space^GRescale data across position, and between position and arrow direction.Tnote that, due to this auto-scaling, there is no such thing as a single arrow_ chart arrowsExample :: Chart b arrowsExample = arrows ( #maxLength .~ 0.5 $ #maxHeadLength .~ 0.2 $ #maxStaffWidth .~ 0.01 $ def) [ Arrow (Pair x (sin (5 * x))) (Pair x (cos x)) | x <- grid MidPos (one :: Range Double) 100 ] other/arrowsExample.svgarrows example_A chart of arrows`&An arrow chart scaled to its own range 1arrowChart_Example :: Chart b arrowChart_Example = arrowChart_ [def] asquare [as] where as = normArrows [ Arrow (Pair x y) (Pair (sin 1 / x + 0.0001) (cos 1 / y + 0.0001)) | x <- grid MidPos (one :: Range Double) 20 , y <- grid MidPos (one :: Range Double) 20 ] other/arrowChart_Example.svgarrowChart_ example*789:;<C=>?@ABDEZFGHIJKLMNOPQRSTUVWXY[\]^_`*789:EFGHIJKLMNOPQRSTUVWXYZ[\;<=>?@ABCD]^_`789:; <=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\None.3456;<=>?BFQTV`dS g/Convert a one-dimensional data set to line datah8Convert a one-dimensional data set to verticle line datai:Convert a one-dimensional data set to horizontal line datajJConvert a one-dimensional data set to rectangular bars with a gap betweenk(Create line data for a formulae y = f(x)l(Create line data for a formulae x = f(y)m(Create rect data for a formulae y = f(x)n(Create rect data for a formulae x = f(y)o*Create rect data for a formulae c = f(x,y)p"transpose the dimensions of a Rect ghijklmnop ghijklmnopNone".3456;<=>?BFQTV`abd q(whether to include lower and upper timesta step in time{parse text as per iso8601:set -XOverloadedStrings,let t0 = parseUTCTime ("2017-12-05" :: Text)t0Just 2017-12-05 00:00:00 UTCadd a TimeGrain to a UTCTime:addGrain (Years 1) 5 (UTCTime (fromGregorian 2015 2 28) 0)2020-02-29 00:00:00 UTC;addGrain (Months 1) 1 (UTCTime (fromGregorian 2015 2 28) 0)2015-03-31 00:00:00 UTC:addGrain (Hours 6) 5 (UTCTime (fromGregorian 2015 2 28) 0)2015-03-01 06:00:00 UTCJaddGrain (Seconds 0.001) (60*1000+1) (UTCTime (fromGregorian 2015 2 28) 0)2015-02-28 00:01:00.001 UTC|0compute the floor UTCTime based on the timegrain9floorGrain (Years 5) (UTCTime (fromGregorian 1999 1 1) 0)1995-12-31 00:00:00 UTC<floorGrain (Months 3) (UTCTime (fromGregorian 2016 12 30) 0)2016-09-30 00:00:00 UTC:floorGrain (Days 5) (UTCTime (fromGregorian 2016 12 30) 1)2016-12-30 00:00:00 UTCTfloorGrain (Minutes 15) (UTCTime (fromGregorian 2016 12 30) (fromDouble' $ 15*60+1))2016-12-30 00:15:00 UTCBfloorGrain (Seconds 0.1) (UTCTime (fromGregorian 2016 12 30) 0.12)2016-12-30 00:00:00.1 UTC}2compute the ceiling UTCTime based on the timegrain;ceilingGrain (Years 5) (UTCTime (fromGregorian 1999 1 1) 0)2000-12-31 00:00:00 UTC>ceilingGrain (Months 3) (UTCTime (fromGregorian 2016 12 30) 0)2016-12-31 00:00:00 UTC<ceilingGrain (Days 5) (UTCTime (fromGregorian 2016 12 30) 1)2016-12-31 00:00:00 UTCVceilingGrain (Minutes 15) (UTCTime (fromGregorian 2016 12 30) (fromDouble' $ 15*60+1))2016-12-30 00:30:00 UTCDceilingGrain (Seconds 0.1) (UTCTime (fromGregorian 2016 12 30) 0.12)2016-12-30 00:00:00.2 UTC~pdates attached to charts are often discontinuous, but we want to smooth that reality over and show a continuous range on the axis The assumption with getSensibleTimeGrid is that there is a list of discountinuous UTCTimes rather than a continuous range. Output is a list of index points for the original [UTCTime] and label tuples, and a list of unused list elements.placedTimeLabelDiscontinuous PosIncludeBoundaries (Just "%d %b") 2 [UTCTime (fromGregorian 2017 12 6) 0, UTCTime (fromGregorian 2017 12 29) 0, UTCTime (fromGregorian 2018 1 31) 0, UTCTime (fromGregorian 2018 3 3) 0]:([(0,"06 Dec"),(1,"31 Dec"),(2,"28 Feb"),(3,"03 Mar")],[])1compute a sensible TimeGrain and list of UTCTimeshsensibleTimeGrid InnerPos 2 (UTCTime (fromGregorian 2016 12 31) 0, UTCTime (fromGregorian 2017 12 31) 0)T(Months 6,[2016-12-31 00:00:00 UTC,2017-06-30 00:00:00 UTC,2017-12-31 00:00:00 UTC])fsensibleTimeGrid InnerPos 2 (UTCTime (fromGregorian 2017 1 1) 0, UTCTime (fromGregorian 2017 12 30) 0)$(Months 6,[2017-06-30 00:00:00 UTC])fsensibleTimeGrid UpperPos 2 (UTCTime (fromGregorian 2017 1 1) 0, UTCTime (fromGregorian 2017 12 30) 0)<(Months 6,[2017-06-30 00:00:00 UTC,2017-12-31 00:00:00 UTC])fsensibleTimeGrid LowerPos 2 (UTCTime (fromGregorian 2017 1 1) 0, UTCTime (fromGregorian 2017 12 30) 0)<(Months 6,[2016-12-31 00:00:00 UTC,2017-06-30 00:00:00 UTC])8come up with a sensible TimeGrain over a NominalDiffTimeqrstuvwxyz{|}~{tuvwxyz|}qrs~qrstuvwxyzNone.3456;<=>?BFQTV`d+Options to pixelate a Rect using a functionAt some point, a color of a rect becomes more about data than stylistic option, hence the pixel. Echewing rect border leaves a Pixel with no stylistic options to choose.0Just about everything on a chart is a rectangle.solid rectangle, no borderclear and transparent rectclear rect, with borderBplace a rect around an Chart, with a size equal to the chart rangeA single rectangle specified using a Rect x z y w where (x,y) is location of lower left corner (z,w) is location of upper right corner rect_Example :: Double -> Chart b rect_Example n = labelled (opts (Pair n 1)) "z,w" $ labelled (opts (Pair n -1)) "z,y" $ labelled (opts (Pair (-n) 1)) "x,w" $ labelled (opts (Pair (-n) -1)) "x,y" $ rect_ def (Ranges (n *. one) one) where opts :: Pair Double -> LabelOptions opts o = #text %~ ( (#color .~ black `withOpacity` 0.8) . (#size .~ 0.3)) $ #orientation .~ o $ def other/rect_Example.svg rect_ example0Create rectangles (with the same configuration). 7rects def (rectBars 0 [1, 2, 3, 5, 8, 0, -2, 11, 2, 1]) other/rectsExample.svg rects exampleA chart of rects-A chart of rectangles scaled to its own range cropts :: [RectOptions] ropts = [ #borderSize .~ 0 $ def , #borderSize .~ 0 $ #color .~ ucolor 0.3 0.3 0.3 0.2 $ def ] rss :: [[Rect Double]] rss = [ rectXY (\x -> exp (-(x ** 2) / 2)) (Range -5 5) 50 , rectXY (\x -> 0.5 * exp (-(x ** 2) / 8)) (Range -5 5) 50 ] rectChart_Example :: Chart b rectChart_Example = rectChart_ ropts widescreen rss other/rectChart_Example.svgrectChart_ example$A pixel is a rectangle with a color. pixel_Example :: Chart b pixel_Example = text_ opt "I'm a pixel!" <> pixel_ (Pixel one ublue) where opt = #color .~ withOpacity black 0.8 $ #size .~ 0.2 $ def other/pixel_Example.svgpixel_ exampleRender multiple pixels pixelsExample :: Chart b pixelsExample = pixels [ Pixel (Rect (5 * x) (5 * x + 0.1) (sin (10 * x)) (sin (10 * x) + 0.1)) (dissolve (2 * x) ublue) | x <- grid OuterPos (Range 0 1) 100 ] other/pixelsExample.svgpixels exampleA chart of pixels)A chart of pixels scaled to its own range pixelChart_Example :: Chart b pixelChart_Example = pixelChart_ asquare [(\(r,c) -> Pixel r (blend c (ucolor 0.47 0.73 0.86 1) (ucolor 0.01 0.06 0.22 1) )) <$> rectF (\(Pair x y) -> (x+y)*(x+y)) one (Pair 40 40)] other/pixelChart_Example.svgpixelChart_ example9Transform a Rect into Pixels using a function over a Pair}Chart pixels using a function This is a convenience function, and the example below is equivalent to the pixelChart_ example :pixelateChart def asquare one (\(Pair x y) -> (x+y)*(x+y))None"-.3456;<=>?BFQTV`abdwToDo: Mathjax capability would be awesome but the html that mathjax generates is not valid svg unless it is wrapped in  foreignObject instead of  text.  foreignObjectf also cant be a sub-element of a text element. This means extensive digging into Diagrams innards etc ?https://stackoverflow.com/questions/15962325/mathjax-inside-svg Svg optionsrender svg to textwrite an svg to filewrite a chart to an svg file a scratch pad None-.3456;<=>?BFQTV`dο5A label is a text element attached to a chart elementdirection of labeldistance to label ADT of fonts text options3size as ratio to overall chart size (default: 0.08)horizontal alignment (default: )vertical alignment (default:  )default: greyish default: 3in degrees from the horozontal (default: 0 degrees) default:  deftext as a path or as svg text$options specific to text as SVG text'options specific to text as an SVG path1transform from chart-unit to SVGFonts rep of fontCreate a textual chart element "text_ def "Welcome to chart-unit!" other/text_Example.svg text_ example"Create positioned text from a list ts :: [(Text, Pair Double)] ts = zip (map Text.singleton ['a' .. 'z']) [Pair (sin (x * 0.1)) x | x <- [0 .. 25]] textsExample :: Chart b textsExample = texts def ts other/textsExample.svg texts exampleA chart of text'A chart of text scaled to its own range ctextChart_Example :: Chart b textChart_Example = textChart_ [#size .~ 0.33 $ def] widescreen [ts] other/textChart_Example.svgtextChart_ example$Label a chart element with some text labelledExample :: Chart b labelledExample = labelled (LabelOptions (#alignH .~ AlignLeft $ #rotation .~ 45 $ def) (Pair 1 1) 0.05) "a label" (glyph_ def) other/labelledExample.svglabelled example$$ None.3456;<=>?BFQTV`d .shape of the glyph expressed in diagrams terms4The actual shape of a glyph can be any Chart element glyph radius normalized*convert from chart-unit to diagrams shapesCreate a glyph.  glyph_ def other/glyph_Example.svgglyph_ exampleCreate positioned glyphs. +glyphs def (dataXY sin (Range 0 (2*pi)) 30) other/glyphsExample.svgglyphs exampleA chart of glyphs)A chart of glyphs scaled to its own range }gopts :: [GlyphOptions] gopts = [ #borderSize .~ 0.001 $ def , #borderSize .~ 0.001 $ #size .~ 0.1 $ #color .~ rybColor 7 `withOpacity` 0.4 $ #shape .~ Triangle $ def ] gdata :: [[Pair Double]] gdata = [ dataXY sin (Range 0 (2*pi)) 30 , dataXY cos (Range 0 (2*pi)) 30 ] glyphChart_Example :: Chart b glyphChart_Example = glyphChart_ gopts widescreen gdata other/glyphChart_Example.svgglyphChart_ example#Create labelled, positioned glyphs. lglyphsExample :: Chart b lglyphsExample = lglyphs def def $ zip (show <$> [0 ..]) [Pair (x / 10) (sin x / 10) | x <- [0 .. 10]] other/lglyphsExample.svglglyphs exampleA chart of labelled glyphs2A chart of labelled glyphs scaled to its own range lgdata :: [(Text, Pair Double)] lgdata = [(\(p@(Pair x y)) -> (show x <> "," <> show y, fromIntegral <$> p)) <$> (Pair <$> [0 .. 5] <*> [0 .. 5] :: [Pair Int]) ] lglyphChart_Example :: Rect Double -> Chart b lglyphChart_Example a = lglyphChart_ [#gap .~ 0.015 $ #text . #size .~ 0.12 $ def] [#color .~ black `withOpacity` 1 $ #borderSize .~ 0 $ #size .~ 0.01 $ def] a [lgdata] other/lglyphChart_Example.svglglyphChart_ example  None.3456;<=>?BFQTV`d KThe main features of a line (that distinguish it from a glyph say) is that:Eit exists over multiple points (a line can't exist at a single point);line rendering is normalized to the eventual physical chart normalized$A line connecting a series of points linesExample :: Int -> Chart b linesExample n = lines (#color .~ red `withOpacity` 0.5 $ def) (dataXY cos (Range 0 (4*pi)) n) other/linesExample.svg lines example!A single line connecting 2 points A chart of lines (A chart of lines scaled to its own range lls :: [[Pair Double]] ls = map (uncurry Pair) <$> [ [(0.0, 1.0), (1.0, 1.0), (2.0, 5.0)] , [(0.0, 0.0), (3.0, 3.0)] , [(0.5, 4.0), (0.5, 0)] ] lopts :: [LineOptions] lopts = zipWith (\x y -> LineOptions x (withOpacity (d3Colors1 y) 0.6)) [0.01, 0.02, 0.005] [0,1,2] lineChart_Example :: Chart b lineChart_Example = lineChart_ lopts sixbyfour ls other/lineChart_Example.svglineChart_ example !Lines with glyphs atop eack point A chart of glines /A chart of glyphs_lines scaled to its own range ggopts3 :: [GlyphOptions] gopts3 = zipWith (\x y -> #color .~ withOpacity (d3Colors1 x) 0.2 $ #borderColor .~ withOpacity (d3Colors1 x) 1 $ #borderSize .~ 0.005 $ #shape .~ y $ #size .~ 0.08 $ def) [6,8,2] [Triangle, Square, Circle] glineChart_Example :: Chart b glineChart_Example = glineChart_ lopts gopts3 sixbyfour ls other/glineChart_Example.svgglineChart_ example            None"-.3456;<=>?BFQTV`adh9%Options for gridlines.Style of grid linesno ticks on axis7sensibly rounded line placement and a guide to how manyexactly n lines using Posspecific line placement5The positioning of boundaries for a grid over a space!9Legend options. todo: allow for horizontal concatenation.-OLegendType reuses all the various chart option types to help formulate a legend5MOptions for titles. Defaults to center aligned, and placed at Top of the hud;Style of tick marks on an axis.<no ticks on axis=specific labels>.sensibly rounded ticks and a guide to how many?exactly n equally spaced ticks@specific labels and placementA(options for prettifying axis decorationsG{Axes are somewhat complicated. For instance, they contain a range within which tick marks need to be supplied or computed.SVarious options for a hud.ADefaults to the classical x- and y-axis, no titles and no legends[ Create a hud. hud def sixbyfour one other/hudExample.svg hud example\-attach a hud to a chart with a specific range],attach a hud to a chart using the data range AwithHudExample :: Chart b withHudExample = withHud_ hopts sixbyfour (lineChart lopts) ls where hopts = #titles .~ [(def, "withHud Example")] $ #legends .~ [ #chartType .~ zipWith (\x y -> (LegendLine x 0.05, y)) lopts ["line1", "line2", "line3"] $ def ] $ def other/withHudExample.svgwithHud example^;Direction to place stuff on the outside of the built-up hud_#A gap to add when placing elements.`default X axisadefault Y axisbDcreate an axis, based on AxisOptions, a physical aspect, and a rangeUnder-the-hood, the axis function has gone through many a refactor, and still has a ways to go. A high degree of technical debt tends to acrue here. axisExample :: Chart b axisExample = axis aopts one (Range 0 100000) where aopts :: AxisOptions aopts = #label . #text %~ ((#rotation .~ -45) . (#size .~ 0.06) . (#alignH .~ AlignLeft)) $ #gap .~ 0.0001 $ def other/axisExample.svg axis examplec&adjust an axis for sane font sizes etcd9create an axis, with adjustment to axis options if needede7compute tick values and labels given options and rangesfProvide formatted text for a list of numbers so that they are just distinguished. 'precision 2 ticks' means give the tick labels as much precision as is needed for them to be distinguished, but with at least 2 significant figues.gCreate a title for a chart. The logic used to work out placement is flawed due to being able to freely specify text rotation. It works for specific rotations (Top, Bottom at 0, Left at 90, Right @ 270)h(Create a legend based on a LegendOptions legends' :: [(LegendType, Text)] legends' = [(LegendText def, "legend")] <> [(LegendPixel (blob ublue) 0.05, "pixel")] <> -- [ (LegendArrow (def & #minStaffWidth .~ 0.01 & #minHeadLength .~ 0.03) 0.05, "arrow")] <> [(LegendRect def 0.05, "rect")] <> [(LegendGLine def def 0.10, "glyph+line")] <> [(LegendGlyph def, "just a glyph")] <> zipWith (\x y -> (LegendLine x 0.05, y)) lopts ["short", "much longer name", "line 3"] legendExample :: Chart b legendExample = legend $ #chartType .~ legends' $ def other/legendExample.svglegend examplei;conversion from a chart-unit GridPos to a numhask-range Posjdefault horizontal gridkdefault vertical gridlCreate a grid line for a chart.\ !",*)(&#$%'+-./0123456789:;><?=@ABCDEFGHQLJKPIMNORSTUVWXYZ[\]^_`abcdefghijkl\STUVWXYZ[\]^_;<=>?@fGHIJKLMNOPQR`abABCDEFcde56789:g-./01234!"#$%&'()*+,h ijkl  ! "#$%&'()*+,-./0123456789:;<=>?@ABCDEFG HIJKLMNOPQRSTUVWXYZ None-.3456;<=>?BFQTV`bdhJimagine a data frame ...the usual bar chart eye-candy9whether to separate each Rect grouping or accumulate themConvert BarData to rectangleskconvert data to a range assuming a zero bound a very common but implicit assumption in a lot of bar chartsEcalculate the Rect range of a bar data set (imagine a data frame ...) A bar chart ~barExample :: Chart b barExample = barChart def (BarData [ys] Nothing Nothing) <> hud ( #titles .~ [(def,"Bar Chart")] $ #axes .~ [ #tickStyle .~ TickLabels labels' $ def ] $ #range .~ Just (fold (abs <$> rs)) $ def) where labels' = fmap Text.pack <$> take 10 $ (:[]) <$> ['a'..] rs = rectBars 0.1 ys ys = [1,2,3,5,8,0,-2,11,2,1] other/barExample.svgbarChart example None"-.3456;<=>?BFQTV`abdhO (compound) Chart optionsA single Chart specification+render a Chart specified using ChartOptionsrender a ChartSpec+extract the range of a single specification%calculate the range of a ChartOptions None".3456;<=>?BFQTV`abdPP      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,789:;<=>?@ABDEZFGHIJKLMNOPQRSTUVWXY[\]^_`ghijklmnopqrstuvwxyz{|}~      !",*)(&#$%'+-./0123456789:;><?=@ABCDEFGHQLJKPIMNORSTUVWXYZ[\]^_`abcdefghijklSafe.3456;<=>?BFQTV`d[$ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGGHIJJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~QQ                Q     Q                                 ! " # $ % & ' ( ) * + , - . / / 0 1 2 3 4 5 6 7 8 9 : : ; < = > ? ? @ A B C D E F G H I J 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 { | } ~ ~                                                        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefegeheiejekelemeneoepeqereseteuevwxywxzwx{wx|wx{wx}w~w~w~w~wwwwwwwwwwwwwwwwwwwwwwwwwww)chart-unit-0.6.1.0-9fp6WrkYUj189nT6CgMBCxChart Chart.Core Chart.Arrow Chart.DataChart.Data.Time Chart.Rect Chart.Svg Chart.Text Chart.Glyph Chart.Line Chart.Hud Chart.Bar Chart.ADTPaths_chart_unit1data-default-class-0.1.2.0-8hmGYd6GPAfLQPQcWKOjRmData.Default.ClassDefaultdefPlace PlaceLeft PlaceRightPlaceTop PlaceBottom OrientationHoriVertAlignVAlignTopAlignMid AlignBottomAlignH AlignLeft AlignCenter AlignRight projectssrangeaspectasquare sixbyfourgolden widescreenskinnyalignHUalignHTUalignVUalignVTU positionedp_r_stackverthorisepHorisepVertucolorublueugreyscaleXscaleYscale$fR2Pair$fR1Pair $fEqAlignH $fShowAlignH $fEqAlignV $fShowAlignV$fEqOrientation$fShowOrientation $fEqPlace $fShowPlaceArrowarrowPosarrowDir ArrowOptions minLength maxLength minHeadLength maxHeadLength minStaffWidth maxStaffWidthcolorhStyle ArrowHTStyleTriDartHalfDartSpikeThornLineHeadNoHeadTri2Dart2 HalfDart2Spike2Thorn2Tri'Dart' HalfDart'Spike'Thorn'LineTailNoTailQuillBlockQuill2Block2 normArrowsarrows arrowChart arrowChart_$fDefaultArrowOptions$fShowArrowHTStyle$fShowArrowOptions$fGenericArrowOptions $fEqArrow $fShowArrowlineOneD vlineOneD hlineOneDrectBarsdataXYdataYXrectXYrectYXrectF rectTransPosDiscontinuous PosInnerOnlyPosIncludeBoundaries TimeGrainYearsMonthsDaysHoursMinutesSeconds parseUTCTime floorGrain ceilingGrainplacedTimeLabelDiscontinuoussensibleTimeGrid$fShowTimeGrain$fGenericTimeGrainPixelationOptionspixelationGradientpixelationGrainPixel pixelRect pixelColor RectOptions borderSize borderColorblobclearboxboundrect_rects rectChart rectChart_pixel_pixels pixelChart pixelChart_pixelate pixelateChart$fDefaultRectOptions$fDefaultPixelationOptions$fShowRectOptions$fGenericRectOptions $fShowPixel SvgOptions$sel:size:SvgOptions$sel:svgId:SvgOptions$sel:attributes:SvgOptions$sel:includeDocType:SvgOptions renderSvgtoTexttoFilefileSvgscratch$fDefaultSvgOptions$fShowSvgOptions$fGenericSvgOptions LabelOptionstext orientationgapTextFontLin2LinBit TextOptionssizealignHalignV textFillRulerotationtextTypeTextTypeTextPathTextSvgTextSvgOptions nudgeSize nudgeBottomnudgeMidnudgeTopTextPathOptionsfonttextFonttext_texts textChart textChart_labelled$fDefaultTextSvgOptions$fDefaultTextPathOptions$fDefaultTextOptions$fDefaultLabelOptions$fShowTextSvgOptions$fGenericTextSvgOptions$fShowTextFont$fShowTextPathOptions$fGenericTextPathOptions$fShowTextType$fGenericTextType$fShowTextOptions$fGenericTextOptions$fShowLabelOptions$fGenericLabelOptions GlyphShapeCircleSquareEllipseTrianglePentagonHexagonSeptagonOctagaon RectSharp RectRoundedVLineHLine GlyphOptionsshape glyphShapeglyph_glyphs glyphChart glyphChart_lglyphs lglyphChart lglyphChart_$fDefaultGlyphOptions$fShowGlyphShape$fShowGlyphOptions$fGenericGlyphOptions LineOptionslinesoneline lineChart lineChart_glines glineChart glineChart_$fDefaultLineOptions$fShowLineOptions$fGenericLineOptions GridOptions $sel:gridOrientation:GridOptions$sel:gridStyle:GridOptions$sel:gridLine:GridOptions GridStyleGridNone GridRound GridExact GridPlacedGridPos GridOuterPos GridInnerPos GridLowerPos GridUpperPos GridMidPos LegendOptions$sel:chartType:LegendOptions$sel:innerPad:LegendOptions$sel:innerSep:LegendOptions$sel:gap:LegendOptions$sel:rowPad:LegendOptions$sel:place:LegendOptions$sel:align:LegendOptions$sel:sep:LegendOptions$sel:canvasRect:LegendOptions$sel:text:LegendOptions LegendType LegendText LegendGlyph LegendLine LegendGLine LegendRect LegendArrow LegendPixel TitleOptions$sel:text:TitleOptions$sel:align:TitleOptions$sel:place:TitleOptions$sel:gap:TitleOptions TickStyleTickNone TickLabels TickRound TickExact TickPlaced AutoOptions$sel:maxXRatio:AutoOptions$sel:maxYRatio:AutoOptions$sel:angledRatio:AutoOptions$sel:allowDiagonal:AutoOptions AxisOptions$sel:outerPad:AxisOptions$sel:orientation:AxisOptions$sel:place:AxisOptions$sel:rect:AxisOptions$sel:rectHeight:AxisOptions$sel:mark:AxisOptions$sel:markStart:AxisOptions$sel:gap:AxisOptions$sel:label:AxisOptions$sel:tickStyle:AxisOptions HudOptions$sel:outerPad:HudOptions$sel:axes:HudOptions$sel:grids:HudOptions$sel:titles:HudOptions$sel:legends:HudOptions$sel:canvas:HudOptionshudwithHudwithHud_ placeOutsideplaceGapdefXAxisdefYAxisaxis adjustAxisaxisSane computeTicks precisiontitlelegendgridPosdefXGriddefYGridgridl$fDefaultAutoOptions$fDefaultAxisOptions$fDefaultTitleOptions$fDefaultLegendOptions$fDefaultGridOptions$fDefaultHudOptions$fShowAutoOptions$fGenericAutoOptions$fShowTickStyle$fGenericTickStyle$fShowAxisOptions$fGenericAxisOptions$fShowTitleOptions$fGenericTitleOptions$fShowLegendType$fGenericLegendType$fShowLegendOptions$fGenericLegendOptions $fShowGridPos$fGenericGridPos $fEqGridPos$fShowGridStyle$fGenericGridStyle$fShowGridOptions$fGenericGridOptions$fShowHudOptions$fGenericHudOptionsBarDatabarData barRowLabelsbarColumnLabels BarOptions rectOptionsouterGapinnerGap displayValuesaccumulateValues hudOptions BarValueAccBarValueSeparateBarValueAccumulatebarDataLowerUpperbarRangebarChart$fDefaultBarOptions$fShowBarValueAcc$fGenericBarValueAcc$fShowBarOptions$fGenericBarOptions $fShowBarData$fGenericBarData ChartOptions$sel:chartRange:ChartOptions$sel:chartAspect:ChartOptions$sel:charts:ChartOptions ChartSpec GlyphChart LGlyphChart LineChart GlineChart TextChart RectChart PixelChart ArrowChartBarChartHudChart renderChart renderSpec rangeSpec rangeChart$fDefaultChartOptions$fShowChartSpec$fGenericChartSpec$fShowChartOptions$fGenericChartOptions,diagrams-core-1.4.0.1-18cEyA8ffNuELJ4qoOHcy6Diagrams.Core.TypesDiagram arrowHTStyleaddGrainstepSensibleTime)diagrams-lib-1.4.2-FbejPwYz5EYFgSLmCfez8UDiagrams.TwoD.PathEvenOddbarRects'SVGFonts-1.6.0.3-EGkGUpwyvaz4gDoJXp4VgxGraphics.SVGFonts.TexttextSVG_textSVG'textSVGTextOptsmodespacing underline textWidth textHeightModeINSIDE_HINSIDE_W INSIDE_WHSpacingHADVKERNGraphics.SVGFonts.Fontslin2linbitGraphics.SVGFonts.ReadFontloadFont#colour-2.3.4-3MiiEznBxpfEYrMTHbnSerData.Colour.Names yellowgreenyellow whitesmokewhitewheatviolet turquoisetomatothistletealtan steelblue springgreensnow slategrey slategray slateblueskybluesilversiennaseashellseagreen sandybrownsalmon saddlebrown royalblue rosybrownredpurple powderblueplumpinkperu peachpuff papayawhip palevioletred paleturquoise palegreen palegoldenrodorchid orangeredorange olivedraboliveoldlacenavy navajowhitemoccasin mistyrose mintcream midnightbluemediumvioletredmediumturquoisemediumspringgreenmediumslatebluemediumseagreen mediumpurple mediumorchid mediumbluemediumaquamarinemaroonmagentalinen limegreenlime lightyellowlightsteelbluelightslategreylightslategray lightskyblue lightseagreen lightsalmon lightpink lightgrey lightgreen lightgraylightgoldenrodyellow lightcyan lightcoral lightblue lemonchiffon lawngreen lavenderblushlavenderkhakiivoryindigo indianredhotpinkhoneydew greenyellowgreengreygray goldenrodgold ghostwhite gainsborofuchsia forestgreen floralwhite firebrick dodgerbluedimgreydimgray deepskybluedeeppink darkviolet darkturquoise darkslategrey darkslategray darkslateblue darkseagreen darksalmondarkred darkorchid darkorangedarkolivegreen darkmagenta darkkhakidarkgrey darkgreendarkgray darkgoldenroddarkcyandarkbluecyancrimsoncornsilkcornflowerbluecoral chocolate chartreuse cadetblue burlywoodbrown bluevioletblueblanchedalmondbisquebeigeazure aquamarineaqua antiquewhite alicebluereadColourNameData.Colour.Internal alphaChannelatopblend withOpacitydissolveopaquealphaColourConvert transparentblack colourConvertColour AlphaColour AffineSpace affineCombo ColourOpsoverdarken,numhask-range-0.1.3.0-3TnX2mZbCE5Koz0YYz2vuN NumHask.Rect projectRectcornersRectRangesRect' NumHask.Range gridSensibleRangeRange' NumHask.SpaceSpaceElementGrid singletonunionspacelowerprojectcontainselementsingular intersectsuppermiddisjointnulgrid gridSpacePosOuterPosInnerPosLowerPosUpperPosMidPos NumHask.PairPairPair'&palette-0.1.0.5-2nC79OSEXWZHVTnhIQYwiNData.Colour.Palette.ColorSet d3Colors4 d3Colors2 d3Colors1infiniteWebColors webColors getWebColorrybColor BrightnessDarkestDarkLightLightestData.Colour.Palette.HarmonybwgaccentAnalogicanalogictetradtriad complement monochromeshadetonetint rotateColorslidersData.Colour.Palette.TypesKolorversion getBinDir getLibDir getDynLibDir getDataDir getLibexecDir getSysconfDirgetDataFileName