gloo 0.5.4 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/lib/gloo/app/args.rb +48 -6
  5. data/lib/gloo/app/engine.rb +60 -38
  6. data/lib/gloo/app/help.rb +137 -16
  7. data/lib/gloo/app/info.rb +3 -1
  8. data/lib/gloo/app/log.rb +23 -0
  9. data/lib/gloo/app/mode.rb +2 -0
  10. data/lib/gloo/app/settings.rb +98 -47
  11. data/lib/gloo/convert/converter.rb +35 -0
  12. data/lib/gloo/convert/string_to_datetime.rb +1 -1
  13. data/lib/gloo/convert/string_to_decimal.rb +1 -1
  14. data/lib/gloo/convert/string_to_integer.rb +1 -1
  15. data/lib/gloo/core/dictionary.rb +99 -22
  16. data/lib/gloo/core/error.rb +19 -8
  17. data/lib/gloo/core/event_manager.rb +4 -0
  18. data/lib/gloo/core/factory.rb +11 -0
  19. data/lib/gloo/core/gloo_system.rb +1 -1
  20. data/lib/gloo/core/heap.rb +11 -3
  21. data/lib/gloo/core/here.rb +36 -0
  22. data/lib/gloo/core/it.rb +6 -0
  23. data/lib/gloo/core/literal.rb +5 -0
  24. data/lib/gloo/core/obj.rb +22 -0
  25. data/lib/gloo/core/op.rb +7 -0
  26. data/lib/gloo/core/parser.rb +6 -0
  27. data/lib/gloo/core/pn.rb +38 -0
  28. data/lib/gloo/core/tokens.rb +66 -22
  29. data/lib/gloo/core/verb.rb +12 -0
  30. data/lib/gloo/exec/action.rb +48 -0
  31. data/lib/gloo/exec/dispatch.rb +15 -5
  32. data/lib/gloo/exec/exec_env.rb +74 -0
  33. data/lib/gloo/exec/runner.rb +4 -2
  34. data/lib/gloo/{core → exec}/script.rb +21 -9
  35. data/lib/gloo/exec/stack.rb +78 -0
  36. data/lib/gloo/expr/expression.rb +26 -4
  37. data/lib/gloo/expr/l_boolean.rb +6 -0
  38. data/lib/gloo/expr/l_decimal.rb +5 -0
  39. data/lib/gloo/expr/l_integer.rb +7 -0
  40. data/lib/gloo/expr/l_string.rb +7 -0
  41. data/lib/gloo/expr/op_div.rb +2 -0
  42. data/lib/gloo/expr/op_minus.rb +2 -0
  43. data/lib/gloo/expr/op_mult.rb +2 -0
  44. data/lib/gloo/expr/op_plus.rb +2 -0
  45. data/lib/gloo/help/app/application.txt +22 -0
  46. data/lib/gloo/help/app/configuration.txt +7 -0
  47. data/lib/gloo/help/app/default_help.txt +14 -0
  48. data/lib/gloo/help/app/logging.txt +16 -0
  49. data/lib/gloo/help/core/color.txt +31 -0
  50. data/lib/gloo/help/core/error.txt +33 -0
  51. data/lib/gloo/help/core/events.txt +21 -0
  52. data/lib/gloo/help/core/gloo_system.txt +54 -0
  53. data/lib/gloo/help/core/here.txt +30 -0
  54. data/lib/gloo/help/core/it.txt +23 -0
  55. data/lib/gloo/help/core/ops.txt +16 -0
  56. data/lib/gloo/help/core/pathname.txt +29 -0
  57. data/lib/gloo/help/objs/basic/alias.txt +36 -0
  58. data/lib/gloo/help/objs/basic/boolean.txt +28 -0
  59. data/lib/gloo/help/objs/basic/container.txt +33 -0
  60. data/lib/gloo/help/objs/basic/decimal.txt +28 -0
  61. data/lib/gloo/help/objs/basic/integer.txt +27 -0
  62. data/lib/gloo/help/objs/basic/script.txt +29 -0
  63. data/lib/gloo/help/objs/basic/string.txt +28 -0
  64. data/lib/gloo/help/objs/basic/text.txt +27 -0
  65. data/lib/gloo/help/objs/basic/untyped.txt +22 -0
  66. data/lib/gloo/help/objs/cli/banner.txt +49 -0
  67. data/lib/gloo/help/objs/cli/bar.txt +34 -0
  68. data/lib/gloo/help/objs/cli/colorize.txt +33 -0
  69. data/lib/gloo/help/objs/cli/confirm.txt +26 -0
  70. data/lib/gloo/help/objs/cli/menu.txt +44 -0
  71. data/lib/gloo/help/objs/cli/menu_item.txt +26 -0
  72. data/lib/gloo/help/objs/cli/pastel.txt +43 -0
  73. data/lib/gloo/help/objs/cli/prompt.txt +27 -0
  74. data/lib/gloo/help/objs/cli/select.txt +34 -0
  75. data/lib/gloo/help/objs/ctrl/each.txt +48 -0
  76. data/lib/gloo/help/objs/ctrl/repeat.txt +38 -0
  77. data/lib/gloo/help/objs/data/markdown.txt +25 -0
  78. data/lib/gloo/help/objs/data/table.txt +46 -0
  79. data/lib/gloo/help/objs/dev/git_repo.txt +35 -0
  80. data/lib/gloo/help/objs/dt/date.txt +23 -0
  81. data/lib/gloo/help/objs/dt/datetime.txt +24 -0
  82. data/lib/gloo/help/objs/dt/time.txt +23 -0
  83. data/lib/gloo/help/objs/ror/erb.txt +37 -0
  84. data/lib/gloo/help/objs/ror/eval.txt +24 -0
  85. data/lib/gloo/help/objs/snd/play.txt +23 -0
  86. data/lib/gloo/help/objs/snd/say.txt +28 -0
  87. data/lib/gloo/help/objs/system/file.txt +41 -0
  88. data/lib/gloo/help/objs/system/system.txt +32 -0
  89. data/lib/gloo/help/objs/web/http_get.txt +35 -0
  90. data/lib/gloo/help/objs/web/http_post.txt +32 -0
  91. data/lib/gloo/help/objs/web/json.txt +34 -0
  92. data/lib/gloo/help/objs/web/slack.txt +33 -0
  93. data/lib/gloo/help/objs/web/teams.txt +30 -0
  94. data/lib/gloo/help/objs/web/uri.txt +37 -0
  95. data/lib/gloo/help/verbs/alert.txt +33 -0
  96. data/lib/gloo/help/verbs/beep.txt +25 -0
  97. data/lib/gloo/help/verbs/cls.txt +24 -0
  98. data/lib/gloo/help/verbs/context.txt +43 -0
  99. data/lib/gloo/help/verbs/create.txt +33 -0
  100. data/lib/gloo/help/verbs/execute.txt +27 -0
  101. data/lib/gloo/help/verbs/help.txt +34 -0
  102. data/lib/gloo/help/verbs/if.txt +37 -0
  103. data/lib/gloo/help/verbs/list.txt +34 -0
  104. data/lib/gloo/help/verbs/load.txt +38 -0
  105. data/lib/gloo/help/verbs/move.txt +42 -0
  106. data/lib/gloo/help/verbs/put.txt +38 -0
  107. data/lib/gloo/help/verbs/quit.txt +25 -0
  108. data/lib/gloo/help/verbs/run.txt +41 -0
  109. data/lib/gloo/help/verbs/save.txt +26 -0
  110. data/lib/gloo/help/verbs/show.txt +30 -0
  111. data/lib/gloo/help/verbs/tell.txt +34 -0
  112. data/lib/gloo/help/verbs/unless.txt +38 -0
  113. data/lib/gloo/help/verbs/version.txt +32 -0
  114. data/lib/gloo/help/verbs/wait.txt +29 -0
  115. data/lib/gloo/objs/basic/alias.rb +0 -33
  116. data/lib/gloo/objs/basic/boolean.rb +6 -27
  117. data/lib/gloo/objs/basic/container.rb +0 -33
  118. data/lib/gloo/objs/basic/decimal.rb +8 -28
  119. data/lib/gloo/objs/basic/integer.rb +5 -26
  120. data/lib/gloo/objs/basic/script.rb +1 -27
  121. data/lib/gloo/objs/basic/string.rb +6 -26
  122. data/lib/gloo/objs/basic/text.rb +0 -25
  123. data/lib/gloo/objs/basic/untyped.rb +0 -26
  124. data/lib/gloo/objs/cli/banner.rb +0 -29
  125. data/lib/gloo/objs/cli/bar.rb +0 -29
  126. data/lib/gloo/objs/cli/colorize.rb +4 -34
  127. data/lib/gloo/objs/cli/confirm.rb +6 -36
  128. data/lib/gloo/objs/cli/menu.rb +6 -36
  129. data/lib/gloo/objs/cli/menu_item.rb +0 -33
  130. data/lib/gloo/objs/cli/pastel.rb +4 -27
  131. data/lib/gloo/objs/cli/prompt.rb +4 -28
  132. data/lib/gloo/objs/cli/select.rb +4 -31
  133. data/lib/gloo/objs/ctrl/each.rb +33 -33
  134. data/lib/gloo/objs/ctrl/repeat.rb +8 -29
  135. data/lib/gloo/objs/data/markdown.rb +0 -25
  136. data/lib/gloo/objs/data/table.rb +4 -32
  137. data/lib/gloo/objs/dev/git.rb +12 -30
  138. data/lib/gloo/objs/dt/date.rb +3 -25
  139. data/lib/gloo/objs/dt/datetime.rb +4 -26
  140. data/lib/gloo/objs/dt/time.rb +3 -25
  141. data/lib/gloo/objs/ror/erb.rb +11 -45
  142. data/lib/gloo/objs/ror/eval.rb +11 -38
  143. data/lib/gloo/objs/snd/play.rb +2 -25
  144. data/lib/gloo/objs/snd/say.rb +9 -31
  145. data/lib/gloo/objs/system/file_handle.rb +0 -38
  146. data/lib/gloo/objs/system/system.rb +16 -46
  147. data/lib/gloo/objs/web/http_get.rb +57 -83
  148. data/lib/gloo/objs/web/http_post.rb +8 -31
  149. data/lib/gloo/objs/web/json.rb +11 -31
  150. data/lib/gloo/objs/web/slack.rb +7 -34
  151. data/lib/gloo/objs/web/teams.rb +13 -48
  152. data/lib/gloo/objs/web/uri.rb +0 -29
  153. data/lib/gloo/persist/file_loader.rb +8 -0
  154. data/lib/gloo/persist/file_saver.rb +6 -0
  155. data/lib/gloo/persist/file_storage.rb +2 -0
  156. data/lib/gloo/persist/line_splitter.rb +2 -0
  157. data/lib/gloo/persist/persist_man.rb +6 -0
  158. data/lib/gloo/verbs/alert.rb +30 -44
  159. data/lib/gloo/verbs/beep.rb +0 -30
  160. data/lib/gloo/verbs/cls.rb +0 -30
  161. data/lib/gloo/verbs/context.rb +9 -39
  162. data/lib/gloo/verbs/create.rb +17 -32
  163. data/lib/gloo/verbs/execute.rb +52 -0
  164. data/lib/gloo/verbs/help.rb +151 -115
  165. data/lib/gloo/verbs/if.rb +46 -44
  166. data/lib/gloo/verbs/list.rb +36 -54
  167. data/lib/gloo/verbs/load.rb +8 -37
  168. data/lib/gloo/verbs/move.rb +12 -51
  169. data/lib/gloo/verbs/put.rb +28 -52
  170. data/lib/gloo/verbs/quit.rb +0 -31
  171. data/lib/gloo/verbs/run.rb +23 -39
  172. data/lib/gloo/verbs/save.rb +0 -33
  173. data/lib/gloo/verbs/show.rb +6 -31
  174. data/lib/gloo/verbs/tell.rb +31 -31
  175. data/lib/gloo/verbs/unless.rb +47 -46
  176. data/lib/gloo/verbs/version.rb +0 -30
  177. data/lib/gloo/verbs/wait.rb +0 -31
  178. metadata +79 -3
