packages feed

balkon 1.1.0.0 → 1.2.0.0

raw patch · 90 files changed

+3921/−382 lines, 90 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Data.Text.ParagraphLayout.Plain: [fragmentAncestorBoxes] :: Fragment d -> [AncestorBox d]
- Data.Text.ParagraphLayout.Plain: [fragmentGlyphs] :: Fragment d -> [(GlyphInfo, GlyphPos)]
- Data.Text.ParagraphLayout.Plain: [fragmentLine] :: Fragment d -> Int
- Data.Text.ParagraphLayout.Plain: [fragmentPen] :: Fragment d -> (Int32, Int32)
- Data.Text.ParagraphLayout.Plain: [fragmentRect] :: Fragment d -> Rect Int32
- Data.Text.ParagraphLayout.Plain: [fragmentUserData] :: Fragment d -> d
- Data.Text.ParagraphLayout.Rich: paragraphLineHeight :: ParagraphOptions -> LineHeight
+ Data.Text.ParagraphLayout.Rect: HH :: Bias
+ Data.Text.ParagraphLayout.Rect: HL :: Bias
+ Data.Text.ParagraphLayout.Rect: LH :: Bias
+ Data.Text.ParagraphLayout.Rect: LL :: Bias
+ Data.Text.ParagraphLayout.Rect: data Bias
+ Data.Text.ParagraphLayout.Rect: union :: (Num a, Ord a) => Bias -> Rect a -> Rect a -> Rect a
+ Data.Text.ParagraphLayout.Rect: unionMany :: (Num a, Ord a) => Bias -> [Rect a] -> Maybe (Rect a)
+ Data.Text.ParagraphLayout.Rect: unionMany1 :: (Num a, Ord a) => Bias -> NonEmpty (Rect a) -> Rect a
+ Data.Text.ParagraphLayout.Rich: AlignCentreH :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AlignEnd :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AlignLeft :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AlignRight :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AlignStart :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AllowBoxCollapse :: BoxCollapse
+ Data.Text.ParagraphLayout.Rich: AvoidBoxCollapse :: BoxCollapse
+ Data.Text.ParagraphLayout.Rich: [fragmentContentRect] :: Fragment d -> Rect Int32
+ Data.Text.ParagraphLayout.Rich: activateBoxSpacing :: BoxSpacing -> BoxOptions -> BoxOptions
+ Data.Text.ParagraphLayout.Rich: boxCollapse :: BoxOptions -> BoxCollapse
+ Data.Text.ParagraphLayout.Rich: class EmptyText t
+ Data.Text.ParagraphLayout.Rich: data BoxCollapse
+ Data.Text.ParagraphLayout.Rich: data ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: paragraphAlignment :: ParagraphOptions -> ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: paragraphSafeWidth :: ParagraphLayout d -> Int32
+ Data.Text.ParagraphLayout.Rich: strut :: EmptyText t => d -> RootNode t d -> RootNode t d
- Data.Text.ParagraphLayout.Plain: Fragment :: d -> Int -> [AncestorBox d] -> Rect Int32 -> (Int32, Int32) -> [(GlyphInfo, GlyphPos)] -> Fragment d
+ Data.Text.ParagraphLayout.Plain: Fragment :: d -> Int -> [AncestorBox d] -> Rect Int32 -> Rect Int32 -> (Int32, Int32) -> [(GlyphInfo, GlyphPos)] -> Fragment d
- Data.Text.ParagraphLayout.Rich: Fragment :: d -> Int -> [AncestorBox d] -> Rect Int32 -> (Int32, Int32) -> [(GlyphInfo, GlyphPos)] -> Fragment d
+ Data.Text.ParagraphLayout.Rich: Fragment :: d -> Int -> [AncestorBox d] -> Rect Int32 -> Rect Int32 -> (Int32, Int32) -> [(GlyphInfo, GlyphPos)] -> Fragment d

Files

