glrb 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c772fbd1ff11982ec16e2c2a95f11b98c17ccb2e219c4b057f68c77851ba308
4
- data.tar.gz: 401dfdd7d4697f3d04ac4ebc8a10ee8aa44b858661cecb3a278e1bb21db619e4
3
+ metadata.gz: 32729b8faab82ca32211bf89905d9f405b95e0d5dcef88289e8429fe3f5b980b
4
+ data.tar.gz: cc9c88592e09288a1b95892e282b6d1d48c7ad12cc07e8179d438694fd26369a
5
5
  SHA512:
6
- metadata.gz: 06f3916bf146e92c91037c62df7028045c0841936783dbd7ead281501570f35102fd6b0114790a94985ae59a8a0d45333e1d1f043ea04729f6c7f1a431805174
7
- data.tar.gz: e8726dcc66821701df2bb3373583cbb7fa6c22d96990bef3dcfc79a8c5fc7d880fe48b4d64758cfc07b42b8a67dcb71bc0380acb22a27e17ddffb46f6d67d4d9
6
+ metadata.gz: 26ff4370b860a1ec2e12c2df95795700b0d47177a35887fac23aa5e243d5777fce8be651d3bfdb60a1267287b2ec1e565eb7601eb2be6c3e9aa7a2a2ded1ef88
7
+ data.tar.gz: 9c326afa555b58e1a765f3c0a5e8d6e573ad668dddabe42421164e23b1714bf2e997290f06178336703f7b6e2c0e5c4531e7c73b8bcc256cf1114333c86dd585
data/lib/gl.rb CHANGED
@@ -36,8 +36,8 @@ module Glrb
36
36
 
37
37
  def gl_render (gl, i)
38
38
  gl.i = i
39
- gl.FragCoord = vec (i % gl.w).to_f + 0.5, i.to_f / gl.w.to_f + 0.5, 0, 0
40
- gl.FragColor = gl.shader.call
39
+ gl.FragCoord = vec (i % gl.w).to_f + 0.5, gl.h.to_f - i.to_f / gl.w.to_f + 0.5, 0, 0
40
+ gl.FragColor = gl.shader.call || gl.FragColor
41
41
  end
42
42
 
43
43
  def gl_test (gl)
@@ -52,6 +52,7 @@ module Glrb
52
52
  open(@filename, "wb") do |f|
53
53
  f.puts("P6\n#{gl.w} #{gl.h}\n255")
54
54
  (gl.w.to_i * gl.h.to_i).times do |i|
55
+ puts "#{i} / #{gl.w.to_i * gl.h.to_i}"
55
56
  col = gl[i].map(->v, i{(v.clamp(0, 1) * 255).to_i})
56
57
  f.write(col.to_a.pack("ccc"))
57
58
  end
data/lib/math/mat.rb CHANGED
@@ -1,26 +1,57 @@
1
1
  module Glrb
2
2
  class Mat
3
- def initialize(init = [1, 0, 0], args = 0)
4
- @v = init
3
+ def initialize(init = [Vec.new, Vec.new, Vec.new], args = 0)
4
+ @v = init.map{|v| isArr(v) ? Vec.new(v) : v}
5
5
  @n = args
6
6
  @_ = ->(v = @v, n = @n){Vec.new(v, n)}
7
7
  end
8
- def to_a() isArr(@v) ? @v : @v[@n] end
9
- def to_s() to_a.to_s end
8
+ def to_a() (isArr(@v) ? @v : @v[@n]) end
9
+ def to_s() to_a.map(&:to_a).to_s end
10
10
  def size() to_a.size end
11
- def sort() @_[->n{to_a.sort}] end
12
11
  def map(_) @_[->n{to_a.map.with_index{|v, i| _[v, i]}}] end
13
- def +(_) map(isNum(_) ? ->v, i{v + _} : ->v, i{v + _[i]}) end
14
- def -(_) map(isNum(_) ? ->v, i{v - _} : ->v, i{v - _[i]}) end
15
- def *(_) map(isNum(_) ? ->v, i{v * _} : ->v, i{v * _[i]}) end
16
- def /(_) map(isNum(_) ? ->v, i{v / _} : ->v, i{v / _[i]}) end
12
+ def tr() transpose(self) end
17
13
  def [](_) @v[_] end
14
+ def +(_) map(!isMat(_) ? ->v, i{v + _} : ->v, i{v + _[i]}) end
15
+ def -(_) map(!isMat(_) ? ->v, i{v - _} : ->v, i{v - _[i]}) end
16
+ def %(_) map(isNum(_) ? ->v, i{v % _} : mx(_, ->a, b{a % b})) end
17
+ def *(_) map(isNum(_) ? ->v, i{v * _} : mx(_, ->a, b{a * b})) end
18
+ def /(_) map(isNum(_) ? ->v, i{v / _} : mx(_, ->a, b{a / b})) end
18
19
  def <=>(_) @v = _ end
19
20
  def >>(_) _ << @n end
20
21
  def <<(n) @_[@v, n] end
21
22
  def +@() map(->v, i{+v}) end
22
23
  def -@() map(->v, i{-v}) end
24
+ def x() self[0] end
25
+ def y() self[1] end
26
+ def z() self[2] end
27
+ def xy() @_[->n{v = to_a; [v[0], v[1]]}] end
28
+ def xz() @_[->n{v = to_a; [v[0], v[2]]}] end
29
+ def yx() @_[->n{v = to_a; [v[1], v[0]]}] end
30
+ def yz() @_[->n{v = to_a; [v[1], v[2]]}] end
31
+ def zx() @_[->n{v = to_a; [v[2], v[0]]}] end
32
+ def zy() @_[->n{v = to_a; [v[2], v[1]]}] end
33
+ def xyz() @_[->n{v = to_a; [v[0], v[1], v[2]]}] end
34
+ def xzy() @_[->n{v = to_a; [v[0], v[2], v[1]]}] end
35
+ def yxz() @_[->n{v = to_a; [v[1], v[0], v[2]]}] end
36
+ def yzx() @_[->n{v = to_a; [v[1], v[2], v[0]]}] end
37
+ def zxy() @_[->n{v = to_a; [v[2], v[0], v[1]]}] end
38
+ def zyx() @_[->n{v = to_a; [v[2], v[1], v[0]]}] end
39
+ def mx(v, _) isMat(v) ? mxm(v, _) : mxv(v, _) end
40
+ def mxv(v, _) ->a, i{ _[a, v].sum } end
41
+ def mxm(m, _)
42
+ m = transpose(m)
43
+ ->v, i{
44
+ v.map(->vv, j{
45
+ _[v, m[j]].sum
46
+ })
47
+ }
48
+ end
23
49
  end