@@ -35,37 +35,6 @@ module Gloo
35
35
  return KEYWORD_SHORT
36
36
  end
37
37
 
38
- # ---------------------------------------------------------------------
39
- # Help
40
- # ---------------------------------------------------------------------
41
-
42
- #
43
- # Get help for this verb.
44
- #
45
- def self.help
46
- return <<~TEXT
47
- QUIT VERB
48
- NAME: quit
49
- SHORTCUT: q
50
-
51
- DESCRIPTION
52
- Stop running the gloo application.
53
- Cleanup and shutdown.
54
-
55
- SYNTAX
56
- quit
57
-
58
- PARAMETERS
59
- None
60
-
61
- RESULT
62
- None
63
-
64
- ERRORS
65
- None
66
- TEXT
67
- end
68
-
69
38
  end
70
39
  end
71
40
  end
@@ -12,11 +12,17 @@ module Gloo
12
12
  KEYWORD = 'run'.freeze
13
13
  KEYWORD_SHORT = 'r'.freeze
14
14
  EVALUATE_RUN = '~>'.freeze
15
+ MISSING_EXPR_ERR = 'Missing Expression!'.freeze
15
16
 
16
17
  #
17
18
  # Run the verb.
18
19
  #
19
20
  def run
21
+ if @tokens.token_count < 2
22
+ $engine.err MISSING_EXPR_ERR
23
+ return
24
+ end
25
+
20
26
  if @tokens.second == EVALUATE_RUN
