rouge 3.10.0 → 3.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rouge/demos/apex +9 -0
  3. data/lib/rouge/demos/csvs +8 -0
  4. data/lib/rouge/demos/liquid +0 -1
  5. data/lib/rouge/demos/minizinc +23 -0
  6. data/lib/rouge/demos/nesasm +11 -0
  7. data/lib/rouge/demos/q +6 -0
  8. data/lib/rouge/demos/robot_framework +27 -0
  9. data/lib/rouge/demos/slice +10 -0
  10. data/lib/rouge/demos/ttcn3 +6 -0
  11. data/lib/rouge/guessers/disambiguation.rb +5 -0
  12. data/lib/rouge/lexer.rb +3 -0
  13. data/lib/rouge/lexers/apex.rb +126 -0
  14. data/lib/rouge/lexers/bpf.rb +20 -6
  15. data/lib/rouge/lexers/coq.rb +12 -9
  16. data/lib/rouge/lexers/csvs.rb +44 -0
  17. data/lib/rouge/lexers/d.rb +1 -1
  18. data/lib/rouge/lexers/dot.rb +2 -2
  19. data/lib/rouge/lexers/eex.rb +2 -1
  20. data/lib/rouge/lexers/io.rb +2 -2
  21. data/lib/rouge/lexers/json.rb +1 -1
  22. data/lib/rouge/lexers/json_doc.rb +4 -3
  23. data/lib/rouge/lexers/kotlin.rb +21 -28
  24. data/lib/rouge/lexers/liquid.rb +82 -108
  25. data/lib/rouge/lexers/m68k.rb +2 -2
  26. data/lib/rouge/lexers/magik.rb +1 -1
  27. data/lib/rouge/lexers/markdown.rb +7 -1
  28. data/lib/rouge/lexers/mason.rb +0 -5
  29. data/lib/rouge/lexers/minizinc.rb +87 -0
  30. data/lib/rouge/lexers/nesasm.rb +78 -0
  31. data/lib/rouge/lexers/nginx.rb +1 -1
  32. data/lib/rouge/lexers/perl.rb +1 -1
  33. data/lib/rouge/lexers/pony.rb +1 -1
  34. data/lib/rouge/lexers/protobuf.rb +1 -1
  35. data/lib/rouge/lexers/q.rb +2 -1
  36. data/lib/rouge/lexers/robot_framework.rb +249 -0
  37. data/lib/rouge/lexers/scala.rb +3 -3
  38. data/lib/rouge/lexers/shell.rb +5 -3
  39. data/lib/rouge/lexers/sieve.rb +1 -1
  40. data/lib/rouge/lexers/slice.rb +32 -0
  41. data/lib/rouge/lexers/sqf.rb +1 -1
  42. data/lib/rouge/lexers/swift.rb +1 -1
  43. data/lib/rouge/lexers/toml.rb +16 -1
  44. data/lib/rouge/lexers/ttcn3.rb +119 -0
  45. data/lib/rouge/lexers/verilog.rb +1 -1
  46. data/lib/rouge/plugins/redcarpet.rb +7 -1
  47. data/lib/rouge/version.rb +1 -1
  48. metadata +16 -2
@@ -17,8 +17,8 @@ module Rouge
17
17
 
18
18
  state :comments_and_whitespace do
19
19
  rule %r/\s+/, Text