24
50
 
25
- def Mat(*init) Vec.new(init) end
51
+ def mat(*init) Mat.new(init) end
52
+
53
+ def transpose(m)
54
+ a = m.to_a
55
+ Mat.new(a.size.times.map{|i| a[i].size.times.map{|j| a[j][i]}})
56
+ end
26
57
  end
data/lib/math/vec.rb CHANGED
@@ -10,19 +10,20 @@ module Glrb
10
10
  def size() to_a.size end
11
11
  def map(_) @_[->n{to_a.map.with_index{|v, i| _[v, i]}}] end
12
12
  def sum() to_a.sum end
13
- def length() Math::sqrt(self * self) end
13
+ def length() Math::sqrt(dot(self)) end
14
14
  def !@() self / length end
15
15
  def [](_) v = to_a; v[_] end
16
16
  def +(_) map(isNum(_) ? ->v, i{v + _} : ->v, i{v + _[i]}) end
17
17
  def -(_) map(isNum(_) ? ->v, i{v - _} : ->v, i{v - _[i]}) end
18
18
  def %(_) map(isNum(_) ? ->v, i{v % _} : ->v, i{v % _[i]}) end
19
- def *(_) isNum(_) ? map(->v, i{v * _}) : map(->v, i{v * _[i]}).sum end
20
- def /(_) isNum(_) ? map(->v, i{v / _}) : cross(_) end
19
+ def *(_) map(isNum(_) ? ->v, i{v * _} : ->v, i{v * _[i]}) end
20
+ def /(_) map(isNum(_) ? ->v, i{v / _} : ->v, i{v / _[i]}) end
21
21
  def <=>(_) @v = _ end
22
22
  def >>(_) _ << @n end
23
23
  def <<(n) @_[@v, n] end
24
24
  def +@() map(->v, i{+v}) end
25
25
  def -@() map(->v, i{-v}) end
26
+ def dot(_) map(->v, i{v * _[i]}).sum end
26
27
  def cross(_) @_[->n{ _vec_cross(to_a, _.to_a) }] end
27
28
  def x() self[0] end
28
29
  def y() self[1] end
@@ -48,4 +49,7 @@ module Glrb
48
49
  a[2] * b[0] - a[0] * b[2],
49
50
  a[0] * b[1] - a[1] * b[0], ]
50
51
  end
52
+ def dot(a, b) a.dot(b) end
53
+ def cross(a, b) a.cross(b) end
54
+ def length(a) a.length end
51
55
  end
data/lib/utils/helpers.rb CHANGED
@@ -2,4 +2,5 @@ module Glrb
2
2
  def isNum (target) target.is_a? Numeric end
3
3
  def isArr (target) target.instance_of?(Array) end
4
4
  def isVec (target) target.instance_of?(Vec) end
5
+ def isMat (target) target.instance_of?(Mat) end
5
6
  end
data/lib/utils/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Glrb
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tseijp
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-06 00:00:00.000000000 Z
11
+ date: 2023-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,7 +72,6 @@ files:
72
72
  - lib/utils/helpers.rb
73
73
  - lib/utils/version.rb
74
74
  - sig/glrb.rbs
75
- - test.ppm
76
75
  homepage: https://tsei.jp
77
76
  licenses:
78
77
  - MIT
