浏览代码

#245 vertical alignment of text

circular17 3 年之前
父节点
当前提交
3ed5c5deda
共有 32 个文件被更改,包括 1052 次插入323 次删除
  1. 646 306
      lazpaint/lazpaintmainform.lfm
  2. 3 0
      lazpaint/lazpaintmainform.lrj
  3. 5 0
      lazpaint/lazpaintmainform.pas
  4. 18 1
      lazpaint/maintoolbar.inc
  5. 12 0
      lazpaint/release/bin/i18n/lazpaint.ar.po
  6. 12 0
      lazpaint/release/bin/i18n/lazpaint.bg.po
  7. 12 0
      lazpaint/release/bin/i18n/lazpaint.cs.po
  8. 12 0
      lazpaint/release/bin/i18n/lazpaint.de.po
  9. 12 0
      lazpaint/release/bin/i18n/lazpaint.es.po
  10. 12 0
      lazpaint/release/bin/i18n/lazpaint.fi.po
  11. 12 0
      lazpaint/release/bin/i18n/lazpaint.fr.po
  12. 12 0
      lazpaint/release/bin/i18n/lazpaint.it.po
  13. 12 0
      lazpaint/release/bin/i18n/lazpaint.ja.po
  14. 12 0
      lazpaint/release/bin/i18n/lazpaint.kab.po
  15. 12 0
      lazpaint/release/bin/i18n/lazpaint.lv.po
  16. 12 0
      lazpaint/release/bin/i18n/lazpaint.nl.po
  17. 12 0
      lazpaint/release/bin/i18n/lazpaint.pl.po
  18. 12 0
      lazpaint/release/bin/i18n/lazpaint.pot
  19. 12 0
      lazpaint/release/bin/i18n/lazpaint.pt_BR.po
  20. 12 0
      lazpaint/release/bin/i18n/lazpaint.ru.po
  21. 12 0
      lazpaint/release/bin/i18n/lazpaint.sv.po
  22. 12 0
      lazpaint/release/bin/i18n/lazpaint.zh_CN.po
  23. 38 0
      lazpaint/tools/utool.pas
  24. 2 0
      lazpaint/tools/utooltext.pas
  25. 8 1
      lazpaint/tools/utoolvectorial.pas
  26. 35 15
      lazpaintcontrols/lcvectortextshapes.pas
  27. 二进制
      resources/vector/textalignbottom32.lzp
  28. 27 0
      resources/vector/textalignbottom32.svg
  29. 二进制
      resources/vector/textalignmiddle32.lzp
  30. 27 0
      resources/vector/textalignmiddle32.svg
  31. 二进制
      resources/vector/textaligntop32.lzp
  32. 27 0
      resources/vector/textaligntop32.svg

+ 646 - 306
lazpaint/lazpaintmainform.lfm

@@ -3337,9 +3337,9 @@ object FMain: TFMain
     Left = 9
     Height = 30
     Top = 243
-    Width = 185
+    Width = 265
     ClientHeight = 30
-    ClientWidth = 185
+    ClientWidth = 265
     TabOrder = 34
     Visible = False
     OnMouseMove = Panel_TextMoreMouseMove
@@ -3347,7 +3347,7 @@ object FMain: TFMain
       Left = 1
       Height = 22
       Top = 1
-      Width = 162
+      Width = 247
       Align = alNone
       AutoSize = True
       EdgeBorders = []
@@ -3389,7 +3389,7 @@ object FMain: TFMain
         Style = tbsCheck
       end
       object Tool_TextBidirectional: TToolButton
-        Left = 93
+        Left = 101
         Hint = 'Bidirectional'
         Top = 0
         Down = True
@@ -3399,7 +3399,7 @@ object FMain: TFMain
         Style = tbsCheck
       end
       object Tool_TextLTR: TToolButton
-        Left = 116
+        Left = 124
         Hint = 'Left to right'
         Top = 0
         Grouped = True
@@ -3408,7 +3408,7 @@ object FMain: TFMain
         Style = tbsCheck
       end
       object Tool_TextRTL: TToolButton
-        Left = 139
+        Left = 147
         Hint = 'Right to left'
         Top = 0
         Grouped = True
@@ -3416,6 +3416,43 @@ object FMain: TFMain
         OnMouseMove = Panel_TextMoreMouseMove
         Style = tbsCheck
       end
+      object Tool_TextAlignTop: TToolButton
+        Left = 178
+        Hint = 'Align top'
+        Top = 0
+        Down = True
+        ImageIndex = 7
+        OnMouseMove = Panel_TextMoreMouseMove
+        Style = tbsCheck
+      end
+      object Tool_TextAlignMiddle: TToolButton
+        Left = 201
+        Hint = 'Center vertically'
+        Top = 0
+        ImageIndex = 8
+        OnMouseMove = Panel_TextMoreMouseMove
+        Style = tbsCheck
+      end
+      object Tool_TextAlignBottom: TToolButton
+        Left = 224
+        Hint = 'Align bottom'
+        Top = 0
+        ImageIndex = 9
+        OnMouseMove = Panel_TextMoreMouseMove
+        Style = tbsCheck
+      end
+      object ToolButton1: TToolButton
+        Left = 170
+        Height = 22
+        Top = 0
+        Style = tbsSeparator
+      end
+      object ToolButton2: TToolButton
+        Left = 93
+        Height = 22
+        Top = 0
+        Style = tbsSeparator
+      end
     end
   end
   object ImageList16: TBGRAImageList
@@ -5501,6 +5538,7 @@ object FMain: TFMain
       Hint = 'Center shape horizontally'
       OnExecute = EditShapeCenterHorizontallyExecute
       OnUpdate = EditShapeCenterHorizontallyUpdate
+      ShortCut = 32840
     end
     object EditShapeAlignRight: TAction
       Category = 'Edit'
@@ -5521,6 +5559,7 @@ object FMain: TFMain
       Hint = 'Center shape vertically'
       OnExecute = EditShapeCenterVerticallyExecute
       OnUpdate = EditShapeCenterVerticallyUpdate
+      ShortCut = 32854
     end
     object EditShapeAlignBottom: TAction
       Category = 'Edit'