21
27
  run_expression
22
28
  else
@@ -24,23 +30,6 @@ module Gloo
24
30
  end
25
31
  end
26
32
 
27
- #
28
- # Run a script specified by pathname
29
- #
30
- def run_script
31
- Gloo::Exec::Runner.run @tokens.second
32
- end
33
-
34
- #
35
- # Evaluate an expression and run that.
36
- #
37
- def run_expression
38
- return unless @tokens.token_count > 2
39
-
40
- expr = Gloo::Expr::Expression.new( @tokens.params[ 1..-1 ] )
41
- $engine.parser.run expr.evaluate
42
- end
43
-
44
33
  #
45
34
  # Get the Verb's keyword.
46
35
  #
@@ -56,34 +45,29 @@ module Gloo
56
45
  end
57
46
 
58
47
  # ---------------------------------------------------------------------
59
- # Help
48
+ # Private functions
60
49
  # ---------------------------------------------------------------------
61
50
 
51
+ private
52
+
62
53
  #
63
- # Get help for this verb.
54
+ # Run a script specified by pathname
64
55
  #
65
- def self.help
66
- return <<~TEXT
67
- RUN VERB
68
- NAME: run
69
- SHORTCUT: r
70
-
71
- DESCRIPTION
72
- Run a script or other object.
73
- This is the same as sending a 'run' message to the object.
74
-
75
- SYNTAX
76
- run <path.to.object>
77
-
78
- PARAMETERS
79
- path.to.object - Reference to the object which will be run.
56
+ def run_script
57
+ Gloo::Exec::Runner.run @tokens.second
58
+ end
80
59
 