20
- rule %r(#.*?\n), Comment::Single
21
- rule %r(//.*?\n), Comment::Single
20
+ rule %r(#.*), Comment::Single
21
+ rule %r(//.*?$), Comment::Single
22
22
  rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline
23
23
  end
24
24
 
@@ -7,8 +7,9 @@ module Rouge
7
7
  desc "Embedded Elixir"
8
8
 
9
9
  tag 'eex'
10
+ aliases 'leex'
10
11
 
11
- filenames '*.eex'
12
+ filenames '*.eex', '*.leex'
12
13
 
13
14
  def initialize(opts={})
14
15
  @elixir_lexer = Elixir.new(opts)
@@ -27,8 +27,8 @@ module Rouge
27
27
 
28
28
  state :root do
29
29
  rule %r/\s+/m, Text
30
- rule %r(//.*?\n), Comment::Single
31
- rule %r(#.*?\n), Comment::Single
30
+ rule %r(//.*), Comment::Single
31
+ rule %r(#.*), Comment::Single
32
32
  rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline
33
33
  rule %r(/[+]), Comment::Multiline, :nested_comment
34
34
 
@@ -34,7 +34,7 @@ module Rouge
34
34
  end
35
35
 
36
36
  state :name do
37
- rule %r/("(?:\\.|[^"\n])*?")(\s*)(:)/ do
37
+ rule %r/("(?:\\.|[^"\\\n])*?")(\s*)(:)/ do
38
38
  groups Name::Label, Text::Whitespace, Punctuation
39
39
  end
40
40
  end
@@ -6,16 +6,17 @@ module Rouge
6
6
  load_lexer 'json.rb'
7
7
 
8
8
  class JSONDOC < JSON
9
- desc "JavaScript Object Notation with extenstions for documentation"
9
+ desc "JavaScript Object Notation with extensions for documentation"
10
10
  tag 'json-doc'
11
11
 
12
- prepend :root do
12
+ prepend :name do
13
13
  rule %r/([$\w]+)(\s*)(:)/ do
14
14
  groups Name::Attribute, Text, Punctuation
15
15
  end
16
+ end
16
17
 
18
+ prepend :value do
17
19
  rule %r(/[*].*?[*]/), Comment
18
-
19
20
  rule %r(//.*?$), Comment::Single
20
21
  rule %r/(\.\.\.)/, Comment::Single
21
22
  end
@@ -24,19 +24,12 @@ module Rouge
24
24
  while yield
25
25
  )
26
26
 
27
- name = %r'@?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}][\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*'
28
- name_backtick = %r'#{name}|`#{name}`'
27
+ name_chars = %r'[-_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*'
29
28
 
30
- id = %r'(#{name_backtick})'
29
+ class_name = %r'`?[\p{Lu}]#{name_chars}`?'
30
+ name = %r'`?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}]#{name_chars}`?'
31
31
 
32
32
  state :root do
33
- rule %r'(\))(\s*)(:)(\s+)(#{name_backtick})(<)' do
34
- groups Punctuation, Text, Punctuation, Text, Name::Class, Punctuation
35
- push :generic_parameters
36
- end
37
- rule %r'(\))(\s*)(:)(\s+)(#{name_backtick})' do
38
- groups Punctuation, Text, Punctuation, Text, Name::Class
39
- end
40
33
  rule %r'\b(companion)(\s+)(object)\b' do
41
34
  groups Keyword, Text, Keyword
42
35
  end
@@ -48,13 +41,6 @@ module Rouge
48
41
  groups Keyword, Text
49
42
  push :function
50
43
  end
51
- rule %r'(#{name_backtick})(:)(\s+)(#{name_backtick})(<)' do
52
- groups Name::Variable, Punctuation, Text, Name::Class, Punctuation
53
- push :generic_parameters
54
- end
55
- rule %r'(#{name_backtick})(:)(\s+)(#{name_backtick})' do
56
- groups Name::Variable, Punctuation, Text, Name::Class
57
- end
58
44
  rule %r'\b(package|import)(\s+)' do
59
45
  groups Keyword, Text
60
46
  push :package
@@ -67,8 +53,8 @@ module Rouge
67
53
  groups Keyword::Declaration, Text
68
54
  push :property
69
55
  end
70
- rule %r/\bfun\b/, Keyword
71
- rule %r/\b(?:#{keywords.join('|')})\b/, Keyword
56
+ rule %r'\bfun\b', Keyword
57
+ rule %r'\b(?:#{keywords.join('|')})\b', Keyword
72
58
  rule %r'^\s*\[.*?\]', Name::Attribute
73
59
  rule %r'[^\S\n]+', Text
74
60
  rule %r'\\\n', Text # line continuation
@@ -85,43 +71,50 @@ module Rouge
85
71
  rule %r'"(\\\\|\\"|[^"\n])*["\n]'m, Str
86
72
  rule %r"'\\.'|'[^\\]'", Str::Char
87
73
  rule %r"[0-9](\.[0-9]+)?([eE][+-][0-9]+)?[flFL]?|0[xX][0-9a-fA-F]+[Ll]?", Num
88
- rule %r/@#{id}/, Name::Decorator
89
- rule id, Name
74
+ rule %r'(@#{class_name})', Name::Decorator
75
+ rule %r'(#{class_name})(<)' do
76
+ groups Name::Class, Punctuation
77
+ push :generic_parameters
78
+ end
79
+ rule class_name, Name::Class
80
+ rule %r'(#{name})(?=\s*[({])', Name::Function
81
+ rule name, Name
90
82
  end
91
83
 
92
84
  state :package do
93
- rule %r/\S+/, Name::Namespace, :pop!
85
+ rule %r'\S+', Name::Namespace, :pop!
94
86
  end
95
87
 
96
88
  state :class do
97
- rule id, Name::Class, :pop!
89
+ rule class_name, Name::Class, :pop!
98
90
  end
99
91
 
100
92
  state :function do
101
93
  rule %r'(<)', Punctuation, :generic_parameters
102
94
  rule %r'(\s+)', Text
103
- rule %r'(#{name_backtick})(\.)' do
95
+ rule %r'(#{class_name})(\.)' do
104
96
  groups Name::Class, Punctuation
105
97
  end
106
- rule id, Name::Function, :pop!
98
+ rule name, Name::Function, :pop!
107
99
  end
108
100
 
109
101
  state :generic_parameters do
110
- rule id, Name::Class
102
+ rule class_name, Name::Class
103
+ rule %r'(<)', Punctuation, :generic_parameters
111
104
  rule %r'(,)', Punctuation
112
105
  rule %r'(\s+)', Text
113
106
  rule %r'(>)', Punctuation, :pop!
114
107
  end
115
108
 
116
109
  state :property do
117
- rule id, Name::Property, :pop!
110
+ rule name, Name::Property, :pop!
118
111
  end
119
112
 
120
113
  state :destructure do
121
114
  rule %r'(,)', Punctuation
122
115
  rule %r'(\))', Punctuation, :pop!
123
116
  rule %r'(\s+)', Text
124
- rule id, Name::Property
117
+ rule name, Name::Property
125
118
  end
126
119
 
127
120
  state :comment do
@@ -12,12 +12,12 @@ module Rouge
12
12
  state :root do
13
13
  rule %r/[^\{]+/, Text
14
14
 
15
- rule %r/(\{%)(\s*)/ do
15
+ rule %r/(\{%-?)(\s*)/ do
16
16
  groups Punctuation, Text::Whitespace
17
17
  push :tag_or_block
18
18
  end
19
19
 
20
- rule %r/(\{\{)(\s*)/ do
20
+ rule %r/(\{\{-?)(\s*)/ do
21
21
  groups Punctuation, Text::Whitespace
22
22
  push :output
23
23
  end
@@ -27,78 +27,70 @@ module Rouge
27
27
 
28
28
  state :tag_or_block do
29
29
  # builtin logic blocks
30
- rule %r/(if|unless|elsif|case)(?=\s+)/, Keyword::Reserved, :condition
30
+ rule %r/(if|elsif|unless|case)\b/, Keyword::Reserved, :condition
31
+ rule %r/(when)\b/, Keyword::Reserved, :when
31
32
 
32
- rule %r/(when)(\s+)/ do
33
- groups Keyword::Reserved, Text::Whitespace
34
- push :when
35
- end
36
-
37
- rule %r/(else)(\s*)(%\})/ do
33
+ rule %r/(else)(\s*)(-?%\})/ do
38
34
  groups Keyword::Reserved, Text::Whitespace, Punctuation
39
35
  pop!
40
36
  end
41
37
 
42
38
  # other builtin blocks
43
- rule %r/(capture)(\s+)([^\s%]+)(\s*)(%\})/ do
44
- groups Name::Tag, Text::Whitespace, Name::Attribute, Text::Whitespace, Punctuation
39
+ rule %r/(capture|(?:in|de)crement)(\s+)([^\s%]+)(\s*)(-?%\})/ do
40
+ groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace, Punctuation
45
41
  pop!
46
42
  end
47
43
 
48
- rule %r/(comment)(\s*)(%\})/ do
44
+ rule %r/(comment)(\s*)(-?%\})/ do
49
45
  groups Name::Tag, Text::Whitespace, Punctuation
50
46
  push :comment
51
47
  end
52
48
 
53
- rule %r/(raw)(\s*)(%\})/ do
49
+ rule %r/(raw)(\s*)(-?%\})/ do
54
50
  groups Name::Tag, Text::Whitespace, Punctuation
55
51
  push :raw
56
52
  end
57
53
 
58
- rule %r/assign/, Name::Tag, :assign
59
- rule %r/include/, Name::Tag, :include
60
-
61
54
  # end of block
62
- rule %r/(end(?:case|unless|if))(\s*)(%\})/ do
55
+ rule %r/(end(?:if|unless|case))(\s*)(-?%\})/ do
63
56
  groups Keyword::Reserved, Text::Whitespace, Punctuation
64
57
  pop!
65
58
  end
66
59
 
67
- rule %r/(end(?:[^\s%]+))(\s*)(%\})/ do
60
+ rule %r/(end(?:[^\s%]+))(\s*)(-?%\})/ do
68
61
  groups Name::Tag, Text::Whitespace, Punctuation
69
62
  pop!
70
63
  end
71
64
 
72
65
  # builtin tags
73
- rule %r/(cycle)(\s+)(([^\s:]*)(:))?(\s*)/ do |m|
74
- token Name::Tag, m[1]
75
- token Text::Whitespace, m[2]
66
+ rule %r/(assign|echo)\b/, Name::Tag, :assign
67
+ rule %r/(include|render)\b/, Name::Tag, :include
76
68
 
77
- if m[4] =~ /'[^']*'/
78
- token Str::Single, m[4]
79
- elsif m[4] =~ /"[^"]*"/
80
- token Str::Double, m[4]
81
- else
82
- token Name::Attribute, m[4]
83
- end
69
+ rule %r/(cycle)(\s+)(?:([^\s:]*)(\s*)(:))?(\s*)/ do |m|
70
+ token_class = case m[3]
71
+ when %r/'[^']*'/ then Str::Single
72
+ when %r/"[^"]*"/ then Str::Double
73
+ else
74
+ Name::Attribute
75
+ end
84
76
 