@@ -12792,183 +12831,8 @@ object FMain: TFMain
     Top = 514
     Items = {
       3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574
-      662D38223F3E0D0A3C434F4E46494720436F756E743D2237223E0D0A20203C49
-      74656D30205356473D22266C743B3F786D6C2076657273696F6E3D2671756F74
-      3B312E302671756F743B20656E636F64696E673D2671756F743B7574662D3826
-      71756F743B3F2667743B262378443B262378413B266C743B7376672077696474
-      683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B687474
-      703A2F2F7777772E77332E6F72672F323030302F7376672671756F743B206865
-      696768743D2671756F743B33322671756F743B2076696577426F783D2671756F
-      743B3020302033322033322671756F743B20786D6C6E733A696E6B7363617065
-      3D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E
-      616D657370616365732F696E6B73636170652671756F743B2667743B26237844
-      3B262378413B2020266C743B67206F7061636974793D2671756F743B31267175
-      6F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77696B
-      692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F666F
-      726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F743B
-      4C61796572312671756F743B20696E6B73636170653A67726F75706D6F64653D
-      2671756F743B6C617965722671756F743B20626772613A6F726967696E616C56
-      696577426F783D2671756F743B3020302032392032382671756F743B2667743B
-      262378443B262378413B20202020266C743B7061746820643D2671756F743B4D
-      32382E383433373520362E353933373520302E303933373520302E3033313235
-      2671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B207374
-      726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F70616369
-      74793D2671756F743B312671756F743B2F2667743B262378443B262378413B20
-      202020266C743B7061746820643D2671756F743B4D3920323820392033203135
-      2033203135203238207A2671756F743B2066696C6C3D2671756F743B626C6163
-      6B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B20
-      66696C6C2D6F7061636974793D2671756F743B302E373932313536392671756F
-      743B2F2667743B262378443B262378413B20202020266C743B7061746820643D
-      2671756F743B4D31352032382031382E38383436312032372E39343437312051
-      32322E37363932332032372E38383934322032342E38363239382032352E3630
-      3831372032362E39353637332032332E33323639322032362E39373833362032
-      302E31363334362032372031372032352E37352031352E32352032342E352031
-      332E352032322E32352031322E37352032302031322031372E35203132204C31
-      35203132203135203136203137203136205131392031362032302E3520313720
-      32322031382032312E38323231312032302E30333834362032312E3634343233
-      2032322E30373639322032302E32363932332032322E39383331372031382E38
-      393432332032332E38383934322031362E39343731312032332E393434373120
-      4C3135203234207A2671756F743B2066696C6C3D2671756F743B626C61636B26
-      71756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B206669
-      6C6C2D6F7061636974793D2671756F743B302E373932313536392671756F743B
-      2F2667743B262378443B262378413B2020266C743B2F672667743B262378443B
-      262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D0A
-      20203C4974656D31205356473D22266C743B3F786D6C2076657273696F6E3D26
-      71756F743B312E302671756F743B20656E636F64696E673D2671756F743B7574
-      662D382671756F743B3F2667743B262378443B262378413B266C743B73766720
-      77696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F74
-      3B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F74
-      3B206865696768743D2671756F743B33322671756F743B2076696577426F783D
-      2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B73
-      636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F
-      72672F6E616D657370616365732F696E6B73636170652671756F743B2667743B
-      262378443B262378413B2020266C743B67206F7061636974793D2671756F743B
-      312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F
-      2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356
-      475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671
-      756F743B4C61796572312671756F743B20696E6B73636170653A67726F75706D
-      6F64653D2671756F743B6C617965722671756F743B20626772613A6F72696769
-      6E616C56696577426F783D2671756F743B3020302032392032382671756F743B
-      2667743B262378443B262378413B20202020266C743B7061746820643D267175
-      6F743B4D32382E383433373520362E353933373520302E303933373520302E30
-      333132352671756F743B2066696C6C3D2671756F743B626C61636B2671756F74
-      3B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F
-      7061636974793D2671756F743B312671756F743B2F2667743B262378443B2623
-      78413B20202020266C743B7061746820643D2671756F743B4D31312032382031
-      362E352031332032302E35203133203135203238207A2671756F743B2066696C
-      6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F74
-      3B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B30
-      2E373932313536392671756F743B2F2667743B262378443B262378413B202020
-      20266C743B7061746820643D2671756F743B4D31382031302031392036203233
-      20362032312E37313837352031302E3039333735207A2671756F743B2066696C
-      6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F74
-      3B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B30
-      2E373932313536392671756F743B2F2667743B262378443B262378413B202020
-      20266C743B7061746820643D2671756F743B4D32342E34303632352031342E33
-      3433373520312E303933373520302E3033313235207A2671756F743B2066696C
-      6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F74
-      3B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B30
-      2E373932313536392671756F743B2F2667743B262378443B262378413B202026
-      6C743B2F672667743B262378443B262378413B266C743B2F7376672667743B26
-      2378443B262378413B222F3E0D0A20203C4974656D32205356473D22266C743B
-      3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B20656E63
-      6F64696E673D2671756F743B7574662D382671756F743B3F2667743B26237844
-      3B262378413B266C743B7376672077696474683D2671756F743B33322671756F
-      743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F7267
-      2F323030302F7376672671756F743B206865696768743D2671756F743B333226
-      71756F743B2076696577426F783D2671756F743B302030203332203332267175
-      6F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F
-      7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B73
-      636170652671756F743B2667743B262378443B262378413B2020266C743B6720
-      6F7061636974793D2671756F743B312671756F743B20786D6C6E733A62677261
-      3D2671756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F
-      72672F4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B
-      73636170653A6C6162656C3D2671756F743B4C61796572312671756F743B2069
-      6E6B73636170653A67726F75706D6F64653D2671756F743B6C61796572267175
-      6F743B20626772613A6F726967696E616C56696577426F783D2671756F743B2D
-      3331202D352039342033352671756F743B2667743B262378443B262378413B20
-      202020266C743B7465787420783D2671756F743B302671756F743B20793D2671
-      756F743B2D352671756F743B2066696C6C3D2671756F743B626C61636B267175
-      6F743B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E74
-      2D73697A653D2671756F743B33312671756F743B20666F6E742D7374796C653D
-      2671756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D26
-      71756F743B4672656553616E732671756F743B20666F6E742D7765696768743D
-      2671756F743B6E6F726D616C2671756F743B2066696C6C2D6F7061636974793D
-      2671756F743B302E373932313536392671756F743B20746578742D6465636F72
-      6174696F6E3D2671756F743B2671756F743B2667743B262378443B262378413B
-      202020202020266C743B747370616E20783D2671756F743B372E333737383637
-      2671756F743B20793D2671756F743B32332671756F743B20646972656374696F
-      6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D267175
-      6F743B31372E32343432372671756F743B2667743B75266C743B2F747370616E
-      2667743B262378443B262378413B20202020266C743B2F746578742667743B26
-      2378443B262378413B20202020266C743B7061746820643D2671756F743B4D36
-      2E3520333020362E352032362032352E352032362032352E35203330207A2671
-      756F743B2066696C6C3D2671756F743B626C61636B2671756F743B207374726F
-      6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163697479
-      3D2671756F743B302E373932313536392671756F743B2F2667743B262378443B
-      262378413B2020266C743B2F672667743B262378443B262378413B266C743B2F
-      7376672667743B262378443B262378413B222F3E0D0A20203C4974656D332053
-      56473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671
-      756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F
-      2667743B262378443B262378413B266C743B7376672077696474683D2671756F
-      743B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F7777
-      772E77332E6F72672F323030302F7376672671756F743B206865696768743D26
-      71756F743B33322671756F743B2076696577426F783D2671756F743B30203020
-      33322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F74
-      3B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D65737061
-      6365732F696E6B73636170652671756F743B2667743B262378443B262378413B
-      2020266C743B67206F7061636974793D2671756F743B312671756F743B20786D
-      6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E66726565
-      70617363616C2E6F72672F4C617A5061696E745F5356475F666F726D61742671
-      756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C6179657231
-      2671756F743B20696E6B73636170653A67726F75706D6F64653D2671756F743B
-      6C617965722671756F743B20626772613A6F726967696E616C56696577426F78
-      3D2671756F743B3520392032322031392671756F743B2667743B262378443B26
-      2378413B20202020266C743B7061746820643D2671756F743B4D352E35203230
-      20352E352031362032362E352031362032362E35203230207A2671756F743B20
-      66696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671
-      756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F
-      743B302E373932313536392671756F743B2F2667743B262378443B262378413B
-      20202020266C743B7061746820643D2671756F743B4D31322E37353235312032
-      322E30343231372031332E30393533342032332E3139313232205131332E3433
-      3831372032342E33343032372031342E38373239312032342E36383834362031
-      362E33303736352032352E30333636352031372E37323138372032352E303033
-      31382031392E31333630382032342E39363937312031392E3632323232203234
-      2E32313834312032302E31303833352032332E34363731312031392E38343331
-      392032322E30393730392031392E35373830322032302E37323730372031372E
-      36333334382032302E31353235342031352E36383839332031392E3537383032
-      2031332E3635362031392E30343736392031312E36323330372031382E353137
-      33362031302E363530382031372E353839323820392E3637383532352031362E
-      3636313220392E3731353133372031352E303138343420392E37353137343920
-      31332E33373536372031302E33373439312031322E33353639392031302E3939
-      3830372031312E333338332031322E34303639322031302E363439352031332E
-      383135373720392E3936303639342031362E303732383220392E393035373737
-      2031382E333239383620392E38353038362031392E35303730322031302E3339
-      3633352032302E36383431382031302E39343138352032312E34383238312031
-      312E37353437332032322E32383134352031322E35363736312032322E343234
-      37352031332E3235363431204C32322E35363830362031332E39343532322031
-      392E33363436332031342E30353530352031382E383334332031332E34353234
-      32205131382E33303339372031322E38343937382031362E363936392031322E
-      39313030362031352E30383938322031322E39373033342031342E3036333535
-      2031332E35393434322031332E30333732382031342E323138352031322E3934
-      38392031342E38363533332031322E38363035312031352E3531323136203135
-      2E35353633352031362E33393630342031382E32353231392031372E32373939
-      322031392E35333338332031372E37323138362032302E38313534362031382E
-      31363338312032312E37343335342031382E39313531312032322E3637313631
-      2031392E36363634312032322E38393235382032312E31323438322032332E31
-      313335362032322E35383332332032322E37362032332E39303930352032322E
-      34303634352032352E32333438382032302E35383530362032362E3632363334
-      2031382E37363336382032382E30313738312031362E33353739372032372E39
-      393633362031332E39353232362032372E39373439312031322E393033323420
-      32372E34353433392031312E38353432332032362E39333338362031302E3835
-      3437362032362E303834333720392E3835353330322032352E32333438382039
-      2E3732303439382032332E3632303232204C392E3538353639342032322E3030
-      353536207A2671756F743B2066696C6C3D2671756F743B626C61636B2671756F
-      743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D
-      6F7061636974793D2671756F743B302E373932313536392671756F743B2F2667
-      743B262378443B262378413B2020266C743B2F672667743B262378443B262378
-      413B266C743B2F7376672667743B262378443B262378413B222F3E0D0A20203C
-      4974656D34205356473D22266C743B3F786D6C2076657273696F6E3D2671756F
+      662D38223F3E0D0A3C434F4E46494720436F756E743D223130223E0D0A20203C
+      4974656D30205356473D22266C743B3F786D6C2076657273696F6E3D2671756F
       743B312E302671756F743B20656E636F64696E673D2671756F743B7574662D38
       2671756F743B3F2667743B262378443B262378413B266C743B73766720776964
       74683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B6874
@@ -12983,105 +12847,576 @@ object FMain: TFMain
       6F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F74
       3B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F6465
       3D2671756F743B6C617965722671756F743B20626772613A6F726967696E616C
-      56696577426F783D2671756F743B2D313520302036322032392671756F743B26
-      67743B262378443B262378413B20202020266C743B7061746820643D2671756F
-      743B4D332E352032322031302031352E35203130203230203232203230203232
-      2031352E352032382E352032322032322032382E352032322032342031302032
-      342031302032382E35207A2671756F743B2066696C6C3D2671756F743B626C61
+      56696577426F783D2671756F743B3020302032392032382671756F743B266774
+      3B262378443B262378413B20202020266C743B7061746820643D2671756F743B
+      4D32382E383433373520362E353933373520302E303933373520302E30333132
+      352671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B2073
+      74726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163
+      6974793D2671756F743B312671756F743B2F2667743B262378443B262378413B
+      20202020266C743B7061746820643D2671756F743B4D39203238203920332031
+      352033203135203238207A2671756F743B2066696C6C3D2671756F743B626C61
       636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B
       2066696C6C2D6F7061636974793D2671756F743B302E37393231353639267175
-      6F743B2F2667743B262378443B262378413B20202020266C743B746578742078
-      3D2671756F743B302671756F743B20793D2671756F743B302671756F743B2066
-      696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D267175
-      6F743B6E6F6E652671756F743B20666F6E742D73697A653D2671756F743B3135
-      2671756F743B20666F6E742D7374796C653D2671756F743B6E6F726D616C2671
-      756F743B20666F6E742D66616D696C793D2671756F743B4672656553616E7326
-      71756F743B20666F6E742D7765696768743D2671756F743B6E6F726D616C2671
-      756F743B2066696C6C2D6F7061636974793D2671756F743B302E393638363237
-      352671756F743B20746578742D6465636F726174696F6E3D2671756F743B2671
-      756F743B2667743B262378443B262378413B202020202020266C743B74737061
-      6E20783D2671756F743B31312E3832382671756F743B20793D2671756F743B31
-      342671756F743B20646972656374696F6E3D2671756F743B6C74722671756F74
-      3B20746578744C656E6774683D2671756F743B382E3334343030312671756F74
-      3B2667743B3F266C743B2F747370616E2667743B262378443B262378413B2020
-      2020266C743B2F746578742667743B262378443B262378413B2020266C743B2F
-      672667743B262378443B262378413B266C743B2F7376672667743B262378443B
-      262378413B222F3E0D0A20203C4974656D35205356473D22266C743B3F786D6C
-      2076657273696F6E3D2671756F743B312E302671756F743B20656E636F64696E
-      673D2671756F743B7574662D382671756F743B3F2667743B262378443B262378
-      413B266C743B7376672077696474683D2671756F743B33322671756F743B2078
-      6D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72672F323030
-      302F7376672671756F743B206865696768743D2671756F743B33322671756F74
-      3B2076696577426F783D2671756F743B3020302033322033322671756F743B20
-      786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F7777772E
-      696E6B73636170652E6F72672F6E616D657370616365732F696E6B7363617065
-      2671756F743B2667743B262378443B262378413B2020266C743B67206F706163
-      6974793D2671756F743B312671756F743B20786D6C6E733A626772613D267175
-      6F743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F4C
-      617A5061696E745F5356475F666F726D61742671756F743B20696E6B73636170
-      653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B7363
-      6170653A67726F75706D6F64653D2671756F743B6C617965722671756F743B20
-      626772613A6F726967696E616C56696577426F783D2671756F743B2D3130202D
-      312035362033302671756F743B2667743B262378443B262378413B2020202026
-      6C743B7061746820643D2671756F743B4D342032302032322032302032322031
-      352E352032382E352032322032322032382E352032322032342034203234207A
-      2671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B207374
-      726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F70616369
-      74793D2671756F743B302E373932313536392671756F743B2F2667743B262378
-      443B262378413B20202020266C743B7465787420783D2671756F743B34267175
-      6F743B20793D2671756F743B2D312671756F743B2066696C6C3D2671756F743B
-      626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E65267175
-      6F743B20666F6E742D73697A653D2671756F743B31342671756F743B20666F6E
-      742D7374796C653D2671756F743B6E6F726D616C2671756F743B20666F6E742D
-      66616D696C793D2671756F743B4672656553616E732671756F743B20666F6E74
-      2D7765696768743D2671756F743B6E6F726D616C2671756F743B2066696C6C2D
-      6F7061636974793D2671756F743B302E393638363237352671756F743B207465
-      78742D6465636F726174696F6E3D2671756F743B2671756F743B2667743B2623
-      78443B262378413B202020202020266C743B747370616E20783D2671756F743B
-      342671756F743B20793D2671756F743B31322671756F743B2064697265637469
+      6F743B2F2667743B262378443B262378413B20202020266C743B706174682064
+      3D2671756F743B4D31352032382031382E38383436312032372E393434373120
+      5132322E37363932332032372E38383934322032342E38363239382032352E36
+      303831372032362E39353637332032332E33323639322032362E393738333620
+      32302E31363334362032372031372032352E37352031352E32352032342E3520
+      31332E352032322E32352031322E37352032302031322031372E35203132204C
+      3135203132203135203136203137203136205131392031362032302E35203137
+      2032322031382032312E38323231312032302E30333834362032312E36343432
+      332032322E30373639322032302E32363932332032322E39383331372031382E
+      38393432332032332E38383934322031362E39343731312032332E3934343731
+      204C3135203234207A2671756F743B2066696C6C3D2671756F743B626C61636B
+      2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066
+      696C6C2D6F7061636974793D2671756F743B302E373932313536392671756F74
+      3B2F2667743B262378443B262378413B2020266C743B2F672667743B26237844
+      3B262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D
+      0A20203C4974656D31205356473D22266C743B3F786D6C2076657273696F6E3D
+      2671756F743B312E302671756F743B20656E636F64696E673D2671756F743B75
+      74662D382671756F743B3F2667743B262378443B262378413B266C743B737667
+      2077696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F
+      743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F
+      743B206865696768743D2671756F743B33322671756F743B2076696577426F78
+      3D2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B
+      73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E
+      6F72672F6E616D657370616365732F696E6B73636170652671756F743B266774
+      3B262378443B262378413B2020266C743B67206F7061636974793D2671756F74
+      3B312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A
+      2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F53
+      56475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D26
+      71756F743B4C61796572312671756F743B20696E6B73636170653A67726F7570
+      6D6F64653D2671756F743B6C617965722671756F743B20626772613A6F726967
+      696E616C56696577426F783D2671756F743B3020302032392032382671756F74
+      3B2667743B262378443B262378413B20202020266C743B7061746820643D2671
+      756F743B4D32382E383433373520362E353933373520302E303933373520302E
+      30333132352671756F743B2066696C6C3D2671756F743B626C61636B2671756F
+      743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D
+      6F7061636974793D2671756F743B312671756F743B2F2667743B262378443B26
+      2378413B20202020266C743B7061746820643D2671756F743B4D313120323820
+      31362E352031332032302E35203133203135203238207A2671756F743B206669
+      6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F
+      743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B
+      302E373932313536392671756F743B2F2667743B262378443B262378413B2020
+      2020266C743B7061746820643D2671756F743B4D313820313020313920362032
+      3320362032312E37313837352031302E3039333735207A2671756F743B206669
+      6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F
+      743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B
+      302E373932313536392671756F743B2F2667743B262378443B262378413B2020
+      2020266C743B7061746820643D2671756F743B4D32342E34303632352031342E
+      333433373520312E303933373520302E3033313235207A2671756F743B206669
+      6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F
+      743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B
+      302E373932313536392671756F743B2F2667743B262378443B262378413B2020
+      266C743B2F672667743B262378443B262378413B266C743B2F7376672667743B
+      262378443B262378413B222F3E0D0A20203C4974656D32205356473D22266C74
+      3B3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B20656E
+      636F64696E673D2671756F743B7574662D382671756F743B3F2667743B262378
+      443B262378413B266C743B7376672077696474683D2671756F743B3332267175
+      6F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72
+      672F323030302F7376672671756F743B206865696768743D2671756F743B3332
+      2671756F743B2076696577426F783D2671756F743B3020302033322033322671
+      756F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F
+      2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B
+      73636170652671756F743B2667743B262378443B262378413B2020266C743B67
+      206F7061636974793D2671756F743B312671756F743B20786D6C6E733A626772
+      613D2671756F743B68747470733A2F2F77696B692E6672656570617363616C2E
+      6F72672F4C617A5061696E745F5356475F666F726D61742671756F743B20696E
+      6B73636170653A6C6162656C3D2671756F743B4C61796572312671756F743B20
+      696E6B73636170653A67726F75706D6F64653D2671756F743B6C617965722671
+      756F743B20626772613A6F726967696E616C56696577426F783D2671756F743B
+      2D3331202D352039342033352671756F743B2667743B262378443B262378413B
+      20202020266C743B7465787420783D2671756F743B302671756F743B20793D26
+      71756F743B2D352671756F743B2066696C6C3D2671756F743B626C61636B2671
+      756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E
+      742D73697A653D2671756F743B33312671756F743B20666F6E742D7374796C65
+      3D2671756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D
+      2671756F743B4672656553616E732671756F743B20666F6E742D776569676874
+      3D2671756F743B6E6F726D616C2671756F743B2066696C6C2D6F706163697479
+      3D2671756F743B302E373932313536392671756F743B20746578742D6465636F
+      726174696F6E3D2671756F743B2671756F743B2667743B262378443B26237841
+      3B202020202020266C743B747370616E20783D2671756F743B372E3337373836
+      372671756F743B20793D2671756F743B32332671756F743B2064697265637469
       6F6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D2671
-      756F743B32332E31353431332671756F743B2667743BCEB1CEB2CEB3266C743B
-      2F747370616E2667743B262378443B262378413B20202020266C743B2F746578
-      742667743B262378443B262378413B2020266C743B2F672667743B262378443B
-      262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D0A
-      20203C4974656D36205356473D22266C743B3F786D6C2076657273696F6E3D26
-      71756F743B312E302671756F743B20656E636F64696E673D2671756F743B7574
-      662D382671756F743B3F2667743B262378443B262378413B266C743B73766720
-      77696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F74
-      3B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F74
-      3B206865696768743D2671756F743B33322671756F743B2076696577426F783D
-      2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B73
-      636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F
-      72672F6E616D657370616365732F696E6B73636170652671756F743B2667743B
-      262378443B262378413B2020266C743B67206F7061636974793D2671756F743B
-      312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F
-      2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356
-      475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671
-      756F743B4C61796572312671756F743B20696E6B73636170653A67726F75706D
-      6F64653D2671756F743B6C617965722671756F743B20626772613A6F72696769
-      6E616C56696577426F783D2671756F743B2D313520302035392032392671756F
-      743B2667743B262378443B262378413B20202020266C743B7061746820643D26
-      71756F743B4D332E352032322031302031352E35203130203230203238203230
-      2032382032342031302032342031302032382E35207A2671756F743B2066696C
-      6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F74
-      3B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B30
-      2E373932313536392671756F743B2F2667743B262378443B262378413B202020
-      20266C743B7465787420783D2671756F743B302671756F743B20793D2671756F
-      743B302671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B
-      207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D7369
-      7A653D2671756F743B31352671756F743B20666F6E742D7374796C653D267175
-      6F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D2671756F
-      743B4672656553616E732671756F743B20666F6E742D7765696768743D267175
-      6F743B6E6F726D616C2671756F743B2066696C6C2D6F7061636974793D267175
-      6F743B302E393638363237352671756F743B20746578742D6465636F72617469
-      6F6E3D2671756F743B2671756F743B2667743B262378443B262378413B202020
-      202020266C743B747370616E20783D2671756F743B32392671756F743B20793D
-      2671756F743B31342671756F743B20646972656374696F6E3D2671756F743B72
-      746C2671756F743B20746578744C656E6774683D2671756F743B32322E353638
-      2671756F743B2667743BD790D791D792266C743B2F747370616E2667743B2623
-      78443B262378413B20202020266C743B2F746578742667743B262378443B2623
-      78413B2020266C743B2F672667743B262378443B262378413B266C743B2F7376
-      672667743B262378443B262378413B222F3E0D0A3C2F434F4E4649473E0D0A
+      756F743B31372E32343432372671756F743B2667743B75266C743B2F74737061
+      6E2667743B262378443B262378413B20202020266C743B2F746578742667743B
+      262378443B262378413B20202020266C743B7061746820643D2671756F743B4D
+      362E3520333020362E352032362032352E352032362032352E35203330207A26
+      71756F743B2066696C6C3D2671756F743B626C61636B2671756F743B20737472
+      6F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974
+      793D2671756F743B302E373932313536392671756F743B2F2667743B26237844
+      3B262378413B2020266C743B2F672667743B262378443B262378413B266C743B
+      2F7376672667743B262378443B262378413B222F3E0D0A20203C4974656D3320
+      5356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E3026
+      71756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B
+      3F2667743B262378443B262378413B266C743B7376672077696474683D267175
+      6F743B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F77
+      77772E77332E6F72672F323030302F7376672671756F743B206865696768743D
+      2671756F743B33322671756F743B2076696577426F783D2671756F743B302030
+      2033322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F
+      743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D657370
+      616365732F696E6B73636170652671756F743B2667743B262378443B26237841
+      3B2020266C743B67206F7061636974793D2671756F743B312671756F743B2078
+      6D6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E667265
+      6570617363616C2E6F72672F4C617A5061696E745F5356475F666F726D617426
+      71756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C61796572
+      312671756F743B20696E6B73636170653A67726F75706D6F64653D2671756F74
+      3B6C617965722671756F743B20626772613A6F726967696E616C56696577426F
+      783D2671756F743B3520392032322031392671756F743B2667743B262378443B
+      262378413B20202020266C743B7061746820643D2671756F743B4D352E352032
+      3020352E352031362032362E352031362032362E35203230207A2671756F743B
+      2066696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D26
+      71756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D267175
+      6F743B302E373932313536392671756F743B2F2667743B262378443B26237841
+      3B20202020266C743B7061746820643D2671756F743B4D31322E373532353120
+      32322E30343231372031332E30393533342032332E3139313232205131332E34
+      333831372032342E33343032372031342E38373239312032342E363838343620
+      31362E33303736352032352E30333636352031372E37323138372032352E3030
+      3331382031392E31333630382032342E39363937312031392E36323232322032
+      342E32313834312032302E31303833352032332E34363731312031392E383433
+      31392032322E30393730392031392E35373830322032302E3732373037203137
+      2E36333334382032302E31353235342031352E36383839332031392E35373830
+      322031332E3635362031392E30343736392031312E36323330372031382E3531
+      3733362031302E363530382031372E353839323820392E363738353235203136
+      2E3636313220392E3731353133372031352E303138343420392E373531373439
+      2031332E33373536372031302E33373439312031322E33353639392031302E39
+      393830372031312E333338332031322E34303639322031302E36343935203133
+      2E383135373720392E3936303639342031362E303732383220392E3930353737
+      372031382E333239383620392E38353038362031392E35303730322031302E33
+      393633352032302E36383431382031302E39343138352032312E343832383120
+      31312E37353437332032322E32383134352031322E35363736312032322E3432
+      3437352031332E3235363431204C32322E35363830362031332E393435323220
+      31392E33363436332031342E30353530352031382E383334332031332E343532
+      3432205131382E33303339372031322E38343937382031362E36393639203132
+      2E39313030362031352E30383938322031322E39373033342031342E30363335
+      352031332E35393434322031332E30333732382031342E323138352031322E39
+      3438392031342E38363533332031322E38363035312031352E35313231362031
+      352E35353633352031362E33393630342031382E32353231392031372E323739
+      39322031392E35333338332031372E37323138362032302E3831353436203138
+      2E31363338312032312E37343335342031382E39313531312032322E36373136
+      312031392E36363634312032322E38393235382032312E31323438322032332E
+      31313335362032322E35383332332032322E37362032332E3930393035203232
+      2E34303634352032352E32333438382032302E35383530362032362E36323633
+      342031382E37363336382032382E30313738312031362E33353739372032372E
+      39393633362031332E39353232362032372E39373439312031322E3930333234
+      2032372E34353433392031312E38353432332032362E39333338362031302E38
+      353437362032362E303834333720392E3835353330322032352E323334383820
+      392E3732303439382032332E3632303232204C392E3538353639342032322E30
+      30353536207A2671756F743B2066696C6C3D2671756F743B626C61636B267175
+      6F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C
+      2D6F7061636974793D2671756F743B302E373932313536392671756F743B2F26
+      67743B262378443B262378413B2020266C743B2F672667743B262378443B2623
+      78413B266C743B2F7376672667743B262378443B262378413B222F3E0D0A2020
+      3C4974656D34205356473D22266C743B3F786D6C2076657273696F6E3D267175
+      6F743B312E302671756F743B20656E636F64696E673D2671756F743B7574662D
+      382671756F743B3F2667743B262378443B262378413B266C743B737667207769
+      6474683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B68
+      7474703A2F2F7777772E77332E6F72672F323030302F7376672671756F743B20
+      6865696768743D2671756F743B33322671756F743B2076696577426F783D2671
+      756F743B3020302033322033322671756F743B20786D6C6E733A696E6B736361
+      70653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F7267
+      2F6E616D657370616365732F696E6B73636170652671756F743B2667743B2623
+      78443B262378413B2020266C743B67206F7061636974793D2671756F743B3126
+      71756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77
+      696B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F
+      666F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F
+      743B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F64
+      653D2671756F743B6C617965722671756F743B20626772613A6F726967696E61
+      6C56696577426F783D2671756F743B2D313520302036322032392671756F743B
+      2667743B262378443B262378413B20202020266C743B7061746820643D267175
+      6F743B4D332E352032322031302031352E352031302032302032322032302032
+      322031352E352032382E352032322032322032382E3520323220323420313020
+      32342031302032382E35207A2671756F743B2066696C6C3D2671756F743B626C
+      61636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F74
+      3B2066696C6C2D6F7061636974793D2671756F743B302E373932313536392671
+      756F743B2F2667743B262378443B262378413B20202020266C743B7465787420
+      783D2671756F743B302671756F743B20793D2671756F743B302671756F743B20
+      66696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671
+      756F743B6E6F6E652671756F743B20666F6E742D73697A653D2671756F743B31
+      352671756F743B20666F6E742D7374796C653D2671756F743B6E6F726D616C26
+      71756F743B20666F6E742D66616D696C793D2671756F743B4672656553616E73
+      2671756F743B20666F6E742D7765696768743D2671756F743B6E6F726D616C26
+      71756F743B2066696C6C2D6F7061636974793D2671756F743B302E3936383632
+      37352671756F743B20746578742D6465636F726174696F6E3D2671756F743B26
+      71756F743B2667743B262378443B262378413B202020202020266C743B747370
+      616E20783D2671756F743B31312E3832382671756F743B20793D2671756F743B
+      31342671756F743B20646972656374696F6E3D2671756F743B6C74722671756F
+      743B20746578744C656E6774683D2671756F743B382E3334343030312671756F
+      743B2667743B3F266C743B2F747370616E2667743B262378443B262378413B20
+      202020266C743B2F746578742667743B262378443B262378413B2020266C743B
+      2F672667743B262378443B262378413B266C743B2F7376672667743B26237844
+      3B262378413B222F3E0D0A20203C4974656D35205356473D22266C743B3F786D
+      6C2076657273696F6E3D2671756F743B312E302671756F743B20656E636F6469
+      6E673D2671756F743B7574662D382671756F743B3F2667743B262378443B2623
+      78413B266C743B7376672077696474683D2671756F743B33322671756F743B20
+      786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72672F3230
+      30302F7376672671756F743B206865696768743D2671756F743B33322671756F
+      743B2076696577426F783D2671756F743B3020302033322033322671756F743B
+      20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F777777
+      2E696E6B73636170652E6F72672F6E616D657370616365732F696E6B73636170
+      652671756F743B2667743B262378443B262378413B2020266C743B67206F7061
+      636974793D2671756F743B312671756F743B20786D6C6E733A626772613D2671
+      756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F
+      4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B736361
+      70653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B73
+      636170653A67726F75706D6F64653D2671756F743B6C617965722671756F743B
+      20626772613A6F726967696E616C56696577426F783D2671756F743B2D313020
+      2D312035362033302671756F743B2667743B262378443B262378413B20202020
+      266C743B7061746820643D2671756F743B4D3420323020323220323020323220
+      31352E352032382E352032322032322032382E35203232203234203420323420
+      7A2671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B2073
+      74726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163
+      6974793D2671756F743B302E373932313536392671756F743B2F2667743B2623
+      78443B262378413B20202020266C743B7465787420783D2671756F743B342671
+      756F743B20793D2671756F743B2D312671756F743B2066696C6C3D2671756F74
+      3B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671
+      756F743B20666F6E742D73697A653D2671756F743B31342671756F743B20666F
+      6E742D7374796C653D2671756F743B6E6F726D616C2671756F743B20666F6E74
+      2D66616D696C793D2671756F743B4672656553616E732671756F743B20666F6E
+      742D7765696768743D2671756F743B6E6F726D616C2671756F743B2066696C6C
+      2D6F7061636974793D2671756F743B302E393638363237352671756F743B2074
+      6578742D6465636F726174696F6E3D2671756F743B2671756F743B2667743B26
+      2378443B262378413B202020202020266C743B747370616E20783D2671756F74
+      3B342671756F743B20793D2671756F743B31322671756F743B20646972656374
+      696F6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D26
+      71756F743B32332E31353431332671756F743B2667743BCEB1CEB2CEB3266C74
+      3B2F747370616E2667743B262378443B262378413B20202020266C743B2F7465
+      78742667743B262378443B262378413B2020266C743B2F672667743B26237844
+      3B262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D
+      0A20203C4974656D36205356473D22266C743B3F786D6C2076657273696F6E3D
+      2671756F743B312E302671756F743B20656E636F64696E673D2671756F743B75
+      74662D382671756F743B3F2667743B262378443B262378413B266C743B737667
+      2077696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F
+      743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F
+      743B206865696768743D2671756F743B33322671756F743B2076696577426F78
+      3D2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B
+      73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E
+      6F72672F6E616D657370616365732F696E6B73636170652671756F743B266774
+      3B262378443B262378413B2020266C743B67206F7061636974793D2671756F74
+      3B312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A
+      2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F53
+      56475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D26
+      71756F743B4C61796572312671756F743B20696E6B73636170653A67726F7570
+      6D6F64653D2671756F743B6C617965722671756F743B20626772613A6F726967
+      696E616C56696577426F783D2671756F743B2D31352030203539203239267175
+      6F743B2667743B262378443B262378413B20202020266C743B7061746820643D
+      2671756F743B4D332E352032322031302031352E352031302032302032382032
+      302032382032342031302032342031302032382E35207A2671756F743B206669
+      6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F
+      743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B
+      302E373932313536392671756F743B2F2667743B262378443B262378413B2020
+      2020266C743B7465787420783D2671756F743B302671756F743B20793D267175
+      6F743B302671756F743B2066696C6C3D2671756F743B626C61636B2671756F74
+      3B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D73
+      697A653D2671756F743B31352671756F743B20666F6E742D7374796C653D2671
+      756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D267175
+      6F743B4672656553616E732671756F743B20666F6E742D7765696768743D2671
+      756F743B6E6F726D616C2671756F743B2066696C6C2D6F7061636974793D2671
+      756F743B302E393638363237352671756F743B20746578742D6465636F726174
+      696F6E3D2671756F743B2671756F743B2667743B262378443B262378413B2020
+      20202020266C743B747370616E20783D2671756F743B32392671756F743B2079
+      3D2671756F743B31342671756F743B20646972656374696F6E3D2671756F743B
+      72746C2671756F743B20746578744C656E6774683D2671756F743B32322E3536
+      382671756F743B2667743BD790D791D792266C743B2F747370616E2667743B26
+      2378443B262378413B20202020266C743B2F746578742667743B262378443B26
+      2378413B2020266C743B2F672667743B262378443B262378413B266C743B2F73
+      76672667743B262378443B262378413B222F3E0D0A20203C4974656D37205356
+      473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E30267175
+      6F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F26
+      67743B262378443B262378413B266C743B7376672077696474683D2671756F74
+      3B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F777777
+      2E77332E6F72672F323030302F7376672671756F743B206865696768743D2671
+      756F743B33322671756F743B2076696577426F783D2671756F743B3020302033
+      322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F743B
+      687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D6573706163
+      65732F696E6B73636170652671756F743B2667743B262378443B262378413B20
+      20266C743B67206F7061636974793D2671756F743B312671756F743B20786D6C
+      6E733A626772613D2671756F743B68747470733A2F2F77696B692E6672656570
+      617363616C2E6F72672F4C617A5061696E745F5356475F666F726D6174267175
+      6F743B20696E6B73636170653A6C6162656C3D2671756F743B4C617965723126
+      71756F743B20696E6B73636170653A67726F75706D6F64653D2671756F743B6C
+      617965722671756F743B20626772613A6F726967696E616C56696577426F783D
+      2671756F743B3220342032382031342671756F743B2667743B262378443B2623
+      78413B20202020266C743B646566732667743B262378443B262378413B202020
+      202020266C743B6C696E6561724772616469656E742069643D2671756F743B6C
+      61796572312D66696C6C67726164312671756F743B2078313D2671756F743B31
+      352671756F743B2078323D2671756F743B31352671756F743B2079313D267175
+      6F743B322E352671756F743B2079323D2671756F743B362E352671756F743B20
+      7370726561644D6574686F643D2671756F743B7265706561742671756F743B20
+      6772616469656E74556E6974733D2671756F743B7573657253706163654F6E55
+      73652671756F743B20636F6C6F722D696E746572706F6C6174696F6E3D267175
+      6F743B6C696E6561725247422671756F743B2667743B262378443B262378413B
+      2020202020202020266C743B73746F70206F66667365743D2671756F743B3026
+      71756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F
+      743B2073746F702D6F7061636974793D2671756F743B302E3439383033393226
+      71756F743B2F2667743B262378443B262378413B2020202020202020266C743B
+      73746F70206F66667365743D2671756F743B302E303632352671756F743B2073
+      746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70
+      2D6F7061636974793D2671756F743B302E333039383033392671756F743B2F26
+      67743B262378443B262378413B2020202020202020266C743B73746F70206F66
+      667365743D2671756F743B302E3132352671756F743B2073746F702D636F6C6F
+      723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479
+      3D2671756F743B302E3134353039382671756F743B2F2667743B262378443B26
+      2378413B2020202020202020266C743B73746F70206F66667365743D2671756F
+      743B302E313837352671756F743B2073746F702D636F6C6F723D2671756F743B
+      626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30
+      2E30333532393431322671756F743B2F2667743B262378443B262378413B2020
+      202020202020266C743B73746F70206F66667365743D2671756F743B302E3235
+      2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175
+      6F743B2073746F702D6F7061636974793D2671756F743B302671756F743B2F26
+      67743B262378443B262378413B2020202020202020266C743B73746F70206F66
+      667365743D2671756F743B302E333132352671756F743B2073746F702D636F6C
+      6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+      793D2671756F743B302E30333532393431322671756F743B2F2667743B262378
+      443B262378413B2020202020202020266C743B73746F70206F66667365743D26
+      71756F743B302E3337352671756F743B2073746F702D636F6C6F723D2671756F
+      743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74
+      3B302E3134353039382671756F743B2F2667743B262378443B262378413B2020
+      202020202020266C743B73746F70206F66667365743D2671756F743B302E3433
+      37352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26
+      71756F743B2073746F702D6F7061636974793D2671756F743B302E3330393830
+      33392671756F743B2F2667743B262378443B262378413B202020202020202026
+      6C743B73746F70206F66667365743D2671756F743B302E352671756F743B2073
+      746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70
+      2D6F7061636974793D2671756F743B302E343938303339322671756F743B2F26
+      67743B262378443B262378413B2020202020202020266C743B73746F70206F66
+      667365743D2671756F743B302E353632352671756F743B2073746F702D636F6C
+      6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+      793D2671756F743B302E363930313936312671756F743B2F2667743B26237844
+      3B262378413B2020202020202020266C743B73746F70206F66667365743D2671
+      756F743B302E3632352671756F743B2073746F702D636F6C6F723D2671756F74
+      3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+      302E3835343930322671756F743B2F2667743B262378443B262378413B202020
+      2020202020266C743B73746F70206F66667365743D2671756F743B302E363837
+      352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+      756F743B2073746F702D6F7061636974793D2671756F743B302E393634373035
+      392671756F743B2F2667743B262378443B262378413B2020202020202020266C
+      743B73746F70206F66667365743D2671756F743B302E37352671756F743B2073
+      746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70
+      2D6F7061636974793D2671756F743B312671756F743B2F2667743B262378443B
+      262378413B2020202020202020266C743B73746F70206F66667365743D267175
+      6F743B302E383132352671756F743B2073746F702D636F6C6F723D2671756F74
+      3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+      302E393634373035392671756F743B2F2667743B262378443B262378413B2020
+      202020202020266C743B73746F70206F66667365743D2671756F743B302E3837
+      352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+      756F743B2073746F702D6F7061636974793D2671756F743B302E383534393032
+      2671756F743B2F2667743B262378443B262378413B2020202020202020266C74
+      3B73746F70206F66667365743D2671756F743B302E393337352671756F743B20
+      73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F
+      702D6F7061636974793D2671756F743B302E363930313936312671756F743B2F
+      2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+      66667365743D2671756F743B312671756F743B2073746F702D636F6C6F723D26
+      71756F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671
+      756F743B302E343938303339322671756F743B2F2667743B262378443B262378
+      413B202020202020266C743B2F6C696E6561724772616469656E742667743B26
+      2378443B262378413B20202020266C743B2F646566732667743B262378443B26
+      2378413B20202020266C743B7061746820643D2671756F743B4D352E35203420
+      352E352036203720382037203130203220313220322031382033302031382033
+      3020313220323520313020323520382032362E3520362032362E352034207A26
+      71756F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C
+      6C6772616431292671756F743B207374726F6B653D2671756F743B6E6F6E6526
+      71756F743B2F2667743B262378443B262378413B2020266C743B2F672667743B
+      262378443B262378413B266C743B2F7376672667743B262378443B262378413B
+      222F3E0D0A20203C4974656D38205356473D22266C743B3F786D6C2076657273
+      696F6E3D2671756F743B312E302671756F743B20656E636F64696E673D267175
+      6F743B7574662D382671756F743B3F2667743B262378443B262378413B266C74
+      3B7376672077696474683D2671756F743B33322671756F743B20786D6C6E733D
+      2671756F743B687474703A2F2F7777772E77332E6F72672F323030302F737667
+      2671756F743B206865696768743D2671756F743B33322671756F743B20766965
+      77426F783D2671756F743B3020302033322033322671756F743B20786D6C6E73
+      3A696E6B73636170653D2671756F743B687474703A2F2F7777772E696E6B7363
+      6170652E6F72672F6E616D657370616365732F696E6B73636170652671756F74
+      3B2667743B262378443B262378413B2020266C743B67206F7061636974793D26
+      71756F743B312671756F743B20786D6C6E733A626772613D2671756F743B6874
+      7470733A2F2F77696B692E6672656570617363616C2E6F72672F4C617A506169
+      6E745F5356475F666F726D61742671756F743B20696E6B73636170653A6C6162
+      656C3D2671756F743B4C61796572312671756F743B20696E6B73636170653A67
+      726F75706D6F64653D2671756F743B6C617965722671756F743B20626772613A
+      6F726967696E616C56696577426F783D2671756F743B32203920323820313426
+      71756F743B2667743B262378443B262378413B20202020266C743B6465667326
+      67743B262378443B262378413B202020202020266C743B6C696E656172477261
+      6469656E742069643D2671756F743B6C61796572312D66696C6C677261643126
+      71756F743B2078313D2671756F743B31352671756F743B2078323D2671756F74
+      3B31352671756F743B2079313D2671756F743B372E352671756F743B2079323D
+      2671756F743B31312E352671756F743B207370726561644D6574686F643D2671
+      756F743B7265706561742671756F743B206772616469656E74556E6974733D26
+      71756F743B7573657253706163654F6E5573652671756F743B20636F6C6F722D
+      696E746572706F6C6174696F6E3D2671756F743B6C696E656172524742267175
+      6F743B2667743B262378443B262378413B2020202020202020266C743B73746F
+      70206F66667365743D2671756F743B302671756F743B2073746F702D636F6C6F
+      723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479
+      3D2671756F743B302E343938303339322671756F743B2F2667743B262378443B
+      262378413B2020202020202020266C743B73746F70206F66667365743D267175
+      6F743B302E303632352671756F743B2073746F702D636F6C6F723D2671756F74
+      3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+      302E333039383033392671756F743B2F2667743B262378443B262378413B2020
+      202020202020266C743B73746F70206F66667365743D2671756F743B302E3132
+      352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+      756F743B2073746F702D6F7061636974793D2671756F743B302E313435303938
+      2671756F743B2F2667743B262378443B262378413B2020202020202020266C74
+      3B73746F70206F66667365743D2671756F743B302E313837352671756F743B20
+      73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F
+      702D6F7061636974793D2671756F743B302E30333532393431322671756F743B
+      2F2667743B262378443B262378413B2020202020202020266C743B73746F7020
+      6F66667365743D2671756F743B302E32352671756F743B2073746F702D636F6C
+      6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+      793D2671756F743B302671756F743B2F2667743B262378443B262378413B2020
+      202020202020266C743B73746F70206F66667365743D2671756F743B302E3331
+      32352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26
+      71756F743B2073746F702D6F7061636974793D2671756F743B302E3033353239
+      3431322671756F743B2F2667743B262378443B262378413B2020202020202020
+      266C743B73746F70206F66667365743D2671756F743B302E3337352671756F74
+      3B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073
+      746F702D6F7061636974793D2671756F743B302E3134353039382671756F743B
+      2F2667743B262378443B262378413B2020202020202020266C743B73746F7020
+      6F66667365743D2671756F743B302E343337352671756F743B2073746F702D63
+      6F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F706163
+      6974793D2671756F743B302E333039383033392671756F743B2F2667743B2623
+      78443B262378413B2020202020202020266C743B73746F70206F66667365743D
+      2671756F743B302E352671756F743B2073746F702D636F6C6F723D2671756F74
+      3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+      302E343938303339322671756F743B2F2667743B262378443B262378413B2020
+      202020202020266C743B73746F70206F66667365743D2671756F743B302E3536
+      32352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26
+      71756F743B2073746F702D6F7061636974793D2671756F743B302E3639303139
+      36312671756F743B2F2667743B262378443B262378413B202020202020202026
+      6C743B73746F70206F66667365743D2671756F743B302E3632352671756F743B
+      2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374
+      6F702D6F7061636974793D2671756F743B302E3835343930322671756F743B2F
+      2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+      66667365743D2671756F743B302E363837352671756F743B2073746F702D636F
+      6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369
+      74793D2671756F743B302E393634373035392671756F743B2F2667743B262378
+      443B262378413B2020202020202020266C743B73746F70206F66667365743D26
+      71756F743B302E37352671756F743B2073746F702D636F6C6F723D2671756F74
+      3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+      312671756F743B2F2667743B262378443B262378413B2020202020202020266C
+      743B73746F70206F66667365743D2671756F743B302E383132352671756F743B
+      2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374
+      6F702D6F7061636974793D2671756F743B302E393634373035392671756F743B
+      2F2667743B262378443B262378413B2020202020202020266C743B73746F7020
+      6F66667365743D2671756F743B302E3837352671756F743B2073746F702D636F
+      6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369
+      74793D2671756F743B302E3835343930322671756F743B2F2667743B26237844
+      3B262378413B2020202020202020266C743B73746F70206F66667365743D2671
+      756F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F
+      743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74
+      3B302E363930313936312671756F743B2F2667743B262378443B262378413B20
+      20202020202020266C743B73746F70206F66667365743D2671756F743B312671
+      756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74
+      3B2073746F702D6F7061636974793D2671756F743B302E343938303339322671
+      756F743B2F2667743B262378443B262378413B202020202020266C743B2F6C69
+      6E6561724772616469656E742667743B262378443B262378413B20202020266C
+      743B2F646566732667743B262378443B262378413B20202020266C743B706174
+      6820643D2671756F743B4D352E35203920352E35203131203720313320372031
+      3520322031372032203233203330203233203330203137203235203135203235
+      2031332032362E352031312032362E352039207A2671756F743B2066696C6C3D
+      2671756F743B75726C28236C61796572312D66696C6C6772616431292671756F
+      743B207374726F6B653D2671756F743B6E6F6E652671756F743B2F2667743B26
+      2378443B262378413B2020266C743B2F672667743B262378443B262378413B26
+      6C743B2F7376672667743B262378443B262378413B222F3E0D0A20203C497465
+      6D39205356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B31
+      2E302671756F743B20656E636F64696E673D2671756F743B7574662D38267175
+      6F743B3F2667743B262378443B262378413B266C743B7376672077696474683D
+      2671756F743B33322671756F743B20786D6C6E733D2671756F743B687474703A
+      2F2F7777772E77332E6F72672F323030302F7376672671756F743B2068656967
+      68743D2671756F743B33322671756F743B2076696577426F783D2671756F743B
+      3020302033322033322671756F743B20786D6C6E733A696E6B73636170653D26
+      71756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D
+      657370616365732F696E6B73636170652671756F743B2667743B262378443B26
+      2378413B2020266C743B67206F7061636974793D2671756F743B312671756F74
+      3B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E
+      6672656570617363616C2E6F72672F4C617A5061696E745F5356475F666F726D
+      61742671756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C61
+      796572312671756F743B20696E6B73636170653A67726F75706D6F64653D2671
+      756F743B6C617965722671756F743B20626772613A6F726967696E616C566965
+      77426F783D2671756F743B322031362032382031352671756F743B2667743B26
+      2378443B262378413B20202020266C743B646566732667743B262378443B2623
+      78413B202020202020266C743B6C696E6561724772616469656E742069643D26
+      71756F743B6C61796572312D66696C6C67726164312671756F743B2078313D26
+      71756F743B31352671756F743B2078323D2671756F743B31352671756F743B20
+      79313D2671756F743B31342E35343136372671756F743B2079323D2671756F74
+      3B31382E35343136372671756F743B207370726561644D6574686F643D267175
+      6F743B7265706561742671756F743B206772616469656E74556E6974733D2671
+      756F743B7573657253706163654F6E5573652671756F743B20636F6C6F722D69
+      6E746572706F6C6174696F6E3D2671756F743B6C696E6561725247422671756F
+      743B2667743B262378443B262378413B2020202020202020266C743B73746F70
+      206F66667365743D2671756F743B302671756F743B2073746F702D636F6C6F72
+      3D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D
+      2671756F743B302E343938303339322671756F743B2F2667743B262378443B26
+      2378413B2020202020202020266C743B73746F70206F66667365743D2671756F
+      743B302E303632352671756F743B2073746F702D636F6C6F723D2671756F743B
+      626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30
+      2E333039383033392671756F743B2F2667743B262378443B262378413B202020
+      2020202020266C743B73746F70206F66667365743D2671756F743B302E313235
+      2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175
+      6F743B2073746F702D6F7061636974793D2671756F743B302E31343530393826
+      71756F743B2F2667743B262378443B262378413B2020202020202020266C743B
+      73746F70206F66667365743D2671756F743B302E313837352671756F743B2073
+      746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70
+      2D6F7061636974793D2671756F743B302E30333532393431322671756F743B2F
+      2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+      66667365743D2671756F743B302E32352671756F743B2073746F702D636F6C6F
+      723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479
+      3D2671756F743B302671756F743B2F2667743B262378443B262378413B202020
+      2020202020266C743B73746F70206F66667365743D2671756F743B302E333132
+      352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+      756F743B2073746F702D6F7061636974793D2671756F743B302E303335323934
+      31322671756F743B2F2667743B262378443B262378413B202020202020202026
+      6C743B73746F70206F66667365743D2671756F743B302E3337352671756F743B
+      2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374
+      6F702D6F7061636974793D2671756F743B302E3134353039382671756F743B2F
+      2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+      66667365743D2671756F743B302E343337352671756F743B2073746F702D636F
+      6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369
+      74793D2671756F743B302E333039383033392671756F743B2F2667743B262378
+      443B262378413B2020202020202020266C743B73746F70206F66667365743D26
+      71756F743B302E352671756F743B2073746F702D636F6C6F723D2671756F743B
+      626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30
+      2E343938303339322671756F743B2F2667743B262378443B262378413B202020
+      2020202020266C743B73746F70206F66667365743D2671756F743B302E353632
+      352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671
+      756F743B2073746F702D6F7061636974793D2671756F743B302E363930313936
+      312671756F743B2F2667743B262378443B262378413B2020202020202020266C
+      743B73746F70206F66667365743D2671756F743B302E3632352671756F743B20
+      73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F
+      702D6F7061636974793D2671756F743B302E3835343930322671756F743B2F26
+      67743B262378443B262378413B2020202020202020266C743B73746F70206F66
+      667365743D2671756F743B302E363837352671756F743B2073746F702D636F6C
+      6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+      793D2671756F743B302E393634373035392671756F743B2F2667743B26237844
+      3B262378413B2020202020202020266C743B73746F70206F66667365743D2671
+      756F743B302E37352671756F743B2073746F702D636F6C6F723D2671756F743B
+      626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B31
+      2671756F743B2F2667743B262378443B262378413B2020202020202020266C74
+      3B73746F70206F66667365743D2671756F743B302E383132352671756F743B20
+      73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F
+      702D6F7061636974793D2671756F743B302E393634373035392671756F743B2F
+      2667743B262378443B262378413B2020202020202020266C743B73746F70206F
+      66667365743D2671756F743B302E3837352671756F743B2073746F702D636F6C
+      6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974
+      793D2671756F743B302E3835343930322671756F743B2F2667743B262378443B
+      262378413B2020202020202020266C743B73746F70206F66667365743D267175
+      6F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F74
+      3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B
+      302E363930313936312671756F743B2F2667743B262378443B262378413B2020
+      202020202020266C743B73746F70206F66667365743D2671756F743B31267175
+      6F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B
+      2073746F702D6F7061636974793D2671756F743B302E34393830333932267175
+      6F743B2F2667743B262378443B262378413B202020202020266C743B2F6C696E
+      6561724772616469656E742667743B262378443B262378413B20202020266C74
+      3B2F646566732667743B262378443B262378413B20202020266C743B70617468
+      20643D2671756F743B4D352E352031362E303431363620352E352031382E3034
+      31363620372032302E303431363620372032322E303431363620322032342E30
+      3431363620322033302E30343136362033302033302E30343136362033302032
+      342E30343136362032352032322E30343136362032352032302E303431363620
+      32362E352031382E30343136362032362E352031362E3034313636207A267175
+      6F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C6C67
+      72616431292671756F743B207374726F6B653D2671756F743B6E6F6E65267175
+      6F743B2F2667743B262378443B262378413B2020266C743B2F672667743B2623
+      78443B262378413B266C743B2F7376672667743B262378443B262378413B222F
+      3E0D0A3C2F434F4E4649473E0D0A
     }
   end
   object SVGRasterImageList1: TBGRAImageList