81
- RESULT
82
- The result depends on the object that is run.
60
+ #
61
+ # Evaluate an expression and run that.
62
+ #
63
+ def run_expression
64
+ unless @tokens.token_count > 2
65
+ $engine.err MISSING_EXPR_ERR
66
+ return
67
+ end
83
68
 
84
- ERRORS
85
- The errors depend on the object that is run.
86
- TEXT
69
+ expr = Gloo::Expr::Expression.new( @tokens.params[ 1..-1 ] )
70
+ $engine.parser.run expr.evaluate
87
71
  end
88
72
 
89
73
  end
@@ -34,39 +34,6 @@ module Gloo
34
34
  return KEYWORD_SHORT
35
35
  end
36
36
 
37
- # ---------------------------------------------------------------------
38
- # Help
39
- # ---------------------------------------------------------------------
40
-
41
- #
42
- # Get help for this verb.
43
- #
44
- def self.help
45
- return <<~TEXT
46
- SAVE VERB
47
- NAME: save
48
- SHORTCUT: >
49
-
50
- DESCRIPTION
51
- Stop running the gloo application.
52
- Cleanup and shutdown.
53
-
54
- SYNTAX
55
- save <path.to.object>
56
- Save a previously loaded object. The path will be for the
57
- root level object that was loaded earlier.
58
-
59
- PARAMETERS
60
- path.to.object - Name of the object file that is to be saved.
61
-
62
- RESULT
63
- The file is updated with the latest object state.
64
-
65
- ERRORS
66
- None
67
- TEXT
68
- end
69
-
70
37
  end