85
- token Punctuation, m[5]
86
- token Text::Whitespace, m[6]
77
+ groups Name::Tag, Text::Whitespace, token_class,
78
+ Text::Whitespace, Punctuation, Text::Whitespace
87
79
 
88
80
  push :variable_tag_markup
89
81
  end
90
82
 
91
83
  # iteration
92
84
  rule %r/
93
- (for)(\s+)
85
+ (for|tablerow)(\s+)
94
86
  ([\w-]+)(\s+)
95
87
  (in)(\s+)
96
88
  (
97
- (?: [^\s,\|'"] | (?:"[^"]*"|'[^']*') )+
89
+ (?: [^\s%,\|'"] | (?:"[^"]*"|'[^']*') )+
98
90
  )(\s*)
99
91
  /x do |m|
100
92
  groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace,
101
- Keyword::Reserved, Text::Whitespace
93
+ Name::Tag, Text::Whitespace
102
94
 
103
95
  token_class = case m[7]
104
96
  when %r/'[^']*'/ then Str::Single
@@ -119,105 +111,76 @@ module Rouge
119
111
  end
120
112
 
121
113
  state :output do
122
- mixin :whitespace
123
- mixin :generic
114
+ rule %r/(\|)(\s*)([a-zA-Z_][^\s}\|:]*)/ do
115
+ groups Punctuation, Text::Whitespace, Name::Function
116
+ push :filters
117
+ end
124
118
 