@@ -13089,33 +13424,38 @@ object FMain: TFMain
     Left = 653
     Top = 216
     Bitmap = {
-      4C7A070000001000000010000000410300000000000078DAED98FB8B4D5114C7
-      EFC35CE34E3306B9189910C9E3326EC63B9428C50F66623C87A13163D22D6F61
-      E4393261AE478D483285C8B3943C6A26EF2E7E935FE4173F4929C51FE0BBEA7B
-      6B77BAE7D8679FEB8C9ABBEAD369F6DCEFDEFBECBDD7DA6B9D4020E79600F524
-      61A0175D9AD4F7707D079F5DE00AA80105067A9536107431FF30180D2E28ED95
-      06EF3F42695F6DA08F2BED2B5CE87B830A704D691FEB61FD0E19ACFF0B701DD4
-      723DF3E6AF35731F1618EAEF8397A0C8C31C0A0D75CB78A64A0DB483C15BF0E0
-      2F3E6F67EBB96E0D8673BF457DB981763CB5970DC7DE497DB581B61778C23D2F
-      31D0CFE5D827F2AEE7BB25C12CCB79DF01666AEA1FD3DF424ADB7350A7A9EF04
-      8D16BD9B5CE07FD06F51EEA91297FAA7A055D12F74A9179F790D8E827DE0864B
-      7D5FB09FF7ADCCA30CB480F93E9CBDF62CF98295F67FA8CF5B6E2DA8916F6733
-      C92F2FF21CCB9EDDE59DA07BF73C026FC001C69D0EDE45651AFA18C73C658901
-      3A759BE8DE811FE037F809BE828F96339870D00BEFC167F00DFC625FDFC10707
-      BD9D4518CF44B754E3F7993A23698909D2B652432F71EB21F7EE38D8C49AE919
-      F3291D2BA7A693A438AF9E6405ACBD0A79A6DD5898714EEADE4FDC4B37677900
-      D80D86D117BFF01CB9B541E00EFB32A9DBD681D3A08FE11A2E67DD1B72E92F6A
-      CD1C5372A1888636E5F0FF94431F196DDA419FB6E943D5EA60EDC3ABDEEBFC73
-      B17E018D3D8AF8E8BB93583BC535CE7E84F59AE4DDE3C06CE66B2D7CC6E99351
-      E5A9DA0CB0193481C3E02CD8C55CB099DF7B9680C57CC62C7AB91FB68339D4DE
-      E6DF49DEA18DAC016E826DA0D8A2DF08F6822A7089FA63FC5E23E36F007BB8FF
-      B559DEBF82ED32CE41709E7E2F63AEE19A34B0EF4A9B3C6308180586731E123B
-      A6B13DC8FC7595E61D2479C2484BDC91B6311E6291EEF90D18FA4FDAA3FF7AD5
-      7B9DBF1FEBE797FF7797499CE9C79C41CE697F7E730B3187C8BC7FD4463F94F5
-      7B137DA58B35A0B44F006B99931C71C8F725373DC9DF0D046798BB17F33BC022
-      F0CA461FE5186D4ACE5347DF9D0EEEB13E3E67F3EE53C1559E9379CC77258E6C
-      E53B55B3BD35CBB7C830E3C7643091DF3BAA98F34ACC9CC27508F21D8A0CEE2F
-      9DDC21ED51AB4B2EF55EE79F8BF5EB161FFF03AC4F0A26
+      4C7A0A0000001000000010000000D90300000000000078DAED9AEB4B145118C6
+      77575D3745BBA1959154BA84A56592D98D0AA220A80F29DDCBB2302FA4D03D2A
+      A3AB9154DA05CC2222A1A2E80A417401A53B5B7D32128CBEF4298220A83FA0E7
+      D0B3701866C63367B6B5705EF831EC719E3967CE9CF73DEF7BD0E78BB915814A
+      52A4A117BA08A9ECE7FA765E3BC165B01C2469E8659A81DFC1F81340189C97DA
+      8B35DE7F8CD4BE5A435F20B5AF70A04F0685E0AAD49EE762FE0E6ACCFF73700D
+      94733E3D8BAF35F03BCCD7D4DF032F40AA8B318434754BB9A6066968878337E0
+      7E2F3E6F65EB396F559A63BF497DB6867602B59734FBDE417D998636113CE637
+      4FD7D0CF61DFC73DD78BBBD5839986F5BE1DCC50D43FA2BF05A4B667A04251DF
+      01AA0D7A27B9C0BFA0DF2CED53E90EF54F4093A45FE0502F7CE6153802F682EB
+      0EF503C13EEEB7621C59A011CC8BC3DA6B35C9178CB4FE45BD67B135BF42BE6D
+      6622BFBCC0752CBED91DEE09AA7BCF43F01AEC67DC69E75E94A5A0CF649F270D
+      3140A56E13BAB7E03BF8057E802FE083610D16D9E805EFC027F015FCE4B3BE81
+      F7367A2B0B329E09DD1285FBA37546BD212688B6950A7A11B71EF0DB1D039B58
+      333D653EA562D9D47490168EAB3F59126BAF10D7B4134B609C1375EF477E4B27
+      6B7928D80546D1173F731D39B561E0369FA553B7AD03A7C000CD395CC6BA37E0
+      D05FE49A3953CA85820ADA169BBFB7D83C23AA8DD8E82316CF90B52A189FE156
+      EF76FCB1983F9FC2370AC6D17727B1762A5058FB41D66B22EF1E0F66315F6BE4
+      B5803E99225D659B0E6A402D3804CE809DCC051B78DEB3182CE235D3A017FBC3
+      36309BDA5BFC5DCF3DB49A35C00DB015A419F41BC11E500A2E527F94E735A2FF
+      0D6037BF7FB9C9FB17B25DF473009CA3DF8B3ED7704EAAF8EC628B3C6304C805
+      A3390E113B4AD8EE67FEBA4A710F1279C25843DC116DE35CC422D5F5EBD3F49F
+      884BFF75AB773BFE78CC5FBCFCBFAF4CC499C1CC19C43A1DC233B7007388E8FB
+      A758E847B27EAFA5AF74B20614EDF9602D7392C336F9BEC84D4FF0BE0C709AB9
+      7B1ACF0116829716FA14F6D12CE53C15F4DD69E02EEBE3B316EF3E155CE13A99
+      CB7C57C4912D7CA732B637999C4526307E4C061379DE51CA9C57C4CC299C073F
+      DF215563FF52C91D222EB5AAC452EF76FCB198BFFEE2E35626F6BA1E454A2C7C
+      57D45DE15EC8F6599F85D729F45D67A24B664E92A3D07F0EEF4D96F43D9A442D
+      AC49ACFAF7CCB3FFDD12996FA860769E21F6DE6E059FE9E6BD6696A1E0B31916
+      5A5127B429F4DFC67B8DDA5C077123D7F08CBE8E5F759A78E699677F4C9C4B74
+      2962768611A04FE6F742D8E63CB346A1EF1A135D88F1284FA1FF3CDE2BFF3F46
+      972651CBD72456FD6BDB6F31F08DBA
     }
   end
   object TimerHideTextMore: TTimer