71
38
  end
72
39
  end
@@ -40,6 +40,12 @@ module Gloo
40
40
  return KEYWORD_SHORT
41
41
  end
42
42
 
43
+ # ---------------------------------------------------------------------
44
+ # Private functions
45
+ # ---------------------------------------------------------------------
46
+
47
+ private
48
+
43
49
  #
44
50
  # Get the formatted string.
45
51
  #
@@ -53,37 +59,6 @@ module Gloo
53
59
  return str
54
60
  end
55
61
 
56
- # ---------------------------------------------------------------------
57
- # Help
58
- # ---------------------------------------------------------------------
59
-
60
- #
61
- # Get help for this verb.
62
- #
63
- def self.help
64
- return <<~TEXT
65
- SHOW VERB
66
- NAME: show
67
- SHORTCUT: =
68
-
69
- DESCRIPTION
70
- Show an object's value.
71
-
72
- SYNTAX
73
- show <path.to.object>
74
-
75
- PARAMETERS
76
- path.to.object - The object that we want to see.
77
-
78
- RESULT
79
- The object's value is shown.
80
- <it> will contain the object's value.
81
-
82
- ERRORS
83
- None
84
- TEXT
85
- end
86
-
87
62
  end
88
63
  end
89
64
  end
@@ -11,21 +11,18 @@ module Gloo
11
11
  KEYWORD = 'tell'.freeze
12
12
  KEYWORD_SHORT = '->'.freeze
13
13
  TO = 'to'.freeze
14
+ OBJ_NOT_FOUND_ERR = 'Object was not found: '.freeze
15
+ UNKNOWN_MSG_ERR = 'Missing message!'.freeze
14
16
 
15
17
  #
16
18
  # Run the verb.
17
19
  #
18
20
  def run
19
- name = @tokens.second
20
- msg = @tokens.after_token( TO )
21
- pn = Gloo::Core::Pn.new name
22
- o = pn.resolve
21
+ setup_msg
22
+ return unless @msg
23
23
 
24
- if o
25
- Gloo::Exec::Dispatch.message msg, o, @params
26
- else
27
- $log.error "Could not send message to object. Bad path: #{name}"
28
- end
24
+ setup_target
25
+ dispatch_msg
29
26
  end
30
27
 
31
28
  #
@@ -43,35 +40,38 @@ module Gloo
43
40
  end
44
41
 
45
42
  # ---------------------------------------------------------------------
46
- # Help
43
+ # Private functions
47
44
  # ---------------------------------------------------------------------
48
45
 
46
+ private
47
+
49
48
  #
50
- # Get help for this verb.
49
+ # Lookup the message to send.
51
50
  #
52
- def self.help
53
- return <<~TEXT
54
- TELL VERB
55
- NAME: tell
56
- SHORTCUT: ->
57
-
58
- DESCRIPTION
59
- Send a message to an object.
60
- Ask the object to perform an action.
51
+ def setup_msg
52
+ @msg = @tokens.after_token( TO )
61
53
 
62
- SYNTAX
63
- tell <path.to.object> to <message>
64
-
65
- PARAMETERS
66
- path.to.object - The object that we want to see.
67
- message - The message to send.
54
+ $engine.err( UNKNOWN_MSG_ERR ) unless @msg
55
+ end
68
56
 
69
- RESULT
70
- The result depends on the message that is sent.
57
+ #
58
+ # Setup the target of the message.
59
+ #
60
+ def setup_target
61
+ @obj_name = @tokens.second
62
+ pn = Gloo::Core::Pn.new @obj_name
63
+ @target_obj = pn.resolve
64
+ end
71
65
 
72
- ERRORS
73
- Errors depend on the message that is sent.
74
- TEXT
66
+ #
67
+ # Dispatch the message to the target object.
68
+ #
69
+ def dispatch_msg
70
+ if @target_obj
71
+ Gloo::Exec::Dispatch.message @msg, @target_obj, @params
72
+ else
73
+ $engine.err "#{OBJ_NOT_FOUND_ERR} #{@obj_name}"
74
+ end
75
75
  end
76
76
 
77
77
  end
@@ -10,32 +10,19 @@ module Gloo
10
10
 