125
- rule %r/\}\}/, Punctuation, :pop!
126
- rule %r/\|/, Punctuation, :filters
119
+ mixin :end_of_tag
120
+ mixin :generic
127
121
  end
128
122
 
129
123
  state :filters do
130
- mixin :whitespace
131
-
132
- rule(/\}\}/) { token Punctuation; reset_stack }
133
-
134
- rule %r/([^\s\|:]+)(:?)(\s*)/ do
135
- groups Name::Function, Punctuation, Text::Whitespace
136
- push :filter_markup
124
+ rule %r/(\|)(\s*)([a-zA-Z_][^\s%}\|:]*)/ do
125
+ groups Punctuation, Text::Whitespace, Name::Function
137
126
  end
138
- end
139
-
140
- state :filter_markup do
141
- rule %r/\|/, Punctuation, :pop!
142
127
 
143
128
  mixin :end_of_tag
144
129
  mixin :end_of_block
145
- mixin :default_param_markup
130
+ mixin :variable_param_markup
146
131
  end
147
132
 
148
133
  state :condition do
149
- mixin :end_of_block
150
- mixin :whitespace
151
-
152
- rule %r/([=!><]=?)/, Operator
153
-
154
- rule %r/\b(?:(!)|(not\b))/ do
155
- groups Operator, Operator::Word
156
- end
157
-
158
- rule %r/(contains)/, Operator::Word
134
+ rule %r/([=!]=|[<>]=?)/, Operator
135
+ rule %r/(and|or|contains)\b/, Operator::Word
159
136
 