+ 3 - 0
lazpaint/lazpaintmainform.lrj

@@ -85,6 +85,9 @@
 {"hash":39152780,"name":"tfmain.tool_textbidirectional.hint","sourcebytes":[66,105,100,105,114,101,99,116,105,111,110,97,108],"value":"Bidirectional"},
 {"hash":63280628,"name":"tfmain.tool_textltr.hint","sourcebytes":[76,101,102,116,32,116,111,32,114,105,103,104,116],"value":"Left to right"},
 {"hash":65854964,"name":"tfmain.tool_textrtl.hint","sourcebytes":[82,105,103,104,116,32,116,111,32,108,101,102,116],"value":"Right to left"},
+{"hash":266351424,"name":"tfmain.tool_textaligntop.hint","sourcebytes":[65,108,105,103,110,32,116,111,112],"value":"Align top"},
+{"hash":116886537,"name":"tfmain.tool_textalignmiddle.hint","sourcebytes":[67,101,110,116,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Center vertically"},
+{"hash":34882909,"name":"tfmain.tool_textalignbottom.hint","sourcebytes":[65,108,105,103,110,32,98,111,116,116,111,109],"value":"Align bottom"},
 {"hash":88908046,"name":"tfmain.filenew.caption","sourcebytes":[78,101,119,46,46,46],"value":"New..."},
 {"hash":111833829,"name":"tfmain.filenew.hint","sourcebytes":[67,114,101,97,116,101,32,97,32,110,101,119,32,102,105,108,101],"value":"Create a new file"},
 {"hash":107745630,"name":"tfmain.fileopen.caption","sourcebytes":[79,112,101,110,46,46,46],"value":"Open..."},

+ 5 - 0
lazpaint/lazpaintmainform.pas

@@ -37,6 +37,11 @@ type
     Panel_Donate: TPanel;
     TimerHideTextMore: TTimer;
     ToolBar25: TToolBar;
+    ToolButton1: TToolButton;
+    ToolButton2: TToolButton;
+    Tool_TextAlignBottom: TToolButton;
+    Tool_TextAlignMiddle: TToolButton;
+    Tool_TextAlignTop: TToolButton;
     Tool_TextRTL: TToolButton;
     Tool_TextBidirectional: TToolButton;
     Tool_TextLTR: TToolButton;

+ 18 - 1
lazpaint/maintoolbar.inc

@@ -113,6 +113,9 @@ begin
   Tool_TextBidirectional.OnClick := @Tool_TextBidiModeClick;
   Tool_TextLTR.OnClick := @Tool_TextBidiModeClick;
   Tool_TextRTL.OnClick := @Tool_TextBidiModeClick;
+  Tool_TextAlignTop.OnClick := @Tool_TextAlignClick;
+  Tool_TextAlignMiddle.OnClick := @Tool_TextAlignClick;
+  Tool_TextAlignBottom.OnClick := @Tool_TextAlignClick;
   Tool_TextBold.OnClick := @Tool_TextStyleClick;
   Tool_TextItalic.OnClick := @Tool_TextStyleClick;
   Tool_TextUnderline.OnClick := @Tool_TextStyleClick;
@@ -442,6 +445,9 @@ begin
   taCenter: Tool_TextAlignCenter.Down := true;
   taRightJustify: Tool_TextAlignRight.Down := true;
   end;
+  Tool_TextAlignTop.Down := ToolManager.TextVerticalAlign = tlTop;
+  Tool_TextAlignMiddle.Down := ToolManager.TextVerticalAlign = tlCenter;
+  Tool_TextAlignBottom.Down := ToolManager.TextVerticalAlign = tlBottom;
 end;
 
 procedure TFMain.UpdateTextOutlineToolbar;
@@ -1877,16 +1883,27 @@ end;
 
 procedure TFMain.Tool_TextAlignClick(Sender: TObject);
 var newAlign: TAlignment;
+    newVAlign: TTextLayout;
 begin
   if initialized then
   begin
     newAlign := taLeftJustify;
+    newVAlign:= ToolManager.TextVerticalAlign;
     if Tool_TextAlignCenter.Down then newAlign:= taCenter;
     if Tool_TextAlignRight.Down then newAlign := taRightJustify;
-    if newAlign <> ToolManager.TextAlign then
+    if Tool_TextAlignTop.Down and (sender = Tool_TextAlignTop) then newVAlign := tlTop;
+    if Tool_TextAlignMiddle.Down and (sender = Tool_TextAlignMiddle) then newVAlign := tlCenter;
+    if Tool_TextAlignBottom.Down and (sender = Tool_TextAlignBottom) then newVAlign := tlBottom;
+    FInTextAlign := true;
+    Tool_TextAlignTop.Down := newVAlign = tlTop;
+    Tool_TextAlignMiddle.Down := newVAlign = tlCenter;
+    Tool_TextAlignBottom.Down := newVAlign = tlBottom;
+    FInTextAlign := false;
+    if (newAlign <> ToolManager.TextAlign) or (newVAlign <> ToolManager.TextVerticalAlign) then
     begin
       FInTextAlign := true;
       ToolManager.TextAlign := newAlign;
+      ToolManager.TextVerticalAlign := newVAlign;
       FInTextAlign := false;
       UpdateEditPicture;
     end;

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.ar.po

@@ -1931,6 +1931,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "ملء  متدرج"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr ""
@@ -1939,10 +1943,18 @@ msgstr ""
 msgid "Align left"
 msgstr ""
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr ""
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.bg.po

@@ -1918,6 +1918,10 @@ msgctxt "TFMAIN.TOOL_PROGRESSIVEFLOODFILL.HINT"
 msgid "Progressive floodfill"
 msgstr ""
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr ""
@@ -1926,10 +1930,18 @@ msgstr ""
 msgid "Align left"
 msgstr "Подравняване вляво"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Подравняване вдясно"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.cs.po

@@ -1931,6 +1931,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Vzrůstající výplň"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Centrovat"
@@ -1939,10 +1943,18 @@ msgstr "Centrovat"
 msgid "Align left"
 msgstr "Zarovnat vlevo"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Zarovnat vpravo"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.de.po

@@ -1942,6 +1942,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Progressive Füllung"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Zentrieren"
@@ -1950,10 +1954,18 @@ msgstr "Zentrieren"
 msgid "Align left"
 msgstr "Links angleichen"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Rechts angleichen"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.es.po

@@ -1935,6 +1935,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Relleno de flujo progresivo"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Centrar"
@@ -1943,10 +1947,18 @@ msgstr "Centrar"
 msgid "Align left"
 msgstr "Alinear a la izquierda"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Alinear a la derecha"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.fi.po

@@ -1921,6 +1921,10 @@ msgctxt "TFMAIN.TOOL_PROGRESSIVEFLOODFILL.HINT"
 msgid "Progressive floodfill"
 msgstr ""
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr ""
@@ -1929,10 +1933,18 @@ msgstr ""
 msgid "Align left"
 msgstr ""
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr ""
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.fr.po

@@ -1933,6 +1933,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Pot de peinture progressif"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr "Aligner en bas"
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Centrer"
@@ -1941,10 +1945,18 @@ msgstr "Centrer"
 msgid "Align left"
 msgstr "Aligner à gauche"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr "Centrer verticallement"
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Aligner à droite"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr "Aligner en haut"
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr "Bidirectionnel"

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.it.po

@@ -1920,6 +1920,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Riempimento progressivo"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr ""
@@ -1928,10 +1932,18 @@ msgstr ""
 msgid "Align left"
 msgstr "Allinea a sinistra"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Allinea a destra"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.ja.po

@@ -1928,6 +1928,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "プログレッシブで塗りつぶす"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr ""
@@ -1936,10 +1940,18 @@ msgstr ""
 msgid "Align left"
 msgstr ""
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr ""
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.kab.po

@@ -1933,6 +1933,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Taqbuct n teklut tafarayt"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Talemmast"
@@ -1941,10 +1945,18 @@ msgstr "Talemmast"
 msgid "Align left"
 msgstr "Derrec s azelmaḍ"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Derrec s ayfus"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.lv.po

@@ -1936,6 +1936,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Vienmērīgs aizpildījums"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Iecentrēt"
@@ -1944,10 +1948,18 @@ msgstr "Iecentrēt"
 msgid "Align left"
 msgstr "Līdzināt pa kreisi"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Līdzināt pa labi"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.nl.po

@@ -1954,6 +1954,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Progressieve vloedvulling"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Middelste"
@@ -1962,10 +1966,18 @@ msgstr "Middelste"
 msgid "Align left"
 msgstr "Links uitlijnen"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Rechts uitlijnen"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.pl.po

@@ -1942,6 +1942,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Wypełnienie progresywne"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Wyśrodkuj"
@@ -1950,10 +1954,18 @@ msgstr "Wyśrodkuj"
 msgid "Align left"
 msgstr "Wyrównaj do lewej"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Wyrównaj do prawej"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.pot

@@ -1791,6 +1791,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr ""
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr ""
@@ -1799,10 +1803,18 @@ msgstr ""
 msgid "Align left"
 msgstr ""
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr ""
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.pt_BR.po

@@ -1929,6 +1929,10 @@ msgctxt "TFMAIN.TOOL_PROGRESSIVEFLOODFILL.HINT"
 msgid "Progressive floodfill"
 msgstr "Preenchimento progressivo"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Centrar"
@@ -1937,10 +1941,18 @@ msgstr "Centrar"
 msgid "Align left"
 msgstr "Alinhar à esquerda"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Alinhar à direita"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.ru.po

@@ -1919,6 +1919,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Прогрессивная заливка"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "По центру"
@@ -1927,10 +1931,18 @@ msgstr "По центру"
 msgid "Align left"
 msgstr "По левому краю"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "По правому краю"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.sv.po

@@ -1930,6 +1930,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "Progressiv flodfyllning"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "Mitten"
@@ -1938,10 +1942,18 @@ msgstr "Mitten"
 msgid "Align left"
 msgstr "Justera till vänster"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "Justera till höger"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 12 - 0
lazpaint/release/bin/i18n/lazpaint.zh_CN.po

@@ -1930,6 +1930,10 @@ msgctxt "tfmain.tool_progressivefloodfill.hint"
 msgid "Progressive floodfill"
 msgstr "渐进式填充"
 
+#: tfmain.tool_textalignbottom.hint
+msgid "Align bottom"
+msgstr ""
+
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
 msgstr "居中"
@@ -1938,10 +1942,18 @@ msgstr "居中"
 msgid "Align left"
 msgstr "向左对齐"
 
+#: tfmain.tool_textalignmiddle.hint
+msgid "Center vertically"
+msgstr ""
+
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
 msgstr "向右对齐"
 
+#: tfmain.tool_textaligntop.hint
+msgid "Align top"
+msgstr ""
+
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
 msgstr ""

+ 38 - 0
lazpaint/tools/utool.pas

@@ -221,6 +221,7 @@ type
     FTextFontSize: single;
     FTextFontStyle: TFontStyles;
     FTextAlign: TAlignment;
+    FTextVerticalAlign: TTextLayout;
     FTextBidiMode: TFontBidiMode;
     FTextOutline: boolean;
     FTextOutlineWidth: single;
@@ -337,6 +338,7 @@ type
     function ScriptGetShapeRatio(AVars: TVariableSet): TScriptResult;
     function ScriptGetSplineStyle(AVars: TVariableSet): TScriptResult;
     function ScriptGetTextAlign(AVars: TVariableSet): TScriptResult;
+    function ScriptGetTextVerticalAlign(AVars: TVariableSet): TScriptResult;
     function ScriptGetTextBidiMode(AVars: TVariableSet): TScriptResult;
     function ScriptGetTextOutline(AVars: TVariableSet): TScriptResult;
     function ScriptGetTextPhong(AVars: TVariableSet): TScriptResult;
@@ -399,6 +401,7 @@ type
     function ScriptSetShapeRatio(AVars: TVariableSet): TScriptResult;
     function ScriptSetSplineStyle(AVars: TVariableSet): TScriptResult;
     function ScriptSetTextAlign(AVars: TVariableSet): TScriptResult;
+    function ScriptSetTextVerticalAlign(AVars: TVariableSet): TScriptResult;
     function ScriptSetTextBidiMode(AVars: TVariableSet): TScriptResult;
     function ScriptSetTextOutline(AVars: TVariableSet): TScriptResult;
     function ScriptSetTextPhong(AVars: TVariableSet): TScriptResult;
@@ -431,6 +434,7 @@ type
     procedure SetShapeRatio(AValue: Single);
     procedure SetSplineStyle(AValue: TSplineStyle);
     procedure SetTextAlign(AValue: TAlignment);
+    procedure SetTextVerticalAlign(AValue: TTextLayout);
     procedure SetTextBidiMode(AValue: TFontBidiMode);
     procedure SetTextFontStyle(AValue: TFontStyles);
     procedure SetTextPhong(AValue: boolean);
@@ -558,6 +562,7 @@ type
     property TextFontSize: single read GetTextFontSize;
     property TextFontStyle: TFontStyles read GetTextFontStyle write SetTextFontStyle;
     property TextAlign: TAlignment read FTextAlign write SetTextAlign;
+    property TextVerticalAlign: TTextLayout read FTextVerticalAlign write SetTextVerticalAlign;
     property TextBidiMode: TFontBidiMode read FTextBidiMode write SetTextBidiMode;
     property TextOutline: boolean read FTextOutline;
     property TextOutlineWidth: single read FTextOutlineWidth;
@@ -1513,6 +1518,14 @@ begin
   if Assigned(FOnTextAlignChanged) then FOnTextAlignChanged(self);
 end;
 
+procedure TToolManager.SetTextVerticalAlign(AValue: TTextLayout);
+begin
+  if FTextVerticalAlign=AValue then Exit;
+  FTextVerticalAlign:=AValue;
+  ToolUpdate;
+  if Assigned(FOnTextAlignChanged) then FOnTextAlignChanged(self);
+end;
+
 procedure TToolManager.SetTextBidiMode(AValue: TFontBidiMode);
 begin
   if FTextBidiMode=AValue then Exit;
@@ -2195,6 +2208,17 @@ begin
   result := srOk;
 end;
 
+function TToolManager.ScriptGetTextVerticalAlign(AVars: TVariableSet): TScriptResult;
+begin
+  case TextVerticalAlign of
+  tlTop: AVars.Strings['Result'] := 'Top';
+  tlCenter: AVars.Strings['Result'] := 'Middle';
+  tlBottom: AVars.Strings['Result'] := 'Bottom';
+  else exit(srException);
+  end;
+  result := srOk;
+end;
+
 function TToolManager.ScriptGetTextBidiMode(AVars: TVariableSet): TScriptResult;
 begin
   case TextBidiMode of
@@ -2813,6 +2837,17 @@ begin
   result := srOk;
 end;
 
+function TToolManager.ScriptSetTextVerticalAlign(AVars: TVariableSet): TScriptResult;
+begin
+  case AVars.Strings['Align'] of
+  'Top': TextVerticalAlign:= tlTop;
+  'Middle': TextVerticalAlign:= tlCenter;
+  'Bottom': TextVerticalAlign:= tlBottom;
+  else exit(srInvalidParameters);
+  end;
+  result := srOk;
+end;
+
 function TToolManager.ScriptSetTextBidiMode(AVars: TVariableSet): TScriptResult;
 begin
   case AVars.Strings['BidiMode'] of
@@ -2925,6 +2960,7 @@ begin
   FTextFontName := TTextShape.DefaultFontName;
   FTextFontStyle:= [];
   FTextAlign := taLeftJustify;
+  FTextVerticalAlign := tlTop;
   FTextBidiMode := fbmAuto;
   FTextPhong := False;
   FTextShadowBlurRadius := 4;
@@ -3337,6 +3373,8 @@ begin
   FScriptContext.RegisterScriptFunction('ToolGetFontStyle', @ScriptGetFontStyle, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetTextAlign', @ScriptSetTextAlign, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetTextAlign', @ScriptGetTextAlign, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetTextVerticalAlign', @ScriptSetTextVerticalAlign, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetTextVerticalAlign', @ScriptGetTextVerticalAlign, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetTextBidiMode', @ScriptSetTextBidiMode, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetTextBidiMode', @ScriptGetTextBidiMode, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetTextOutline', @ScriptSetTextOutline, ARegister);

+ 2 - 0
lazpaint/tools/utooltext.pas

@@ -150,6 +150,7 @@ begin
     Manager.TextFontStyle := FontStyle;
     Manager.TextBidiMode := FontBidiMode;
     Manager.TextAlign := ParagraphAlignment;
+    Manager.TextVerticalAlign := VerticalAlignment;
   end;
   inherited ShapeEditingChange(ASender);
 end;
@@ -178,6 +179,7 @@ begin
     end
     else
       ParagraphAlignment:= Manager.TextAlign;
+    VerticalAlignment := Manager.TextVerticalAlign;
     PenPhong := Manager.TextPhong;
   end;
   if (Manager.TextShadow <> FPrevShadow) or

+ 8 - 1
lazpaint/tools/utoolvectorial.pas

@@ -497,6 +497,7 @@ begin
     Manager.LightPosition := m*LightPosition;
     Manager.PhongShapeAltitude := round(AltitudePercent);
     Manager.TextAlign:= ParagraphAlignment;
+    Manager.TextVerticalAlign:= VerticalAlignment;
     Manager.SetTextFont(FontName, FontEmHeight*zoom*72/Manager.Image.DPI, FontStyle);
     Manager.TextShadow:= false;
     if Aliased then
@@ -704,7 +705,13 @@ begin
         PenPhong := Manager.TextPhong;
         LightPosition := m*Manager.LightPosition;
         AltitudePercent := Manager.PhongShapeAltitude;
-        ParagraphAlignment := Manager.TextAlign;
+        if FontBidiMode <> Manager.TextBidiMode then
+        begin
+          FontBidiMode:= Manager.TextBidiMode;
+          Manager.TextAlign:= ParagraphAlignment;
+        end else
+          ParagraphAlignment := Manager.TextAlign;
+        VerticalAlignment:= Manager.TextVerticalAlign;
         FontName:= Manager.TextFontName;
         FontEmHeight:= Manager.TextFontSize*zoom*Manager.Image.DPI/72;
         FontStyle := Manager.TextFontStyle;

+ 35 - 15
lazpaintcontrols/lcvectortextshapes.pas

@@ -101,15 +101,15 @@ type
     function GetHasSelection: boolean;
     function GetParagraphAlignment: TAlignment;
     procedure InvalidateParagraphLayout(AFrom, ATo: integer);
-    procedure LayoutBrokenLinesChanged(ASender: TObject;
+    procedure LayoutBrokenLinesChanged({%H-}ASender: TObject;
       AParagraphIndex: integer; ASubBrokenStart, ASubBrokenChangedCountBefore,
       ASubBrokenChangedCountAfter: integer; ASubBrokenTotalCountBefore,
       ASubBrokenTotalCountAfter: integer);
-    procedure LayoutParagraphDeleted(ASender: TObject; AParagraphIndex: integer);
-    procedure LayoutParagraphMergedWithNext(ASender: TObject;
+    procedure LayoutParagraphDeleted({%H-}ASender: TObject; AParagraphIndex: integer);
+    procedure LayoutParagraphMergedWithNext({%H-}ASender: TObject;
       AParagraphIndex: integer);
-    procedure LayoutParagraphSplit(ASender: TObject; AParagraphIndex: integer;
-      ASubBrokenIndex, ACharIndex: integer);
+    procedure LayoutParagraphSplit({%H-}ASender: TObject; AParagraphIndex: integer;
+      {%H-}ASubBrokenIndex, {%H-}ACharIndex: integer);
     procedure OnMoveLightPos({%H-}ASender: TObject; {%H-}APrevCoord, ANewCoord: TPointF;
       {%H-}AShift: TShiftState);
     procedure SetAliased(AValue: boolean);
@@ -153,6 +153,7 @@ type
     procedure InsertUnicodeValue;
     procedure FillChange(ASender: TObject; var ADiff: TCustomVectorialFillDiff); override;
     procedure InvalidateAll;
+    function GetVerticalAlignMatrix(tl: TBidiTextLayout): TAffineMatrix;
   public
     constructor Create(AContainer: TVectorOriginal); override;
     procedure QuickDefine(constref APoint1,APoint2: TPointF); override;
@@ -819,6 +820,7 @@ begin
   if FVertAlign=AValue then Exit;
   BeginUpdate(TTextShapeTextDiff);
   FVertAlign:=AValue;
+  InvalidateAll; // could be more subtle
   EndUpdate;
 end;
 
@@ -1074,6 +1076,19 @@ begin
   FParagraphLayout := nil;
 end;
 
+function TTextShape.GetVerticalAlignMatrix(tl: TBidiTextLayout): TAffineMatrix;
+var
+  th: Single;
+begin
+  th := max(tl.TotalTextHeight - tl.ParagraphSpacingBelow * tl.LineHeight, 0);
+  if th < tl.AvailableHeight then
+  case VerticalAlignment of
+  tlBottom: exit(AffineMatrixTranslation(0, tl.AvailableHeight-th));
+  tlCenter: exit(AffineMatrixTranslation(0, (tl.AvailableHeight-th)/2));
+  end;
+  exit(AffineMatrixIdentity);
+end;
+
 constructor TTextShape.Create(AContainer: TVectorOriginal);
 begin
   inherited Create(AContainer);
@@ -1176,6 +1191,11 @@ begin
     tl.ParagraphAlignment[i] := AlignmentToBidiTextAlignment(alignment, tl.ParagraphRightToLeft[i]);
   end;
   paraAlignList.Free;
+  case AStorage.RawString['vertical-align'] of
+  'middle': VerticalAlignment:= tlCenter;
+  'bottom': VerticalAlignment:= tlBottom;
+  else VerticalAlignment:= tlTop;
+  end;
   EndUpdate;
 end;
 
@@ -1220,6 +1240,11 @@ begin
     end;
   AStorage.RawString['paragraph-align'] := paraAlignList.DelimitedText;
   paraAlignList.Free;
+  case VerticalAlignment of
+  tlTop: AStorage.RemoveAttribute('vertical-align');
+  tlCenter: AStorage.RawString['vertical-align'] := 'middle';
+  tlBottom: AStorage.RawString['vertical-align'] := 'bottom';
+  end;
 end;
 
 destructor TTextShape.Destroy;
@@ -1277,7 +1302,7 @@ begin
     tl := GetTextLayout;
     caret:= tl.GetCaret(FSelEnd);
     zoom := GetTextRenderZoom;
-    m := AffineMatrixTranslation(-0.5,-0.5)*GetUntransformedMatrix*AffineMatrixScale(1/zoom,1/zoom);
+    m := AffineMatrixTranslation(-0.5,-0.5)*GetUntransformedMatrix*AffineMatrixScale(1/zoom,1/zoom)*GetVerticalAlignMatrix(tl);
     if FSelStart<>FSelEnd then
     begin
       pts := tl.GetTextEnveloppe(FSelStart, FSelEnd, false, true, true);
@@ -1761,6 +1786,7 @@ begin
 
   tl := GetTextLayout;
   sourceRectF := RectF(-pad,0,tl.AvailableWidth+pad,min(tl.TotalTextHeight,tl.AvailableHeight));
+  m *= GetVerticalAlignMatrix(tl);
 
   if CanHaveRenderStorage then
   begin
@@ -1833,12 +1859,6 @@ begin
   sourceRectF.Right := floor(sourceRectF.Right);
   sourceRectF.Bottom := sourceRectF.Bottom;
 
-  if tl.TotalTextHeight < tl.AvailableHeight then
-  case VerticalAlignment of
-  tlBottom: m *= AffineMatrixTranslation(0, tl.AvailableHeight-tl.TotalTextHeight);
-  tlCenter: m *= AffineMatrixTranslation(0, (tl.AvailableHeight-tl.TotalTextHeight)/2);
-  end;
-
   with transfRectF do
     transfRect := Rect(floor(Left),floor(Top),ceil(Right),ceil(Bottom));
 
@@ -2148,7 +2168,7 @@ begin
     else DeleteTextAfter(1);
     AHandled:= true;
   end else
-  if Key in [skLeft,skRight] then
+  if (Key in [skLeft,skRight]) and not (ssAlt in Shift) then
   begin
     tl := GetTextLayout;
     if (Key = skLeft) xor tl.ParagraphRightToLeft[tl.GetParagraphAt(FSelEnd)] then
@@ -2168,7 +2188,7 @@ begin
     end;
     AHandled := true;
   end else
-  if Key in [skUp,skDown] then
+  if (Key in [skUp,skDown]) and not (ssAlt in Shift)  then
   begin
     tl := GetTextLayout;
     if Key = skUp then
@@ -2456,7 +2476,7 @@ begin
       else span.textDirection:= stdLtr;
     with rF do
     begin
-      setlength(a, 1);
+      setlength({%H-}a, 1);
       a[0] := FloatWithCSSUnit(Left/zoom, cuCustom);
       if span.textDirection = stdRtl then a[0].value += Width/zoom;
       span.x := a;

二进制
resources/vector/textalignbottom32.lzp


+ 27 - 0
resources/vector/textalignbottom32.svg

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="32" xmlns="http://www.w3.org/2000/svg" height="32" viewBox="0 0 32 32" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
+  <g opacity="1" xmlns:bgra="https://wiki.freepascal.org/LazPaint_SVG_format" inkscape:label="Layer1" inkscape:groupmode="layer" bgra:originalViewBox="2 16 28 15">
+    <defs>
+      <linearGradient id="layer1-fillgrad1" x1="15" x2="15" y1="14.54167" y2="18.54167" spreadMethod="repeat" gradientUnits="userSpaceOnUse" color-interpolation="linearRGB">
+        <stop offset="0" stop-color="black" stop-opacity="0.4980392"/>
+        <stop offset="0.0625" stop-color="black" stop-opacity="0.3098039"/>
+        <stop offset="0.125" stop-color="black" stop-opacity="0.145098"/>
+        <stop offset="0.1875" stop-color="black" stop-opacity="0.03529412"/>
+        <stop offset="0.25" stop-color="black" stop-opacity="0"/>
+        <stop offset="0.3125" stop-color="black" stop-opacity="0.03529412"/>
+        <stop offset="0.375" stop-color="black" stop-opacity="0.145098"/>
+        <stop offset="0.4375" stop-color="black" stop-opacity="0.3098039"/>
+        <stop offset="0.5" stop-color="black" stop-opacity="0.4980392"/>
+        <stop offset="0.5625" stop-color="black" stop-opacity="0.6901961"/>
+        <stop offset="0.625" stop-color="black" stop-opacity="0.854902"/>
+        <stop offset="0.6875" stop-color="black" stop-opacity="0.9647059"/>
+        <stop offset="0.75" stop-color="black" stop-opacity="1"/>
+        <stop offset="0.8125" stop-color="black" stop-opacity="0.9647059"/>
+        <stop offset="0.875" stop-color="black" stop-opacity="0.854902"/>
+        <stop offset="0.9375" stop-color="black" stop-opacity="0.6901961"/>
+        <stop offset="1" stop-color="black" stop-opacity="0.4980392"/>
+      </linearGradient>
+    </defs>
+    <path d="M5.5 16.04166 5.5 18.04166 7 20.04166 7 22.04166 2 24.04166 2 30.04166 30 30.04166 30 24.04166 25 22.04166 25 20.04166 26.5 18.04166 26.5 16.04166 z" fill="url(#layer1-fillgrad1)" stroke="none"/>
+  </g>
+</svg>

二进制
resources/vector/textalignmiddle32.lzp


+ 27 - 0
resources/vector/textalignmiddle32.svg

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="32" xmlns="http://www.w3.org/2000/svg" height="32" viewBox="0 0 32 32" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
+  <g opacity="1" xmlns:bgra="https://wiki.freepascal.org/LazPaint_SVG_format" inkscape:label="Layer1" inkscape:groupmode="layer" bgra:originalViewBox="2 9 28 14">
+    <defs>
+      <linearGradient id="layer1-fillgrad1" x1="15" x2="15" y1="7.5" y2="11.5" spreadMethod="repeat" gradientUnits="userSpaceOnUse" color-interpolation="linearRGB">
+        <stop offset="0" stop-color="black" stop-opacity="0.4980392"/>
+        <stop offset="0.0625" stop-color="black" stop-opacity="0.3098039"/>
+        <stop offset="0.125" stop-color="black" stop-opacity="0.145098"/>
+        <stop offset="0.1875" stop-color="black" stop-opacity="0.03529412"/>
+        <stop offset="0.25" stop-color="black" stop-opacity="0"/>
+        <stop offset="0.3125" stop-color="black" stop-opacity="0.03529412"/>
+        <stop offset="0.375" stop-color="black" stop-opacity="0.145098"/>
+        <stop offset="0.4375" stop-color="black" stop-opacity="0.3098039"/>
+        <stop offset="0.5" stop-color="black" stop-opacity="0.4980392"/>
+        <stop offset="0.5625" stop-color="black" stop-opacity="0.6901961"/>
+        <stop offset="0.625" stop-color="black" stop-opacity="0.854902"/>
+        <stop offset="0.6875" stop-color="black" stop-opacity="0.9647059"/>
+        <stop offset="0.75" stop-color="black" stop-opacity="1"/>
+        <stop offset="0.8125" stop-color="black" stop-opacity="0.9647059"/>
+        <stop offset="0.875" stop-color="black" stop-opacity="0.854902"/>
+        <stop offset="0.9375" stop-color="black" stop-opacity="0.6901961"/>
+        <stop offset="1" stop-color="black" stop-opacity="0.4980392"/>
+      </linearGradient>
+    </defs>
+    <path d="M5.5 9 5.5 11 7 13 7 15 2 17 2 23 30 23 30 17 25 15 25 13 26.5 11 26.5 9 z" fill="url(#layer1-fillgrad1)" stroke="none"/>
+  </g>
+</svg>

二进制
resources/vector/textaligntop32.lzp


+ 27 - 0
resources/vector/textaligntop32.svg

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="32" xmlns="http://www.w3.org/2000/svg" height="32" viewBox="0 0 32 32" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
+  <g opacity="1" xmlns:bgra="https://wiki.freepascal.org/LazPaint_SVG_format" inkscape:label="Layer1" inkscape:groupmode="layer" bgra:originalViewBox="2 4 28 14">
+    <defs>
+      <linearGradient id="layer1-fillgrad1" x1="15" x2="15" y1="2.5" y2="6.5" spreadMethod="repeat" gradientUnits="userSpaceOnUse" color-interpolation="linearRGB">
+        <stop offset="0" stop-color="black" stop-opacity="0.4980392"/>
+        <stop offset="0.0625" stop-color="black" stop-opacity="0.3098039"/>
+        <stop offset="0.125" stop-color="black" stop-opacity="0.145098"/>
+        <stop offset="0.1875" stop-color="black" stop-opacity="0.03529412"/>
+        <stop offset="0.25" stop-color="black" stop-opacity="0"/>
+        <stop offset="0.3125" stop-color="black" stop-opacity="0.03529412"/>
+        <stop offset="0.375" stop-color="black" stop-opacity="0.145098"/>
+        <stop offset="0.4375" stop-color="black" stop-opacity="0.3098039"/>
+        <stop offset="0.5" stop-color="black" stop-opacity="0.4980392"/>
+        <stop offset="0.5625" stop-color="black" stop-opacity="0.6901961"/>
+        <stop offset="0.625" stop-color="black" stop-opacity="0.854902"/>
+        <stop offset="0.6875" stop-color="black" stop-opacity="0.9647059"/>
+        <stop offset="0.75" stop-color="black" stop-opacity="1"/>
+        <stop offset="0.8125" stop-color="black" stop-opacity="0.9647059"/>
+        <stop offset="0.875" stop-color="black" stop-opacity="0.854902"/>
+        <stop offset="0.9375" stop-color="black" stop-opacity="0.6901961"/>
+        <stop offset="1" stop-color="black" stop-opacity="0.4980392"/>
+      </linearGradient>
+    </defs>
+    <path d="M5.5 4 5.5 6 7 8 7 10 2 12 2 18 30 18 30 12 25 10 25 8 26.5 6 26.5 4 z" fill="url(#layer1-fillgrad1)" stroke="none"/>
+  </g>
+</svg>