data/test.ppm DELETED
@@ -1,64 +0,0 @@
1
- P6
2
- 150.0 150.0
3
- 255
4
- ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~~~~~~~}}}}}}}}}}}}|||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}~~~~~~~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~~~~}}}}}}}}}|||||||||{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{|||||||||}}}}}}}}}~~~~~~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~~~~}}}}}}|||||||||{{{{{{{{{zzzzzzzzzyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyzzzzzzzzz{{{{{{{{{|||||||||}}}}}}~~~~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~~~~}}}}}}||||||{{{{{{zzzzzzzzzyyyyyyyyyxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxyyyyyyyyyzzzzzzzzz{{{{{{||||||}}}}}}~~~~~~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}}}}||||||{{{{{{zzzzzzyyyyyyxxxxxxxxxwwwwwwwwwvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvwwwwwwwwwxxxxxxxxxyyyyyyzzzzzz{{{{{{||||||}}}}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}||||||{{{{{{zzzzzzyyyxxxxxxxxxwwwwwwvvvvvvvvvuuuuuuuuutttttttttttttttssssssssssssssssssssssssssssssssstttttttttttttttuuuuuuuuuvvvvvvvvvwwwwwwxxxxxxyyyyyyzzzzzz{{{{{{|||}}}}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~~~~}}}||||||{{{zzzzzzyyyxxxxxxwwwwwwvvvvvvuuuuuuuuutttttttttsssssssssrrrrrrrrrrrrrrrrrrrrrqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrssssssssstttttttttuuuuuuuuuvvvvvvwwwwwwxxxyyyyyyzzzzzz{{{||||||}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~~~~}}}|||{{{{{{zzzyyyyyyxxxwwwwwwvvvvvvuuuuuuttttttsssssssssrrrrrrrrrqqqqqqqqqqqqpppppppppppppppppppppppppppppppppppppppppppppqqqqqqqqqqqqrrrrrrrrrsssssssssttttttuuuuuuvvvvvvwwwxxxxxxyyyyyyzzz{{{||||||}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{{{{zzzyyyxxxxxxwwwvvvvvvuuuuuuttttttssssssrrrrrrqqqqqqqqqpppppppppoooooooooooonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnoooooooooooopppppppppqqqqqqqqqrrrrrrssssssttttttuuuuuuvvvwwwwwwxxxyyyyyyzzz{{{{{{|||}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{{{{zzzyyyxxxxxxwwwvvvvvvuuuttttttssssssrrrqqqqqqpppppppppooooooooonnnnnnnnnmmmmmmmmmmmmmmmmmmlllllllllllllllllllllmmmmmmmmmmmmmmmmmmnnnnnnnnnoooooooooppppppqqqqqqrrrrrrssssssttttttuuuvvvvvvwwwxxxxxxyyyzzz{{{||||||}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}}}}|||{{{zzzyyyxxxxxxwwwvvvuuuuuutttssssssrrrqqqqqqppppppoooooonnnnnnnnnmmmmmmmmmlllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklllllllllmmmmmmmmmnnnnnnnnnooooooppppppqqqrrrrrrsssssstttuuuuuuvvvwwwxxxxxxyyyzzz{{{|||}}}~~~~~~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{zzzyyyxxxxxxwwwvvvuuuuuutttsssrrrrrrqqqppppppoooooonnnnnnmmmmmmlllllllllkkkkkkkkkjjjjjjjjjjjjiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjjjjjkkkkkkkkklllllllllmmmmmmnnnnnnoooooopppqqqqqqrrrsssssstttuuuuuuvvvwwwxxxyyyyyyzzz{{{|||}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{{{{zzzyyyxxxwwwvvvuuuuuutttsssrrrrrrqqqppppppooonnnnnnmmmmmmllllllkkkkkkjjjjjjiiiiiiiiiiiihhhhhhhhhhhhhhhggggggggggggggggggggggggggghhhhhhhhhhhhhhhiiiiiiiiijjjjjjjjjkkkkkkllllllmmmmmmnnnnnnoooppppppqqqrrrrrrssstttuuuuuuvvvwwwxxxyyyzzz{{{|||}}}}}}~~~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{zzzyyyxxxwwwvvvvvvuuutttsssrrrqqqqqqpppoooooonnnmmmmmmllllllkkkjjjjjjiiiiiiiiihhhhhhggggggggggggfffffffffffffffffffffffffffffffffffffffffffffffffffggggggggghhhhhhhhhiiiiiijjjjjjkkkkkkllllllmmmmmmnnnoooooopppqqqrrrrrrssstttuuuvvvwwwwwwxxxyyyzzz{{{|||}}}~~~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrrrrqqqpppooonnnnnnmmmllllllkkkjjjjjjiiiiiihhhhhhgggggggggffffffeeeeeeeeeeeeddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeefffffffffggggggggghhhhhhiiiiiijjjkkkkkklllmmmmmmnnnoooooopppqqqrrrsssssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttssssssrrrqqqpppooonnnnnnmmmlllkkkkkkjjjjjjiiihhhhhhggggggffffffeeeeeeeeedddddddddccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccdddddddddeeeeeeeeeffffffgggggghhhhhhiiijjjjjjkkkllllllmmmnnnoooooopppqqqrrrssstttuuuuuuvvvwwwxxxyyyzzz{{{|||}}}���������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppoooooonnnmmmlllkkkkkkjjjiiiiiihhhggggggffffffeeeeeeddddddccccccbbbbbbbbbbbbaaaaaaaaaaaaaaaaaa```````````````aaaaaaaaaaaaaaaaaabbbbbbbbbcccccccccddddddeeeeeeffffffgggggghhhiiiiiijjjkkkllllllmmmnnnoooppppppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{yyyxxxwwwvvvuuutttsssrrrqqqqqqpppooonnnmmmlllkkkkkkjjjiiihhhhhhgggffffffeeeeeedddccccccbbbbbbbbbaaaaaa````````````_____________________________________________`````````aaaaaaaaabbbbbbccccccddddddeeeeeefffgggggghhhiiiiiijjjkkkllllllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmllllllkkkjjjiiihhhhhhgggfffeeeeeeddddddcccbbbbbbaaaaaa`````````______^^^^^^^^^^^^^^^]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^^^^^^^^^^^^_________`````````aaaaaabbbbbbcccddddddeeeffffffggghhhiiiiiijjjkkklllmmmnnnnnnooopppqqqrrrssstttuuuvvvwwwxxxzzz{{{|||}}}~~~������������������������������������������������������������������������������������������������������������������������������������������~~~|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhhhhgggfffeeeeeedddccccccbbbaaaaaa``````______^^^^^^]]]]]]]]]]]]\\\\\\\\\\\\\\\[[[[[[[[[[[[[[[[[[[[[\\\\\\\\\\\\\\\]]]]]]]]]^^^^^^^^^______``````aaaaaabbbccccccdddeeeeeefffggghhhiiiiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz|||}}}~~~������������������������������������������������������������������������������������������������������������������������������������~~~|||{{{zzzyyyxxxwwwvvvtttsssrrrqqqpppooonnnmmmlllkkkjjjjjjiiihhhgggfffeeeeeedddcccbbbbbbaaa``````______^^^^^^]]]]]]\\\\\\[[[[[[[[[[[[ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[\\\\\\\\\]]]]]]^^^^^^______```aaaaaabbbccccccdddeeeffffffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz|||}}}~~~������������������������������������������������������������������������������������������������������������������������������~~~|||{{{zzzyyyxxxvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeeeedddcccbbbaaaaaa```______^^^^^^]]]\\\\\\[[[[[[[[[ZZZZZZYYYYYYYYYYYYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZZ[[[[[[\\\\\\]]]]]]^^^^^^___``````aaabbbbbbcccdddeeefffgggggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssuuuvvvwwwxxxyyyzzz|||}}}~~~������������������������������������������������������������������������������������������������������������������������~~~|||{{{zzzyyyxxxvvvuuutttsssrrrqqqpppooonnnlllkkkjjjiiiiiihhhgggfffeeedddcccbbbaaaaaa```______^^^]]]]]]\\\[[[[[[ZZZZZZYYYYYYYYYXXXXXXWWWWWWWWWWWWWWWVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWWWWWXXXXXXXXXYYYYYYYYYZZZZZZ[[[\\\\\\]]]]]]^^^______```aaabbbccccccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttvvvwwwxxxyyyzzz|||}}}~~~������������������������������������������������������������������������������������������������������������������~~~|||{{{zzzyyyxxxvvvuuutttsssrrrqqqooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbbbbaaa```___^^^^^^]]]\\\\\\[[[ZZZZZZYYYYYYXXXXXXWWWWWWVVVVVVVVVVVVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVWWWWWWWWWXXXXXXYYYYYYZZZ[[[[[[\\\\\\]]]^^^______```aaabbbcccdddeeeffffffggghhhiiijjjkkkmmmnnnooopppqqqrrrssstttvvvwwwxxxyyyzzz|||}}}~~~������������������������������������������������������������������������������������������������������������~~~}}}{{{zzzyyyxxxvvvuuutttsssrrrpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^^^^]]]\\\[[[[[[ZZZYYYYYYXXXXXXWWWWWWVVVVVVUUUUUUTTTTTTTTTTTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTUUUUUUUUUVVVVVVWWWWWWXXXXXXYYYZZZZZZ[[[\\\\\\]]]^^^___``````aaabbbcccdddeeefffggghhhiiijjjkkklllmmmooopppqqqrrrssstttvvvwwwxxxyyyzzz|||}}}~~~���������������������������������������������������������������������������������������������������������~~~}}}{{{zzzyyyxxxvvvuuutttsssqqqpppooonnnmmmlllkkkjjjhhhgggfffeeedddcccbbbaaa``````___^^^]]]\\\[[[[[[ZZZYYYXXXXXXWWWWWWVVVUUUUUUTTTTTTTTTSSSSSSRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRSSSSSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXYYYYYYZZZ[[[\\\\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnpppqqqrrrssstttvvvwwwxxxyyy{{{|||}}}~~~���������������������������������������������������������������������������������������������������~~~}}}|||zzzyyyxxxvvvuuutttsssqqqpppooonnnmmmllljjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[[[[ZZZYYYXXXXXXWWWVVVVVVUUUTTTTTTSSSSSSRRRRRRQQQQQQQQQQQQPPPPPPPPPPPPPPPOOOOOOOOOOOOOOOPPPPPPPPPPPPPPPQQQQQQQQQRRRRRRRRRSSSSSSTTTUUUUUUVVVVVVWWWXXXYYYYYYZZZ[[[\\\]]]^^^^^^___```aaabbbcccdddeeefffhhhiiijjjkkklllmmmnnnpppqqqrrrssstttvvvwwwxxxyyy{{{|||}}}������������������������������������������������������������������������������������������������~~~}}}|||zzzyyyxxxwwwuuutttsssrrrpppooonnnmmmkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXXXXWWWVVVUUUUUUTTTSSSSSSRRRRRRQQQQQQPPPPPPOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOPPPPPPPPPQQQQQQRRRRRRSSSTTTTTTUUUVVVVVVWWWXXXYYYYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhjjjkkklllmmmnnnpppqqqrrrsssuuuvvvwwwxxxzzz{{{|||~~~������������������������������������������������������������������������������������������}}}|||{{{yyyxxxwwwuuutttsssrrrpppooonnnmmmkkkjjjiiihhhgggfffeeecccbbbaaa```___^^^]]]\\\[[[ZZZYYYYYYXXXWWWVVVUUUUUUTTTSSSRRRRRRQQQQQQPPPPPPOOOOOONNNNNNMMMMMMMMMMMMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMNNNNNNNNNOOOOOOPPPPPPQQQQQQRRRSSSSSSTTTUUUVVVVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhjjjkkklllmmmnnnpppqqqrrrsssuuuvvvwwwyyyzzz{{{}}}~~~������������������������������������������������������������������������������������~~~|||{{{zzzxxxwwwvvvtttsssrrrpppooonnnmmmkkkjjjiiihhhgggfffdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUUUUTTTSSSRRRRRRQQQPPPPPPOOONNNNNNMMMMMMMMMLLLLLLKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKLLLLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQRRRSSSSSSTTTUUUVVVWWWWWWXXXYYYZZZ[[[\\\]]]^^^___```aaacccdddeeefffggghhhjjjkkklllmmmnnnpppqqqrrrtttuuuvvvxxxyyyzzz|||}}}~~~���������������������������������������������������������������������������������~~~}}}{{{zzzyyywwwvvvuuusssrrrqqqooonnnmmmllljjjiiihhhgggeeedddcccbbbaaa```___^^^\\\[[[ZZZYYYXXXWWWWWWVVVUUUTTTSSSRRRQQQQQQPPPOOOOOONNNMMMMMMLLLLLLKKKKKKJJJJJJJJJJJJIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJKKKKKKKKKLLLLLLMMMNNNNNNOOOPPPPPPQQQRRRSSSSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbdddeeefffggghhhjjjkkklllmmmooopppqqqrrrtttuuuvvvxxxyyy{{{|||}}}������������������������������������������������������������������������������}}}|||zzzyyyxxxvvvuuutttrrrqqqpppnnnmmmllljjjiiihhhgggeeedddcccbbbaaa```^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRRRRQQQPPPOOONNNNNNMMMLLLLLLKKKKKKJJJJJJIIIIIIHHHHHHHHHHHHGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHHHHHHIIIIIIIIIJJJJJJKKKKKKLLLMMMMMMNNNOOOOOOPPPQQQRRRSSSTTTUUUVVVVVVWWWXXXYYY[[[\\\]]]^^^___```aaabbbdddeeefffggghhhjjjkkklllnnnooopppqqqssstttuuuwwwxxxzzz{{{|||~~~������������������������������������������������������������������������~~~|||{{{yyyxxxwwwuuutttrrrqqqpppnnnmmmlllkkkiiihhhgggeeedddcccbbbaaa___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNNNNMMMLLLKKKKKKJJJJJJIIIIIIHHHHHHGGGGGGFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFGGGGGGGGGHHHHHHIIIIIIJJJJJJKKKLLLLLLMMMNNNOOOPPPPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[]]]^^^___```aaabbbdddeeefffgggiiijjjkkklllnnnoooppprrrssstttvvvwwwyyyzzz{{{}}}~~~���������������������������������������������������������������������~~~}}}{{{zzzxxxwwwvvvtttsssqqqpppooommmlllkkkiiihhhgggfffdddcccbbbaaa___^^^]]]\\\[[[ZZZXXXWWWVVVUUUTTTSSSRRRQQQPPPOOOOOONNNMMMLLLKKKKKKJJJIIIIIIHHHGGGGGGFFFFFFFFFEEEEEEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFFFFGGGGGGHHHHHHIIIJJJJJJKKKLLLLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\^^^___```aaabbbdddeeefffgggiiijjjkkkmmmnnnoooqqqrrrsssuuuvvvxxxyyyzzz|||}}}������������������������������������������������������������������}}}|||zzzyyywwwvvvuuusssrrrpppooonnnlllkkkjjjhhhgggfffdddcccbbbaaa___^^^]]]\\\[[[YYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKKKKJJJIIIHHHHHHGGGFFFFFFEEEEEEDDDDDDCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCDDDDDDEEEEEEFFFFFFGGGGGGHHHIIIIIIJJJKKKLLLMMMNNNNNNOOOPPPQQQRRRSSSTTTVVVWWWXXXYYYZZZ[[[\\\^^^___```aaabbbdddeeefffhhhiiijjjlllmmmnnnpppqqqrrrtttuuuwwwxxxzzz{{{|||~~~������������������������������������������������������������~~~|||{{{yyyxxxvvvuuutttrrrqqqooonnnmmmkkkjjjiiigggfffeeecccbbbaaa___^^^]]]\\\[[[YYYXXXWWWVVVUUUTTTSSSRRRQQQOOOOOONNNMMMLLLKKKJJJIIIHHHHHHGGGFFFEEEEEEDDDDDDCCCCCCBBBBBBAAAAAAAAAAAA@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAABBBBBBBBBCCCCCCDDDDDDEEEFFFFFFGGGHHHIIIJJJJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVXXXYYYZZZ[[[\\\^^^___```aaacccdddeeeggghhhiiikkklllmmmooopppqqqssstttvvvwwwyyyzzz{{{}}}~~~������������������������������������������������������������~~~}}}{{{zzzxxxwwwvvvtttsssqqqpppnnnmmmllljjjiiihhhfffeeedddbbbaaa```^^^]]]\\\[[[YYYXXXWWWVVVUUUTTTRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHHHHGGGFFFEEEEEEDDDCCCCCCBBBAAAAAAAAA@@@@@@???????????????>>>>>>>>>>>>???????????????@@@@@@@@@AAAAAABBBBBBCCCDDDDDDEEEFFFFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVXXXYYYZZZ[[[\\\^^^___```bbbcccdddfffggghhhjjjkkklllnnnoooqqqrrrsssuuuvvvxxxyyy{{{|||~~~������������������������������������������������������}}}|||zzzyyyxxxvvvuuusssrrrpppooommmlllkkkiiihhhgggeeedddbbbaaa```___]]]\\\[[[YYYXXXWWWVVVUUUSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDDDDCCCBBBBBBAAA@@@@@@??????>>>>>>>>>====================================>>>>>>>>>??????@@@@@@AAAAAABBBCCCCCCDDDEEEFFFGGGGGGHHHIIIJJJKKKLLLMMMNNNOOOQQQRRRSSSTTTUUUVVVXXXYYYZZZ[[[]]]^^^___```bbbccceeefffgggiiijjjkkkmmmnnnpppqqqrrrtttuuuwwwxxxzzz{{{}}}~~~������������������������������������������������������~~~}}}{{{zzzxxxwwwuuutttrrrqqqooonnnmmmkkkjjjhhhgggfffdddcccaaa```___]]]\\\[[[ZZZXXXWWWVVVUUUSSSRRRQQQPPPOOONNNLLLKKKJJJIIIHHHGGGFFFFFFEEEDDDCCCBBBAAAAAA@@@??????>>>>>>======<<<<<<<<<<<<;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<<<<<======>>>>>>??????@@@@@@AAABBBCCCCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPRRRSSSTTTUUUVVVXXXYYYZZZ[[[]]]^^^___aaabbbccceeefffhhhiiijjjlllmmmoooppprrrsssuuuvvvwwwyyyzzz|||}}}������������������������������������������������}}}|||zzzyyywwwvvvtttsssqqqpppnnnmmmllljjjiiigggfffeeecccbbb```___^^^\\\[[[ZZZXXXWWWVVVUUUSSSRRRQQQPPPOOOMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAAAAA@@@???>>>>>>======<<<<<<;;;;;;::::::::::::999999999999999999::::::::::::;;;;;;;;;<<<<<<===>>>>>>???@@@@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPRRRSSSTTTUUUWWWXXXYYYZZZ\\\]]]^^^```aaabbbdddeeeggghhhjjjkkklllnnnoooqqqrrrtttuuuwwwxxxzzz{{{}}}~~~������������������������������������������������~~~}}}{{{yyyxxxvvvuuusssrrrqqqooonnnlllkkkiiihhhfffeeedddbbbaaa___^^^]]][[[ZZZYYYWWWVVVUUUSSSRRRQQQPPPOOOMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>>>>===<<<<<<;;;:::::::::999999888888888888888888888888888888888888999999999::::::;;;;;;<<<======>>>???@@@@@@AAABBBCCCDDDEEEFFFGGGHHHIIIKKKLLLMMMNNNOOOPPPRRRSSSTTTUUUWWWXXXYYY[[[\\\]]]___```bbbcccdddfffgggiiijjjkkkmmmnnnpppqqqssstttvvvwwwyyyzzz|||}}}������������������������������������������}}}|||zzzyyywwwvvvtttsssqqqpppnnnmmmkkkjjjhhhgggeeedddcccaaa```^^^]]]\\\ZZZYYYXXXVVVUUUTTTRRRQQQPPPOOOMMMLLLKKKJJJIIIGGGFFFEEEDDDCCCBBBAAA@@@??????>>>===<<<;;;;;;:::999999888888777777777666666666666666666666666666666777777777888888999999::::::;;;<<<======>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJLLLMMMNNNOOOPPPRRRSSSTTTVVVWWWXXXZZZ[[[\\\^^^___aaabbbccceeefffhhhiiikkklllnnnoooqqqrrrtttuuuwwwxxxzzz{{{}}}~~~������������������������������������������~~~}}}{{{yyyxxxvvvuuusssrrrpppooommmllljjjiiigggfffeeecccbbb```___]]]\\\[[[YYYXXXVVVUUUTTTRRRQQQPPPOOOMMMLLLKKKJJJHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;;;;:::999888888777777666666555555555555444444444444444444555555555555666666777777888888999::::::;;;<<<===>>>>>>???@@@AAABBBDDDEEEFFFGGGHHHIIIJJJLLLMMMNNNOOOQQQRRRSSSUUUVVVWWWYYYZZZ[[[]]]^^^```aaabbbdddeeeggghhhjjjkkkmmmnnnpppqqqssstttvvvwwwyyyzzz|||}}}������������������������������������}}}|||zzzyyywwwvvvtttsssqqqpppnnnmmmkkkjjjhhhgggeeedddbbbaaa___^^^\\\[[[ZZZXXXWWWUUUTTTSSSQQQPPPOOOMMMLLLKKKJJJHHHGGGFFFEEEDDDCCCBBB@@@???>>>======<<<;;;:::999888888777666666555555444444333333333333333333333333333333333333444444444555555666777777888999::::::;;;<<<===>>>???@@@AAABBBCCCDDDFFFGGGHHHIIIJJJLLLMMMNNNPPPQQQRRRTTTUUUVVVXXXYYYZZZ\\\]]]___```bbbccceeefffgggiiijjjlllmmmoooppprrrtttuuuwwwxxxzzz{{{}}}~~~������������������������������������~~~}}}{{{zzzxxxvvvuuusssrrrpppooommmllljjjiiigggfffdddcccaaa```^^^]]]\\\ZZZYYYWWWVVVTTTSSSRRRPPPOOONNNLLLKKKJJJIIIGGGFFFEEEDDDCCCAAA@@@???>>>===<<<;;;:::999888888777666555555444333333333222222111111111111111111111111111111222222222333333444444555666666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDFFFGGGHHHIIIKKKLLLMMMNNNPPPQQQSSSTTTUUUWWWXXXZZZ[[[\\\^^^___aaabbbdddeeeggghhhjjjkkkmmmnnnpppqqqssstttvvvwwwyyy{{{|||~~~������������������������������~~~|||zzzyyywwwvvvtttsssqqqpppnnnmmmkkkiiihhhfffeeecccbbb```___^^^\\\[[[YYYXXXVVVUUUSSSRRRQQQOOONNNMMMKKKJJJIIIGGGFFFEEEDDDBBBAAA@@@???>>>===<<<;;;:::999888777666555444444333222222111111000000000000/////////////////////000000000111111222222333444444555666777777888999:::;;;<<<===???@@@AAABBBCCCDDDFFFGGGHHHIIIKKKLLLMMMOOOPPPRRRSSSTTTVVVWWWYYYZZZ\\\]]]^^^```aaacccdddfffgggiiijjjlllmmmoooqqqrrrtttuuuwwwxxxzzz{{{}}}������������������������������}}}{{{zzzxxxwwwuuutttrrrpppooommmllljjjiiigggfffdddcccaaa```^^^]]][[[ZZZXXXWWWUUUTTTSSSQQQPPPNNNMMMLLLJJJIIIHHHFFFEEEDDDBBBAAA@@@???>>>===;;;:::999888777666555555444333222222111000000//////............------------............//////000000111111222333333444555666777888999:::;;;<<<===>>>@@@AAABBBCCCEEEFFFGGGHHHJJJKKKLLLNNNOOOQQQRRRSSSUUUVVVXXXYYY[[[\\\^^^___aaabbbdddeeeggghhhjjjkkkmmmnnnpppqqqsssuuuvvvxxxyyy{{{|||~~~������������������������������~~~|||{{{yyyxxxvvvtttsssqqqpppnnnmmmkkkjjjhhhfffeeecccbbb```___]]]\\\ZZZYYYWWWVVVTTTSSSRRRPPPOOOMMMLLLKKKIIIHHHFFFEEEDDDCCCAAA@@@???>>><<<;;;:::999888777666555444333222111111000//////......------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---------......///000000111222333444555666777888999:::;;;<<<===>>>@@@AAABBBCCCEEEFFFGGGIIIJJJKKKMMMNNNPPPQQQSSSTTTUUUWWWXXXZZZ[[[]]]^^^```aaacccdddfffgggiiikkklllnnnoooqqqrrrtttuuuwwwyyyzzz|||}}}������������������������}}}|||zzzyyywwwuuutttrrrqqqooommmllljjjiiigggfffdddcccaaa```^^^]]][[[ZZZXXXWWWUUUTTTRRRQQQOOONNNLLLKKKJJJHHHGGGEEEDDDCCCAAA@@@???>>><<<;;;:::999888777666555444333222111000///......---,,,,,,+++++++++************************+++++++++,,,,,,------...///000000111222333444555666777888:::;;;<<<===>>>@@@AAABBBDDDEEEFFFHHHIIIJJJLLLMMMOOOPPPRRRSSSUUUVVVXXXYYY[[[\\\^^^___aaabbbdddeeeggghhhjjjkkkmmmoooppprrrsssuuuvvvxxxzzz{{{}}}~~~������������������������~~~}}}{{{zzzxxxvvvuuusssrrrpppnnnmmmkkkjjjhhhgggeeecccbbb```___]]]\\\ZZZYYYWWWVVVTTTSSSQQQPPPNNNMMMKKKJJJIIIGGGFFFDDDCCCBBB@@@???>>><<<;;;:::999888666555444333222111000///......---,,,++++++******))))))))))))((((((((((((((()))))))))******++++++,,,------...///000111222333444555666777888:::;;;<<<===???@@@AAACCCDDDEEEGGGHHHJJJKKKLLLNNNOOOQQQRRRTTTUUUWWWXXXZZZ[[[]]]^^^```aaacccdddfffhhhiiikkklllnnnoooqqqssstttvvvwwwyyy{{{|||~~~������������������~~~|||{{{yyywwwvvvtttsssqqqooonnnlllkkkiiigggfffdddcccaaa```^^^]]][[[YYYXXXVVVUUUSSSRRRPPPOOOMMMLLLKKKIIIHHHFFFEEECCCBBBAAA???>>>===;;;:::999888666555444333222111000///...---,,,++++++***))))))((((((''''''''''''''''''''''''''''''(((((())))))******+++,,,---...//////000222333444555666777888:::;;;<<<>>>???@@@BBBCCCDDDFFFGGGIIIJJJLLLMMMNNNPPPQQQSSSTTTVVVWWWYYY[[[\\\^^^___aaabbbdddeeegggiiijjjlllmmmoooppprrrtttuuuwwwxxxzzz|||}}}������������������}}}|||zzzxxxwwwuuutttrrrpppooommmllljjjhhhgggeeedddbbbaaa___]]]\\\ZZZYYYWWWVVVTTTSSSQQQPPPNNNMMMKKKJJJHHHGGGEEEDDDBBBAAA@@@>>>===<<<:::999888666555444333222111///...---,,,,,,+++***)))((((((''''''&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&'''(((((()))******+++,,,---...///000111222444555666777999:::;;;===>>>???AAABBBCCCEEEFFFHHHIIIKKKLLLNNNOOOQQQRRRTTTUUUWWWXXXZZZ[[[]]]^^^```bbbccceeefffhhhjjjkkkmmmnnnppprrrsssuuuvvvxxxzzz{{{}}}~~~������������������~~~}}}{{{zzzxxxvvvuuusssqqqpppnnnmmmkkkiiihhhfffeeecccaaa```^^^]]][[[ZZZXXXVVVUUUSSSRRRPPPOOOMMMLLLJJJIIIGGGFFFDDDCCCAAA@@@???===<<<;;;999888777555444333222000///...---,,,+++***)))(((((('''&&&%%%%%%$$$$$$$$$##################$$$$$$$$$%%%%%%&&&''''''((()))***+++,,,---...///000111222444555666777999:::;;;===>>>@@@AAACCCDDDEEEGGGHHHJJJKKKMMMNNNPPPQQQSSSTTTVVVXXXYYY[[[\\\^^^___aaacccdddfffgggiiikkklllnnnoooqqqssstttvvvwwwyyy{{{|||~~~������������������~~~|||{{{yyywwwvvvtttsssqqqooonnnllljjjiiigggfffdddbbbaaa___^^^\\\ZZZYYYWWWVVVTTTSSSQQQPPPNNNLLLKKKIIIHHHFFFEEECCCBBBAAA???>>><<<;;;999888777555444333222000///...---,,,+++***)))((('''&&&%%%%%%$$$######""""""""""""""""""""""""""""""######$$$$$$%%%&&&''''''((()))***+++---...///000111333444555666888999;;;<<<===???@@@BBBCCCEEEFFFHHHIIIKKKLLLNNNOOOQQQRRRTTTUUUWWWXXXZZZ\\\]]]___```bbbdddeeeggghhhjjjlllmmmoooppprrrtttuuuwwwyyyzzz|||~~~������������}}}|||zzzyyywwwuuutttrrrpppooommmllljjjhhhgggeeecccbbb```___]]][[[ZZZXXXWWWUUUTTTRRRPPPOOOMMMLLLJJJIIIGGGFFFDDDCCCAAA@@@>>>===;;;:::999777666444333222000///...---,,,***)))((('''&&&%%%%%%$$$###""""""!!!!!! !!!!!!""""""###$$$$$$%%%&&&'''((()))***+++,,,...///000111333444555777888:::;;;<<<>>>???AAABBBDDDEEEGGGHHHJJJKKKMMMNNNPPPRRRSSSUUUVVVXXXYYY[[[]]]^^^```aaaccceeefffhhhiiikkkmmmnnnppprrrsssuuuwwwxxxzzz{{{}}}������������}}}{{{zzzxxxvvvuuusssrrrpppnnnmmmkkkiiihhhfffeeecccaaa```^^^\\\[[[YYYXXXVVVTTTSSSQQQPPPNNNMMMKKKIIIHHHFFFEEECCCBBB@@@???===<<<:::999888666555333222111///...---,,,***)))((('''&&&%%%$$$###"""!!!!!!  !!!!!!"""###$$$%%%&&&'''((()))***+++,,,...///000222333444666777999:::<<<===>>>@@@AAACCCEEEFFFHHHIIIKKKLLLNNNOOOQQQRRRTTTVVVWWWYYYZZZ\\\^^^___aaabbbdddfffgggiiikkklllnnnpppqqqssstttvvvxxxyyy{{{}}}~~~������������~~~}}}{{{yyyxxxvvvtttsssqqqooonnnlllkkkiiigggfffdddbbbaaa___]]]\\\ZZZYYYWWWUUUTTTRRRQQQOOOMMMLLLJJJIIIGGGFFFDDDCCCAAA@@@>>>===;;;:::888777555444222111000...---,,,***)))((('''&&&%%%######"""!!!  !!!!!!"""###$$$%%%&&&((()))***+++---...///111222333555666888999;;;<<<>>>???AAABBBDDDEEEGGGHHHJJJLLLMMMOOOPPPRRRSSSUUUWWWXXXZZZ\\\]]]___```bbbdddeeegggiiijjjlllmmmoooqqqrrrtttvvvwwwyyy{{{|||~~~������������~~~|||{{{yyywwwvvvtttrrrqqqooommmllljjjhhhgggeeedddbbb```___]]][[[ZZZXXXVVVUUUSSSRRRPPPNNNMMMKKKJJJHHHGGGEEECCCBBB@@@???===<<<:::999777666444333111000///---,,,+++)))((('''&&&$$$###"""!!!  !!!"""###$$$%%%&&&((()))***,,,---...000111333444555777888:::;;;===>>>@@@BBBCCCEEEFFFHHHIIIKKKMMMNNNPPPQQQSSSUUUVVVXXXYYY[[[]]]^^^```bbbccceeefffhhhjjjkkkmmmoooppprrrtttuuuwwwyyyzzz|||~~~������~~~|||zzzyyywwwuuutttrrrpppooommmkkkjjjhhhfffeeecccaaa```^^^\\\[[[YYYXXXVVVTTTSSSQQQOOONNNLLLKKKIIIGGGFFFDDDCCCAAA@@@>>>===;;;999888666555333222000///...,,,+++)))((('''&&&$$$###"""!!!  !!!"""###$$$%%%'''((()))+++,,,---///000222333555666888999;;;<<<>>>???AAABBBDDDFFFGGGIIIJJJLLLNNNOOOQQQRRRTTTVVVWWWYYY[[[\\\^^^___aaacccdddfffhhhiiikkkmmmnnnppprrrsssuuuwwwxxxzzz|||}}}������}}}|||zzzxxxwwwuuusssrrrpppnnnmmmkkkiiihhhfffdddcccaaa___^^^\\\ZZZYYYWWWUUUTTTRRRQQQOOOMMMLLLJJJIIIGGGEEEDDDBBBAAA???===<<<:::999777666444333111000...---+++***((('''&&&$$$###"""!!!  """###$$$%%%'''(((***+++,,,...///111222444555777888:::<<<===???@@@BBBCCCEEEGGGHHHJJJKKKMMMOOOPPPRRRTTTUUUWWWXXXZZZ\\\]]]___aaabbbdddfffgggiiikkklllnnnpppqqqsssuuuvvvxxxzzz{{{}}}������}}}{{{zzzxxxvvvuuusssqqqpppnnnlllkkkiiigggfffdddbbbaaa___]]]\\\ZZZXXXWWWUUUSSSRRRPPPNNNMMMKKKJJJHHHFFFEEECCCBBB@@@>>>===;;;:::888666555333222000///---,,,***)))'''&&&%%%###"""!!!!!!"""###$$$&&&''')))***,,,---///000222333555666888999;;;<<<>>>@@@AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSUUUVVVXXXZZZ[[[]]]___```bbbdddeeegggiiijjjlllnnnoooqqqssstttvvvxxxyyy{{{}}}~~~������~~~}}}{{{yyyxxxvvvtttsssqqqooommmllljjjhhhgggeeecccbbb```___]]][[[ZZZXXXVVVUUUSSSQQQPPPNNNLLLKKKIIIGGGFFFDDDCCCAAA???>>><<<;;;999777666444333111000...,,,+++)))((('''%%%$$$"""!!! !!!"""###%%%&&&((()))+++,,,...///111222444666777999:::<<<===???AAABBBDDDFFFGGGIIIJJJLLLNNNOOOQQQSSSTTTVVVXXXYYY[[[]]]^^^```bbbccceeeggghhhjjjlllmmmoooqqqrrrtttvvvwwwyyy{{{|||~~~������~~~|||{{{yyywwwvvvtttrrrqqqooommmllljjjhhhfffeeecccaaa```^^^\\\[[[YYYWWWVVVTTTSSSQQQOOONNNLLLJJJIIIGGGEEEDDDBBB@@@???===<<<:::888777555444222000///---,,,***)))'''&&&$$$###!!!  !!!###$$$%%%'''(((***,,,---///000222333555777888:::;;;===???@@@BBBCCCEEEGGGHHHJJJLLLMMMOOOQQQRRRTTTVVVWWWYYY[[[\\\^^^```aaaccceeefffhhhjjjkkkmmmoooppprrrtttuuuwwwyyyzzz|||~~~~~~|||zzzyyywwwuuutttrrrpppooommmkkkjjjhhhfffeeecccaaa___^^^\\\ZZZYYYWWWUUUTTTRRRPPPOOOMMMKKKJJJHHHGGGEEECCCBBB@@@>>>===;;;999888666555333111000...---+++)))(((&&&%%%###"""  """###%%%&&&((()))+++,,,...000111333444666888999;;;<<<>>>@@@AAACCCEEEFFFHHHJJJKKKMMMOOOPPPRRRTTTUUUWWWYYYZZZ\\\^^^___aaacccdddfffhhhiiikkkmmmnnnppprrrsssuuuwwwxxxzzz|||}}}}}}|||zzzxxxwwwuuusssrrrpppnnnmmmkkkiiihhhfffdddcccaaa___^^^\\\ZZZXXXWWWUUUSSSRRRPPPNNNMMMKKKIIIHHHFFFDDDCCCAAA@@@>>><<<;;;999777666444222111///...,,,***)))'''&&&$$$###!!! !!!"""$$$%%%''')))***,,,---///111222444555777999:::<<<>>>???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPRRRSSSUUUWWWXXXZZZ\\\]]]___aaabbbdddfffgggiiikkklllnnnpppqqqsssuuuwwwxxxzzz|||}}}}}}|||zzzxxxwwwuuusssqqqpppnnnlllkkkiiigggfffdddbbbaaa___]]]\\\ZZZXXXWWWUUUSSSQQQPPPNNNLLLKKKIIIGGGFFFDDDBBBAAA???===<<<:::888777555444222000///---+++***((('''%%%###""" 
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
- 
20
-
21
-
22
-
23
-
24
-
25
- 
26
-
27
-
28
-  !!!###%%%&&&(((***+++---///000222444555777999:::<<<>>>@@@AAACCCEEEFFFHHHJJJKKKMMMOOOPPPRRRTTTVVVWWWYYY[[[\\\^^^```aaaccceeeggghhhjjjlllmmmoooqqqrrrtttvvvxxxyyy{{{}}}~~~~~~}}}{{{yyywwwvvvtttrrrqqqooommmllljjjhhhgggeeecccaaa```^^^\\\[[[YYYWWWVVVTTTRRRPPPOOOMMMKKKJJJHHHFFFEEECCCAAA???>>><<<:::999777555444222000///---+++)))(((&&&$$$###!!!
29
-
30
-
31
- 
32
-
33
-
34
-
35
-
36
-
37
- 
38
-
39
-
40
-
41
-
42
-
43
- 
44
-
45
-
46
-
47
-
48
-
49
- 
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-