11
11
  KEYWORD = 'unless'.freeze
12
12
  KEYWORD_SHORT = 'if!'.freeze
13
- THEN = 'do'.freeze
13
+ DO = 'do'.freeze
14
+ MISSING_EXPR_ERR = 'Missing Expression!'.freeze
14
15
 
15
16
  #
16
17
  # Run the verb.
17
18
  #
18
19
  def run
19
- value = @tokens.before_token( THEN )
20
- if value.count > 1
21
- # The first token is the verb, so we drop it.
22
- value = value[ 1..-1 ]
23
- end
20
+ value = value_tokens
21
+ return if value.nil?
24
22
 
25
- evals_false = false
26
- if value.count.positive?
27
- expr = Gloo::Expr::Expression.new( value )
28
- result = expr.evaluate
29
- evals_false = true if result == false
30
- evals_false = true if result.is_a?( Numeric ) && result.zero?
31
- end
32
- return unless evals_false
23
+ return unless evals_false( value )
33
24
 
34
- cmd = @tokens.expr_after( THEN )
35
- i = $engine.parser.parse_immediate cmd
36
- return unless i
37
-
38
- i.run
25
+ run_do
39
26
  end
40
27
 
41
28
  #
@@ -53,37 +40,51 @@ module Gloo
53
40
  end
54
41
 
55
42
  # ---------------------------------------------------------------------
56
- # Help
43
+ # Private functions
57
44
  # ---------------------------------------------------------------------
58
45
 
46
+ private
47
+
59
48
  #
60
- # Get help for this verb.
49
+ # Get the list of tokens that represent the parameters
50
+ # of the unless command.
61
51
  #
62
- def self.help
63
- return <<~TEXT
64
- UNLESS VERB
65
- NAME: unless
66
- SHORTCUT: if!
67
-
68
- DESCRIPTION
69
- Unless an expression is true, do something.
70
- This is the opposite of the if verb.
71
-
72
- SYNTAX
73
- unless <true> do <do>
74
-
75
- PARAMETERS
76
- true - Does the expression evaluate to true?
77
- do - Execute command if the expression is not true.
78
-
79
- RESULT
80
- Unchanged if the expression is true.
81
- If not true, then the result will be based on the command
82
- specified after the 'do' keyword.
83
-
84
- ERRORS
85
- The errors depend on the object that is run.
86
- TEXT
52
+ def value_tokens
53
+ value = @tokens.before_token( DO )
54
+ if value && value.count > 1
55
+ # The first token is the verb, so we drop it.
56
+ value = value[ 1..-1 ]
57
+ else
58
+ $engine.err MISSING_EXPR_ERR
59
+ end
60
+
61
+ return value
62
+ end
63
+
64
+ #
65
+ # Does the given value evalute to true?
66
+ #
67
+ def evals_false( value )
68
+ eval_result = false
69
+ if value.count.positive?
70
+ expr = Gloo::Expr::Expression.new( value )
71
+ result = expr.evaluate
72
+ eval_result = true if result == false
73
+ eval_result = true if result.is_a?( Numeric ) && result.zero?
74
+ end
75
+
76
+ return eval_result
77
+ end
78
+
79
+ #
80
+ # Run the 'do' command.
81
+ #
82
+ def run_do
83
+ cmd = @tokens.expr_after( DO )
84
+ i = $engine.parser.parse_immediate cmd
85
+ return unless i
86
+
87
+ i.run
87
88
  end
88
89
 
89
90
  end
@@ -32,36 +32,6 @@ module Gloo
32
32
  return KEYWORD_SHORT
33
33
  end
34
34
 
35
- # ---------------------------------------------------------------------
36
- # Help
37
- # ---------------------------------------------------------------------
38
-
39
- #
40
- # Get help for this verb.
41
- #
42
- def self.help
43
- return <<~TEXT
44
- VERSION VERB
45
- NAME: version
46
- SHORTCUT: v
47
-
48
- DESCRIPTION
49
- Show the application version information.
50
-
51
- SYNTAX
52
- version
53
-
54
- PARAMETERS
55
- None
56
-
57
- RESULT
58
- None
59
-
60
- ERRORS
61
- None
62
- TEXT
63
- end
64
-
65
35
  end
66
36
  end
67
37
  end