.golden/paginatedParagraphLayout/loremIpsum20em.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -58,6 +59,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -114,6 +116,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -169,6 +172,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -217,6 +221,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -272,6 +277,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -323,6 +329,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -375,6 +382,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -437,6 +445,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -485,6 +494,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -538,6 +548,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}             , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -40,6 +41,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}             , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -65,6 +67,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -98,6 +101,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}             , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -122,6 +126,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}             , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -152,6 +157,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}             , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -182,6 +188,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -242,6 +249,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500}             , fragmentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -269,6 +277,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500}             , fragmentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -292,6 +301,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500}             , fragmentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -322,6 +332,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -341,6 +352,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500}             , fragmentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -361,6 +373,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500}             , fragmentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -392,6 +405,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =
.golden/paginatedRichParagraphLayout/loremIpsum20em.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -55,6 +56,7 @@             , fragmentLine = 2             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -109,6 +111,7 @@             , fragmentLine = 3             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -163,6 +166,7 @@             , fragmentLine = 4             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -210,6 +214,7 @@             , fragmentLine = 5             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -264,6 +269,7 @@             , fragmentLine = 6             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -314,6 +320,7 @@             , fragmentLine = 7             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -365,6 +372,7 @@             , fragmentLine = 8             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -425,6 +433,7 @@             , fragmentLine = 9             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -472,6 +481,7 @@             , fragmentLine = 10             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -524,6 +534,7 @@             , fragmentLine = 11             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/arabicFiller20em.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -67,6 +68,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -129,6 +131,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -186,6 +189,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =
+ .golden/paragraphLayout/arabicHelloParagraphUltraNarrow.golden view
@@ -0,0 +1,183 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = -727, y_origin = 0, x_size = 827, y_size = -19500}+    , spanLayouts = [+        SpanLayout+        [ Fragment+            { fragmentUserData = ()+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -124, y_origin = 0, x_size = 224, y_size = -1500}+            , fragmentRect = Rect {x_origin = -124, y_origin = 0, x_size = 224, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 302, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 224, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -169, y_origin = -1500, x_size = 269, y_size = -1500}+            , fragmentRect = Rect {x_origin = -169, y_origin = -1500, x_size = 269, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 477, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 269, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -727, y_origin = -3000, x_size = 827, y_size = -1500}+            , fragmentRect = Rect {x_origin = -727, y_origin = -3000, x_size = 827, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 1665, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 303, y_offset = -40})+                , (GlyphInfo {codepoint = 359, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 827, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 4+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -214, y_origin = -4500, x_size = 314, y_size = -1500}+            , fragmentRect = Rect {x_origin = -214, y_origin = -4500, x_size = 314, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 1588, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 26, y_offset = 451})+                , (GlyphInfo {codepoint = 381, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 314, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 5+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -170, y_origin = -6000, x_size = 270, y_size = -1500}+            , fragmentRect = Rect {x_origin = -170, y_origin = -6000, x_size = 270, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 293, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 6+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -455, y_origin = -7500, x_size = 555, y_size = -1500}+            , fragmentRect = Rect {x_origin = -455, y_origin = -7500, x_size = 555, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 1641, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 185, y_offset = 120})+                , (GlyphInfo {codepoint = 906, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 555, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 7+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -379, y_origin = -9000, x_size = 479, y_size = -1500}+            , fragmentRect = Rect {x_origin = -379, y_origin = -9000, x_size = 479, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 1588, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 99, y_offset = 170})+                , (GlyphInfo {codepoint = 770, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 479, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 8+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -214, y_origin = -10500, x_size = 314, y_size = -1500}+            , fragmentRect = Rect {x_origin = -214, y_origin = -10500, x_size = 314, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 1588, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 26, y_offset = 451})+                , (GlyphInfo {codepoint = 381, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 314, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 9+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -210, y_origin = -12000, x_size = 310, y_size = -1500}+            , fragmentRect = Rect {x_origin = -210, y_origin = -12000, x_size = 310, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 1563, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 42, y_offset = 40})+                , (GlyphInfo {codepoint = 336, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 310, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 10+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -352, y_origin = -13500, x_size = 452, y_size = -1500}+            , fragmentRect = Rect {x_origin = -352, y_origin = -13500, x_size = 452, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 1641, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 4, y_offset = 379})+                , (GlyphInfo {codepoint = 840, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 11+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -424, y_origin = -15000, x_size = 524, y_size = -1500}+            , fragmentRect = Rect {x_origin = -424, y_origin = -15000, x_size = 524, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 1588, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 131, y_offset = 80})+                , (GlyphInfo {codepoint = 916, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 524, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 12+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = -170, y_origin = -16500, x_size = 270, y_size = -1500}+            , fragmentRect = Rect {x_origin = -170, y_origin = -16500, x_size = 270, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 293, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = ()+            , fragmentLine = 13+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = -184, y_origin = -18000, x_size = 284, y_size = -1500}+            , fragmentRect = Rect {x_origin = -184, y_origin = -18000, x_size = 284, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 108, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 284, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    ]}
.golden/paragraphLayout/czechHello.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/czechHelloParagraphNarrow.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -21,6 +22,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -35,6 +37,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -48,6 +51,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -61,6 +65,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -20,6 +21,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -32,6 +34,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -44,6 +47,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -56,6 +60,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -68,6 +73,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -80,6 +86,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -92,6 +99,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -104,6 +112,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -116,6 +125,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -128,6 +138,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/devanagari.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630}             , fragmentPen = (0, -1171)             , fragmentGlyphs =
.golden/paragraphLayout/devanagariAccent.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1630}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1630}             , fragmentPen = (0, -1171)             , fragmentGlyphs =
.golden/paragraphLayout/devanagariPrefixedAccent.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1630}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1630}             , fragmentPen = (0, -1171)             , fragmentGlyphs =
.golden/paragraphLayout/hardBreaksLTR.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -25,6 +26,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -49,6 +51,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -66,6 +69,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -82,6 +86,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -94,6 +99,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -111,6 +117,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -122,6 +129,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -138,6 +146,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/hardBreaksRTL.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -25,6 +26,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -49,6 +51,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -66,6 +69,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -83,6 +87,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -95,6 +100,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -112,6 +118,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -123,6 +130,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -139,6 +147,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =
.golden/paragraphLayout/ligature.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/ligatureParagraphBreak1.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -23,6 +24,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -39,6 +41,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/ligatureParagraphBreak2.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -23,6 +24,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -37,6 +39,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/lineHeightLarger.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -240, x_size = 522, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1600}             , fragmentPen = (0, -1172)             , fragmentGlyphs =
.golden/paragraphLayout/lineHeightNormal.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/lineHeightSmaller.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 261, x_size = 522, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -599}             , fragmentPen = (0, -671)             , fragmentGlyphs =
.golden/paragraphLayout/loremIpsum100em.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -231,6 +232,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -463,6 +465,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/loremIpsum20em.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -58,6 +59,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -107,6 +109,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -162,6 +165,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -210,6 +214,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -265,6 +270,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -316,6 +322,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -368,6 +375,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -423,6 +431,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -471,6 +480,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -524,6 +534,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/manySpaces.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -25,6 +26,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -42,6 +44,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -59,6 +62,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/mixedLanguageLTR.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -33,6 +34,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121}             , fragmentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/mixedScriptWords.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -22,6 +23,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -36,6 +38,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -50,6 +53,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -64,6 +68,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -78,6 +83,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -92,6 +98,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -106,6 +113,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -120,6 +128,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -134,6 +143,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -148,6 +158,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -162,6 +173,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -176,6 +188,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -188,6 +201,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121}             , fragmentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -200,6 +214,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121}             , fragmentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -214,6 +229,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121}             , fragmentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -226,6 +242,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121}             , fragmentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -239,6 +256,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121}             , fragmentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -251,6 +269,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121}             , fragmentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -263,6 +282,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121}             , fragmentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -275,6 +295,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -287,6 +308,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121}             , fragmentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -299,6 +321,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121}             , fragmentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/paragraphLayout/spannedArabicFiller20em.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}             , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -40,6 +41,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}             , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -65,6 +67,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -98,6 +101,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}             , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -122,6 +126,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}             , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -152,6 +157,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}             , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -182,6 +188,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -202,6 +209,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500}             , fragmentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -229,6 +237,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500}             , fragmentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -252,6 +261,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500}             , fragmentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -282,6 +292,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -301,6 +312,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500}             , fragmentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -321,6 +333,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500}             , fragmentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -352,6 +365,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =
.golden/paragraphLayout/spannedLoremIpsum20em.golden view
@@ -8,6 +8,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -40,6 +41,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121}             , fragmentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -71,10 +73,23 @@         SpanLayout         [ Fragment             { fragmentUserData = ()+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = 18310, y_origin = 0, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 18310, y_origin = 0, x_size = 0, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = ()             , fragmentLine = 2             , fragmentAncestorBoxes =-                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -110,6 +125,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121}             , fragmentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -137,10 +153,23 @@         SpanLayout         [ Fragment             { fragmentUserData = ()+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}+                ]+            , fragmentContentRect = Rect {x_origin = 17443, y_origin = -1121, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 17443, y_origin = -1121, x_size = 0, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = ()             , fragmentLine = 3             , fragmentAncestorBoxes =-                [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -176,6 +205,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121}             , fragmentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -205,6 +235,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121}             , fragmentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -224,6 +255,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -246,6 +278,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121}             , fragmentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -276,6 +309,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121}             , fragmentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -300,6 +334,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -327,6 +362,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121}             , fragmentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -361,6 +397,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121}             , fragmentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -383,6 +420,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -400,6 +438,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121}             , fragmentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -435,6 +474,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121}             , fragmentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -465,6 +505,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -501,6 +542,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121}             , fragmentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -534,6 +576,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -566,6 +609,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121}             , fragmentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -597,6 +641,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121}             , fragmentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -617,6 +662,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -640,6 +686,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121}             , fragmentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -679,6 +726,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121}             , fragmentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -693,6 +741,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -721,6 +770,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121}             , fragmentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -749,6 +799,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121}             , fragmentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -774,6 +825,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -794,6 +846,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121}             , fragmentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -821,6 +874,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121}             , fragmentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
+ .golden/richParagraphLayout/emptyBoxMiddle.golden view
@@ -0,0 +1,49 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 5193, y_size = -1121}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3139, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3139, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 92, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 497, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "emptyText"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}+                ]+            , fragmentContentRect = Rect {x_origin = 3189, y_origin = 0, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 3189, y_origin = 0, x_size = 0, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "text2"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 3289, y_origin = 0, x_size = 1904, y_size = -1121}+            , fragmentRect = Rect {x_origin = 3289, y_origin = 0, x_size = 1904, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 3, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 69, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 573, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 91, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
.golden/richParagraphLayout/hardBoxBreakLTR.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3333, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3333, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -24,6 +25,7 @@                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge}                 , AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3533, y_origin = 0, x_size = 2222, y_size = -1121}             , fragmentRect = Rect {x_origin = 3533, y_origin = 0, x_size = 2222, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -40,6 +42,7 @@                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200}                 , AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2222, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2222, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -54,6 +57,7 @@             , fragmentLine = 2             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 2522, y_origin = -1121, x_size = 3333, y_size = -1121}             , fragmentRect = Rect {x_origin = 2522, y_origin = -1121, x_size = 3333, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/richParagraphLayout/hardBoxBreakRTL.golden view
@@ -1,5 +1,5 @@ ParagraphLayout-    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 3455, y_size = -3000}+    { paragraphRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 3455, y_size = -3000}     , paragraphFragments =         [ Fragment             { fragmentUserData = "text2"@@ -8,7 +8,8 @@                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = SpacedEdge 200, boxEndEdge = NoEdge}                 , AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 100, boxEndEdge = NoEdge}                 ]-            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1632, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 1632, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 1632, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 512, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 839, y_advance = 0, x_offset = 0, y_offset = 0})@@ -22,7 +23,8 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 1932, y_origin = 0, x_size = 1523, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999998477, y_origin = 0, x_size = 1523, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999998477, y_origin = 0, x_size = 1523, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 389, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})@@ -38,7 +40,8 @@             , fragmentLine = 2             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 2155, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999996645, y_origin = -1500, x_size = 2155, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999996645, y_origin = -1500, x_size = 2155, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 512, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 839, y_advance = 0, x_offset = 0, y_offset = 0})@@ -56,7 +59,8 @@                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 150}                 , AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 50}                 ]-            , fragmentRect = Rect {x_origin = 2355, y_origin = -1500, x_size = 1000, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999999000, y_origin = -1500, x_size = 1000, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999999000, y_origin = -1500, x_size = 1000, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 389, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
.golden/richParagraphLayout/loremIpsum20em.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -55,6 +56,7 @@             , fragmentLine = 2             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -103,6 +105,7 @@             , fragmentLine = 3             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -157,6 +160,7 @@             , fragmentLine = 4             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -204,6 +208,7 @@             , fragmentLine = 5             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -258,6 +263,7 @@             , fragmentLine = 6             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -308,6 +314,7 @@             , fragmentLine = 7             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -359,6 +366,7 @@             , fragmentLine = 8             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -413,6 +421,7 @@             , fragmentLine = 9             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -460,6 +469,7 @@             , fragmentLine = 10             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -512,6 +522,7 @@             , fragmentLine = 11             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
+ .golden/richParagraphLayout/loremIpsum20emCentre.golden view
@@ -0,0 +1,559 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 104, y_origin = 0, x_size = 19791, y_size = -12331}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 845, y_origin = 0, x_size = 18310, y_size = -1121}+            , fragmentRect = Rect {x_origin = 845, y_origin = 0, x_size = 18310, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 15, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 39, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1278, y_origin = -1121, x_size = 17443, y_size = -1121}+            , fragmentRect = Rect {x_origin = 1278, y_origin = -1121, x_size = 17443, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 15, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 104, y_origin = -2242, x_size = 19791, y_size = -1121}+            , fragmentRect = Rect {x_origin = 104, y_origin = -2242, x_size = 19791, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 86, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 87, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 94, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 69, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 100, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 101, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 102, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 103, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 104, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 105, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 106, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 107, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 108, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 109, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 110, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 111, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 112, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 113, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 114, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 115, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 116, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 117, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 118, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 119, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 120, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 121, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 122, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 123, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 124, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 125, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 17, cluster = 126, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 4+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1219, y_origin = -3363, x_size = 17562, y_size = -1121}+            , fragmentRect = Rect {x_origin = 1219, y_origin = -3363, x_size = 17562, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 129, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 130, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 131, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 132, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 133, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 134, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 135, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 136, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 137, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 138, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 139, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 140, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 141, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 142, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 143, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 144, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 89, cluster = 145, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 146, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 147, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 148, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 149, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 150, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 15, cluster = 151, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 152, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 153, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 154, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 155, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 156, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 157, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 158, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 159, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 160, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 161, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 162, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 163, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 164, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 5+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 615, y_origin = -4484, x_size = 18769, y_size = -1121}+            , fragmentRect = Rect {x_origin = 615, y_origin = -4484, x_size = 18769, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 91, cluster = 167, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 168, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 169, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 170, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 171, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 172, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 173, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 174, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 175, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 176, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 177, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 178, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 179, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 180, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 181, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 182, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 183, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 184, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 185, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 186, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 187, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 188, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 69, cluster = 189, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 190, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 192, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 193, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 194, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 195, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 196, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 197, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 198, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 199, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 200, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 201, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 202, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 203, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 204, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 205, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 206, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 207, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 208, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 209, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 6+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 387, y_origin = -5605, x_size = 19226, y_size = -1121}+            , fragmentRect = Rect {x_origin = 387, y_origin = -5605, x_size = 19226, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 91, cluster = 212, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 213, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 214, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 215, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 216, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 217, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 218, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 219, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 220, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 221, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 222, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 223, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 224, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 225, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 226, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 227, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 228, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 229, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 230, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 231, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 232, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 233, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 17, cluster = 234, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 235, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 39, cluster = 236, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 713, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 237, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 238, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 239, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 240, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 241, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 242, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 243, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 244, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 245, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 246, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 247, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 248, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 249, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 250, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 7+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1013, y_origin = -6726, x_size = 17973, y_size = -1121}+            , fragmentRect = Rect {x_origin = 1013, y_origin = -6726, x_size = 17973, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 253, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 254, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 255, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 256, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 257, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 258, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 259, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 260, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 261, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 262, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 263, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 264, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 265, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 75, cluster = 266, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 571, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 267, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 268, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 269, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 270, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 271, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 272, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 273, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 274, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 275, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 276, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 277, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 89, cluster = 278, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 279, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 281, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 282, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 283, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 284, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 285, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 286, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 287, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 89, cluster = 288, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 289, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 290, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 291, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 292, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 8+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 514, y_origin = -7847, x_size = 18971, y_size = -1121}+            , fragmentRect = Rect {x_origin = 514, y_origin = -7847, x_size = 18971, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 295, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 296, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 297, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 298, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 299, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 300, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 301, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 302, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 303, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 304, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 305, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 306, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 307, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 308, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 309, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 310, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 311, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 312, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 313, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 314, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 315, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 73, cluster = 316, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 317, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 318, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 319, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 320, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 321, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 322, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 323, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 324, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 325, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 326, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 327, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 328, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 329, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 330, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 331, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 332, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 333, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 334, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 335, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 336, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 331, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 17, cluster = 337, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 9+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1380, y_origin = -8968, x_size = 17239, y_size = -1121}+            , fragmentRect = Rect {x_origin = 1380, y_origin = -8968, x_size = 17239, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 91, cluster = 340, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 341, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 342, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 343, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 344, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 345, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 346, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 347, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 348, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 349, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 350, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 351, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 352, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 353, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 354, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 355, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 357, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 358, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 359, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 360, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 361, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 362, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 363, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 364, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 365, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 366, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 367, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 368, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 369, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 370, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 371, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 372, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 373, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 374, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 375, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 10+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 400, y_origin = -10089, x_size = 19199, y_size = -1121}+            , fragmentRect = Rect {x_origin = 400, y_origin = -10089, x_size = 19199, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 378, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 379, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 380, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 381, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 382, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 383, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 384, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 15, cluster = 385, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 386, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 387, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 388, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 389, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 390, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 391, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 392, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 393, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 394, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 395, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 396, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 397, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 398, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 399, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 400, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 401, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 402, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 403, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 404, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 405, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 431, cluster = 406, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1033, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 409, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 410, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 411, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 412, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 413, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 414, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 415, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 416, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 417, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 418, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 419, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 420, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 11+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 3962, y_origin = -11210, x_size = 12076, y_size = -1121}+            , fragmentRect = Rect {x_origin = 3962, y_origin = -11210, x_size = 12076, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 423, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 424, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 425, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 426, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 427, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 428, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 429, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 430, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 431, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 432, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 433, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 434, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 435, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 436, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 437, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 438, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 439, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 440, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 441, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 442, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 69, cluster = 443, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 444, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 445, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 446, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 447, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 17, cluster = 448, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
+ .golden/richParagraphLayout/loremIpsum20emRight.golden view
@@ -0,0 +1,559 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 209, y_origin = 0, x_size = 19791, y_size = -12331}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1690, y_origin = 0, x_size = 18310, y_size = -1121}+            , fragmentRect = Rect {x_origin = 1690, y_origin = 0, x_size = 18310, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 15, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 39, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 2557, y_origin = -1121, x_size = 17443, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2557, y_origin = -1121, x_size = 17443, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 15, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 209, y_origin = -2242, x_size = 19791, y_size = -1121}+            , fragmentRect = Rect {x_origin = 209, y_origin = -2242, x_size = 19791, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 86, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 87, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 94, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 69, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 100, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 101, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 102, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 103, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 104, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 105, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 106, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 107, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 108, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 109, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 110, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 111, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 112, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 113, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 114, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 115, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 116, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 117, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 118, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 119, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 120, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 121, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 122, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 123, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 124, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 125, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 17, cluster = 126, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 4+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 2438, y_origin = -3363, x_size = 17562, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2438, y_origin = -3363, x_size = 17562, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 129, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 130, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 131, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 132, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 133, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 134, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 135, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 136, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 137, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 138, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 139, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 140, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 141, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 142, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 143, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 144, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 89, cluster = 145, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 146, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 147, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 148, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 149, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 150, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 15, cluster = 151, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 152, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 153, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 154, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 155, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 156, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 157, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 158, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 159, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 160, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 161, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 162, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 163, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 164, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 5+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1231, y_origin = -4484, x_size = 18769, y_size = -1121}+            , fragmentRect = Rect {x_origin = 1231, y_origin = -4484, x_size = 18769, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 91, cluster = 167, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 168, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 169, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 170, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 171, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 172, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 173, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 174, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 175, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 176, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 177, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 178, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 179, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 180, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 181, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 182, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 183, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 184, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 185, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 186, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 187, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 188, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 69, cluster = 189, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 190, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 192, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 193, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 194, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 195, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 196, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 197, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 198, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 199, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 200, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 201, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 202, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 203, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 204, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 205, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 206, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 207, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 208, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 209, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 6+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 774, y_origin = -5605, x_size = 19226, y_size = -1121}+            , fragmentRect = Rect {x_origin = 774, y_origin = -5605, x_size = 19226, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 91, cluster = 212, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 213, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 214, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 215, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 216, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 217, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 218, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 219, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 220, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 221, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 222, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 223, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 224, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 225, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 226, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 227, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 228, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 229, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 230, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 231, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 232, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 233, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 17, cluster = 234, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 235, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 39, cluster = 236, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 713, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 237, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 238, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 239, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 240, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 241, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 242, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 243, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 244, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 245, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 246, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 247, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 248, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 249, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 250, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 7+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 2027, y_origin = -6726, x_size = 17973, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2027, y_origin = -6726, x_size = 17973, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 253, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 254, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 255, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 256, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 257, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 258, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 259, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 260, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 261, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 262, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 263, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 264, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 265, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 75, cluster = 266, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 571, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 267, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 268, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 269, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 270, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 271, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 272, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 273, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 274, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 275, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 276, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 277, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 89, cluster = 278, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 279, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 281, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 282, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 283, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 284, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 285, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 286, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 287, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 89, cluster = 288, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 289, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 290, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 291, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 292, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 8+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1029, y_origin = -7847, x_size = 18971, y_size = -1121}+            , fragmentRect = Rect {x_origin = 1029, y_origin = -7847, x_size = 18971, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 295, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 296, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 297, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 298, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 299, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 300, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 301, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 302, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 303, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 304, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 305, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 306, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 307, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 308, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 309, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 310, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 311, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 312, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 313, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 314, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 315, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 73, cluster = 316, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 317, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 318, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 319, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 320, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 321, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 322, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 323, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 324, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 325, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 326, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 327, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 328, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 329, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 330, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 331, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 332, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 333, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 334, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 335, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 336, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 331, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 17, cluster = 337, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 9+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 2761, y_origin = -8968, x_size = 17239, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2761, y_origin = -8968, x_size = 17239, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 91, cluster = 340, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 341, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 342, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 343, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 344, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 345, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 346, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 347, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 348, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 349, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 350, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 351, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 352, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 353, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 354, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 355, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 357, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 358, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 359, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 360, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 361, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 362, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 363, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 364, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 365, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 366, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 367, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 368, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 369, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 370, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 371, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 372, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 373, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 374, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 375, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 10+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 801, y_origin = -10089, x_size = 19199, y_size = -1121}+            , fragmentRect = Rect {x_origin = 801, y_origin = -10089, x_size = 19199, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 378, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 379, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 380, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 381, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 382, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 383, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 384, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 15, cluster = 385, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 386, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 387, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 388, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 389, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 390, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 391, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 392, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 393, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 394, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 395, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 396, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 397, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 398, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 399, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 400, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 84, cluster = 401, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 402, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 403, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 404, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 405, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 431, cluster = 406, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1033, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 409, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 410, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 411, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 412, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 413, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 414, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 415, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 416, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 417, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 418, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 419, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 420, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 11+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 7924, y_origin = -11210, x_size = 12076, y_size = -1121}+            , fragmentRect = Rect {x_origin = 7924, y_origin = -11210, x_size = 12076, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 423, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 424, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 425, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 426, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 427, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 428, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 429, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 81, cluster = 430, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 431, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 432, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 433, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 434, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 435, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 436, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 437, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 86, cluster = 438, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 87, cluster = 439, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 440, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 441, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 442, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 69, cluster = 443, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 444, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 445, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 446, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 447, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 17, cluster = 448, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
.golden/richParagraphLayout/mixedDirectionComplexLTR.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6732, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6732, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -35,6 +36,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 6732, y_origin = 0, x_size = 1580, y_size = -1500}             , fragmentRect = Rect {x_origin = 6732, y_origin = 0, x_size = 1580, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -51,6 +53,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 8312, y_origin = 0, x_size = 3166, y_size = -1500}             , fragmentRect = Rect {x_origin = 8312, y_origin = 0, x_size = 3166, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -71,6 +74,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 11478, y_origin = 0, x_size = 6578, y_size = -1500}             , fragmentRect = Rect {x_origin = 11478, y_origin = 0, x_size = 6578, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -100,6 +104,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 18056, y_origin = 0, x_size = 1580, y_size = -1500}             , fragmentRect = Rect {x_origin = 18056, y_origin = 0, x_size = 1580, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -115,6 +120,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 19636, y_origin = 0, x_size = 3577, y_size = -1500}             , fragmentRect = Rect {x_origin = 19636, y_origin = 0, x_size = 3577, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -134,6 +140,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500}             , fragmentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =
.golden/richParagraphLayout/mixedDirectionComplexRTL.golden view
@@ -1,12 +1,13 @@ ParagraphLayout-    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 24557, y_size = -1500}+    { paragraphRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 24557, y_size = -1500}     , paragraphFragments =         [ Fragment             { fragmentUserData = "text3"             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6501, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 6501, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 6501, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 600, y_advance = 0, x_offset = 0, y_offset = 0})@@ -35,7 +36,8 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]-            , fragmentRect = Rect {x_origin = 6501, y_origin = 0, x_size = 1580, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999981944, y_origin = 0, x_size = 1580, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999981944, y_origin = 0, x_size = 1580, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 3, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})@@ -51,7 +53,8 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]-            , fragmentRect = Rect {x_origin = 8081, y_origin = 0, x_size = 3418, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999983524, y_origin = 0, x_size = 3418, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999983524, y_origin = 0, x_size = 3418, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 26, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})@@ -71,7 +74,8 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]-            , fragmentRect = Rect {x_origin = 11499, y_origin = 0, x_size = 6326, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999986942, y_origin = 0, x_size = 6326, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999986942, y_origin = 0, x_size = 6326, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 3, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})@@ -100,7 +104,8 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 17825, y_origin = 0, x_size = 1580, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999993268, y_origin = 0, x_size = 1580, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999993268, y_origin = 0, x_size = 1580, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 3, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})@@ -115,7 +120,8 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 19405, y_origin = 0, x_size = 3808, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999994848, y_origin = 0, x_size = 3808, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999994848, y_origin = 0, x_size = 3808, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 4, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 534, y_advance = 0, x_offset = 0, y_offset = 0})@@ -134,7 +140,8 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999998656, y_origin = 0, x_size = 1344, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999998656, y_origin = 0, x_size = 1344, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 3, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})
.golden/richParagraphLayout/mixedDirectionSimpleLTR.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3397, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3397, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -23,6 +24,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 3397, y_origin = 0, x_size = 1578, y_size = -1500}             , fragmentRect = Rect {x_origin = 3397, y_origin = 0, x_size = 1578, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =@@ -35,6 +37,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 4975, y_origin = 0, x_size = 2979, y_size = -1500}             , fragmentRect = Rect {x_origin = 4975, y_origin = 0, x_size = 2979, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =
.golden/richParagraphLayout/mixedDirectionSimpleRTL.golden view
@@ -1,12 +1,13 @@ ParagraphLayout-    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 7954, y_size = -1500}+    { paragraphRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 7954, y_size = -1500}     , paragraphFragments =         [ Fragment             { fragmentUserData = "text"             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2979, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 2979, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 2979, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 17, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 517, y_advance = 0, x_offset = 0, y_offset = 0})@@ -22,7 +23,8 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 2979, y_origin = 0, x_size = 1578, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999995025, y_origin = 0, x_size = 1578, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999995025, y_origin = 0, x_size = 1578, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 1143, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1095, y_advance = 0, x_offset = 0, y_offset = 0})@@ -34,7 +36,8 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 4557, y_origin = 0, x_size = 3397, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999996603, y_origin = 0, x_size = 3397, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999996603, y_origin = 0, x_size = 3397, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 6, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})
+ .golden/richParagraphLayout/mixedLineHeight.golden view
@@ -0,0 +1,306 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 16708, y_size = -9400}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "mediumText"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -90, x_size = 3928, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3928, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 80, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "smallText"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = 3928, y_origin = 160, x_size = 2606, y_size = -1121}+            , fragmentRect = Rect {x_origin = 3928, y_origin = 0, x_size = 2606, y_size = -800}+            , fragmentPen = (0, -772)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 86, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "mediumText"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 6534, y_origin = -90, x_size = 3928, y_size = -1121}+            , fragmentRect = Rect {x_origin = 6534, y_origin = 0, x_size = 3928, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 80, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "largeText"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = 10462, y_origin = -290, x_size = 2549, y_size = -1121}+            , fragmentRect = Rect {x_origin = 10462, y_origin = 0, x_size = 2549, y_size = -1700}+            , fragmentPen = (0, -1222)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 79, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "mediumText"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 13011, y_origin = -90, x_size = 3697, y_size = -1121}+            , fragmentRect = Rect {x_origin = 13011, y_origin = 0, x_size = 3697, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 80, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "lineBreak"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 16708, y_origin = -90, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 16708, y_origin = 0, x_size = 0, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "smallText"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1540, x_size = 2606, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -1700, x_size = 2606, y_size = -800}+            , fragmentPen = (0, -772)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 86, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 43, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "mediumText"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 2606, y_origin = -1790, x_size = 3928, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2606, y_origin = -1700, x_size = 3928, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 80, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "largeText"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = 6534, y_origin = -1990, x_size = 2318, y_size = -1121}+            , fragmentRect = Rect {x_origin = 6534, y_origin = -1700, x_size = 2318, y_size = -1700}+            , fragmentPen = (0, -1222)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 79, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "lineBreak"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 8852, y_origin = -1790, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 8852, y_origin = -1700, x_size = 0, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "mediumText"+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3490, x_size = 3928, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -3400, x_size = 3928, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 80, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "smallText"+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = 3928, y_origin = -3240, x_size = 2375, y_size = -1121}+            , fragmentRect = Rect {x_origin = 3928, y_origin = -3400, x_size = 2375, y_size = -800}+            , fragmentPen = (0, -772)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 86, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "lineBreak"+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 6303, y_origin = -3490, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 6303, y_origin = -3400, x_size = 0, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "largeText"+            , fragmentLine = 4+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4990, x_size = 2549, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -4700, x_size = 2549, y_size = -1700}+            , fragmentPen = (0, -1222)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 79, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 3, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "mediumText"+            , fragmentLine = 4+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 2549, y_origin = -4790, x_size = 3697, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2549, y_origin = -4700, x_size = 3697, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 80, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 71, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 88, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "lineBreak"+            , fragmentLine = 4+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 6246, y_origin = -4790, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 6246, y_origin = -4700, x_size = 0, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "smallText"+            , fragmentLine = 5+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6240, x_size = 2375, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -6400, x_size = 2375, y_size = -800}+            , fragmentPen = (0, -772)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 86, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 80, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 79, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "lineBreak"+            , fragmentLine = 5+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 2375, y_origin = -6490, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2375, y_origin = -6400, x_size = 0, y_size = -1300}+            , fragmentPen = (0, -1022)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "largeText"+            , fragmentLine = 6+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+                ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7990, x_size = 2318, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -7700, x_size = 2318, y_size = -1700}+            , fragmentPen = (0, -1222)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 79, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 85, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 74, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
.golden/richParagraphLayout/mixedScript.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -19,6 +20,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -33,6 +35,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -47,6 +50,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100}                 ]+            , fragmentContentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -60,6 +64,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 6374, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 6374, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -74,6 +79,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 8859, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 8859, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -88,6 +94,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 11194, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 11194, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -102,6 +109,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200}                 ]+            , fragmentContentRect = Rect {x_origin = 11971, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 11971, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -115,6 +123,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 14506, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 14506, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/richParagraphLayout/mixedScriptWrap.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -19,6 +20,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -33,6 +35,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -47,6 +50,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 763, y_size = -1121}             , fragmentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 763, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -59,6 +63,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1549, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1549, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -71,6 +76,7 @@             , fragmentLine = 2             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 1649, y_origin = -1121, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 1649, y_origin = -1121, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -85,6 +91,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 4134, y_origin = -1121, x_size = 763, y_size = -1121}             , fragmentRect = Rect {x_origin = 4134, y_origin = -1121, x_size = 763, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -97,6 +104,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1549, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1549, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -110,6 +118,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 1549, y_origin = -2242, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 1549, y_origin = -2242, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -124,6 +133,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200}                 ]+            , fragmentContentRect = Rect {x_origin = 2326, y_origin = -2242, x_size = 2335, y_size = -1121}             , fragmentRect = Rect {x_origin = 2326, y_origin = -2242, x_size = 2335, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -137,6 +147,7 @@             , fragmentLine = 4             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 777, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 777, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/richParagraphLayout/mixedSizes.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1651, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1651, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -21,6 +22,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "smallBox1", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 1651, y_origin = 0, x_size = 1956, y_size = -841}             , fragmentRect = Rect {x_origin = 1651, y_origin = 0, x_size = 1956, y_size = -841}             , fragmentPen = (0, -699)             , fragmentGlyphs =@@ -37,6 +39,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 3607, y_origin = 0, x_size = 1651, y_size = -1121}             , fragmentRect = Rect {x_origin = 3607, y_origin = 0, x_size = 1651, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -52,6 +55,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "smallBox2", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 5258, y_origin = 0, x_size = 1956, y_size = -841}             , fragmentRect = Rect {x_origin = 5258, y_origin = 0, x_size = 1956, y_size = -841}             , fragmentPen = (0, -699)             , fragmentGlyphs =@@ -68,6 +72,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 7214, y_origin = 0, x_size = 1420, y_size = -1121}             , fragmentRect = Rect {x_origin = 7214, y_origin = 0, x_size = 1420, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/richParagraphLayout/nestedBoxes.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8569, y_size = -1121}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8569, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -37,6 +38,7 @@                 [ AncestorBox {boxUserData = "box3", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}                 , AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}                 ]+            , fragmentContentRect = Rect {x_origin = 8569, y_origin = 0, x_size = 3350, y_size = -1121}             , fragmentRect = Rect {x_origin = 8569, y_origin = 0, x_size = 3350, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =@@ -55,6 +57,7 @@             , fragmentAncestorBoxes =                 [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}                 ]+            , fragmentContentRect = Rect {x_origin = 11919, y_origin = 0, x_size = 2657, y_size = -1121}             , fragmentRect = Rect {x_origin = 11919, y_origin = 0, x_size = 2657, y_size = -1121}             , fragmentPen = (0, -932)             , fragmentGlyphs =
.golden/richParagraphLayout/neutralDirectionLTR.golden view
@@ -6,6 +6,7 @@             , fragmentLine = 1             , fragmentAncestorBoxes =                 []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}             , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =
.golden/richParagraphLayout/neutralDirectionRTL.golden view
@@ -1,12 +1,13 @@ ParagraphLayout-    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}+    { paragraphRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500}     , paragraphFragments =         [ Fragment             { fragmentUserData = "text"             , fragmentLine = 1             , fragmentAncestorBoxes =                 []-            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}+            , fragmentContentRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500}             , fragmentPen = (0, -1085)             , fragmentGlyphs =                 [ (GlyphInfo {codepoint = 147, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 600, y_advance = 0, x_offset = 0, y_offset = 0})
+ .golden/richParagraphLayout/newline1Paragraph.golden view
@@ -0,0 +1,16 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                []+            }+        ]+    }
+ .golden/richParagraphLayout/newline1TextParagraph.golden view
@@ -0,0 +1,28 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 999999649, y_origin = 0, x_size = 351, y_size = -3000}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 999999649, y_origin = -1500, x_size = 351, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999999649, y_origin = -1500, x_size = 351, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 26, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
+ .golden/richParagraphLayout/newline2Paragraph.golden view
@@ -0,0 +1,27 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -3000}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                []+            }+        ]+    }
+ .golden/richParagraphLayout/newline2TextParagraph.golden view
@@ -0,0 +1,39 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 999999649, y_origin = 0, x_size = 351, y_size = -4500}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}+            , fragmentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "text"+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 999999649, y_origin = -3000, x_size = 351, y_size = -1500}+            , fragmentRect = Rect {x_origin = 999999649, y_origin = -3000, x_size = 351, y_size = -1500}+            , fragmentPen = (0, -1085)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 26, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
+ .golden/richParagraphLayout/spaceBoxCollapsed.golden view
@@ -0,0 +1,101 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 590, y_size = -8968}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 4+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 5+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text3"+            , fragmentLine = 6+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 589, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 589, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text3"+            , fragmentLine = 7+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 590, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 590, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text3"+            , fragmentLine = 8+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 511, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 511, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
+ .golden/richParagraphLayout/spaceBoxMiddle.golden view
@@ -0,0 +1,48 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 4635, y_size = -1121}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2581, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2581, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text2"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}+                ]+            , fragmentContentRect = Rect {x_origin = 2631, y_origin = 0, x_size = 231, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2631, y_origin = 0, x_size = 231, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 3, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text3"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 2962, y_origin = 0, x_size = 1673, y_size = -1121}+            , fragmentRect = Rect {x_origin = 2962, y_origin = 0, x_size = 1673, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 573, y_advance = 0, x_offset = 0, y_offset = 0})+                , (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
+ .golden/richParagraphLayout/spaceBoxPreserved.golden view
@@ -0,0 +1,113 @@+ParagraphLayout+    { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 590, y_size = -10089}+    , paragraphFragments =+        [ Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 1+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 2+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 3+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 4+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text1"+            , fragmentLine = 5+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text2"+            , fragmentLine = 6+            , fragmentAncestorBoxes =+                [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}+                ]+            , fragmentContentRect = Rect {x_origin = 50, y_origin = -5605, x_size = 0, y_size = -1121}+            , fragmentRect = Rect {x_origin = 50, y_origin = -5605, x_size = 0, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                []+            }+        , Fragment+            { fragmentUserData = "text3"+            , fragmentLine = 7+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 589, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 589, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text3"+            , fragmentLine = 8+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 590, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 590, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        , Fragment+            { fragmentUserData = "text3"+            , fragmentLine = 9+            , fragmentAncestorBoxes =+                []+            , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 511, y_size = -1121}+            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 511, y_size = -1121}+            , fragmentPen = (0, -932)+            , fragmentGlyphs =+                [ (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+                ]+            }+        ]+    }
+ .golden/shapedRuns/intraWordBreak.fontInfo view
@@ -0,0 +1,1 @@+assets/fonts/plex/IBMPlexSansArabic-Regular.ttf 0 32,32 32,32
+ .golden/shapedRuns/intraWordBreak.golden view
@@ -0,0 +1,19 @@+[ (3, -35, +    [ (GlyphInfo {codepoint = 373, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 971, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 407, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 89, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 1363, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 373, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 971, cluster = 2, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 407, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+    ])+, (18, -83, +    [ (GlyphInfo {codepoint = 1363, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 373, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 971, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 407, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 89, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 1363, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})+    ])+]
.golden/shapedRuns/mixedDirectionComplexRTL.golden view
@@ -1,31 +1,17 @@-[ (0, -35, -    [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 3, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 90, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 3, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 517, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 27, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 955, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 15, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 147, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 3, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 90, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 3, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 971, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 394, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 3, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})-    , (GlyphInfo {codepoint = 147, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})+[ (7, -35, +    [ (GlyphInfo {codepoint = 147, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 90, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     ])-, (212, -35, +, (51, -35,      [ (GlyphInfo {codepoint = 3, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 147, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 90, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     ])-, (264, -35, +, (103, -35,      [ (GlyphInfo {codepoint = 26, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 11, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 27, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})@@ -36,7 +22,7 @@     , (GlyphInfo {codepoint = 27, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 26, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 11, y_advance = 0, x_offset = 0, y_offset = 0})     ])-, (374, -35, +, (213, -35,      [ (GlyphInfo {codepoint = 3, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 147, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})@@ -57,14 +43,14 @@     , (GlyphInfo {codepoint = 90, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     ])-, (581, -35, +, (420, -35,      [ (GlyphInfo {codepoint = 3, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 147, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 90, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     ])-, (633, -35, +, (472, -35,      [ (GlyphInfo {codepoint = 4, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 17, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 6, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})@@ -75,10 +61,25 @@     , (GlyphInfo {codepoint = 6, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 4, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 17, y_advance = 0, x_offset = 0, y_offset = 0})     ])-, (757, -35, +, (596, -35,      [ (GlyphInfo {codepoint = 3, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 147, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 3, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     , (GlyphInfo {codepoint = 90, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})+    ])+, (480, -83, +    [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 3, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 90, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 3, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 517, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 27, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 955, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 15, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 147, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 3, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 90, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 3, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 971, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})+    , (GlyphInfo {codepoint = 394, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})     ]) ]
CHANGELOG.md view
@@ -1,5 +1,38 @@ # Revision history for Balkón +## 1.2.0.0 -- 2023-06-28++* Added options for horizontal paragraph alignment:+  start, end, left, right, centre.++    * For backwards compatibility, left alignment remains the default.+      Consider updating your code to use start alignment instead.++* Added option to prevent making boxes invisible when they contain no glyphs+  and no forced (hard) line breaks.++* Added `fragmentContentRect` to provide a popular (though unstandardised)+  way of determining the content area of inline elements.++* Added function `paragraphSafeWidth` to help calculating max-content width+  for CSS.++* Trimmed white space at the beginning and end of lines may now generate+  fragments with zero glyphs, to more closely match CSS behaviour.+  These fragments may affect line height and/or the start edge of boxes.++* Text will now overflow the end edge of the paragraph according to the+  text direction of the root box, instead of always overflowing the right edge.++* Fixed a bug where only the height of the shortest fragment on a line+  would be considered when positioning the following line.++* Removed `paragraphLineHeight` from the rich text interface+  after it was included by mistake.+  Rich text needs to use `textLineHeight` instead.++* Exposed functions for calculating rectangle unions.+ ## 1.1.0.0 -- 2023-05-31  * Updated support for bidirectional text:
balkon.cabal view
@@ -14,7 +14,7 @@ -- PVP summary:     +-+------- breaking API changes --                  | | +----- non-breaking API additions --                  | | | +--- code changes with no API change-version:            1.1.0.0+version:            1.2.0.0  stability:          experimental @@ -114,7 +114,9 @@         Data.Text.ParagraphLayout.Internal.LineHeight,         Data.Text.ParagraphLayout.Internal.LinePagination,         Data.Text.ParagraphLayout.Internal.Paginable,+        Data.Text.ParagraphLayout.Internal.ParagraphAlignment,         Data.Text.ParagraphLayout.Internal.ParagraphConstruction,+        Data.Text.ParagraphLayout.Internal.ParagraphLine,         Data.Text.ParagraphLayout.Internal.ParagraphOptions,         Data.Text.ParagraphLayout.Internal.Plain,         Data.Text.ParagraphLayout.Internal.Plain.Paragraph,@@ -136,12 +138,13 @@     -- Modules used purely internally and not in any tests.     other-modules:         Data.Text.ParagraphLayout.Internal.Layout,+        Data.Text.ParagraphLayout.Internal.LineNumbers,         Data.Text.ParagraphLayout.Internal.ParagraphExtents,-        Data.Text.ParagraphLayout.Internal.ParagraphLine,         Data.Text.ParagraphLayout.Internal.ProtoFragment,         Data.Text.ParagraphLayout.Internal.ProtoLine,         Data.Text.ParagraphLayout.Internal.ProtoRun,-        Data.Text.ParagraphLayout.Internal.Script+        Data.Text.ParagraphLayout.Internal.Script,+        Data.Text.ParagraphLayout.Internal.SplitList      build-depends:         base >=4.12 && < 4.16,
lib/Data/Text/ParagraphLayout/Rect.hs view
@@ -10,6 +10,10 @@     , y_max     , y_min     , y_terminus+    , union+    , unionMany+    , unionMany1+    , Bias (LL, LH, HL, HH)     ) where 
lib/Data/Text/ParagraphLayout/Rich.hs view
@@ -5,6 +5,14 @@     -- * Input paragraph     ( Paragraph (Paragraph)     , constructParagraph+    , ParagraphAlignment+        ( AlignStart+        , AlignEnd+        , AlignLeft+        , AlignRight+        , AlignCentreH+        )+    , BoxCollapse (AllowBoxCollapse, AvoidBoxCollapse)     , BoxSpacing (BoxSpacingLeftRight)     , LineHeight (Absolute, Normal)     , ParagraphOptions@@ -12,7 +20,7 @@     -- ** Paragraph options     -- | These are record selectors that can be used for reading     -- as well as updating specific option fields.-    , paragraphLineHeight+    , paragraphAlignment     , paragraphMaxWidth     -- NOTE: `paragraphFont` is only used by the legacy plain text interface,     --       and is therefore not exported here.@@ -20,6 +28,8 @@     , RootNode (RootBox)     , InnerNode (InlineBox, TextSequence)     , Box (Box)+    , EmptyText+    , strut     , BoxOptions     , defaultBoxOptions     , TextOptions@@ -28,6 +38,8 @@     -- | These are record selectors that can be used for reading     -- as well as updating specific option fields.     , boxSpacing+    , boxCollapse+    , activateBoxSpacing     -- ** Text options     -- | These are record selectors that can be used for reading     -- as well as updating specific option fields.@@ -42,11 +54,13 @@     -- * Output layout     , layoutRich     , ParagraphLayout (ParagraphLayout, paragraphRect, paragraphFragments)+    , paragraphSafeWidth     , Fragment         ( Fragment         , fragmentUserData         , fragmentLine         , fragmentAncestorBoxes+        , fragmentContentRect         , fragmentRect         , fragmentPen         , fragmentGlyphs@@ -68,6 +82,7 @@ import Data.Text.ParagraphLayout.Internal.BoxOptions import Data.Text.ParagraphLayout.Internal.Fragment import Data.Text.ParagraphLayout.Internal.LineHeight+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment import Data.Text.ParagraphLayout.Internal.ParagraphOptions import Data.Text.ParagraphLayout.Internal.Rich import Data.Text.ParagraphLayout.Internal.Rich.Paragraph
src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs view
@@ -2,6 +2,8 @@     ( Level     , TextLevels (TextLevels)     , WithLevel+    , baseLevel+    , directionLevel     , dropLevels     , firstStrongDirection     , headLevel@@ -27,22 +29,28 @@ class WithLevel a where     level :: a -> Level --- | BiDi levels for each character from a given input text.+-- | BiDi levels for each character from a given input text,+-- plus the base level (for safe handling of empty text runs). -- -- This wrapper is meant to ease the transition to a different internal -- representation, if required when integrating with the ICU.-newtype TextLevels = TextLevels [Level]+data TextLevels = TextLevels [Level] Level     deriving (Eq, Show)  headLevel :: TextLevels -> Level-headLevel (TextLevels xs) = head xs+headLevel (TextLevels xs base) = case xs of+    [] -> base+    (x : _) -> x  tailLevels :: TextLevels -> TextLevels-tailLevels (TextLevels xs) = TextLevels (tail xs)+tailLevels (TextLevels xs base) = TextLevels (tail xs) base  dropLevels :: Int -> TextLevels -> TextLevels-dropLevels n (TextLevels xs) = TextLevels (drop n xs)+dropLevels n (TextLevels xs base) = TextLevels (drop n xs) base +baseLevel :: TextLevels -> Level+baseLevel (TextLevels _ base) = base+ -- | Determine the BiDi level of each character in the input text -- using a simplified algorithm with the following main limitations: --@@ -56,25 +64,26 @@ -- -- TODO: Use Haskell bindings to the ICU BiDi implementation once available. textLevels :: Direction -> Text -> TextLevels-textLevels baseDir txt = TextLevels $ textLevels' baseLevel baseLevel 0 txt+textLevels baseDir txt =+    TextLevels (textLevels' base base 0 txt) base     where-        baseLevel = directionLevel 0 baseDir+        base = directionLevel 0 baseDir  -- | Determine the BiDi level of each character in the input text -- using a simplified algorithm. textLevels' :: Level -> Level -> Int -> Text -> [Level]-textLevels' baseLevel previousLevel neutrals txt = case uncons txt of-    Just (char, rest) -> case charLevel baseLevel char of+textLevels' base previousLevel neutrals txt = case uncons txt of+    Just (char, rest) -> case charLevel base char of         Just currentLevel ->-            replicate neutrals (mergeLevel baseLevel previousLevel currentLevel)+            replicate neutrals (mergeLevel base previousLevel currentLevel)             ++             currentLevel             :-            textLevels' baseLevel currentLevel 0 rest+            textLevels' base currentLevel 0 rest         Nothing ->-            textLevels' baseLevel previousLevel (neutrals + 1) rest+            textLevels' base previousLevel (neutrals + 1) rest     Nothing ->-        replicate neutrals baseLevel+        replicate neutrals base  -- | Determine the level of a neutral character based on its surrounding levels. mergeLevel :: Level -> Level -> Level -> Level@@ -94,12 +103,12 @@ -- | Determine the BiDi level of one character -- using a simplified algorithm. charLevel :: Level -> Char -> Maybe Level-charLevel baseLevel c = case simpleType c of-    StrongLTR -> Just $ directionLevel baseLevel DirLTR-    StrongRTL -> Just $ directionLevel baseLevel DirRTL-    Number -> Just $ directionLevel (baseLevel + 1) DirLTR+charLevel base c = case simpleType c of+    StrongLTR -> Just $ directionLevel base DirLTR+    StrongRTL -> Just $ directionLevel base DirRTL+    Number -> Just $ directionLevel (base + 1) DirLTR     Neutral -> Nothing-    Reset -> Just baseLevel+    Reset -> Just base  -- | Reduce the character's BiDi class into a simpler category -- for the purposes of the simplified algorithm.
src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs view
@@ -1,6 +1,8 @@ module Data.Text.ParagraphLayout.Internal.BoxOptions-    ( BoxOptions (..)+    ( BoxCollapse (..)+    , BoxOptions (..)     , BoxSpacing (..)+    , activateBoxSpacing     , defaultBoxOptions     ) where@@ -20,7 +22,16 @@     --     -- This can be used to reserve space for a left margin, border,     -- and/or padding.+    --+    -- In order to get CSS-compliant behaviour, consider using+    -- `activateBoxSpacing` instead. +    , boxCollapse :: BoxCollapse+    -- ^ Determines how this box affects the height of a line that would+    -- otherwise be empty.++    -- TODO: textVerticalAlign+     }     deriving (Eq) @@ -45,8 +56,56 @@      deriving (Eq, Show, Read) +-- | Determines how an inline box affects the height of a line that would+-- otherwise be empty.+--+-- Note that for this setting to have any effect, the box must be the ancestor+-- of at least one (possibly empty) text sequence, so that it can generate+-- a `Data.Text.ParagraphLayout.Rich.Fragment`.+--+-- For CSS-compliant behaviour:+--+-- - Ensure that empty boxes contain empty text sequences as mentioned above.+--   This can be achieved using the `Data.Text.ParagraphLayout.Rich.strut`+--   function.+--+-- - Set `AllowBoxCollapse` for boxes with zero margins, padding,+--   and borders.+--+-- - Set `AvoidBoxCollapse` for boxes with non-zero margins, padding,+--   or borders.+--+-- Note that `BoxSpacing` may contain zero values even when calculated from+-- non-zero CSS values, because of rounding to integer values and/or because+-- of adding together positive and negative values that cancel out. You should+-- therefore compare the individual computed values for margins, padding, and+-- borders with zero, and set `boxCollapse` to `AllowBoxCollapse` if and only+-- if all these values are equal to zero.+data BoxCollapse++    = AllowBoxCollapse+    -- ^ The box should disappear when possible to make empty lines invisible.++    | AvoidBoxCollapse+    -- ^ The box should be preserved when possible, making lines visible+    -- even when they would otherwise be empty.++    deriving (Eq, Read, Show)+ -- | `BoxOptions` with default values. defaultBoxOptions :: BoxOptions defaultBoxOptions = BoxOptions     { boxSpacing = BoxSpacingLeftRight 0 0+    , boxCollapse = AllowBoxCollapse+    }++-- | Shorthand for updating `boxSpacing` and setting `boxCollapse`+-- to `AvoidBoxCollapse`.+--+-- Can be used to activate CSS-compliant rendering of empty boxes whose+-- spacing is calculated from non-zero values.+activateBoxSpacing :: BoxSpacing -> BoxOptions -> BoxOptions+activateBoxSpacing spacing boxOptions = boxOptions+    { boxSpacing = spacing+    , boxCollapse = AvoidBoxCollapse     }
src/Data/Text/ParagraphLayout/Internal/Break.hs view
@@ -8,6 +8,7 @@ module Data.Text.ParagraphLayout.Internal.Break     ( LineBreak (..)     , locale+    , breaksAsc     , breaksDesc     , subOffsetsDesc     )@@ -19,7 +20,9 @@     ( Break     , Breaker     , LocaleName (Locale)+    , breaks     , breaksRight+    , brkBreak     , brkPrefix     , brkStatus     )@@ -49,6 +52,16 @@         -- This filter is here just to stop syntactically incorrect input.         clean = takeWhile (`elem` ['A' .. 'Z'] ++ ['a' .. 'z'] ++ "_-") +-- | List of all breaks in the given text, with offsets in ascending order,+-- including the status of the break if applicable.+--+-- Excludes the start of the text (with offset 0).+--+-- Includes the end of the text (with offset equal to the text length)+-- as the last list item.+breaksAsc :: Breaker a -> Text -> [(Int, a)]+breaksAsc breaker input = map brkEndOffsetStatus $ breaks breaker input+ -- | List of all breaks in the given text, with offsets in descending order, -- including the status of the break if applicable. --@@ -61,11 +74,20 @@ brkStartOffsetStatus :: Break a -> (Int, a) brkStartOffsetStatus brk = (brkStartOffset brk, brkStatus brk) +brkEndOffsetStatus :: Break a -> (Int, a)+brkEndOffsetStatus brk = (brkEndOffset brk, brkStatus brk)+ -- | The ICU library returns "breaks" as slices of text with two boundaries. -- This gives the smaller of the two distances from the start of the text -- to the boundaries of the break. brkStartOffset :: Break a -> Int brkStartOffset brk = lengthWord8 (brkPrefix brk)++-- | The ICU library returns "breaks" as slices of text with two boundaries.+-- This gives the larger of the two distances from the start of the text+-- to the boundaries of the break.+brkEndOffset :: Break a -> Int+brkEndOffset brk = lengthWord8 (brkPrefix brk) + lengthWord8 (brkBreak brk)  -- | Given a list of offsets into a text in descending order, produce a list of -- corresponding offsets into a slice of the text starting at a given offset.
src/Data/Text/ParagraphLayout/Internal/Fragment.hs view
@@ -3,6 +3,7 @@     , ShapedRun     , fragmentSpacedRect     , shapedRun+    , shiftFragment     ) where @@ -36,6 +37,15 @@     -- (starting from the nearest ancestor and continuing upwards through the     -- tree, up to but excluding the root) and the spacing required by them. +    , fragmentContentRect :: Rect Int32+    -- ^ Physical position of the fragment within the paragraph, calculated+    -- using all glyph advances in this fragment and the used font's ascent+    -- and descent metrics.+    --+    -- This is commonly used as the /content area/ of inline elements in+    -- web browsers, although this behaviour is not specified in CSS 2+    -- nor in CSS Inline Layout Module Level 3.+     , fragmentRect :: Rect Int32     -- ^ Physical position of the fragment within the paragraph, calculated     -- using all glyph advances in this fragment and the calculated line height.@@ -52,7 +62,10 @@     --     -- The origin coordinates are relative to the paragraph.     ---    -- This is the CSS equivalent of /content box/, before adding box spacing.+    -- The vertical extent of this rectangle is the equivalent of+    -- /layout bounds/ defined by CSS.+    --+    -- Box spacing is not included.      , fragmentPen :: (Int32, Int32)     -- ^ Coordinates of the initial pen position, from which the first glyph@@ -95,4 +108,15 @@         y = y_origin r + py         g = fragmentGlyphs f         (px, py) = fragmentPen f+        r = fragmentRect f++-- | Add @dx@ and @dy@ to the fragment's `x_origin` and `y_origin`,+-- respectively.+shiftFragment :: Int32 -> Int32 -> Fragment d -> Fragment d+shiftFragment dx dy f = f'+    where+        f' = f { fragmentContentRect = cr', fragmentRect = r' }+        cr' = cr { x_origin = x_origin r + dx, y_origin = y_origin r + dy }+        cr = fragmentContentRect f+        r' = r { x_origin = x_origin r + dx, y_origin = y_origin r + dy }         r = fragmentRect f
src/Data/Text/ParagraphLayout/Internal/Layout.hs view
@@ -10,12 +10,12 @@ import Data.List (mapAccumL) import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty, (<|)) import qualified Data.List.NonEmpty as NonEmpty-import Data.Maybe (catMaybes, fromMaybe)+import Data.Maybe (fromMaybe) import Data.Text.Foreign (lengthWord8) import Data.Text.Glyphize     ( Buffer (..)     , ContentType (ContentTypeUnicode)-    , Direction (DirLTR, DirRTL)+    , Direction (DirLTR, DirRTL, DirTTB, DirBTT)     , FontExtents (..)     , GlyphInfo     , GlyphPos@@ -32,6 +32,7 @@ import Data.Text.ParagraphLayout.Internal.Break import Data.Text.ParagraphLayout.Internal.Fragment import Data.Text.ParagraphLayout.Internal.LineHeight+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment import Data.Text.ParagraphLayout.Internal.ParagraphExtents import qualified Data.Text.ParagraphLayout.Internal.ProtoFragment as PF import qualified Data.Text.ParagraphLayout.Internal.ProtoLine as PL@@ -39,6 +40,7 @@ import qualified Data.Text.ParagraphLayout.Internal.ResolvedBox as RB import qualified Data.Text.ParagraphLayout.Internal.ResolvedSpan as RS import Data.Text.ParagraphLayout.Internal.Run+import Data.Text.ParagraphLayout.Internal.SplitList import Data.Text.ParagraphLayout.Internal.TextContainer import Data.Text.ParagraphLayout.Internal.TextOptions import Data.Text.ParagraphLayout.Internal.WithSpan@@ -54,32 +56,34 @@ -- necessary to fit within the requested line width. -- -- The output is a flat list of fragments positioned in both dimensions.-layoutAndAlignLines :: Int32 -> NonEmpty (WithSpan d Run) ->-    [FragmentWithSpan d]-layoutAndAlignLines maxWidth runs = frags+layoutAndAlignLines+    :: Direction+    -> ParagraphAlignment+    -> Int32+    -> NonEmpty (WithSpan d Run)+    -> [FragmentWithSpan d]+layoutAndAlignLines dir align maxWidth runs = frags     where-        frags = concatMap NonEmpty.toList fragsInLines-        (_, fragsInLines) = mapAccumL positionLineH originY numberedLines+        frags = concatMap toList fragsInLines+        (_, fragsInLines) = mapAccumL positionLine originY numberedLines+        positionLine = positionLineH dir align maxWidth         numberedLines = zip [1 ..] canonicalLines-        canonicalLines = fmap reorderProtoFragments logicalLines-        logicalLines = nonEmptyItems $ layoutLines maxWidth [] runs+        canonicalLines = fmap reorderProtoFragments visibleLines+        visibleLines = filter PL.visible logicalLines+        logicalLines = toList $ layoutLines maxWidth [] runs         originY = paragraphOriginY  reorderProtoFragments :: PL.ProtoLine NonEmpty d -> PL.ProtoLine NonEmpty d reorderProtoFragments pl@(PL.ProtoLine { PL.protoFragments = pfs }) =     pl { PL.protoFragments = reorder pfs } -nonEmptyItems :: Foldable t =>-    t (PL.ProtoLine [] d) -> [PL.ProtoLine NonEmpty d]-nonEmptyItems = catMaybes . map PL.nonEmpty . toList- -- | Create a multi-line layout from the given runs, splitting them as -- necessary to fit within the requested line width. -- -- The output is a two-dimensional list of fragments positioned along the -- horizontal axis. layoutLines :: Int32 -> [RB.ResolvedBox d] -> NonEmpty (WithSpan d Run) ->-    NonEmpty (PL.ProtoLine [] d)+    NonEmpty (PL.ProtoLine NonEmpty d) layoutLines maxWidth openBoxes runs = case nonEmpty rest of         -- Everything fits. We are done.         Nothing -> fitting :| []@@ -87,12 +91,9 @@         Just runs' -> fitting <| layoutLines maxWidth openBoxes' runs'     where         (fitting, rest) = layoutAndWrapRunsH maxWidth openBoxes runs-        -- Update the list of open boxes using the logically last run on this-        -- line, if there is one.-        openBoxes' =-            openBoxes `fromMaybe` lastSpanBoxes (PL.protoFragments fitting)---- TODO: Allow a run across multiple spans (e.g. if they only differ by colour).+        -- Update the list of open boxes using the logically last run+        -- on this line.+        openBoxes' = lastSpanBoxes $ PL.protoFragments fitting  -- | Position all the given horizontal fragments on the same line, -- using @originY@ as its top edge, and return the bottom edge for continuation.@@ -101,16 +102,58 @@ -- @vertical-align: top@ in CSS. -- -- TODO: For rich text, allow other types of vertical alignment.-positionLineH :: Int32 -> (Int, PL.ProtoLine NonEmpty d) ->-    (Int32, NonEmpty (FragmentWithSpan d))-positionLineH originY (num, pl) = (nextY, frags)+positionLineH+    :: Direction+    -> ParagraphAlignment+    -> Int32+    -> Int32+    -> (Int, PL.ProtoLine NonEmpty d)+    -> (Int32, NonEmpty (FragmentWithSpan d))+positionLineH dir align maxWidth originY (num, pl) = (nextY, frags)     where-        nextY = maximum $ fmap y_min rects+        nextY = minimum $ fmap y_min rects         rects = fmap (\ (WithSpan _ r) -> fragmentRect r) frags         (_, frags) = mapAccumL (positionFragmentH num originY) originX wpfs         wpfs = PL.applyBoxes pl-        originX = paragraphOriginX+        originX = paragraphOriginX + if lineWidth > maxWidth+            then overflowingLineOffset dir (lineWidth - maxWidth)+            else fittingLineOffset align dir (maxWidth - lineWidth)+        lineWidth = PL.width pl +-- | Inline offset of the first fragment on a line that overflows.+overflowingLineOffset :: Direction -> Int32 -> Int32+overflowingLineOffset DirLTR _ = 0+overflowingLineOffset DirTTB _ = 0+overflowingLineOffset DirRTL excess = -excess+-- TODO: Check if the sign needs to be flipped for vertical text.+overflowingLineOffset DirBTT excess = -excess++-- | Inline offset of the first fragment on a line with extra blank space.+fittingLineOffset :: ParagraphAlignment -> Direction -> Int32 -> Int32+fittingLineOffset AlignLeft _ = leftAlignOffset+fittingLineOffset AlignRight _ = rightAlignOffset+fittingLineOffset AlignCentreH _ = centreAlignOffset+fittingLineOffset AlignStart DirLTR = leftAlignOffset+fittingLineOffset AlignEnd DirLTR = rightAlignOffset+fittingLineOffset AlignStart DirRTL = rightAlignOffset+fittingLineOffset AlignEnd DirRTL = leftAlignOffset+-- For completeness, treat vertical directions as horizontal directions+-- rotated 90° clockwise, thus left becomes top and right becomes bottom.+-- TODO: Verify this when vertical text is implemented.+fittingLineOffset AlignStart DirTTB = leftAlignOffset+fittingLineOffset AlignEnd DirTTB = rightAlignOffset+fittingLineOffset AlignStart DirBTT = rightAlignOffset+fittingLineOffset AlignEnd DirBTT = leftAlignOffset++leftAlignOffset :: Int32 -> Int32+leftAlignOffset _ = 0++rightAlignOffset :: Int32 -> Int32+rightAlignOffset slack = slack++centreAlignOffset :: Int32 -> Int32+centreAlignOffset slack = slack `div` 2+ -- | Position the given horizontal fragment on a line, -- using @originY@ as its top edge and @originX@ as its left edge, -- returning the X coordinate of its right edge for continuation.@@ -124,9 +167,19 @@         contentWidth = PF.advance pf         leftSpacing = totalLeftSpacing bs         rightSpacing = totalRightSpacing bs-        frag = Fragment userData line bs rect (penX, penY) (PF.glyphs pf)+        frag = Fragment+            { fragmentUserData = userData+            , fragmentLine = line+            , fragmentAncestorBoxes = bs+            , fragmentContentRect = contentRect+            , fragmentRect = rect+            , fragmentPen = (penX, penY)+            , fragmentGlyphs = (PF.glyphs pf)+            }         userData = RS.spanUserData rs         bs = ancestorBoxes lbs rbs rs+        contentRect = Rect contentX contentY contentWidth (-normalLineHeight)+        contentY = originY + penY + ascent         rect = Rect contentX originY contentWidth (-lineHeight)         penX = 0         penY = descent + leading `div` 2 - lineHeight@@ -183,7 +236,7 @@     :: Int32     -> [RB.ResolvedBox d]     -> NonEmpty (WithSpan d Run)-    -> (PL.ProtoLine [] d, [WithSpan d Run])+    -> (PL.ProtoLine NonEmpty d, [WithSpan d Run]) layoutAndWrapRunsH maxWidth prevOpenBoxes runs = NonEmpty.head $ validProtoLines     where         validProtoLines = dropWhile1 tooLong layouts@@ -202,9 +255,9 @@ -- to determine `PL.nextOpenBoxes`. protoLine     :: [RB.ResolvedBox d]-    -> [ProtoFragmentWithSpan d]+    -> NonEmpty (ProtoFragmentWithSpan d)     -> [WithSpan d Run]-    -> PL.ProtoLine [] d+    -> PL.ProtoLine NonEmpty d protoLine prev pfs rest = PL.ProtoLine pfs prev next     where         next = [] `fromMaybe` firstSpanBoxes rest@@ -214,10 +267,9 @@     [] -> Nothing     (WithSpan rs _) : _ -> Just $ RS.spanBoxes rs -lastSpanBoxes :: [WithSpan d a] -> Maybe [RB.ResolvedBox d]-lastSpanBoxes xs = case reverse xs of-    [] -> Nothing-    (WithSpan rs _) : _ -> Just $ RS.spanBoxes rs+lastSpanBoxes :: NonEmpty (WithSpan d a) -> [RB.ResolvedBox d]+lastSpanBoxes xs = case NonEmpty.last xs of+    WithSpan rs _ -> RS.spanBoxes rs  -- | Treat a list of runs as a contiguous sequence, and split them into two -- lists so that the first list contains as many non-whitespace characters as@@ -228,25 +280,39 @@ -- output list will contain a run of zero characters. This can be used to -- correctly size an empty line. --+-- If there is a hard line break in the input, the run containing it will have+-- its `runHardBreak` set to `True`.+-- -- If there is no hard line break in the input, the first output list will -- contain the whole input, and the second output list will be empty.-hardSplit :: NonEmpty (WithSpan d Run) -> ([WithSpan d Run], [WithSpan d Run])-hardSplit runs = allowFstEmpty $ trimFst $ NonEmpty.last $ splits+hardSplit :: NonEmpty (WithSpan d Run) ->+    (NonEmpty (WithSpan d Run), [WithSpan d Run])+hardSplit runs = case reverse hSplits of+    [] -> noSplit+    (splitRuns : _) -> forcedSplit splitRuns     where-        trimFst (runs1, runs2) = (trim runs1, runs2)+        noSplit = (trim runs, [])+        forcedSplit (runs1, runs2) = (markHard $ trim runs1, runs2)+        markHard = mapLast markHard'+        markHard' (WithSpan rs x) = WithSpan rs x { runHardBreak = True }         trim-            = trimTextsStartPreserve isStartSpace-            . trimTextsEndPreserve isEndSpace-            . trimTextsEndPreserve isNewline+            = dropWhileStartCascade isStartSpace+            . dropWhileEndCascade isEndSpace+            . dropWhileEndCascade isNewline         -- TODO: Consider optimising.         --       We do not need to look for any line breaks further than the         --       shortest hard break.-        splits = noSplit :| map allowSndEmpty hSplits-        noSplit = (runs, [])-        hSplits = -- from longest to shortest+        hSplits = nonEmptyFsts $+            -- from longest to shortest             splitTextsBy (map fst . filter isHard . runLineBreaks) runs         isHard (_, status) = status == BreakStatus.Hard +-- | Apply a function to the last element of the non-empty list.+mapLast :: (a -> a) -> NonEmpty a -> NonEmpty a+mapLast f xs = case NonEmpty.uncons xs of+    (x, Nothing) -> f x :| []+    (x, Just rest) -> NonEmpty.cons x $ mapLast f rest+ -- | Treat a list of runs as a contiguous sequence, -- and find all possible ways to split them into two non-empty lists, -- using soft line break opportunities (typically after words) and then@@ -260,23 +326,21 @@ -- closer to the start of the list are preferred for line breaking, but without -- considering overflows. softSplits :: NonEmpty (WithSpan d Run) ->-    [([WithSpan d Run], [WithSpan d Run])]+    [(NonEmpty (WithSpan d Run), [WithSpan d Run])] softSplits runs = map (allowSndEmpty . trimFst) splits     where         trimFst (runs1, runs2) = (trim runs1, runs2)-        trim = trimTextsStart isStartSpace . trimTextsEnd isEndSpace+        trim+            = dropWhileStartCascade isStartSpace+            . dropWhileEndCascade isEndSpace         splits = lSplits ++ cSplits-        lSplits = splitTextsBy (map fst . runLineBreaks) runs+        lSplits = nonEmptyPairs $+            splitTextsBy (map fst . runLineBreaks) runs         -- TODO: Consider optimising.         --       We do not need to look for character breaks further than the         --       shortest line break.-        cSplits = splitTextsBy (map fst . runCharacterBreaks) runs--allowFstEmpty :: (NonEmpty a, b) -> ([a], b)-allowFstEmpty (a, b) = (NonEmpty.toList a, b)--allowSndEmpty :: (a, NonEmpty b) -> (a, [b])-allowSndEmpty (a, b) = (a, NonEmpty.toList b)+        cSplits = nonEmptyPairs $+            splitTextsBy (map fst . runCharacterBreaks) runs  -- | The suffix remaining after removing the longest prefix of the list for -- which the predicate holds, except always including at least the last element@@ -290,17 +354,18 @@  -- | Calculate layout for multiple horizontal runs on the same line, without -- any breaking.-layoutRunsH :: [WithSpan d Run] -> [ProtoFragmentWithSpan d]-layoutRunsH runs = map layoutRunH runs+layoutRunsH :: Functor f => f (WithSpan d Run) -> f (ProtoFragmentWithSpan d)+layoutRunsH runs = fmap layoutRunH runs  -- | Calculate layout for the given horizontal run and attach extra information. layoutRunH :: WithSpan d Run -> ProtoFragmentWithSpan d layoutRunH (WithSpan rs run) = WithSpan rs pf     where-        pf = PF.protoFragmentH dir lvl glyphs+        pf = PF.protoFragmentH dir lvl glyphs hard         glyphs = shapeRun (WithSpan rs run)         dir = runDirection run         lvl = runLevel run+        hard = runHardBreak run  -- | Calculate layout for the given run independently of its position. shapeRun :: WithSpan d Run -> [(GlyphInfo, GlyphPos)]@@ -341,7 +406,7 @@ runBreaksFromSpan run spanBreaks =     dropWhile (not . valid) $ subOffsetsDesc (runOffsetInSpan run) spanBreaks     where-        valid (off, _) = off < runLength+        valid (off, _) = off <= runLength         runLength = lengthWord8 $ getText run  -- | Predicate for characters that can be potentially removed from the
+ src/Data/Text/ParagraphLayout/Internal/LineNumbers.hs view
@@ -0,0 +1,23 @@+module Data.Text.ParagraphLayout.Internal.LineNumbers+    ( LineNumbers+    , lineNumbers+    , lineNumbersWithDuplication+    )+where++import qualified Data.List.NonEmpty as NonEmpty++-- | Data types that contain numbered lines.+class LineNumbers ml where++    -- | A list of all line numbers in ascending order,+    -- with possible duplicates.+    lineNumbersWithDuplication :: ml -> [Int]++-- | A list of all unique line numbers, in ascending order.+lineNumbers :: (LineNumbers ml) => ml -> [Int]+lineNumbers ml = dedupe $ lineNumbersWithDuplication ml++-- | Remove duplicates from a sorted list.+dedupe :: Eq a => [a] -> [a]+dedupe xs = map NonEmpty.head $ NonEmpty.group xs
src/Data/Text/ParagraphLayout/Internal/Paginable.hs view
@@ -8,6 +8,7 @@  import Data.Int (Int32) +import Data.Text.ParagraphLayout.Internal.LineNumbers import Data.Text.ParagraphLayout.Internal.LinePagination import Data.Text.ParagraphLayout.Internal.ParagraphLine import qualified Data.Text.ParagraphLayout.Internal.Plain.ParagraphLayout@@ -86,7 +87,7 @@ instance Paginable (Rich.ParagraphLayout d) where     paginate = paginateLayout -paginateLayout :: (Line a, GenericLayout a) =>+paginateLayout :: (Line a, LineNumbers a, GenericLayout a) =>    PageOptions -> a -> (PageContinuity, a, Maybe a) paginateLayout opts pl =     case paginate opts (cutLines pl) of
+ src/Data/Text/ParagraphLayout/Internal/ParagraphAlignment.hs view
@@ -0,0 +1,40 @@+module Data.Text.ParagraphLayout.Internal.ParagraphAlignment+    ( ParagraphAlignment (..)+    )+where++-- | Determines how the contents of the paragraph should be aligned+-- horizontally, that is, how should fragments be stacked inside each line+-- when there is space available.+--+-- This has no effect on lines with overflowing content.+data ParagraphAlignment++    = AlignStart+    -- ^ Behave like `AlignLeft` when the base direction of the paragraph+    -- is LTR, and like `AlignRight` when the base direction is RTL.++    | AlignEnd+    -- ^ Behave like `AlignLeft` when the base direction of the paragraph+    -- is RTL, and like `AlignRight` when the base direction is LTR.++    | AlignLeft+    -- ^ Stack fragments to the left edge of each line,+    -- leaving free space on the right side.+    --+    -- The leftmost fragment on each non-overflowing line will have its+    -- `Data.Text.ParagraphLayout.Rect.x_min` equal to @0@.++    | AlignRight+    -- ^ Stack fragments to the right edge of each line,+    -- leaving free space on the left side.+    --+    -- The rightmost fragment on each non-overflowing line will have its+    -- `Data.Text.ParagraphLayout.Rect.x_max` equal to+    -- `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth`.++    | AlignCentreH+    -- ^ Stack fragments to the horizontal centre of each line,+    -- leaving free space split evenly between each side.++    deriving (Eq, Read, Show)
src/Data/Text/ParagraphLayout/Internal/ParagraphExtents.hs view
@@ -6,14 +6,20 @@     ) where +import Data.Maybe (fromMaybe)+ import Data.Text.ParagraphLayout.Internal.Rect +-- | X coordinate used as the left edge of every paragraph. paragraphOriginX :: (Num a) => a paragraphOriginX = 0 +-- | Y coordinate used as the top edge of every paragraph. paragraphOriginY :: (Num a) => a paragraphOriginY = 0 +-- | A `Rect` located at the top left corner of a paragraph,+-- with zero size in each dimension. emptyRect :: (Num a) => Rect a emptyRect = Rect     { x_origin = paragraphOriginX@@ -22,5 +28,7 @@     , y_size = 0     } -containRects :: (Ord a, Num a) => [Rect a] -> Rect a-containRects = foldr union emptyRect+-- | Smallest rectangle containing the given rectangles,+-- or `emptyRect` if none are given.+containRects :: (Num a, Ord a) => [Rect a] -> Rect a+containRects rects = fromMaybe emptyRect $ unionMany LH rects
src/Data/Text/ParagraphLayout/Internal/ParagraphLine.hs view
@@ -3,13 +3,14 @@     ( GenericLayout     , cutLines     , mergeLines+    , forceLeftAlign     ) where  import Data.Int (Int32)-import qualified Data.List.NonEmpty as NonEmpty  import Data.Text.ParagraphLayout.Internal.Fragment+import Data.Text.ParagraphLayout.Internal.LineNumbers import qualified Data.Text.ParagraphLayout.Internal.Plain.ParagraphLayout as P import qualified Data.Text.ParagraphLayout.Internal.Rich.ParagraphLayout as R import Data.Text.ParagraphLayout.Internal.Rect@@ -22,17 +23,20 @@     -- | Rectangle surrounding the layout, to be used for appending.     rect :: pl -> Rect Int32 -    -- | Actual distance between the paragraph origin and the nearest fragment.+    -- | Actual distance between the paragraph origin and the nearest fragment+    -- on the Y axis.     topDistance :: pl -> Int32 -    -- | A list of all unique line numbers that have laid out content.-    lineNumbers :: pl -> [Int]+    -- | Actual distance between the paragraph origin and the nearest fragment+    -- on the X axis.+    leftDistance :: pl -> Int32      -- | Keep only fragments with the given line number.     limitFragments :: Int -> pl -> pl -    -- | Add @dy@ to each fragment's `y_origin`.-    shiftFragments :: Int32 -> pl -> pl+    -- | Add @dx@ and @dy@ to each fragment's `x_origin` and `y_origin`,+    -- respectively.+    shiftFragments :: Int32 -> Int32 -> pl -> pl      -- | Combine fragments from two layouts into one,     -- without any adjustment of coordinates.@@ -42,22 +46,22 @@     empty = P.emptyParagraphLayout     rect = P.paragraphRect     topDistance pl = topFragmentOrigin $ P.paragraphFragments pl-    lineNumbers pl = uniqueFragmentLines $ P.paragraphFragments pl+    leftDistance pl = leftmostFragmentOrigin $ P.paragraphFragments pl     limitFragments n = P.filterFragments (fragmentIsOnLine n)-    shiftFragments dy = P.mapFragments (shiftFragment dy)+    shiftFragments dx dy = P.mapFragments (shiftFragment dx dy)     appendFragments = P.appendFragments  instance GenericLayout (R.ParagraphLayout d) where     empty = R.emptyParagraphLayout     rect = R.paragraphRect     topDistance pl = topFragmentOrigin $ R.paragraphFragments pl-    lineNumbers pl = uniqueFragmentLines $ R.paragraphFragments pl+    leftDistance pl = leftmostFragmentOrigin $ R.paragraphFragments pl     limitFragments n = R.filterFragments (fragmentIsOnLine n)-    shiftFragments dy = R.mapFragments (shiftFragment dy)+    shiftFragments dx dy = R.mapFragments (shiftFragment dx dy)     appendFragments = R.appendFragments  -- | Split the given paragraph layout into single-line layouts.-cutLines :: GenericLayout pl => pl -> [pl]+cutLines :: (GenericLayout pl, LineNumbers pl) => pl -> [pl] cutLines pl = map (\ n -> cutLine n pl) (lineNumbers pl)  -- | Reduce the given paragraph layout to fragments with the given line number.@@ -66,17 +70,17 @@  -- | Add a constant to each fragment's `y_origin` so that their maximum is zero. trimTop :: GenericLayout pl => pl -> pl-trimTop pl = shiftFragments (-topDistance pl) pl+trimTop pl = shiftFragments 0 (-topDistance pl) pl +-- | Add a constant to each fragment's `x_origin` so that their minimum is zero.+trimLeft :: GenericLayout pl => pl -> pl+trimLeft pl = shiftFragments (-leftDistance pl) 0 pl+ topFragmentOrigin :: [Fragment d] -> Int32 topFragmentOrigin frags = maximum $ map (y_origin . fragmentRect) frags -uniqueFragmentLines :: [Fragment d] -> [Int]-uniqueFragmentLines frags = dedupe $ map fragmentLine frags---- | Remove duplicates from a sorted list.-dedupe :: Eq a => [a] -> [a]-dedupe xs = map NonEmpty.head $ NonEmpty.group xs+leftmostFragmentOrigin :: [Fragment d] -> Int32+leftmostFragmentOrigin frags = minimum $ map (x_origin . fragmentRect) frags  -- | Put the given paragraph layouts together as a vertically contiguous -- sequence.@@ -87,15 +91,14 @@ mergeLine pl nextLine = pl'     where         -- Quadratic time complexity. TODO: Consider optimising.-        pl' = appendFragments pl $ shiftFragments y nextLine+        pl' = appendFragments pl $ shiftFragments 0 y nextLine         y = y_terminus $ rect pl -shiftFragment :: Int32 -> Fragment d -> Fragment d-shiftFragment dy f = f'-    where-        f' = f { fragmentRect = r' }-        r' = r { y_origin = y_origin r + dy }-        r = fragmentRect f- fragmentIsOnLine :: Int -> Fragment d -> Bool fragmentIsOnLine n frag = n == fragmentLine frag++-- | Rearrange fragments on each line so that they are stacked from the left.+--+-- Intended for comparing paragraph layouts of different maximum widths.+forceLeftAlign :: (GenericLayout pl, LineNumbers pl) => pl -> pl+forceLeftAlign pl = mergeLines $ map trimLeft $ cutLines pl
src/Data/Text/ParagraphLayout/Internal/ParagraphOptions.hs view
@@ -8,12 +8,17 @@ import Data.Text.Glyphize (Font, emptyFont)  import Data.Text.ParagraphLayout.Internal.LineHeight+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment  -- | Defines options relevant to the entire paragraph. -- -- This record type is likely to be extended in the future. -- Use `defaultParagraphOptions` and update it with specific record selectors -- instead of constructing `ParagraphOptions` directly.+--+-- In order to get CSS defaults, use:+--+-- > defaultParagraphOptions { paragraphAlignment = AlignStart } data ParagraphOptions = ParagraphOptions      { paragraphFont :: Font@@ -24,6 +29,9 @@     , paragraphLineHeight :: LineHeight     -- ^ Preferred line height of the resulting fragments. +    , paragraphAlignment :: ParagraphAlignment+    -- ^ Alignment of non-overflowing lines within the paragraph.+     , paragraphMaxWidth :: Int32     -- ^ Line width at which line breaking should occur.     -- Lines will be broken at language-appropriate boundaries.@@ -34,10 +42,14 @@     }     deriving (Eq) --- | `ParagraphOptions` with default values.+-- | `ParagraphOptions` with backwards-compatible values.+--+-- Note that this sets `paragraphAlignment` to `AlignLeft`,+-- whereas the CSS default should be `AlignStart`. defaultParagraphOptions :: ParagraphOptions defaultParagraphOptions = ParagraphOptions     { paragraphFont = emptyFont     , paragraphLineHeight = Normal+    , paragraphAlignment = AlignLeft     , paragraphMaxWidth = maxBound     }
src/Data/Text/ParagraphLayout/Internal/Plain/ParagraphLayout.hs view
@@ -13,6 +13,7 @@ import Data.Int (Int32)  import Data.Text.ParagraphLayout.Internal.Fragment+import Data.Text.ParagraphLayout.Internal.LineNumbers import Data.Text.ParagraphLayout.Internal.LinePagination import Data.Text.ParagraphLayout.Internal.ParagraphExtents import Data.Text.ParagraphLayout.Internal.Rect@@ -26,6 +27,9 @@     }     deriving (Eq, Read, Show) +instance LineNumbers (ParagraphLayout d) where+    lineNumbersWithDuplication pl = map fragmentLine $ paragraphFragments pl+ instance Line (ParagraphLayout d) where     lineHeight pl = height $ paragraphRect pl @@ -77,6 +81,8 @@ paragraphFragments :: ParagraphLayout d -> [Fragment d] paragraphFragments pl = concat $ map spanFragments $ spanLayouts pl --- | Return all shaped runs in the paragraph.+-- | Return all non-empty shaped runs in the paragraph. shapedRuns :: ParagraphLayout d -> [ShapedRun]-shapedRuns pl = map shapedRun $ paragraphFragments pl+shapedRuns pl = map shapedRun $ filter hasGlyphs $ paragraphFragments pl+    where+        hasGlyphs = not . null . fragmentGlyphs
src/Data/Text/ParagraphLayout/Internal/ProtoFragment.hs view
@@ -1,5 +1,5 @@ module Data.Text.ParagraphLayout.Internal.ProtoFragment-    ( ProtoFragment (direction, advance, glyphs)+    ( ProtoFragment (direction, advance, glyphs, hardBreak)     , protoFragmentH     ) where@@ -20,13 +20,15 @@     -- ^ Total advance of glyphs in this fragment,     -- depending on the text direction.     , glyphs :: [(GlyphInfo, GlyphPos)]+    , hardBreak :: Bool+    -- ^ Marks fragment that ends with a forced line break.     }  -- | Construct a `ProtoFragment`, automatically calculating the total advance -- for a horizontal text direction.-protoFragmentH :: Direction -> BiDi.Level -> [(GlyphInfo, GlyphPos)] ->+protoFragmentH :: Direction -> BiDi.Level -> [(GlyphInfo, GlyphPos)] -> Bool ->     ProtoFragment-protoFragmentH dir lvl gs = ProtoFragment dir lvl adv gs+protoFragmentH dir lvl gs hard = ProtoFragment dir lvl adv gs hard     where         adv = sum $ map (x_advance . snd) gs 
src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs view
@@ -1,6 +1,7 @@ module Data.Text.ParagraphLayout.Internal.ProtoLine     ( ProtoLine (..)     , nonEmpty+    , visible     , width     , applyBoxes     )@@ -10,8 +11,10 @@ import Data.List.NonEmpty (NonEmpty ((:|)))  import qualified Data.Text.ParagraphLayout.Internal.ApplyBoxes as Algo+import Data.Text.ParagraphLayout.Internal.BoxOptions import Data.Text.ParagraphLayout.Internal.ProtoFragment import Data.Text.ParagraphLayout.Internal.ResolvedBox+import Data.Text.ParagraphLayout.Internal.ResolvedSpan import Data.Text.ParagraphLayout.Internal.WithSpan  -- | Contents of a line that have not been visually ordered or positioned yet.@@ -37,6 +40,22 @@ nonEmpty (ProtoLine [] _ _) = Nothing nonEmpty pl@(ProtoLine { protoFragments = (f : fs) }) =     Just pl { protoFragments = f :| fs }++-- | `True` if this line should generate a visible line box,+-- or `False` if this line should generate an /invisible line box/+-- as defined by <https://www.w3.org/TR/css-inline-3/#invisible-line-boxes>.+visible :: Foldable f => ProtoLine f d -> Bool+visible pl = any visibleProtoFragment $ protoFragments pl++visibleProtoFragment :: WithSpan d ProtoFragment -> Bool+visibleProtoFragment (WithSpan rs pf) =+    hasGlyphs || hasHardBreak || hasNonCollapsibleBoxes+    where+        hasGlyphs = not $ null $ glyphs pf+        hasHardBreak = hardBreak pf+        hasNonCollapsibleBoxes =+            any (== AvoidBoxCollapse) $ map (boxCollapse . boxOptions) boxes+        boxes = spanBoxes rs  -- | Total width of the line (content and spacing). width :: (Foldable f, Functor f) => ProtoLine f d -> Int32
src/Data/Text/ParagraphLayout/Internal/Rect.hs view
@@ -1,9 +1,12 @@ -- | Representation of an axis-aligned rectangle on a 2D plane, with one of its -- corners being a designated origin point. module Data.Text.ParagraphLayout.Internal.Rect-    ( Rect (Rect, x_origin, y_origin, x_size, y_size)+    ( Bias (LL, LH, HL, HH)+    , Rect (Rect, x_origin, y_origin, x_size, y_size)     , height     , union+    , unionMany+    , unionMany1     , width     , x_max     , x_min@@ -14,6 +17,8 @@     ) where +import Data.List.NonEmpty (NonEmpty, nonEmpty)+ -- | An axis-aligned rectangle on a 2D plane. data Rect a = Rect     { x_origin :: a@@ -59,17 +64,62 @@ y_max :: (Num a, Ord a) => Rect a -> a y_max r = y_origin r `max` y_terminus r --- | Calculate the smallest rectangle that completely contains the given two--- rectangles.+-- | Determines which corner of a calculated rectangle should be its origin.+data Bias+    = LL+    -- ^ Set the origin as the corner with low X and low Y coordinates.+    | LH+    -- ^ Set the origin as the corner with low X and high Y coordinates.+    | HL+    -- ^ Set the origin as the corner with high X and low Y coordinates.+    | HH+    -- ^ Set the origin as the corner with high X and high Y coordinates.++-- | The smallest rectangle completely containing the given two rectangles. ----- The origin of the resulting rectangle will be the corner with the lowest--- X coordinate and the highest Y coordinate, regardless of the origin of the--- input rectangles.-union :: (Num a, Ord a) => Rect a -> Rect a -> Rect a-union a b = Rect x_low y_high dx (-dy) where-    x_low = x_min a `min` x_min b-    y_low = y_min a `min` y_min b-    x_high = x_max a `max` x_max b-    y_high = y_max a `max` y_max b-    dx = x_high - x_low-    dy = y_high - y_low+-- The origin of the output rectangle will be set according to `Bias`,+-- regardless of which corners of the input rectangles are designated+-- as their origins.+--+-- Note that this operation has no identity element. A rectangle whose+-- `x_size` and/or `y_size` are zero is not considered null or neutral,+-- but effectively acts as a point, which will be contained in the union.+--+-- You can use `Nothing` as an identity element if you lift this operation+-- over the `Maybe` applicative functor:+--+-- @+-- `Control.Applicative.liftA2` (`union` bias)+-- @+union :: (Num a, Ord a) => Bias -> Rect a -> Rect a -> Rect a+union bias a b =+    case bias of+        LL -> Rect lx ly dx dy+        LH -> Rect lx hy dx (-dy)+        HL -> Rect hx ly (-dx) dy+        HH -> Rect hx hy (-dx) (-dy)+    where+        lx = x_min a `min` x_min b+        ly = y_min a `min` y_min b+        hx = x_max a `max` x_max b+        hy = y_max a `max` y_max b+        dx = hx - lx+        dy = hy - ly++-- | `Just` the `union` of all given rectangles, or `Nothing` if none are given.+unionMany :: (Num a, Ord a) => Bias -> [Rect a] -> Maybe (Rect a)+unionMany bias rects = unionMany1 bias <$> nonEmpty rects++-- | The `union` of all given rectangles, where at least one must be given.+--+-- Note that adding a default value to the input list to make it non-empty+-- will probably not do what you want, since the `union` operation has no+-- identity element.+--+-- If you need a default output value for empty inputs, consider using:+--+-- @+-- `Data.Maybe.fromMaybe` yourDefaultValue $ `unionMany` bias rects+-- @+unionMany1 :: (Num a, Ord a) => Bias -> NonEmpty (Rect a) -> Rect a+unionMany1 bias rects = foldr1 (union bias) rects
src/Data/Text/ParagraphLayout/Internal/Rich.hs view
@@ -23,14 +23,22 @@  -- | Lay out a rich text paragraph. layoutRich :: Paragraph d -> ParagraphLayout d-layoutRich p@(Paragraph _ _ _ opts) = paragraphLayout $ map unwrap frags+layoutRich p = paragraphLayout $ map unwrap frags     where+        Paragraph _ _ root opts = p+        RootBox (Box _ rootTextOpts) = root         unwrap (WithSpan rs frag) =             frag { fragmentUserData = RS.spanUserData rs }         frags = case nonEmpty wrappedRuns of-            Just xs -> layoutAndAlignLines maxWidth xs+            Just xs -> layoutAndAlignLines dir align maxWidth xs             Nothing -> []         wrappedRuns = spansToRunsWrapped spans+        -- TODO: To support @unicode-bidi: plaintext@ as in CSS, allow ignoring+        --       the text direction of the root box, and instead use the BiDi+        --       rules P2 and P3 to determine the base directionality, which+        --       may differ between lines.+        dir = textDirection rootTextOpts+        align = paragraphAlignment opts         maxWidth = paragraphMaxWidth opts         spans = resolveSpans p @@ -63,8 +71,8 @@     let lang = textLanguage textOpts     -- TODO: Allow BiDi embedding/isolation for inner nodes.     let pLevels = textLevels (textDirection rootTextOpts) pText-    let lBreaks = paragraphBreaks breakLine pText lang-    let cBreaks = paragraphBreaks breakCharacter pText lang+    let lBreaks = paragraphBreaksDesc breakLine pText lang+    let cBreaks = paragraphBreaksDesc breakCharacter pText lang     -- TODO: Optimise. This has time complexity O(n*s), where n is number of     --       characters and s is number of resolved spans.     --       Maybe include byte offsets in the TextLevels data structure?@@ -82,6 +90,12 @@         , RS.spanCharacterBreaks = subOffsetsDesc (sStart - pStart) cBreaks         } -paragraphBreaks :: (LocaleName -> Breaker a) -> Text -> String -> [(Int, a)]-paragraphBreaks breakFunc txt lang =-    breaksDesc (breakFunc (locale lang LBAuto)) txt+paragraphBreaksDesc :: (LocaleName -> Breaker a) -> Text -> String -> [(Int, a)]+paragraphBreaksDesc breakFunc txt lang =+    -- Workaround: We are interested in the type of the end-of-text break+    --             (if it is hard, that line needs to be always visible),+    --             but `breaksDesc` does not provide it.+    --+    -- TODO: Consider optimising by creating a custom reimplementation+    --       of `Data.Text.ICU.breaksRight`.+    reverse $ breaksAsc (breakFunc (locale lang LBAuto)) txt
src/Data/Text/ParagraphLayout/Internal/Rich/ParagraphLayout.hs view
@@ -7,6 +7,7 @@     , paragraphLayout     , paragraphOriginX     , paragraphOriginY+    , paragraphSafeWidth     , shapedRuns     ) where@@ -14,6 +15,7 @@ import Data.Int (Int32)  import Data.Text.ParagraphLayout.Internal.Fragment+import Data.Text.ParagraphLayout.Internal.LineNumbers import Data.Text.ParagraphLayout.Internal.LinePagination import Data.Text.ParagraphLayout.Internal.ParagraphExtents import Data.Text.ParagraphLayout.Internal.Rect@@ -29,6 +31,9 @@     }     deriving (Eq, Read, Show) +instance LineNumbers (ParagraphLayout d) where+    lineNumbersWithDuplication pl = map fragmentLine $ paragraphFragments pl+ instance Line (ParagraphLayout d) where     lineHeight pl = height $ paragraphRect pl @@ -68,3 +73,25 @@ -- | Return all shaped runs in the paragraph. shapedRuns :: ParagraphLayout d -> [ShapedRun] shapedRuns pl = map shapedRun $ paragraphFragments pl++-- | Width of the widest line, including spacing.+--+-- This is the smallest `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth`+-- that will not introduce new line breaks.+--+-- When `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth` is set to `maxBound`,+-- `paragraphSafeWidth` can be used to determine the @max-content@ width of the+-- paragraph for CSS.+paragraphSafeWidth :: ParagraphLayout d -> Int32+paragraphSafeWidth pl = maximum $ map (lineWidth pl) $ lineNumbers pl++lineWidth :: ParagraphLayout d -> Int -> Int32+lineWidth pl line = sum $ map fragmentWidth $ lineFragments pl line++fragmentWidth :: Fragment d -> Int32+fragmentWidth f = width $ fragmentSpacedRect f++lineFragments :: ParagraphLayout d -> Int -> [Fragment d]+lineFragments pl line = filter byLine $ paragraphFragments pl+    where+        byLine frag = line == fragmentLine frag
src/Data/Text/ParagraphLayout/Internal/Run.hs view
@@ -25,6 +25,10 @@     , runLevel :: Level     , runDirection :: Direction     , runScript :: Maybe ScriptCode+    , runHardBreak :: Bool+    -- ^ Marks run that ends with a forced line break.+    -- Those should prevent creation of invisible line boxes+    -- according to <https://www.w3.org/TR/css-inline-3/#invisible-line-boxes>.     }     deriving (Eq, Show) @@ -74,8 +78,23 @@ data Merged a = Incompatible | Merged a  spanToRuns :: ResolvedSpan d -> [Run]-spanToRuns s = snd $ mapAccumL run 0 $ protoRuns zipper levels+spanToRuns s+    | Text.null (spanText s) = [emptyRun]+    | otherwise = spanToRuns' s     where+        emptyRun = Run+            { runOffsetInSpan = 0+            , runText = Text.empty+            , runLevel = defaultLevel+            , runDirection = levelDirectionH defaultLevel+            , runScript = Nothing+            , runHardBreak = False+            }+        defaultLevel = baseLevel $ spanBiDiLevels s++spanToRuns' :: ResolvedSpan d -> [Run]+spanToRuns' s = snd $ mapAccumL run 0 $ protoRuns zipper levels+    where         wholeText = spanText s         zipper = start wholeText         levels = spanBiDiLevels s@@ -87,6 +106,7 @@                 , runLevel = PR.level pr                 , runDirection = levelDirectionH $ PR.level pr                 , runScript = Just $ PR.script pr+                , runHardBreak = False                 }             ) 
+ src/Data/Text/ParagraphLayout/Internal/SplitList.hs view
@@ -0,0 +1,58 @@+-- | Utility functions to work with pairs of lists, which may be non-empty.+module Data.Text.ParagraphLayout.Internal.SplitList+    ( allowFstEmpty+    , allowSndEmpty+    , nonEmptyPairs+    , nonEmptyFsts+    , nonEmptySnds+    )+where++import Data.List.NonEmpty (NonEmpty, nonEmpty, toList)+import Data.Maybe (catMaybes)++-- | Generalise the first component of a pair from a non-empty list+-- to a regular list.+allowFstEmpty :: (NonEmpty a, b) -> ([a], b)+allowFstEmpty (a, b) = (toList a, b)++-- | Generalise the second component of a pair from a non-empty list+-- to a regular list.+allowSndEmpty :: (a, NonEmpty b) -> (a, [b])+allowSndEmpty (a, b) = (a, toList b)++-- | Turn pairs of normal lists into pairs of `NonEmpty` lists,+-- removing pairs in which either list is empty.+nonEmptyPairs :: [([a], [b])] -> [(NonEmpty a, NonEmpty b)]+nonEmptyPairs = catMaybes . map nonEmptyPair++-- | Turn a pair of normal lists into `Just` a pair of `NonEmpty` lists,+-- or `Nothing` if either list is empty.+nonEmptyPair :: ([a], [b]) -> Maybe (NonEmpty a, NonEmpty b)+nonEmptyPair (xs, ys) = case (nonEmpty xs, nonEmpty ys) of+    (Just xs1, Just ys1) -> Just (xs1, ys1)+    (_, _) -> Nothing++-- | Turn pairs of normal lists into pairs where the first list is `NonEmpty`,+-- removing pairs in which the first list is empty.+nonEmptyFsts :: [([a], [b])] -> [(NonEmpty a, [b])]+nonEmptyFsts = catMaybes . map nonEmptyFst++-- | Turn a pair of normal lists into `Just` a pair where the first list is+-- `NonEmpty`, or `Nothing` if the first list is empty.+nonEmptyFst :: ([a], [b]) -> Maybe (NonEmpty a, [b])+nonEmptyFst (xs, ys) = case nonEmpty xs of+    Just xs1 -> Just (xs1, ys)+    Nothing -> Nothing++-- | Turn pairs of normal lists into pairs where the second list is `NonEmpty`,+-- removing pairs in which the second list is empty.+nonEmptySnds :: [([a], [b])] -> [([a], NonEmpty b)]+nonEmptySnds = catMaybes . map nonEmptySnd++-- | Turn a pair of normal lists into `Just` a pair where the second list is+-- `NonEmpty`, or `Nothing` if the second list is empty.+nonEmptySnd :: ([a], [b]) -> Maybe ([a], NonEmpty b)+nonEmptySnd (xs, ys) = case nonEmpty ys of+    Just ys1 -> Just (xs, ys1)+    Nothing -> Nothing
src/Data/Text/ParagraphLayout/Internal/TextContainer.hs view
@@ -2,21 +2,18 @@     ( SeparableTextContainer     , TextContainer     , dropWhileEnd+    , dropWhileEndCascade     , dropWhileStart+    , dropWhileStartCascade     , getText     , splitTextAt8     , splitTextsBy-    , trimTextsEnd-    , trimTextsEndPreserve-    , trimTextsStart-    , trimTextsStartPreserve     ) where  import Data.Foldable (toList)-import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty)-import qualified Data.List.NonEmpty as NonEmpty-import Data.Maybe (catMaybes)+import Data.List (mapAccumL, mapAccumR)+import Data.List.NonEmpty (NonEmpty ((:|))) import Data.Text (Text) import qualified Data.Text as Text import Data.Text.Foreign (dropWord8, takeWord8)@@ -57,16 +54,16 @@     dropWhileEnd = Text.dropWhileEnd  -- | Treat a list of text containers as a contiguous sequence,--- and find all possible ways to split them into two non-empty lists,+-- and find all possible ways to split them into two lists, -- using the given function to find valid split offsets in `Data.Word.Word8` -- units from the beginning of each container. -- -- The results in the form (prefix, suffix) will be ordered from the longest -- prefix to shortest. splitTextsBy :: (SeparableTextContainer a, Foldable f) =>-    (a -> [Int]) -> f a -> [(NonEmpty a, NonEmpty a)]+    (a -> [Int]) -> f a -> [([a], [a])] splitTextsBy breakFunc tcs =-    nonEmptyPairs $ splitTextsBy' breakFunc [] $ reverse $ toList tcs+    splitTextsBy' breakFunc [] $ reverse $ toList tcs  splitTextsBy' :: SeparableTextContainer a =>     (a -> [Int]) -> [a] -> [a] -> [([a], [a])]@@ -80,18 +77,6 @@         tcSplits = map (\ i -> splitTextAt8 i tc) tcBreakOffsets         tcBreakOffsets = breakFunc tc --- | Turn pairs of normal lists into pairs of `NonEmpty` lists,--- removing pairs in which either list is empty.-nonEmptyPairs :: [([a], [b])] -> [(NonEmpty a, NonEmpty b)]-nonEmptyPairs = catMaybes . map nonEmptyPair---- | Turn a pair of normal lists into `Just` a pair of `NonEmpty` lists,--- or `Nothing` if either list is empty.-nonEmptyPair :: ([a], [b]) -> Maybe (NonEmpty a, NonEmpty b)-nonEmptyPair (xs, ys) = case (nonEmpty xs, nonEmpty ys) of-    (Just xs1, Just ys1) -> Just (xs1, ys1)-    (_, _) -> Nothing- -- | If the first container in the list is empty, remove it. collapse :: SeparableTextContainer a => NonEmpty a -> [a] collapse (tc :| tcs)@@ -101,61 +86,42 @@ -- | Treat a list of text containers as a contiguous sequence, -- and remove a prefix of characters that match the given predicate. ----- Empty text containers are removed from the output, so the result may--- potentially be an empty list.-trimTextsStart :: (SeparableTextContainer a, Foldable f) =>-    (Char -> Bool) -> f a -> [a]-trimTextsStart p tcs = trimTextsStart' p $ toList tcs---- | Treat a list of text containers as a contiguous sequence,--- and remove a prefix of characters that match the given predicate.------ Empty text containers are removed from the output except the first one,--- which is instead truncated to zero length.-trimTextsStartPreserve :: SeparableTextContainer a =>-    (Char -> Bool) -> NonEmpty a -> NonEmpty a-trimTextsStartPreserve p tcs =-    case nonEmpty $ trimTextsStart p $ NonEmpty.toList tcs of-        Nothing -> truncateText (NonEmpty.head tcs) :| []-        Just out -> out+-- All text containers are preserved but their contents may end up having+-- zero length.+dropWhileStartCascade :: (SeparableTextContainer a, Traversable t) =>+    (Char -> Bool) -> t a -> t a+dropWhileStartCascade p tcs = trimTextsStartCascade (dropWhileStart p) tcs  -- | Treat a list of text containers as a contiguous sequence, -- and remove a suffix of characters that match the given predicate. ----- Empty text containers are removed from the output, so the result may--- potentially be an empty list.-trimTextsEnd :: (SeparableTextContainer a, Foldable f) =>-    (Char -> Bool) -> f a -> [a]-trimTextsEnd p tcs = trimTextsEnd' p $ reverse $ toList tcs+-- All text containers are preserved but their contents may end up having+-- zero length.+dropWhileEndCascade :: (SeparableTextContainer a, Traversable t) =>+    (Char -> Bool) -> t a -> t a+dropWhileEndCascade p tcs = trimTextsEndCascade (dropWhileEnd p) tcs --- | Treat a list of text containers as a contiguous sequence,--- and remove a suffix of characters that match the given predicate.------ Empty text containers are removed from the output except the first one,--- which is instead truncated to zero length.-trimTextsEndPreserve :: SeparableTextContainer a =>-    (Char -> Bool) -> NonEmpty a -> NonEmpty a-trimTextsEndPreserve p tcs =-    case nonEmpty $ trimTextsEnd p $ NonEmpty.toList tcs of-        Nothing -> truncateText (NonEmpty.head tcs) :| []-        Just out -> out+-- | Traverse the given structure from start to end, applying the given+-- text trimming function to each text container until a non-empty container+-- is produced.+trimTextsStartCascade :: (SeparableTextContainer a, Traversable t) =>+    (a -> a) -> t a -> t a+trimTextsStartCascade trimFunc tcs =+    snd $ mapAccumL (cascadingTrim trimFunc) True tcs -trimTextsStart' :: SeparableTextContainer a => (Char -> Bool) -> [a] -> [a]-trimTextsStart' _ [] = []-trimTextsStart' p (tc : tcs)-    | Text.null (getText trimmed) = trimTextsStart' p tcs-    | otherwise = trimmed : tcs-    where-        trimmed = dropWhileStart p tc+-- | Traverse the given structure from end to start, applying the given+-- text trimming function to each text container until a non-empty container+-- is produced.+trimTextsEndCascade :: (SeparableTextContainer a, Traversable t) =>+    (a -> a) -> t a -> t a+trimTextsEndCascade trimFunc tcs =+    snd $ mapAccumR (cascadingTrim trimFunc) True tcs -trimTextsEnd' :: SeparableTextContainer a => (Char -> Bool) -> [a] -> [a]-trimTextsEnd' _ [] = []-trimTextsEnd' p (tc : tcs)-    | Text.null (getText trimmed) = trimTextsEnd' p tcs-    | otherwise = reverse $ trimmed : tcs+-- | Wraps a text trimming function in a controlled cascade.+-- When the trim produces an empty text, the cascade continues.+cascadingTrim :: SeparableTextContainer a => (a -> a) -> Bool -> a -> (Bool, a)+cascadingTrim _ False tc = (False, tc)+cascadingTrim trimFunc True tc = (continue, trimmed)     where-        trimmed = dropWhileEnd p tc---- | Discard all text from the container by creating a prefix of length 0.-truncateText :: SeparableTextContainer a => a -> a-truncateText tc = fst $ splitTextAt8 0 tc+        trimmed = trimFunc tc+        continue = Text.null $ getText trimmed
src/Data/Text/ParagraphLayout/Internal/TextOptions.hs view
@@ -40,7 +40,6 @@     -- When applied to the root box in a paragraph, this is also used to     -- determine the base direction of the paragraph. -    -- TODO: textVerticalAlign     -- TODO: textLetterSpacing     -- TODO: textWordSpacing     -- TODO: textFontFeatures
src/Data/Text/ParagraphLayout/Internal/Tree.hs view
@@ -19,12 +19,15 @@     , InnerNode (..)     , Box (..)     , Leaf (..)+    , EmptyText     , flatten     , glue+    , strut     ) where  import Data.Text (Text)+import qualified Data.Text as Text import Data.Text.Foreign (lengthWord8) import qualified Data.Text.Lazy as Lazy (toStrict) import qualified Data.Text.Internal.Lazy as Lazy (Text, chunk, empty)@@ -68,6 +71,13 @@      [InnerNode t d]     -- ^ Text nodes and other boxes contained by this box.+    --+    -- Please note that boxes which are not the ancestors of any leaf nodes+    -- will have no effect on the output.+    --+    -- To ensure that all boxes are represented in the output, as would be+    -- expected for DOM elements in HTML, an empty text sequence must be added+    -- to otherwise empty boxes. This can be done by using the `strut` function.      TextOptions     -- ^ Style options to apply to text sequences directly contained@@ -91,6 +101,30 @@     (BoxPath d)     -- ^ Inline boxes found on the path from this text sequence to the root     -- of the original tree.++-- | Data types that can represent an empty text sequence in a `Tree`.+class EmptyText t where+    empty :: t++instance EmptyText Int where+    empty = 0++instance EmptyText Text where+    empty = Text.empty++-- | Insert an empty text sequence with the given user data into each empty box.+strut :: EmptyText t => d -> RootNode t d -> RootNode t d+strut d (RootBox (Box ns textOpts)) = RootBox $ Box (strutNodes d ns) textOpts++strutNodes :: EmptyText t => d -> [InnerNode t d] -> [InnerNode t d]+strutNodes d ns = map (strutNode d) ns++strutNode :: EmptyText t => d -> InnerNode t d -> InnerNode t d+strutNode _ x@(TextSequence _ _) = x+strutNode d (InlineBox boxData (Box [] textOpts) boxOpts) =+    InlineBox boxData (Box [TextSequence d empty] textOpts) boxOpts+strutNode d (InlineBox boxData (Box ns textOpts) boxOpts) =+    InlineBox boxData (Box (strutNodes d ns) textOpts) boxOpts  -- | Convert the tree to a flat list of its leaf nodes (text sequences). flatten :: RootNode t d -> [Leaf t d]
test/Data/Text/ParagraphLayout/Internal/ApplyBoxesSpec.hs view
@@ -24,7 +24,7 @@     , spanText = empty     , spanTextOptions = defaultTextOptions dir     , spanBoxes = bs-    , spanBiDiLevels = TextLevels []+    , spanBiDiLevels = TextLevels [] (directionLevel 0 dir)     , spanLineBreaks = []     , spanCharacterBreaks = []     }
test/Data/Text/ParagraphLayout/Internal/BiDiLevelsSpec.hs view
@@ -11,11 +11,12 @@ -- | Test that `textLevels` produces the levels of the lengths given in -- "Data.Text.ParagraphLayout.TextData" and values given here. shouldHaveLevels :: (Direction, a, Text, [Int]) -> [Level] -> SpecWith ()-shouldHaveLevels (dir, _, text, lens) levels = it description $-    result `shouldBe` TextLevels (runLengthDecode rls)+shouldHaveLevels (dir, _, text, runLens) runLevels = it description $+    actualLevels `shouldBe` runLengthDecode rls     where+        TextLevels actualLevels _ = result         result = textLevels dir text-        rls = zip lens levels+        rls = zip runLens runLevels         description = case rls of             [] -> "should be empty"             [(_, lvl)] -> "should all have level " ++ show lvl
test/Data/Text/ParagraphLayout/Internal/RunSpec.hs view
@@ -1,6 +1,6 @@ module Data.Text.ParagraphLayout.Internal.RunSpec (spec) where -import Data.Text (Text, pack)+import Data.Text (Text, empty, pack) import Data.Text.Glyphize (Direction (..), emptyFont)  import Test.Hspec@@ -35,13 +35,13 @@     }  allLTR :: TextLevels-allLTR = TextLevels $ repeat 0+allLTR = TextLevels (repeat 0) 0  allRTL :: TextLevels-allRTL = TextLevels $ repeat 1+allRTL = TextLevels (repeat 1) 1  levelsRLE :: [(Int, Level)] -> TextLevels-levelsRLE rls = TextLevels $ runLengthDecode rls+levelsRLE rls = TextLevels (runLengthDecode rls) undefined  spec :: Spec spec = do@@ -49,7 +49,16 @@         it "handles span with no text" $ do             let inputSpan = sampleSpan englishEmpty allLTR             let runs = spanToRuns inputSpan-            runs `shouldBe` []+            runs `shouldBe`+                [ Run+                    { runOffsetInSpan = 0+                    , runText = empty+                    , runLevel = 0+                    , runDirection = DirLTR+                    , runScript = Nothing+                    , runHardBreak = False+                    }+                ]         it "handles Czech hello" $ do             let inputSpan = sampleSpan czechHello allLTR             let runs = spanToRuns inputSpan@@ -60,6 +69,7 @@                     , runLevel = 0                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 ]         it "handles Arabic hello" $ do@@ -72,6 +82,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Arab"+                    , runHardBreak = False                     }                 ]         it "handles Serbian with mixed script" $ do@@ -85,6 +96,7 @@                     , runLevel = 0                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 12@@ -92,6 +104,7 @@                     , runLevel = 0                     , runDirection = DirLTR                     , runScript = Just "Cyrl"+                    , runHardBreak = False                     }                 ]         it "handles mixed direction with base LTR" $ do@@ -105,6 +118,7 @@                     , runLevel = 0                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 7@@ -112,6 +126,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Arab"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 13@@ -119,6 +134,7 @@                     , runLevel = 0                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 ]         it "handles mixed direction with base RTL" $ do@@ -132,6 +148,7 @@                     , runLevel = 2                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 7@@ -139,6 +156,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Arab"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 13@@ -146,6 +164,7 @@                     , runLevel = 2                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 ]         it "handles Arabic text with English inside" $ do@@ -159,6 +178,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Arab"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 5@@ -166,6 +186,7 @@                     , runLevel = 2                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 14@@ -173,6 +194,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Arab"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 79@@ -180,6 +202,7 @@                     , runLevel = 2                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 82@@ -187,6 +210,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Zyyy"+                    , runHardBreak = False                     }                 ]         it "handles English text with Arabic inside" $ do@@ -200,6 +224,7 @@                     , runLevel = 0                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 13@@ -207,6 +232,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Arab"+                    , runHardBreak = False                     }                 , Run                     { runOffsetInSpan = 47@@ -214,6 +240,7 @@                     , runLevel = 0                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 ]         -- Unrealistic example where text changes direction@@ -229,6 +256,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 -- direction change                 , Run@@ -237,6 +265,7 @@                     , runLevel = 2                     , runDirection = DirLTR                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 -- direction change                 , Run@@ -245,6 +274,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Latn"+                    , runHardBreak = False                     }                 -- script change                 , Run@@ -253,6 +283,7 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Cyrl"+                    , runHardBreak = False                     }                 -- direction change                 , Run@@ -261,6 +292,7 @@                     , runLevel = 2                     , runDirection = DirLTR                     , runScript = Just "Cyrl"+                    , runHardBreak = False                     }                 -- direction change                 , Run@@ -269,5 +301,6 @@                     , runLevel = 1                     , runDirection = DirRTL                     , runScript = Just "Cyrl"+                    , runHardBreak = False                     }                 ]
test/Data/Text/ParagraphLayout/Internal/TextContainerSpec.hs view
@@ -1,15 +1,11 @@ module Data.Text.ParagraphLayout.Internal.TextContainerSpec (spec) where -import qualified Data.List.NonEmpty import Data.Text (Text, empty, pack) import Data.Text.Foreign (lengthWord8)  import Test.Hspec import Data.Text.ParagraphLayout.Internal.TextContainer -ne :: [a] -> Data.List.NonEmpty.NonEmpty a-ne = Data.List.NonEmpty.fromList- data ExampleContainer = Contain { cText :: Text, cOffset :: Int }     deriving (Show, Eq) @@ -43,7 +39,8 @@     [     -- Out of bounds. Should not generate any splits.     999, 50,-    -- End of last text. Should not generate a split.+    -- End of last text.+    -- Should only generate a split for end-biased breaks.     43,     -- Word and syllable bounds in the second text,     -- similar to hyphenation rules. Each should generate a corresponding split.@@ -54,79 +51,189 @@     -- Word and syllable bounds in the first text.     -- Each should generate a corresponding split.     18, 16, 14, 12,-    -- Start of first text. Should not generate a split.+    -- Start of first text.+    -- Should only generate a split for start-biased breaks.     10,     -- Out of bounds. Should not generate any splits.     5, 0, -1     ] -exampleBreakPoints :: ExampleContainer -> [Int]-exampleBreakPoints c =+-- | Bound `exampleBreaks` to the given text container and adjust offsets,+-- including start of text but excluding end of text.+--+-- Container boundaries should therefore only generate one split,+-- and all splits should have a non-empty prefix.+startBiasedBreakPoints :: ExampleContainer -> [Int]+startBiasedBreakPoints c =     dropWhile (>= l) $ takeWhile (>= 0) $ map (subtract d) $ exampleBreaks     where         l = lengthWord8 $ cText c         d = cOffset c +-- | Bound `exampleBreaks` to the given text container and adjust offsets,+-- excluding start of text but including end of text.+--+-- Container boundaries should therefore only generate one split,+-- and all splits should have a non-empty prefix.+endBiasedBreakPoints :: ExampleContainer -> [Int]+endBiasedBreakPoints c =+    dropWhile (> l) $ takeWhile (> 0) $ map (subtract d) $ exampleBreaks+    where+        l = lengthWord8 $ cText c+        d = cOffset c+ isSpace :: Char -> Bool isSpace = (== ' ')  spec :: Spec spec = do+     describe "splitTextsBy" $ do-        it "splits example text containers" $ do-            splitTextsBy exampleBreakPoints exampleContainers `shouldBe`-                [ ( ne [ contain "Vikipedija " 10, contain "(Википеди" 21 ]-                  , ne [ contain "ја)" 38 ]++        it "splits example text containers (start bias)" $ do+            splitTextsBy startBiasedBreakPoints exampleContainers `shouldBe`+                [ ( [ contain "Vikipedija " 10, contain "(Википеди" 21 ]+                  , [ contain "ја)" 38 ]                   )-                , ( ne [ contain "Vikipedija " 10, contain "(Википе" 21 ]-                  , ne [ contain "дија)" 34 ]+                , ( [ contain "Vikipedija " 10, contain "(Википе" 21 ]+                  , [ contain "дија)" 34 ]                   )-                , ( ne [ contain "Vikipedija " 10, contain "(Вики" 21 ]-                  , ne [ contain "педија)" 30 ]+                , ( [ contain "Vikipedija " 10, contain "(Вики" 21 ]+                  , [ contain "педија)" 30 ]                   )-                , ( ne [ contain "Vikipedija " 10, contain "(Ви" 21 ]-                  , ne [ contain "кипедија)" 26 ]+                , ( [ contain "Vikipedija " 10, contain "(Ви" 21 ]+                  , [ contain "кипедија)" 26 ]                   )-                , ( ne [ contain "Vikipedija " 10 ]-                  , ne [ contain "(Википедија)" 21 ]+                , ( [ contain "Vikipedija " 10 ]+                  , [ contain "(Википедија)" 21 ]                   )-                , ( ne [ contain "Vikipedi" 10 ]-                  , ne [ contain "ja " 18, contain "(Википедија)" 21 ]+                , ( [ contain "Vikipedi" 10 ]+                  , [ contain "ja " 18, contain "(Википедија)" 21 ]                   )-                , ( ne [ contain "Vikipe" 10 ]-                  , ne [ contain "dija " 16, contain "(Википедија)" 21 ]+                , ( [ contain "Vikipe" 10 ]+                  , [ contain "dija " 16, contain "(Википедија)" 21 ]                   )-                , ( ne [ contain "Viki" 10 ]-                  , ne [ contain "pedija " 14, contain "(Википедија)" 21 ]+                , ( [ contain "Viki" 10 ]+                  , [ contain "pedija " 14, contain "(Википедија)" 21 ]                   )-                , ( ne [ contain "Vi" 10 ]-                  , ne [ contain "kipedija " 12, contain "(Википедија)" 21 ]+                , ( [ contain "Vi" 10 ]+                  , [ contain "kipedija " 12, contain "(Википедија)" 21 ]                   )+                , ( []+                  , [ contain "Vikipedija " 10, contain "(Википедија)" 21 ]+                  )                 ]-    describe "trimTextsEnd" $ do++        it "splits example text containers (end bias)" $ do+            splitTextsBy endBiasedBreakPoints exampleContainers `shouldBe`+                [ ( [ contain "Vikipedija " 10, contain "(Википедија)" 21 ]+                  , []+                  )+                , ( [ contain "Vikipedija " 10, contain "(Википеди" 21 ]+                  , [ contain "ја)" 38 ]+                  )+                , ( [ contain "Vikipedija " 10, contain "(Википе" 21 ]+                  , [ contain "дија)" 34 ]+                  )+                , ( [ contain "Vikipedija " 10, contain "(Вики" 21 ]+                  , [ contain "педија)" 30 ]+                  )+                , ( [ contain "Vikipedija " 10, contain "(Ви" 21 ]+                  , [ contain "кипедија)" 26 ]+                  )+                , ( [ contain "Vikipedija " 10 ]+                  , [ contain "(Википедија)" 21 ]+                  )+                , ( [ contain "Vikipedi" 10 ]+                  , [ contain "ja " 18, contain "(Википедија)" 21 ]+                  )+                , ( [ contain "Vikipe" 10 ]+                  , [ contain "dija " 16, contain "(Википедија)" 21 ]+                  )+                , ( [ contain "Viki" 10 ]+                  , [ contain "pedija " 14, contain "(Википедија)" 21 ]+                  )+                , ( [ contain "Vi" 10 ]+                  , [ contain "kipedija " 12, contain "(Википедија)" 21 ]+                  )+                ]++    describe "dropWhileStartCascade" $ do+         describe "isSpace" $ do+             it "does nothing on an empty list" $ do                 let inputTexts = [] :: [Text]-                trimTextsEnd isSpace inputTexts `shouldBe` inputTexts-            it "does nothing when last run does not end with space" $ do+                dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts++            it "does nothing on list of empty texts" $ do+                let inputTexts = [empty, empty, empty]+                dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts++            it "does nothing when first run does not start with space" $ do                 let inputTexts = [pack "some ", pack "text"]-                trimTextsEnd isSpace inputTexts `shouldBe` inputTexts-            it "trims empty texts down to an empty list" $ do+                dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts++            it "does nothing when first non-empty run does not start with space" $ do+                let inputTexts = [empty, empty, pack "some ", pack "text"]+                dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts++            it "trims spaces from first text" $ do+                let inputTexts = [pack "      some ", pack "text"]+                dropWhileStartCascade isSpace inputTexts `shouldBe`+                    [pack "some ", pack "text"]++            it "trims texts containing only spaces to empty" $ do+                let inputTexts = [pack "    ", pack "some ", pack "text"]+                dropWhileStartCascade isSpace inputTexts `shouldBe`+                    [empty, pack "some ", pack "text"]++            it "trims first text that contains non-spaces" $ do+                let inputTexts = [pack "    ", pack "    some ", pack "text  "]+                dropWhileStartCascade isSpace inputTexts `shouldBe`+                    [empty, pack "some ", pack "text  "]++            it "trims space-only input down to empty texts" $ do+                let inputTexts = [pack " ", pack "  ", pack "   "]+                dropWhileStartCascade isSpace inputTexts `shouldBe`+                    [empty, empty, empty]++    describe "dropWhileEndCascade" $ do++        describe "isSpace" $ do++            it "does nothing on an empty list" $ do+                let inputTexts = [] :: [Text]+                dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts++            it "does nothing on list of empty texts" $ do                 let inputTexts = [empty, empty, empty]-                trimTextsEnd isSpace inputTexts `shouldBe` []-            it "trims empty texts from a list" $ do+                dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts++            it "does nothing when last run does not end with space" $ do+                let inputTexts = [pack "some ", pack "text"]+                dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts++            it "does nothing when last non-empty run does not end with space" $ do                 let inputTexts = [pack "some ", pack "text", empty, empty]-                trimTextsEnd isSpace inputTexts `shouldBe`-                    [pack "some ", pack "text"]+                dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts+             it "trims spaces from last text" $ do                 let inputTexts = [pack "some ", pack "text      "]-                trimTextsEnd isSpace inputTexts `shouldBe`+                dropWhileEndCascade isSpace inputTexts `shouldBe`                     [pack "some ", pack "text"]-            it "trims texts containing only spaces" $ do++            it "trims texts containing only spaces to empty" $ do                 let inputTexts = [pack "some ", pack "text", pack "    "]-                trimTextsEnd isSpace inputTexts `shouldBe`-                    [pack "some ", pack "text"]+                dropWhileEndCascade isSpace inputTexts `shouldBe`+                    [pack "some ", pack "text", empty]+             it "trims last text that contains non-spaces" $ do                 let inputTexts = [pack "some ", pack "text  ", pack "    "]-                trimTextsEnd isSpace inputTexts `shouldBe`-                    [pack "some ", pack "text"]+                dropWhileEndCascade isSpace inputTexts `shouldBe`+                    [pack "some ", pack "text", empty]++            it "trims space-only input down to empty texts" $ do+                let inputTexts = [pack " ", pack "  ", pack "   "]+                dropWhileEndCascade isSpace inputTexts `shouldBe`+                    [empty, empty, empty]
test/Data/Text/ParagraphLayout/Internal/TreeSpec.hs view
@@ -83,6 +83,48 @@     ]     t +sparseTree :: RootNode Int String+sparseTree = RootBox $ Box+    [ TextSequence "a" 1+    , InlineBox+        "empty box level 1 of 1"+        (Box+            []+            t+        )+        defaultBoxOptions+    , InlineBox+        "empty box level 1 of 2"+        (Box+            [ InlineBox+                "empty box level 2 of 2"+                (Box+                    []+                    t+                )+                defaultBoxOptions+            ]+            t+        )+        defaultBoxOptions+    , InlineBox+        "non-empty box"+        (Box+            [ TextSequence "b" 1+            , InlineBox+                "empty box in non-empty box"+                (Box+                    []+                    t+                )+                defaultBoxOptions+            ]+            t+        )+        defaultBoxOptions+    ]+    t+ leafData :: Leaf t d -> d leafData (TextLeaf d _ _ _) = d @@ -102,57 +144,77 @@ spec = do      describe "flatten" $ do-        let leaves = flatten complexTree -        it "should have one leaf per text sequence" $-            length leaves `shouldBe` 13+        describe "complex tree" $ do+            let leaves = flatten complexTree -        it "leaves should have expected data" $ do-            map leafData leaves `shouldBe`-                map (: []) ['a' .. 'm']+            it "should have one leaf per text sequence" $+                length leaves `shouldBe` 13 -        it "leaves should have expected depths" $ do-            map leafDepth leaves `shouldBe`-                [0, 1, 1, 2, 2, 1, 2, 3, 2, 2, 2, 3, 1]+            it "leaves should have expected data" $ do+                map leafData leaves `shouldBe`+                    map (: []) ['a' .. 'm'] -        it "leaves should have expected ancestor data" $ do-            map leafPathData leaves `shouldBe`-                [ []-                , ["box1"]-                , ["box1"]-                , ["box2", "box1"]-                , ["box2", "box1"]-                , ["box1"]-                , ["box3", "box1"]-                , ["box4", "box3", "box1"]-                , ["box3", "box1"]-                , ["box6", "box5"]-                , ["box6", "box5"]-                , ["box8", "box7", "box5"]-                , ["box5"]-                ]+            it "leaves should have expected depths" $ do+                map leafDepth leaves `shouldBe`+                    [0, 1, 1, 2, 2, 1, 2, 3, 2, 2, 2, 3, 1] -        it "leaves should have expected ancestor indexes" $ do-            map leafPathIndexes leaves `shouldBe`-                [ []-                , [0]-                , [0]-                , [1, 0]-                , [1, 0]-                , [0]-                , [2, 0]-                , [3, 2, 0]-                , [2, 0]-                , [5, 4]-                , [5, 4]-                , [7, 6, 4]-                , [4]-                ]+            it "leaves should have expected ancestor data" $ do+                map leafPathData leaves `shouldBe`+                    [ []+                    , ["box1"]+                    , ["box1"]+                    , ["box2", "box1"]+                    , ["box2", "box1"]+                    , ["box1"]+                    , ["box3", "box1"]+                    , ["box4", "box3", "box1"]+                    , ["box3", "box1"]+                    , ["box6", "box5"]+                    , ["box6", "box5"]+                    , ["box8", "box7", "box5"]+                    , ["box5"]+                    ] -        it "leaves 'c' and 'f' should have the same parent" $-            leafPath (leaves !! 2) !! 0 ==-            leafPath (leaves !! 5) !! 0 `shouldBe` True+            it "leaves should have expected ancestor indexes" $ do+                map leafPathIndexes leaves `shouldBe`+                    [ []+                    , [0]+                    , [0]+                    , [1, 0]+                    , [1, 0]+                    , [0]+                    , [2, 0]+                    , [3, 2, 0]+                    , [2, 0]+                    , [5, 4]+                    , [5, 4]+                    , [7, 6, 4]+                    , [4]+                    ] -        it "leaves 'e' and 'i' should have a different parent" $-            leafPath (leaves !! 4) !! 0 ==-            leafPath (leaves !! 8) !! 0 `shouldBe` False+            it "leaves 'c' and 'f' should have the same parent" $+                leafPath (leaves !! 2) !! 0 ==+                leafPath (leaves !! 5) !! 0 `shouldBe` True++            it "leaves 'e' and 'i' should have a different parent" $+                leafPath (leaves !! 4) !! 0 ==+                leafPath (leaves !! 8) !! 0 `shouldBe` False++        describe "unstrutted sparse tree with empty boxes" $ do+            let leaves = flatten sparseTree++            it "should have one leaf per text sequence" $+                length leaves `shouldBe` 2++            it "leaves should have expected data" $ do+                map leafData leaves `shouldBe` ["a", "b"]++        describe "strutted sparse tree with empty boxes" $ do+            let leaves = flatten $ strut "d" sparseTree++            it "should have one leaf per text sequence" $+                length leaves `shouldBe` 5++            it "leaves should have expected data" $ do+                map leafData leaves `shouldBe` ["a", "d", "d", "b", "d"]
test/Data/Text/ParagraphLayout/Plain/ParagraphData.hs view
@@ -1,6 +1,7 @@ {-# OPTIONS_GHC -fno-warn-deprecations #-} module Data.Text.ParagraphLayout.Plain.ParagraphData     ( arabicFillerParagraph+    , arabicHelloParagraph     , czechHelloParagraph     , devanagariAccentParagraph     , devanagariParagraph@@ -29,6 +30,10 @@     ) import Data.Text.ParagraphLayout.ParagraphConstruction +-- | Span with text in the Arabic language.+ar :: String -> (SpanOptions, String)+ar = (,) defaultSpanOptions { spanLanguage = "ar" }+ -- | Span with text in the Czech language. cs :: String -> (SpanOptions, String) cs = (,) defaultSpanOptions { spanLanguage = "cs" }@@ -79,6 +84,11 @@  spannedLoremIpsumParagraph :: ParagraphOptions -> Paragraph () spannedLoremIpsumParagraph = "xxxx" |< zxx "Lorem ipsum dolor " >|< zxx "sit amet, consectetur" >|< zxx " adipiscing elit, sed " >|< zxx "do eiusmod tempor" >|< zxx " incididunt ut labore " >|< zxx "et dolore magna" >|< zxx " aliqua. Ut enim " >|< zxx "ad minim veniam," >|< zxx " quis nostrud exercitation " >|< zxx "ullamco laboris nisi" >|< zxx " ut aliquip ex " >|< zxx "ea commodo consequat." >|< zxx " Duis aute irure " >|< zxx "dolor in reprehenderit" >|< zxx " in voluptate velit " >|< zxx "esse cillum dolore" >|< zxx " eu fugiat nulla " >|< zxx "pariatur. Excepteur" >|< zxx " sint occaecat cupidatat " >|< zxx "non proident, sunt" >|< zxx " in culpa qui " >|< zxx "officia deserunt mollit" >|< zxx " anim id est " >|< zxx "laborum." >| "z"++-- | Source:+-- <https://en.wikipedia.org/w/index.php?title=As-salamu_alaykum&oldid=1158575357>+arabicHelloParagraph :: ParagraphOptions -> Paragraph ()+arabicHelloParagraph = "xxxxx" |< ar "ٱلسَّلَامُ عَلَيْكُمَا!" >| "zz"  czechHelloParagraph :: ParagraphOptions -> Paragraph () czechHelloParagraph = "xxxxx" |< cs "Ahoj, světe!" >| "zz"
test/Data/Text/ParagraphLayout/PlainSpec.hs view
@@ -36,6 +36,11 @@                 let result = layoutPlain $ emptyParagraph opts                 result `shouldBe` emptyLayout +            it "wraps by characters when line is ultra narrow" $ do+                let opts = opts_ { paragraphMaxWidth = 100 }+                let result = layoutPlain $ arabicHelloParagraph opts+                result `shouldBeGolden` "arabicHelloParagraphUltraNarrow"+             it "wraps filler text at 20em" $ do                 let opts = opts_ { paragraphMaxWidth = 20000 }                 let result = layoutPlain $ arabicFillerParagraph opts
test/Data/Text/ParagraphLayout/PrettyShow.hs view
@@ -109,7 +109,7 @@         ]  instance Show d => PrettyShow (Fragment d) where-    prettyShow (Fragment d l bs r pen glyphs) = concat+    prettyShow (Fragment d l bs cr r pen glyphs) = concat         [ "Fragment"         , newline         , indent3@@ -124,6 +124,10 @@         , ", fragmentAncestorBoxes ="         , newline         , concat $ commaFirstList indent4 $ map show bs+        , newline+        , indent3+        , ", fragmentContentRect = "+        , show cr         , newline         , indent3         , ", fragmentRect = "
test/Data/Text/ParagraphLayout/RectSpec.hs view
@@ -1,6 +1,7 @@ module Data.Text.ParagraphLayout.RectSpec (spec) where  import Data.Int (Int32)+import Data.List.NonEmpty (NonEmpty ((:|)))  import Test.Hspec import Data.Text.ParagraphLayout.Internal.Rect@@ -13,17 +14,121 @@  spec :: Spec spec = do+     describe "union of two rects" $ do-        let r = union positiveRect negativeRect-        it "has origin at 50,-60" $-            (x_origin r, y_origin r) `shouldBe` (50, -60)-        it "has minimum coordinates at at 50,-90" $-            (x_min r, y_min r) `shouldBe` (50, -90)-        it "has terminus at 80,-90" $-            (x_terminus r, y_terminus r) `shouldBe` (80, -90)-        it "has maximum coordinates at 80,-60" $-            (x_max r, y_max r) `shouldBe` (80, -60)-        it "has size 30,-30" $-            (x_size r, y_size r) `shouldBe` (30, -30)-        it "has absolute size 30,30" $-            (width r, height r) `shouldBe` (30, 30)++        describe "low X, low Y" $+            llSpec $ union LL positiveRect negativeRect++        describe "low X, high Y" $+            lhSpec $ union LH positiveRect negativeRect++        describe "high X, low Y" $+            hlSpec $ union HL positiveRect negativeRect++        describe "high X, high Y" $+            hhSpec $ union HH positiveRect negativeRect++    describe "union of list" $ do++        describe "when empty" $+            it "should be Nothing" $ do+                unionMany LL []+                    `shouldBe` (Nothing :: Maybe (Rect Int32))++        describe "with single item" $ do++            describe "matching LL origin" $+                it "should be identity" $+                    unionMany LL [positiveRect]+                        `shouldBe` Just positiveRect++            describe "matching HH origin" $+                it "should be identity" $+                    unionMany HH [negativeRect]+                        `shouldBe` Just negativeRect++        describe "with single item repeated" $ do++            describe "matching LL origin" $+                it "should be equal to item" $+                    unionMany LL (replicate 2 positiveRect)+                        `shouldBe` Just positiveRect++            describe "matching HH origin" $+                it "should be equal to item" $+                    unionMany HH (replicate 7 negativeRect)+                        `shouldBe` Just negativeRect++        describe "with two items" $+            it "should behave the same as binary function" $+                unionMany LL [positiveRect, negativeRect]+                    `shouldBe` Just (union LL positiveRect negativeRect)++    describe "union of non-empty list" $ do++        describe "with single item" $ do++            describe "matching LL origin" $+                it "should be identity" $+                    unionMany1 LL (positiveRect :| [])+                        `shouldBe` positiveRect++            describe "matching HH origin" $+                it "should be identity" $+                    unionMany1 HH (negativeRect :| [])+                        `shouldBe` negativeRect++        describe "with two items" $+            it "should behave the same as binary function" $+                unionMany1 LL (positiveRect :| [negativeRect])+                    `shouldBe` union LL positiveRect negativeRect++llSpec :: Rect Int32 -> SpecWith ()+llSpec r = do+    commonSpec r+    it "has origin at 50,-90" $+        (x_origin r, y_origin r) `shouldBe` (50, -90)+    it "has terminus at 80,-60" $+        (x_terminus r, y_terminus r) `shouldBe` (80, -60)+    it "has size 30,30" $+        (x_size r, y_size r) `shouldBe` (30, 30)++lhSpec :: Rect Int32 -> SpecWith ()+lhSpec r = do+    commonSpec r+    it "has origin at 50,-60" $+        (x_origin r, y_origin r) `shouldBe` (50, -60)+    it "has terminus at 80,-90" $+        (x_terminus r, y_terminus r) `shouldBe` (80, -90)+    it "has size 30,-30" $+        (x_size r, y_size r) `shouldBe` (30, -30)++hlSpec :: Rect Int32 -> SpecWith ()+hlSpec r = do+    commonSpec r+    it "has origin at 80,-90" $+        (x_origin r, y_origin r) `shouldBe` (80, -90)+    it "has terminus at 50,-60" $+        (x_terminus r, y_terminus r) `shouldBe` (50, -60)+    it "has size -30,30" $+        (x_size r, y_size r) `shouldBe` (-30, 30)++hhSpec :: Rect Int32 -> SpecWith ()+hhSpec r = do+    commonSpec r+    it "has origin at 80,-60" $+        (x_origin r, y_origin r) `shouldBe` (80, -60)+    it "has terminus at 50,-90" $+        (x_terminus r, y_terminus r) `shouldBe` (50, -90)+    it "has size -30,-30" $+        (x_size r, y_size r) `shouldBe` (-30, -30)++commonSpec :: Rect Int32 -> SpecWith ()+commonSpec r = do+    it "has minimum coordinates at at 50,-90" $+        (x_min r, y_min r) `shouldBe` (50, -90)+    it "has maximum coordinates at 80,-60" $+        (x_max r, y_max r) `shouldBe` (80, -60)+    it "has absolute size 30,30" $+        (width r, height r) `shouldBe` (30, 30)
test/Data/Text/ParagraphLayout/Rich/ParagraphData.hs view
@@ -1,14 +1,22 @@ module Data.Text.ParagraphLayout.Rich.ParagraphData-    ( hardBoxBreakLTRParagraph+    ( emptyBoxParagraph+    , hardBoxBreakLTRParagraph     , hardBoxBreakRTLParagraph+    , intraWordBreakParagraph     , loremIpsumParagraph     , mixedDirectionComplexParagraph     , mixedDirectionSimpleParagraph+    , mixedLineHeightParagraph     , mixedScriptParagraph     , mixedSizesParagraph     , nestedBoxesParagraph     , neutralDirectionParagraph+    , newline1Paragraph+    , newline1TextParagraph+    , newline2Paragraph+    , newline2TextParagraph     , softBreakParagraph+    , spaceBoxParagraph     ) where @@ -21,6 +29,7 @@ import Data.Text.ParagraphLayout.Internal.Rich.Paragraph import Data.Text.ParagraphLayout.Internal.TextOptions import Data.Text.ParagraphLayout.Internal.Tree+import Data.Text.ParagraphLayout.Rich import Data.Text.ParagraphLayout.TextData  tLTR :: TextOptions@@ -41,6 +50,22 @@ text :: d -> String -> InnerNode Text d text label contents = TextSequence label (pack contents) +emptyBoxParagraph :: Font -> ParagraphOptions -> Paragraph String+emptyBoxParagraph font = constructParagraph+    (pack "prefix")+    (rootBox t+        [ text "text1" "empty "+        , box "box1" b t+            [ text "emptyText" ""+            ]+        , text "text2" " box"+        ]+    )+    (pack "suffix")+    where+        b = b_ { boxSpacing = BoxSpacingLeftRight 50 100 }+        t = tLTR { textFont = font, textLanguage = "en" }+ hardBoxBreakLTRParagraph :: Font -> ParagraphOptions -> Paragraph String hardBoxBreakLTRParagraph font = constructParagraph     (pack "prefix")@@ -79,6 +104,19 @@         b2 = b_ { boxSpacing = BoxSpacingLeftRight 150 200 }         t = tRTL { textFont = font, textLanguage = "zxx" } +-- | For testing that soft wrap preserves the form of Arabic characters.+-- Source: <https://www.w3.org/TR/css-text-3/#word-break-shaping>+intraWordBreakParagraph :: Font -> ParagraphOptions -> Paragraph String+intraWordBreakParagraph font = constructParagraph+    empty+    (rootBox t+        [ text "text" "نوشتن_نوشتن_نوشتن"+        ]+    )+    empty+    where+        t = tRTL { textFont = font, textLanguage = "fa" }+ -- | Filler text using the Latin script. -- Source: <https://www.lipsum.com/> loremIpsumParagraph :: Font -> ParagraphOptions -> Paragraph String@@ -133,6 +171,45 @@         t = (defaultTextOptions dir) { textFont = font, textLanguage = lang }         (_, lang, textContents, _) = mixedDirectionSimple dir +mixedLineHeightParagraph :: (Int32, Int32, Int32) -> Font -> ParagraphOptions ->+    Paragraph String+mixedLineHeightParagraph (lhSmall, lhMedium, lhLarge) font = constructParagraph+    (pack "prefix")+    (rootBox tMedium+        -- Line 1: all 3 heights, with medium height prevailing.+        [ text "mediumText" "medium "+        , box "smallBox" b_ tSmall [text "smallText" "small "]+        , text "mediumText" "medium "+        , box "largeBox" b_ tLarge [text "largeText" "large "]+        , text "mediumText" "medium "+        , text "lineBreak" "\n"+        -- Line 2: all 3 line heights, with medium only in the middle.+        , box "smallBox" b_ tSmall [text "smallText" "small "]+        , text "mediumText" "medium "+        , box "largeBox" b_ tLarge [text "largeText" "large "]+        , text "lineBreak" "\n"+        -- Line 3: asymmetric, medium changing into small.+        , text "mediumText" "medium "+        , box "smallBox" b_ tSmall [text "smallText" "small "]+        , text "lineBreak" "\n"+        -- Line 4: asymmetric, large changing into medium.+        , box "largeBox" b_ tLarge [text "largeText" "large "]+        , text "mediumText" "medium "+        , text "lineBreak" "\n"+        -- Line 5: small only.+        , box "smallBox" b_ tSmall [text "smallText" "small "]+        , text "lineBreak" "\n"+        -- Line 6: large only.+        , box "largeBox" b_ tLarge [text "largeText" "large "]+        ]+    )+    (pack "suffix")+    where+        tLarge = t { textLineHeight = Absolute lhLarge }+        tMedium = t { textLineHeight = Absolute lhMedium }+        tSmall = t { textLineHeight = Absolute lhSmall }+        t = tLTR { textFont = font, textLanguage = "en" }+ mixedScriptParagraph :: Font -> ParagraphOptions -> Paragraph String mixedScriptParagraph font = constructParagraph     (pack "prefix")@@ -206,6 +283,38 @@     where         t = (defaultTextOptions dir) { textFont = font, textLanguage = "zxx" } +newline1Paragraph :: Font -> ParagraphOptions -> Paragraph String+newline1Paragraph font = constructParagraph+    (pack "prefix")+    (rootBox t [ text "text" "\n" ])+    (pack "suffix")+    where+        t = tRTL { textFont = font, textLanguage = "zxx" }++newline1TextParagraph :: Font -> ParagraphOptions -> Paragraph String+newline1TextParagraph font = constructParagraph+    (pack "prefix")+    (rootBox t [ text "text" "\nt" ])+    (pack "suffix")+    where+        t = tRTL { textFont = font, textLanguage = "zxx" }++newline2Paragraph :: Font -> ParagraphOptions -> Paragraph String+newline2Paragraph font = constructParagraph+    (pack "prefix")+    (rootBox t [ text "text" "\n\n" ])+    (pack "suffix")+    where+        t = tRTL { textFont = font, textLanguage = "zxx" }++newline2TextParagraph :: Font -> ParagraphOptions -> Paragraph String+newline2TextParagraph font = constructParagraph+    (pack "prefix")+    (rootBox t [ text "text" "\n\nt" ])+    (pack "suffix")+    where+        t = tRTL { textFont = font, textLanguage = "zxx" }+ softBreakParagraph :: Int32 -> Font -> ParagraphOptions -> Paragraph String softBreakParagraph spacing font = constructParagraph     (pack "prefix")@@ -222,4 +331,23 @@     (pack "suffix")     where         b = b_ { boxSpacing = BoxSpacingLeftRight spacing spacing }+        t = tLTR { textFont = font, textLanguage = "en" }++spaceBoxParagraph :: BoxCollapse -> Font -> ParagraphOptions -> Paragraph String+spaceBoxParagraph collapse font = constructParagraph+    (pack "prefix")+    (rootBox t+        [ text "text1" "space"+        , box "box1" b t+            [ text "text2" " "+            ]+        , text "text3" "box"+        ]+    )+    (pack "suffix")+    where+        b = b_+            { boxCollapse = collapse+            , boxSpacing = BoxSpacingLeftRight 50 100+            }         t = tLTR { textFont = font, textLanguage = "en" }
test/Data/Text/ParagraphLayout/RichSpec.hs view
@@ -1,13 +1,15 @@ module Data.Text.ParagraphLayout.RichSpec (spec) where  import Data.Int (Int32)-import Data.Text.Glyphize (Direction (DirLTR, DirRTL))+import Data.Word (Word32)+import Data.Text.Glyphize (Direction (DirLTR, DirRTL), codepoint)  import Test.Hspec import System.FilePath ((</>)) import Data.Text.ParagraphLayout import Data.Text.ParagraphLayout.FontLoader import Data.Text.ParagraphLayout.Internal.Paginable (paginateAll)+import Data.Text.ParagraphLayout.Internal.ParagraphLine (forceLeftAlign) import Data.Text.ParagraphLayout.Internal.Rich.ParagraphLayout (shapedRuns) import Data.Text.ParagraphLayout.PrettyShow import Data.Text.ParagraphLayout.PrettyShow.Golden@@ -19,6 +21,28 @@ fragmentRects p = map toItem $ paragraphFragments p     where toItem (Fragment { fragmentUserData = d, fragmentRect = r }) = (d, r) +glyphRuns :: ParagraphLayout d -> [[Word32]]+glyphRuns = map (map (codepoint . fst) . fragmentGlyphs) . paragraphFragments++-- | A sufficiently large number to prevent line breaking,+-- while being round so that coordinates in test results are easy to read.+largeWidth :: Int32+largeWidth = 1000000000++-- | Expect two paragraph layouts to contain the same fragments,+-- except possibly shifted left or right.+shouldBeWrappedLike :: (Show d, Eq d) =>+    ParagraphLayout d -> ParagraphLayout d -> Expectation+shouldBeWrappedLike a b =+    forceLeftAlign a `shouldBe` forceLeftAlign b++-- | Expect two paragraph layouts to not contain the same fragments,+-- even if ignoring a possible shift to the left or to the right.+shouldNotBeWrappedLike :: (Show d, Eq d) =>+    ParagraphLayout d -> ParagraphLayout d -> Expectation+shouldNotBeWrappedLike a b =+    forceLeftAlign a `shouldNotBe` forceLeftAlign b+ spec :: Spec spec = do @@ -31,38 +55,167 @@             font <- runIO $ loadFont latinFont 0 testingOptions             fontSmall <- runIO $ loadFont latinFont 0 testingOptionsSmall -            it "wraps lorem ipsum at 20em" $ do-                let opts = defaultParagraphOptions { paragraphMaxWidth = 20000 }-                let input = loremIpsumParagraph font opts+            let commonWrapWidth = 20000+            let expectedSafeWidth = 19791++            describe "lorem ipsum at 20em, left aligned" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignLeft+                        }+                let input w = loremIpsumParagraph font $+                        opts { paragraphMaxWidth = w }+                let result20em = layoutRich $ input commonWrapWidth+                let resultSafe = layoutRich $ input expectedSafeWidth+                let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)++                it "wraps correctly" $+                    result20em `shouldBeGolden` "loremIpsum20em"++                it "gives correct safe width" $+                    paragraphSafeWidth result20em `shouldBe` expectedSafeWidth++                it "wraps the same at safe width" $+                    resultSafe `shouldBeWrappedLike` result20em++                it "does not wrap the same at smaller width" $+                    resultUnsafe `shouldNotBeWrappedLike` result20em++            describe "lorem ipsum at 20em, right aligned" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignRight+                        }+                let input w = loremIpsumParagraph font $+                        opts { paragraphMaxWidth = w }+                let result20em = layoutRich $ input commonWrapWidth+                let resultSafe = layoutRich $ input expectedSafeWidth+                let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)++                it "wraps correctly" $+                    result20em `shouldBeGolden` "loremIpsum20emRight"++                it "gives correct safe width" $+                    paragraphSafeWidth result20em `shouldBe` expectedSafeWidth++                it "wraps the same at safe width" $+                    resultSafe `shouldBeWrappedLike` result20em++                it "does not wrap the same at smaller width" $+                    resultUnsafe `shouldNotBeWrappedLike` result20em++            describe "lorem ipsum at 20em, centred" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignCentreH+                        }+                let input w = loremIpsumParagraph font $+                        opts { paragraphMaxWidth = w }+                let result20em = layoutRich $ input commonWrapWidth+                let resultSafe = layoutRich $ input expectedSafeWidth+                let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)+                let resultUnsafe2 = layoutRich $ input (expectedSafeWidth - 2)++                it "wraps correctly" $+                    result20em `shouldBeGolden` "loremIpsum20emCentre"++                it "gives correct safe width" $+                    paragraphSafeWidth result20em `shouldBe` expectedSafeWidth++                it "wraps the same at safe width" $+                    resultSafe `shouldBeWrappedLike` result20em++                it "does not wrap the same at smaller width" $+                    resultUnsafe `shouldNotBeWrappedLike` result20em++                -- Cover for false negatives when halving odd numbers.+                it "does not wrap the same at 2 units smaller width" $+                    resultUnsafe2 `shouldNotBeWrappedLike` result20em++            it "handles mixed line height" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }+                let lineHeights = (800, 1300, 1700)+                let input = mixedLineHeightParagraph lineHeights font opts                 let result = layoutRich input-                result `shouldBeGolden` "loremIpsum20em"+                result `shouldBeGolden` "mixedLineHeight"              it "handles mixed sizes" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = mixedSizesParagraph (font, fontSmall) opts                 let result = layoutRich input                 result `shouldBeGolden` "mixedSizes"              it "handles mixed script" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = mixedScriptParagraph font opts                 let result = layoutRich input                 result `shouldBeGolden` "mixedScript"              it "handles mixed script with line wraps" $ do-                let opts = defaultParagraphOptions { paragraphMaxWidth = 5000 }+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = 5000+                        }                 let input = mixedScriptParagraph font opts                 let result = layoutRich input                 result `shouldBeGolden` "mixedScriptWrap" +            it "handles empty box in the middle of the line" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = 5193+                        }+                let input = emptyBoxParagraph font opts+                let result = layoutRich input+                result `shouldBeGolden` "emptyBoxMiddle"++            it "handles space box in the middle of the line" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = 4635+                        }+                let input = spaceBoxParagraph AllowBoxCollapse font opts+                let result = layoutRich input+                result `shouldBeGolden` "spaceBoxMiddle"++            it "can collapse space box when on its own line" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = 100+                        }+                let input = spaceBoxParagraph AllowBoxCollapse font opts+                let result = layoutRich input+                result `shouldBeGolden` "spaceBoxCollapsed"++            it "can preserve space box when on its own line" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = 100+                        }+                let input = spaceBoxParagraph AvoidBoxCollapse font opts+                let result = layoutRich input+                result `shouldBeGolden` "spaceBoxPreserved"+             it "handles nested boxes" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = nestedBoxesParagraph font opts                 let result = layoutRich input                 result `shouldBeGolden` "nestedBoxes"              it "handles hard break in LTR boxes" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = hardBoxBreakLTRParagraph font opts                 let result = layoutRich input                 result `shouldBeGolden` "hardBoxBreakLTR"@@ -79,7 +232,10 @@                         originX + (sum $ take (n - 1) wordAdvancesWithSpace)                 let endX = originX + (sum wordAdvancesWithSpace)                 -- A paragraph exactly wide enough to fit the whole text.-                let opts = defaultParagraphOptions { paragraphMaxWidth = endX }+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = endX+                        }                 -- Small spacing that should push one word onto the next line.                 let s = 5                 -- Large spacing that should push two words onto the next line.@@ -116,48 +272,129 @@         describe "with Arabic font" $ do             font <- runIO $ loadFont arabicFont 0 testingOptions +            it "makes space for one newline" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }+                let input = newline1Paragraph font opts+                let result = layoutRich input+                result `shouldBeGolden` "newline1Paragraph"++            it "makes space for one newline plus text" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }+                let input = newline1TextParagraph font opts+                let result = layoutRich input+                result `shouldBeGolden` "newline1TextParagraph"++            it "makes space for two newlines" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }+                let input = newline2Paragraph font opts+                let result = layoutRich input+                result `shouldBeGolden` "newline2Paragraph"++            it "makes space for two newlines plus text" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }+                let input = newline2TextParagraph font opts+                let result = layoutRich input+                result `shouldBeGolden` "newline2TextParagraph"+             it "handles hard break in RTL boxes" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = hardBoxBreakRTLParagraph font opts                 let result = layoutRich input                 result `shouldBeGolden` "hardBoxBreakRTL"              it "handles neutral characters in RTL paragraph" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = neutralDirectionParagraph DirRTL font opts                 let result = layoutRich input                 result `shouldBeGolden` "neutralDirectionRTL"              it "handles neutral characters in LTR paragraph" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = neutralDirectionParagraph DirLTR font opts                 let result = layoutRich input                 result `shouldBeGolden` "neutralDirectionLTR"              it "handles simple mixed direction in RTL paragraph" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = mixedDirectionSimpleParagraph DirRTL font opts                 let result = layoutRich input                 result `shouldBeGolden` "mixedDirectionSimpleRTL"              it "handles simple mixed direction in LTR paragraph" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = mixedDirectionSimpleParagraph DirLTR font opts                 let result = layoutRich input                 result `shouldBeGolden` "mixedDirectionSimpleLTR"              it "handles complex mixed direction in RTL paragraph" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = mixedDirectionComplexParagraph DirRTL font opts                 let result = layoutRich input                 result `shouldBeGolden` "mixedDirectionComplexRTL"              it "handles complex mixed direction in LTR paragraph" $ do                 let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = largeWidth+                        }                 let input = mixedDirectionComplexParagraph DirLTR font opts                 let result = layoutRich input                 result `shouldBeGolden` "mixedDirectionComplexLTR" +            it "preserves joining forms across soft breaks" $ do+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = 4500+                        }+                let input = intraWordBreakParagraph font opts+                let glyphRunsVisual = glyphRuns $ layoutRich input+                let glyphRunsLogical = map reverse glyphRunsVisual+                -- Glyph indexes for the corresponding Arabic letters/ligatures:+                let n_initial = 407+                let v_final = 971+                let sh_initial = 373+                let tn_final = 1363+                -- Glyph index for the underscore used to break repetitions:+                let sp = 89+                -- Unconventional code formatting here shows that there should+                -- be three repetitions of the same glyph sequence, unaffected+                -- by the line break inserted after an initial form and before+                -- a final form.+                glyphRunsLogical `shouldBe`+                    [[n_initial, v_final, sh_initial, tn_final, sp,+                    n_initial, v_final, sh_initial], [tn_final, sp,+                    n_initial, v_final, sh_initial, tn_final]]+     describe "paginate" $ do         let             goldenDir = ".golden" </> "paginatedRichParagraphLayout"@@ -167,7 +404,10 @@             font <- runIO $ loadFont latinFont 0 testingOptions              it "wraps lorem ipsum at 20em" $ do-                let opts = defaultParagraphOptions { paragraphMaxWidth = 20000 }+                let opts = defaultParagraphOptions+                        { paragraphAlignment = AlignStart+                        , paragraphMaxWidth = 20000+                        }                 let input = loremIpsumParagraph font opts                 let pl = layoutRich input                 let popts = PageOptions@@ -195,13 +435,24 @@             let fontPath = arabicFont             font <- runIO $ loadFont fontPath 0 demoOptions -            let-                opts = defaultParagraphOptions-                input = mixedDirectionComplexParagraph DirRTL font opts-                result = layoutRich input-                shapedRunsSpec = shapedRunsSpecWithFont fontPath font+            let shapedRunsSpec = shapedRunsSpecWithFont fontPath font              shapedRunsSpec                 "handles complex mixed direction in RTL paragraph"-                "mixedDirectionComplexRTL"-                result+                "mixedDirectionComplexRTL" $+                layoutRich $+                mixedDirectionComplexParagraph DirRTL font $+                defaultParagraphOptions+                    { paragraphAlignment = AlignStart+                    , paragraphMaxWidth = 640+                    }++            shapedRunsSpec+                "preserves joining forms across soft breaks"+                "intraWordBreak" $+                layoutRich $+                intraWordBreakParagraph font $+                defaultParagraphOptions+                    { paragraphAlignment = AlignStart+                    , paragraphMaxWidth = 144+                    }