137
+ mixin :end_of_block
160
138
  mixin :generic
161
- mixin :whitespace
162
139
  end
163
140
 
164
141
  state :when do
165
142
  mixin :end_of_block
166
- mixin :whitespace
167
143
  mixin :generic
168
144
  end
169
145
 
170
- state :operator do
171
- rule %r/(\s*)((?:=|!|>|<)=?)(\s*)/ do
172
- groups Text::Whitespace, Operator, Text::Whitespace
173
- pop!
174
- end
175
-
176
- rule %r/(\s*)(\bcontains\b)(\s*)/ do
177
- groups Text::Whitespace, Operator::Word, Text::Whitespace
178
- pop!
179
- end
180
- end
181
-
182
146
  state :end_of_tag do
183
- rule(/\}\}/) { token Punctuation; reset_stack }
147
+ rule(/-?\}\}/) { token Punctuation; reset_stack }
184
148
  end
185
149
 
186
150
  state :end_of_block do
187
- rule(/%\}/) { token Punctuation; reset_stack }
151
+ rule(/-?%\}/) { token Punctuation; reset_stack }
188
152
  end
189
153
 
190
154
  # states for unknown markup
191
155
  state :param_markup do
192
156
  mixin :whitespace
157
+ mixin :keyword
193
158
  mixin :string
159
+ mixin :number
194
160
 
195
161
  rule %r/([^\s=:]+)(\s*)(=|:)/ do
196
162
  groups Name::Attribute, Text::Whitespace, Operator
197
163
  end
198
164
 
199
- rule %r/(\{\{)(\s*)([^\s\}])(\s*)(\}\})/ do
200
- groups Punctuation, Text::Whitespace, Text, Text::Whitespace, Punctuation
201
- end
202
-
203
- mixin :number
204
- mixin :keyword
205
-
206
- rule %r/,/, Punctuation
165
+ rule %r/[,:]/, Punctuation
207
166
  end
208
167
 
209
168
  state :default_param_markup do
210
169
  mixin :param_markup
211
- rule %r/./, Text
170
+
171
+ rule %r/\S+/, Text
212
172
  end
213
173
 
214
174
  state :variable_param_markup do
215
175
  mixin :param_markup
216
176
  mixin :variable
217
- rule %r/./, Text
177
+
178
+ rule %r/\S+/, Text
218
179
  end
219
180
 
220
181
  state :tag_markup do
182
+ rule %r/(reversed)\b/, Name::Attribute
183
+
221
184
  mixin :end_of_block
222
185
  mixin :default_param_markup
223
186
  end
@@ -229,12 +192,14 @@ module Rouge
229
192
 
230
193
  # states for different values types
231
194
  state :keyword do
232
- rule %r/\b(false|true)\b/, Keyword::Constant
195
+ rule %r/(false|true|nil)\b/, Keyword::Constant
233
196
  end
234
197
 
235
198
  state :variable do
236
- rule %r/\.(?=\w)/, Punctuation
237
- rule %r/[a-zA-Z_]\w*\??/, Name::Variable
199
+ rule %r/(empty|blank|forloop\.[^\s%}\|:]+)\b/, Name::Builtin
200
+ rule %r/\.(?=\w)|\[|\]/, Punctuation
201
+ rule %r/(first|last|size)\b/, Name::Function
202
+ rule %r/[a-zA-Z_][\w-]*\??/, Name::Variable
238
203
  end
239
204
 
240
205
  state :string do
@@ -243,21 +208,17 @@ module Rouge
243
208
  end
244
209
 
245
210
  state :number do
211
+ rule %r/-/, Operator
246
212
  rule %r/\d+\.\d+/, Num::Float
247
213
  rule %r/\d+/, Num::Integer
248
214
  end
249
215
 
250
- state :array_index do
251
- rule %r/\[/, Punctuation
252
- rule %r/\]/, Punctuation
253
- end
254
-
255
216
  state :generic do
256
- mixin :array_index
217
+ mixin :whitespace
257
218
  mixin :keyword
258
219
  mixin :string
259
- mixin :variable
260
220
  mixin :number
221
+ mixin :variable
261
222
  end
262
223
 
263
224
  state :whitespace do
@@ -265,18 +226,20 @@ module Rouge
265
226
  end
266
227
 
267
228
  state :comment do
268
- rule %r/(\{%)(\s*)(endcomment)(\s*)(%\})/ do
229
+ rule %r/[^\{]+/, Comment
230
+
231
+ rule %r/(\{%-?)(\s*)(endcomment)(\s*)(-?%\})/ do
269
232
  groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation
270
233
  reset_stack
271
234
  end
272
235
 
273
- rule %r/./, Comment
236
+ rule %r/\{/, Comment
274
237
  end
275
238
 
276
239
  state :raw do
277
240
  rule %r/[^\{]+/, Text
278
241
 
279
- rule %r/(\{%)(\s*)(endraw)(\s*)(%\})/ do
242
+ rule %r/(\{%-?)(\s*)(endraw)(\s*)(-?%\})/ do
280
243
  groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation
281
244
  reset_stack
282
245
  end
@@ -285,27 +248,38 @@ module Rouge
285
248
  end
286
249
 
287
250
  state :assign do
288
- mixin :whitespace
289
- mixin :end_of_block
251
+ rule %r/=/, Operator
290
252
 
291
- rule %r/(\s*)(=)(\s*)/ do
292
- groups Text::Whitespace, Operator, Text::Whitespace
253
+ rule %r/(\|)(\s*)([a-zA-Z_][^\s%\|:]*)/ do
254
+ groups Punctuation, Text::Whitespace, Name::Function
255
+ push :filters
293
256
  end
294
257
 
295
- rule %r/\|/, Punctuation, :filters
296
-
258
+ mixin :end_of_block
297
259
  mixin :generic
298
260
  end
299
261
 
300
262
  state :include do
301
- mixin :whitespace
302
-
303
- rule %r/([^\.]+)(\.)(html|liquid)/ do
304
- groups Name::Attribute, Punctuation, Name::Attribute
263
+ rule %r/(\{\{-?)(\s*)/ do
264
+ groups Punctuation, Text::Whitespace
265
+ push :output_embed
305
266
  end
306
267
 
268
+ rule %r/(with|for)\b/, Name::Tag
269
+ rule %r/[\/\w-]+(\.[\w-]+)+\b/, Text
270
+
307
271
  mixin :variable_tag_markup
308
272
  end
273
+
274
+ state :output_embed do
275
+ rule %r/(\|)(\s*)([a-zA-Z_][^\s}\|:]*)/ do
276
+ groups Punctuation, Text::Whitespace, Name::Function
277
+ end
278
+
279
+ rule %r/-?\}\}/, Punctuation, :pop!
280
+
281
+ mixin :variable_param_markup
282
+ end
309
283
  end
310
284
  end
311
285
  end