lissio 0.1.0.beta3 → 0.1.0

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.
@@ -0,0 +1,318 @@
1
+ require 'browser/http'
2
+ require 'browser/effects'
3
+
4
+ module Lissio; class Component
5
+
6
+ class Autocomplete < Lissio::Component
7
+ class Section < Lissio::Component
8
+ class Options
9
+ def initialize(&block)
10
+ @key = :id
11
+ @limit = 10
12
+
13
+ if block.arity.nonzero?
14
+ block.call(self)
15
+ else
16
+ instance_eval(&block)
17
+ end
18
+ end
19
+
20
+ def title(value = nil)
21
+ value ? @title = value : @title
22
+ end
23
+
24
+ def local(value = nil)
25
+ value ? @local = value : @local
26
+ end
27
+
28
+ def remote(value = nil)
29
+ value ? @remote = value : @remote
30
+ end
31
+
32
+ def key(value = nil)
33
+ value ? @key = value : @key
34
+ end
35
+
36
+ def limit(value = nil)
37
+ value ? @limit = value : @limit
38
+ end
39
+
40
+ def select(&block)
41
+ block ? @select = block : @select
42
+ end
43
+
44
+ def css(&block)
45
+ block ? @css = block : @css
46
+ end
47
+
48
+ def html(&block)
49
+ block ? @html = block : @html
50
+ end
51
+ end
52
+
53
+ tag class: :section
54
+
55
+ on 'mouse:down', '.result' do |e|
56
+ result = JSON.parse(e.target.child.data(:result))
57
+
58
+ @select.call(result)
59
+ end
60
+
61
+ def initialize(title, results, key, input, select)
62
+ @title = title
63
+ @results = results
64
+ @key = key
65
+ @input = input
66
+ @select = select
67
+ end
68
+ end
69
+
70
+ def initialize(&block)
71
+ @autocompleters = []
72
+
73
+ if block.arity.nonzero?
74
+ block.call(self)
75
+ else
76
+ instance_eval(&block)
77
+ end
78
+ end
79
+
80
+ def section(&block)
81
+ options = Section::Options.new(&block)
82
+
83
+ section = Class.new(Section) do
84
+ html do |_|
85
+ _.div.title @title
86
+
87
+ @results.each do |res|
88
+ _.div.result do |_|
89
+ _.div.data(result: res.to_json)
90
+
91
+ if options.html
92
+ instance_exec(_, res, &options.html)
93
+ else
94
+ _.div do
95
+ from = res[@key].index(@input)
96
+ to = from + @input.length
97
+
98
+ _.span res[@key][0 .. from - 1] if from.nonzero?
99
+ _.span.hl res[@key][from .. to - 1]
100
+ _.span res[@key][to .. -1]
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ css do
108
+ rule '.result' do
109
+ instance_eval(&options.css) if options.css
110
+ end
111
+ end
112
+ end
113
+
114
+ @autocompleters << {
115
+ title: options.title,
116
+ local: options.local,
117
+ remote: options.remote,
118
+ key: options.key,
119
+ limit: options.limit,
120
+ select: options.select,
121
+ section: section
122
+ }
123
+ end
124
+
125
+ def results
126
+ element.at_css(".results")
127
+ end
128
+
129
+ def hint
130
+ element.at_css(".hint")
131
+ end
132
+
133
+ def query
134
+ element.at_css(".query")
135
+ end
136
+
137
+ on 'input', '.query' do |e|
138
+ if query.value.empty?
139
+ hide_completions
140
+ next
141
+ end
142
+
143
+ remove_old_completions
144
+
145
+ comps = @autocompleters.map do |ac|
146
+ local_completions = get_local_completions(ac)
147
+
148
+ if local_completions.count < ac[:limit] and ac[:remote]
149
+ url = "#{ac[:remote]}?q=#{query.value}"
150
+
151
+ Browser::HTTP.get(url).then do |response|
152
+ [ac, local_completions, response]
153
+ end
154
+ else
155
+ [ac, local_completions, nil]
156
+ end
157
+ end
158
+
159
+ Promise.when(*comps).each do |ac, completions, response|
160
+ if response
161
+ completions += response.json.take(ac[:limit] - completions.size)
162
+ end
163
+
164
+ append_completions(ac, completions)
165
+ end
166
+ end
167
+
168
+ on 'key:down', '.query' do |e|
169
+ set_completion(@cur, @cur_ac) if e.key.eql?(:Tab)
170
+ end
171
+
172
+ on :blur, '.query' do
173
+ hide_completions
174
+ end
175
+
176
+ def set_completion(comp, ac)
177
+ key = ac[:key]
178
+ select = ac[:select]
179
+
180
+ query.value = comp[key]
181
+ select.call(comp)
182
+ end
183
+
184
+ def hide_completions
185
+ hint.value = ''
186
+ results.hide
187
+ end
188
+
189
+ def remove_old_completions
190
+ @some_results = false
191
+ @cur = nil
192
+ hint.value = ''
193
+
194
+ results.children.each do |child|
195
+ results.remove_child(child)
196
+ end
197
+ end
198
+
199
+ def set_hint(comps, ac)
200
+ return unless hint.value.empty?
201
+
202
+ key = ac[:key]
203
+
204
+ if comps.first[key].downcase.start_with?(query.value)
205
+ hint.value = query.value + comps.first[key][query.value.size .. -1]
206
+
207
+ @cur = comps.first
208
+ @cur_ac = ac
209
+ else
210
+ hint.value = ''
211
+ end
212
+ end
213
+
214
+ def get_local_completions(ac)
215
+ return [] unless ac[:local]
216
+
217
+ key = ac[:key]
218
+ q = query.value
219
+
220
+ ac[:local].select do |comp|
221
+ comp[key].match(q)
222
+ end.take(ac[:limit])
223
+ end
224
+
225
+ def append_completions(ac, comps)
226
+ if comps.empty?
227
+ hide_completions unless @some_results
228
+ return
229
+ end
230
+
231
+ title = ac[:title]
232
+ select = ac[:select]
233
+ section = ac[:section]
234
+ key = ac[:key]
235
+ input = query.value
236
+
237
+ @some_results = true
238
+
239
+ if @cur.nil?
240
+ @cur = comps.first
241
+ @cur_ac = ac
242
+ end
243
+
244
+ set_hint(comps, ac)
245
+
246
+ results << section.new(title, comps, key, input, select).render
247
+ results.show
248
+ end
249
+
250
+ tag class: :autocomplete
251
+
252
+ html do
253
+ input.hint
254
+ input.query
255
+
256
+ div.results
257
+ end
258
+
259
+ css do
260
+ position :relative
261
+ display :table
262
+ margin 0.px, :auto
263
+
264
+ rule '> *' do
265
+ font size: 16.px;
266
+ border 1.px, :solid, :black
267
+ width 400.px
268
+ end
269
+
270
+ rule '.hint' do
271
+ padding 6.px, 12.px
272
+ color :grey
273
+ display :block
274
+ end
275
+
276
+ rule '.query' do
277
+ position :absolute
278
+ top 0.px
279
+ padding 6.px, 12.px
280
+ background color: :transparent
281
+ end
282
+
283
+ rule '.results' do
284
+ position :absolute
285
+ top 32.px
286
+ display :none
287
+ border top: 0.px;
288
+ width 424.px;
289
+ background color: :white
290
+
291
+ rule '.title' do
292
+ padding 4.px
293
+ text align: :center
294
+ border top: [1.px, :solid, :black], bottom: [1.px, :solid, :black]
295
+ end
296
+
297
+ rule '.result' do
298
+ padding 4.px, 12.px
299
+ cursor :pointer
300
+
301
+ rule '*' do
302
+ pointer events: :none
303
+ end
304
+
305
+ rule 'span.hl' do
306
+ font weight: :bold
307
+ end
308
+ end
309
+
310
+ rule '.result:hover' do
311
+ background color: :black
312
+ color :white
313
+ end
314
+ end
315
+ end
316
+ end
317
+ end; end
318
+
@@ -21,9 +21,7 @@ class Container < Component
21
21
  end
22
22
  end
23
23
 
24
- def initialize(parent, &block)
25
- super(parent)
26
-
24
+ def initialize(&block)
27
25
  if block
28
26
  @content = Definer.new(&block).to_a
29
27
  else
@@ -38,10 +36,10 @@ class Container < Component
38
36
  element.clear
39
37
 
40
38
  content.each {|c|
41
- if String === c
42
- element << c
43
- else
39
+ if Component === c
44
40
  element << c.render
41
+ else
42
+ element << c.to_s
45
43
  end
46
44
  }
47
45
 
@@ -4,13 +4,21 @@ module Lissio; class Component
4
4
 
5
5
  class Markdown < Component
6
6
  def self.render(string, options = {}, &block)
7
- `marked(#{@string.to_n}, #{@options.to_n}, #{@block.to_n})`
7
+ `marked(#{string.to_n}, #{options.to_n}, #{block.to_n})`
8
8
  end
9
9
 
10
- def initialize(string, options = {}, &block)
11
- @string = string
10
+ def self.content(string = nil)
11
+ string ? @content = string : @content
12
+ end
13
+
14
+ def initialize(string = nil, options = {}, &block)
15
+ @string = string || self.class.content
12
16
  @options = options
13
17
  @block = block
18
+
19
+ unless @string
20
+ raise ArgumentError, 'missing text to render'
21
+ end
14
22
  end
15
23
 
16
24
  def render
@@ -207,126 +215,139 @@ KHRoaXMuc21hcnR5cGFudHMoY2FwWzBdKSk7Y29udGludWV9aWYoc3JjKXt0aHJvdyBuZXcgRXJy
207
215
  b3IoIkluZmluaXRlIGxvb3Agb24gYnl0ZTogIitzcmMuY2hhckNvZGVBdCgwKSl9fXJldHVybiBv
208
216
  dXR9O0lubGluZUxleGVyLnByb3RvdHlwZS5vdXRwdXRMaW5rPWZ1bmN0aW9uKGNhcCxsaW5rKXt2
209
217
  YXIgaHJlZj1lc2NhcGUobGluay5ocmVmKSx0aXRsZT1saW5rLnRpdGxlP2VzY2FwZShsaW5rLnRp
210
- dGxlKTpudWxsO2lmKGNhcFswXS5jaGFyQXQoMCkhPT0iISIpe3JldHVybiB0aGlzLnJlbmRlcmVy
211
- LmxpbmsoaHJlZix0aXRsZSx0aGlzLm91dHB1dChjYXBbMV0pKX1lbHNle3JldHVybiB0aGlzLnJl
212
- bmRlcmVyLmltYWdlKGhyZWYsdGl0bGUsZXNjYXBlKGNhcFsxXSkpfX07SW5saW5lTGV4ZXIucHJv
213
- dG90eXBlLnNtYXJ0eXBhbnRzPWZ1bmN0aW9uKHRleHQpe2lmKCF0aGlzLm9wdGlvbnMuc21hcnR5
214
- cGFudHMpcmV0dXJuIHRleHQ7cmV0dXJuIHRleHQucmVwbGFjZSgvLS0vZywi4oCUIikucmVwbGFj
215
- ZSgvKF58Wy1cdTIwMTQvKFxbeyJcc10pJy9nLCIkMeKAmCIpLnJlcGxhY2UoLycvZywi4oCZIiku
216
- cmVwbGFjZSgvKF58Wy1cdTIwMTQvKFxbe1x1MjAxOFxzXSkiL2csIiQx4oCcIikucmVwbGFjZSgv
217
- Ii9nLCLigJ0iKS5yZXBsYWNlKC9cLnszfS9nLCLigKYiKX07SW5saW5lTGV4ZXIucHJvdG90eXBl
218
- Lm1hbmdsZT1mdW5jdGlvbih0ZXh0KXt2YXIgb3V0PSIiLGw9dGV4dC5sZW5ndGgsaT0wLGNoO2Zv
219
- cig7aTxsO2krKyl7Y2g9dGV4dC5jaGFyQ29kZUF0KGkpO2lmKE1hdGgucmFuZG9tKCk+LjUpe2No
220
- PSJ4IitjaC50b1N0cmluZygxNil9b3V0Kz0iJiMiK2NoKyI7In1yZXR1cm4gb3V0fTtmdW5jdGlv
221
- biBSZW5kZXJlcigpe31SZW5kZXJlci5wcm90b3R5cGUuY29kZT1mdW5jdGlvbihjb2RlLGxhbmcp
222
- e2lmKCFsYW5nKXtyZXR1cm4iPHByZT48Y29kZT4iK2VzY2FwZShjb2RlLHRydWUpKyJcbjwvY29k
223
- ZT48L3ByZT4ifXJldHVybic8cHJlPjxjb2RlIGNsYXNzPSInKyJsYW5nLSIrbGFuZysnIj4nK2Vz
224
- Y2FwZShjb2RlKSsiXG48L2NvZGU+PC9wcmU+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUuYmxvY2tx
225
- dW90ZT1mdW5jdGlvbihxdW90ZSl7cmV0dXJuIjxibG9ja3F1b3RlPlxuIitxdW90ZSsiPC9ibG9j
226
- a3F1b3RlPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLmh0bWw9ZnVuY3Rpb24oaHRtbCl7cmV0dXJu
227
- IGh0bWx9O1JlbmRlcmVyLnByb3RvdHlwZS5oZWFkaW5nPWZ1bmN0aW9uKHRleHQsbGV2ZWwscmF3
228
- LG9wdGlvbnMpe3JldHVybiI8aCIrbGV2ZWwrIj4iK3RleHQrIjwvaCIrbGV2ZWwrIj5cbiJ9O1Jl
229
- bmRlcmVyLnByb3RvdHlwZS5ocj1mdW5jdGlvbigpe3JldHVybiI8aHI+XG4ifTtSZW5kZXJlci5w
230
- cm90b3R5cGUubGlzdD1mdW5jdGlvbihib2R5LG9yZGVyZWQpe3ZhciB0eXBlPW9yZGVyZWQ/Im9s
231
- IjoidWwiO3JldHVybiI8Iit0eXBlKyI+XG4iK2JvZHkrIjwvIit0eXBlKyI+XG4ifTtSZW5kZXJl
232
- ci5wcm90b3R5cGUubGlzdGl0ZW09ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxsaT4iK3RleHQrIjwv
233
- bGk+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUucGFyYWdyYXBoPWZ1bmN0aW9uKHRleHQpe3JldHVy
234
- biI8cD4iK3RleHQrIjwvcD5cbiJ9O1JlbmRlcmVyLnByb3RvdHlwZS50YWJsZT1mdW5jdGlvbiho
235
- ZWFkZXIsYm9keSl7cmV0dXJuIjx0YWJsZT5cbiIrIjx0aGVhZD5cbiIraGVhZGVyKyI8L3RoZWFk
236
- PlxuIisiPHRib2R5PlxuIitib2R5KyI8L3Rib2R5PlxuIisiPC90YWJsZT5cbiJ9O1JlbmRlcmVy
237
- LnByb3RvdHlwZS50YWJsZXJvdz1mdW5jdGlvbihjb250ZW50KXtyZXR1cm4iPHRyPlxuIitjb250
238
- ZW50KyI8L3RyPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLnRhYmxlY2VsbD1mdW5jdGlvbihjb250
239
- ZW50LGZsYWdzKXt2YXIgdHlwZT1mbGFncy5oZWFkZXI/InRoIjoidGQiO3ZhciB0YWc9ZmxhZ3Mu
240
- YWxpZ24/IjwiK3R5cGUrJyBzdHlsZT0idGV4dC1hbGlnbjonK2ZsYWdzLmFsaWduKyciPic6Ijwi
241
- K3R5cGUrIj4iO3JldHVybiB0YWcrY29udGVudCsiPC8iK3R5cGUrIj5cbiJ9O1JlbmRlcmVyLnBy
242
- b3RvdHlwZS5zdHJvbmc9ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxzdHJvbmc+Iit0ZXh0KyI8L3N0
243
- cm9uZz4ifTtSZW5kZXJlci5wcm90b3R5cGUuZW09ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxlbT4i
244
- K3RleHQrIjwvZW0+In07UmVuZGVyZXIucHJvdG90eXBlLmNvZGVzcGFuPWZ1bmN0aW9uKHRleHQp
245
- e3JldHVybiI8Y29kZT4iK3RleHQrIjwvY29kZT4ifTtSZW5kZXJlci5wcm90b3R5cGUuYnI9ZnVu
246
- Y3Rpb24oKXtyZXR1cm4iPGJyPiJ9O1JlbmRlcmVyLnByb3RvdHlwZS5kZWw9ZnVuY3Rpb24odGV4
247
- dCl7cmV0dXJuIjxkZWw+Iit0ZXh0KyI8L2RlbD4ifTtSZW5kZXJlci5wcm90b3R5cGUubGluaz1m
248
- dW5jdGlvbihocmVmLHRpdGxlLHRleHQpe3ZhciBvdXQ9JzxhIGhyZWY9IicraHJlZisnIic7aWYo
249
- dGl0bGUpe291dCs9JyB0aXRsZT0iJyt0aXRsZSsnIid9b3V0Kz0iPiIrdGV4dCsiPC9hPiI7cmV0
250
- dXJuIG91dH07UmVuZGVyZXIucHJvdG90eXBlLmltYWdlPWZ1bmN0aW9uKGhyZWYsdGl0bGUsdGV4
251
- dCl7dmFyIG91dD0nPGltZyBzcmM9IicraHJlZisnIiBhbHQ9IicrdGV4dCsnIic7aWYodGl0bGUp
252
- e291dCs9JyB0aXRsZT0iJyt0aXRsZSsnIid9b3V0Kz0iPiI7cmV0dXJuIG91dH07ZnVuY3Rpb24g
253
- UGFyc2VyKG9wdGlvbnMpe3RoaXMudG9rZW5zPVtdO3RoaXMudG9rZW49bnVsbDt0aGlzLm9wdGlv
254
- bnM9b3B0aW9uc3x8bWFya2VkLmRlZmF1bHRzO3RoaXMub3B0aW9ucy5yZW5kZXJlcj10aGlzLm9w
255
- dGlvbnMucmVuZGVyZXJ8fG5ldyBSZW5kZXJlcjt0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5y
256
- ZW5kZXJlcn1QYXJzZXIucGFyc2U9ZnVuY3Rpb24oc3JjLG9wdGlvbnMscmVuZGVyZXIpe3ZhciBw
257
- YXJzZXI9bmV3IFBhcnNlcihvcHRpb25zLHJlbmRlcmVyKTtyZXR1cm4gcGFyc2VyLnBhcnNlKHNy
258
- Yyl9O1BhcnNlci5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oc3JjKXt0aGlzLmlubGluZT1uZXcg
259
- SW5saW5lTGV4ZXIoc3JjLmxpbmtzLHRoaXMub3B0aW9ucyx0aGlzLnJlbmRlcmVyKTt0aGlzLnRv
260
- a2Vucz1zcmMucmV2ZXJzZSgpO3ZhciBvdXQ9IiI7d2hpbGUodGhpcy5uZXh0KCkpe291dCs9dGhp
261
- cy50b2soKX1yZXR1cm4gb3V0fTtQYXJzZXIucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtyZXR1
262
- cm4gdGhpcy50b2tlbj10aGlzLnRva2Vucy5wb3AoKX07UGFyc2VyLnByb3RvdHlwZS5wZWVrPWZ1
263
- bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMudG9rZW5zLmxlbmd0aC0xXXx8MH07UGFy
264
- c2VyLnByb3RvdHlwZS5wYXJzZVRleHQ9ZnVuY3Rpb24oKXt2YXIgYm9keT10aGlzLnRva2VuLnRl
265
- eHQ7d2hpbGUodGhpcy5wZWVrKCkudHlwZT09PSJ0ZXh0Iil7Ym9keSs9IlxuIit0aGlzLm5leHQo
266
- KS50ZXh0fXJldHVybiB0aGlzLmlubGluZS5vdXRwdXQoYm9keSl9O1BhcnNlci5wcm90b3R5cGUu
267
- dG9rPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMudG9rZW4udHlwZSl7Y2FzZSJzcGFjZSI6e3JldHVy
268
- biIifWNhc2UiaHIiOntyZXR1cm4gdGhpcy5yZW5kZXJlci5ocigpfWNhc2UiaGVhZGluZyI6e3Jl
269
- dHVybiB0aGlzLnJlbmRlcmVyLmhlYWRpbmcodGhpcy5pbmxpbmUub3V0cHV0KHRoaXMudG9rZW4u
270
- dGV4dCksdGhpcy50b2tlbi5kZXB0aCl9Y2FzZSJjb2RlIjp7cmV0dXJuIHRoaXMucmVuZGVyZXIu
271
- Y29kZSh0aGlzLnRva2VuLnRleHQsdGhpcy50b2tlbi5sYW5nKX1jYXNlInRhYmxlIjp7dmFyIGhl
272
- YWRlcj0iIixib2R5PSIiLGkscm93LGNlbGwsZmxhZ3MsajtjZWxsPSIiO2ZvcihpPTA7aTx0aGlz
273
- LnRva2VuLmhlYWRlci5sZW5ndGg7aSsrKXtmbGFncz17aGVhZGVyOnRydWUsYWxpZ246dGhpcy50
274
- b2tlbi5hbGlnbltpXX07Y2VsbCs9dGhpcy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5pbmxpbmUu
275
- b3V0cHV0KHRoaXMudG9rZW4uaGVhZGVyW2ldKSx7aGVhZGVyOnRydWUsYWxpZ246dGhpcy50b2tl
276
- bi5hbGlnbltpXX0pfWhlYWRlcis9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhjZWxsKTtmb3IoaT0w
277
- O2k8dGhpcy50b2tlbi5jZWxscy5sZW5ndGg7aSsrKXtyb3c9dGhpcy50b2tlbi5jZWxsc1tpXTtj
278
- ZWxsPSIiO2ZvcihqPTA7ajxyb3cubGVuZ3RoO2orKyl7Y2VsbCs9dGhpcy5yZW5kZXJlci50YWJs
279
- ZWNlbGwodGhpcy5pbmxpbmUub3V0cHV0KHJvd1tqXSkse2hlYWRlcjpmYWxzZSxhbGlnbjp0aGlz
280
- LnRva2VuLmFsaWduW2pdfSl9Ym9keSs9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhjZWxsKX1yZXR1
281
- cm4gdGhpcy5yZW5kZXJlci50YWJsZShoZWFkZXIsYm9keSl9Y2FzZSJibG9ja3F1b3RlX3N0YXJ0
282
- Ijp7dmFyIGJvZHk9IiI7d2hpbGUodGhpcy5uZXh0KCkudHlwZSE9PSJibG9ja3F1b3RlX2VuZCIp
283
- e2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShib2R5KX1j
284
- YXNlImxpc3Rfc3RhcnQiOnt2YXIgYm9keT0iIixvcmRlcmVkPXRoaXMudG9rZW4ub3JkZXJlZDt3
285
- aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxpc3RfZW5kIil7Ym9keSs9dGhpcy50b2soKX1yZXR1
286
- cm4gdGhpcy5yZW5kZXJlci5saXN0KGJvZHksb3JkZXJlZCl9Y2FzZSJsaXN0X2l0ZW1fc3RhcnQi
287
- Ont2YXIgYm9keT0iIjt3aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxpc3RfaXRlbV9lbmQiKXti
288
- b2R5Kz10aGlzLnRva2VuLnR5cGU9PT0idGV4dCI/dGhpcy5wYXJzZVRleHQoKTp0aGlzLnRvaygp
289
- fXJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGJvZHkpfWNhc2UibG9vc2VfaXRlbV9zdGFy
290
- dCI6e3ZhciBib2R5PSIiO3doaWxlKHRoaXMubmV4dCgpLnR5cGUhPT0ibGlzdF9pdGVtX2VuZCIp
291
- e2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIubGlzdGl0ZW0oYm9keSl9Y2Fz
292
- ZSJodG1sIjp7dmFyIGh0bWw9IXRoaXMudG9rZW4ucHJlJiYhdGhpcy5vcHRpb25zLnBlZGFudGlj
293
- P3RoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpOnRoaXMudG9rZW4udGV4dDtyZXR1
294
- cm4gdGhpcy5yZW5kZXJlci5odG1sKGh0bWwpfWNhc2UicGFyYWdyYXBoIjp7cmV0dXJuIHRoaXMu
295
- cmVuZGVyZXIucGFyYWdyYXBoKHRoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpKX1j
296
- YXNlInRleHQiOntyZXR1cm4gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodGhpcy5wYXJzZVRleHQo
297
- KSl9fX07ZnVuY3Rpb24gZXNjYXBlKGh0bWwsZW5jb2RlKXtyZXR1cm4gaHRtbC5yZXBsYWNlKCFl
298
- bmNvZGU/LyYoPyEjP1x3KzspL2c6LyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5y
299
- ZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLycvZywi
300
- JiMzOTsiKX1mdW5jdGlvbiByZXBsYWNlKHJlZ2V4LG9wdCl7cmVnZXg9cmVnZXguc291cmNlO29w
301
- dD1vcHR8fCIiO3JldHVybiBmdW5jdGlvbiBzZWxmKG5hbWUsdmFsKXtpZighbmFtZSlyZXR1cm4g
302
- bmV3IFJlZ0V4cChyZWdleCxvcHQpO3ZhbD12YWwuc291cmNlfHx2YWw7dmFsPXZhbC5yZXBsYWNl
303
- KC8oXnxbXlxbXSlcXi9nLCIkMSIpO3JlZ2V4PXJlZ2V4LnJlcGxhY2UobmFtZSx2YWwpO3JldHVy
304
- biBzZWxmfX1mdW5jdGlvbiBub29wKCl7fW5vb3AuZXhlYz1ub29wO2Z1bmN0aW9uIG1lcmdlKG9i
305
- ail7dmFyIGk9MSx0YXJnZXQsa2V5O2Zvcig7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dGFyZ2V0
306
- PWFyZ3VtZW50c1tpXTtmb3Ioa2V5IGluIHRhcmdldCl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNP
307
- d25Qcm9wZXJ0eS5jYWxsKHRhcmdldCxrZXkpKXtvYmpba2V5XT10YXJnZXRba2V5XX19fXJldHVy
308
- biBvYmp9ZnVuY3Rpb24gbWFya2VkKHNyYyxvcHQsY2FsbGJhY2spe2lmKGNhbGxiYWNrfHx0eXBl
309
- b2Ygb3B0PT09ImZ1bmN0aW9uIil7aWYoIWNhbGxiYWNrKXtjYWxsYmFjaz1vcHQ7b3B0PW51bGx9
310
- b3B0PW1lcmdlKHt9LG1hcmtlZC5kZWZhdWx0cyxvcHR8fHt9KTt2YXIgaGlnaGxpZ2h0PW9wdC5o
311
- aWdobGlnaHQsdG9rZW5zLHBlbmRpbmcsaT0wO3RyeXt0b2tlbnM9TGV4ZXIubGV4KHNyYyxvcHQp
312
- fWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1wZW5kaW5nPXRva2Vucy5sZW5ndGg7dmFyIGRv
313
- bmU9ZnVuY3Rpb24oKXt2YXIgb3V0LGVycjt0cnl7b3V0PVBhcnNlci5wYXJzZSh0b2tlbnMsb3B0
314
- KX1jYXRjaChlKXtlcnI9ZX1vcHQuaGlnaGxpZ2h0PWhpZ2hsaWdodDtyZXR1cm4gZXJyP2NhbGxi
315
- YWNrKGVycik6Y2FsbGJhY2sobnVsbCxvdXQpfTtyZXR1cm4gZG9uZSgpfXRyeXtpZihvcHQpb3B0
316
- PW1lcmdlKHt9LG1hcmtlZC5kZWZhdWx0cyxvcHQpO3JldHVybiBQYXJzZXIucGFyc2UoTGV4ZXIu
317
- bGV4KHNyYyxvcHQpLG9wdCl9Y2F0Y2goZSl7ZS5tZXNzYWdlKz0iXG5QbGVhc2UgcmVwb3J0IHRo
318
- aXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL2NoamovbWFya2VkLiI7aWYoKG9wdHx8bWFya2VkLmRl
319
- ZmF1bHRzKS5zaWxlbnQpe3JldHVybiI8cD5BbiBlcnJvciBvY2N1cmVkOjwvcD48cHJlPiIrZXNj
320
- YXBlKGUubWVzc2FnZSsiIix0cnVlKSsiPC9wcmU+In10aHJvdyBlfX1tYXJrZWQub3B0aW9ucz1t
321
- YXJrZWQuc2V0T3B0aW9ucz1mdW5jdGlvbihvcHQpe21lcmdlKG1hcmtlZC5kZWZhdWx0cyxvcHQp
322
- O3JldHVybiBtYXJrZWR9O21hcmtlZC5kZWZhdWx0cz17Z2ZtOnRydWUsdGFibGVzOnRydWUsYnJl
323
- YWtzOmZhbHNlLHBlZGFudGljOmZhbHNlLHNhbml0aXplOmZhbHNlLHNtYXJ0TGlzdHM6ZmFsc2Us
324
- c2lsZW50OmZhbHNlLHNtYXJ0eXBhbnRzOmZhbHNlLHJlbmRlcmVyOm5ldyBSZW5kZXJlcn07bWFy
325
- a2VkLlBhcnNlcj1QYXJzZXI7bWFya2VkLnBhcnNlcj1QYXJzZXIucGFyc2U7bWFya2VkLlJlbmRl
326
- cmVyPVJlbmRlcmVyO21hcmtlZC5MZXhlcj1MZXhlcjttYXJrZWQubGV4ZXI9TGV4ZXIubGV4O21h
327
- cmtlZC5JbmxpbmVMZXhlcj1JbmxpbmVMZXhlcjttYXJrZWQuaW5saW5lTGV4ZXI9SW5saW5lTGV4
328
- ZXIub3V0cHV0O21hcmtlZC5wYXJzZT1tYXJrZWQ7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0
329
- Iil7bW9kdWxlLmV4cG9ydHM9bWFya2VkfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlv
330
- biImJmRlZmluZS5hbWQpe2RlZmluZShmdW5jdGlvbigpe3JldHVybiBtYXJrZWR9KX1lbHNle3Ro
331
- aXMubWFya2VkPW1hcmtlZH19KS5jYWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN8fCh0eXBlb2Yg
332
- d2luZG93IT09InVuZGVmaW5lZCI/d2luZG93Omdsb2JhbCl9KCkpOw==
218
+ dGxlKTpudWxsO3JldHVybiBjYXBbMF0uY2hhckF0KDApIT09IiEiP3RoaXMucmVuZGVyZXIubGlu
219
+ ayhocmVmLHRpdGxlLHRoaXMub3V0cHV0KGNhcFsxXSkpOnRoaXMucmVuZGVyZXIuaW1hZ2UoaHJl
220
+ Zix0aXRsZSxlc2NhcGUoY2FwWzFdKSl9O0lubGluZUxleGVyLnByb3RvdHlwZS5zbWFydHlwYW50
221
+ cz1mdW5jdGlvbih0ZXh0KXtpZighdGhpcy5vcHRpb25zLnNtYXJ0eXBhbnRzKXJldHVybiB0ZXh0
222
+ O3JldHVybiB0ZXh0LnJlcGxhY2UoLy0tL2csIuKAlCIpLnJlcGxhY2UoLyhefFstXHUyMDE0Lyhc
223
+ W3siXHNdKScvZywiJDHigJgiKS5yZXBsYWNlKC8nL2csIuKAmSIpLnJlcGxhY2UoLyhefFstXHUy
224
+ MDE0LyhcW3tcdTIwMThcc10pIi9nLCIkMeKAnCIpLnJlcGxhY2UoLyIvZywi4oCdIikucmVwbGFj
225
+ ZSgvXC57M30vZywi4oCmIil9O0lubGluZUxleGVyLnByb3RvdHlwZS5tYW5nbGU9ZnVuY3Rpb24o
226
+ dGV4dCl7dmFyIG91dD0iIixsPXRleHQubGVuZ3RoLGk9MCxjaDtmb3IoO2k8bDtpKyspe2NoPXRl
227
+ eHQuY2hhckNvZGVBdChpKTtpZihNYXRoLnJhbmRvbSgpPi41KXtjaD0ieCIrY2gudG9TdHJpbmco
228
+ MTYpfW91dCs9IiYjIitjaCsiOyJ9cmV0dXJuIG91dH07ZnVuY3Rpb24gUmVuZGVyZXIoKXt9UmVu
229
+ ZGVyZXIucHJvdG90eXBlLmNvZGU9ZnVuY3Rpb24oY29kZSxsYW5nLGVzY2FwZWQsb3B0aW9ucyl7
230
+ b3B0aW9ucz1vcHRpb25zfHx7fTtpZihvcHRpb25zLmhpZ2hsaWdodCl7dmFyIG91dD1vcHRpb25z
231
+ LmhpZ2hsaWdodChjb2RlLGxhbmcpO2lmKG91dCE9bnVsbCYmb3V0IT09Y29kZSl7ZXNjYXBlZD10
232
+ cnVlO2NvZGU9b3V0fX1pZighbGFuZyl7cmV0dXJuIjxwcmU+PGNvZGU+IisoZXNjYXBlZD9jb2Rl
233
+ OmVzY2FwZShjb2RlLHRydWUpKSsiXG48L2NvZGU+PC9wcmU+In1yZXR1cm4nPHByZT48Y29kZSBj
234
+ bGFzcz0iJytvcHRpb25zLmxhbmdQcmVmaXgrbGFuZysnIj4nKyhlc2NhcGVkP2NvZGU6ZXNjYXBl
235
+ KGNvZGUpKSsiXG48L2NvZGU+PC9wcmU+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUuYmxvY2txdW90
236
+ ZT1mdW5jdGlvbihxdW90ZSl7cmV0dXJuIjxibG9ja3F1b3RlPlxuIitxdW90ZSsiPC9ibG9ja3F1
237
+ b3RlPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLmh0bWw9ZnVuY3Rpb24oaHRtbCl7cmV0dXJuIGh0
238
+ bWx9O1JlbmRlcmVyLnByb3RvdHlwZS5oZWFkaW5nPWZ1bmN0aW9uKHRleHQsbGV2ZWwscmF3LG9w
239
+ dGlvbnMpe3JldHVybiI8aCIrbGV2ZWwrJyBpZD0iJytvcHRpb25zLmhlYWRlclByZWZpeCtyYXcu
240
+ dG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXlx3XSsvZywiLSIpKyciPicrdGV4dCsiPC9oIitsZXZl
241
+ bCsiPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLmhyPWZ1bmN0aW9uKCl7cmV0dXJuIjxocj5cbiJ9
242
+ O1JlbmRlcmVyLnByb3RvdHlwZS5saXN0PWZ1bmN0aW9uKGJvZHksb3JkZXJlZCl7dmFyIHR5cGU9
243
+ b3JkZXJlZD8ib2wiOiJ1bCI7cmV0dXJuIjwiK3R5cGUrIj5cbiIrYm9keSsiPC8iK3R5cGUrIj5c
244
+ biJ9O1JlbmRlcmVyLnByb3RvdHlwZS5saXN0aXRlbT1mdW5jdGlvbih0ZXh0KXtyZXR1cm4iPGxp
245
+ PiIrdGV4dCsiPC9saT5cbiJ9O1JlbmRlcmVyLnByb3RvdHlwZS5wYXJhZ3JhcGg9ZnVuY3Rpb24o
246
+ dGV4dCl7cmV0dXJuIjxwPiIrdGV4dCsiPC9wPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLnRhYmxl
247
+ PWZ1bmN0aW9uKGhlYWRlcixib2R5KXtyZXR1cm4iPHRhYmxlPlxuIisiPHRoZWFkPlxuIitoZWFk
248
+ ZXIrIjwvdGhlYWQ+XG4iKyI8dGJvZHk+XG4iK2JvZHkrIjwvdGJvZHk+XG4iKyI8L3RhYmxlPlxu
249
+ In07UmVuZGVyZXIucHJvdG90eXBlLnRhYmxlcm93PWZ1bmN0aW9uKGNvbnRlbnQpe3JldHVybiI8
250
+ dHI+XG4iK2NvbnRlbnQrIjwvdHI+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUudGFibGVjZWxsPWZ1
251
+ bmN0aW9uKGNvbnRlbnQsZmxhZ3Mpe3ZhciB0eXBlPWZsYWdzLmhlYWRlcj8idGgiOiJ0ZCI7dmFy
252
+ IHRhZz1mbGFncy5hbGlnbj8iPCIrdHlwZSsnIHN0eWxlPSJ0ZXh0LWFsaWduOicrZmxhZ3MuYWxp
253
+ Z24rJyI+JzoiPCIrdHlwZSsiPiI7cmV0dXJuIHRhZytjb250ZW50KyI8LyIrdHlwZSsiPlxuIn07
254
+ UmVuZGVyZXIucHJvdG90eXBlLnN0cm9uZz1mdW5jdGlvbih0ZXh0KXtyZXR1cm4iPHN0cm9uZz4i
255
+ K3RleHQrIjwvc3Ryb25nPiJ9O1JlbmRlcmVyLnByb3RvdHlwZS5lbT1mdW5jdGlvbih0ZXh0KXty
256
+ ZXR1cm4iPGVtPiIrdGV4dCsiPC9lbT4ifTtSZW5kZXJlci5wcm90b3R5cGUuY29kZXNwYW49ZnVu
257
+ Y3Rpb24odGV4dCl7cmV0dXJuIjxjb2RlPiIrdGV4dCsiPC9jb2RlPiJ9O1JlbmRlcmVyLnByb3Rv
258
+ dHlwZS5icj1mdW5jdGlvbigpe3JldHVybiI8YnI+In07UmVuZGVyZXIucHJvdG90eXBlLmRlbD1m
259
+ dW5jdGlvbih0ZXh0KXtyZXR1cm4iPGRlbD4iK3RleHQrIjwvZGVsPiJ9O1JlbmRlcmVyLnByb3Rv
260
+ dHlwZS5saW5rPWZ1bmN0aW9uKGhyZWYsdGl0bGUsdGV4dCl7dmFyIG91dD0nPGEgaHJlZj0iJyto
261
+ cmVmKyciJztpZih0aXRsZSl7b3V0Kz0nIHRpdGxlPSInK3RpdGxlKyciJ31vdXQrPSI+Iit0ZXh0
262
+ KyI8L2E+IjtyZXR1cm4gb3V0fTtSZW5kZXJlci5wcm90b3R5cGUuaW1hZ2U9ZnVuY3Rpb24oaHJl
263
+ Zix0aXRsZSx0ZXh0KXt2YXIgb3V0PSc8aW1nIHNyYz0iJytocmVmKyciIGFsdD0iJyt0ZXh0Kyci
264
+ JztpZih0aXRsZSl7b3V0Kz0nIHRpdGxlPSInK3RpdGxlKyciJ31vdXQrPSI+IjtyZXR1cm4gb3V0
265
+ fTtmdW5jdGlvbiBQYXJzZXIob3B0aW9ucyl7dGhpcy50b2tlbnM9W107dGhpcy50b2tlbj1udWxs
266
+ O3RoaXMub3B0aW9ucz1vcHRpb25zfHxtYXJrZWQuZGVmYXVsdHM7dGhpcy5vcHRpb25zLnJlbmRl
267
+ cmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcnx8bmV3IFJlbmRlcmVyO3RoaXMucmVuZGVyZXI9dGhp
268
+ cy5vcHRpb25zLnJlbmRlcmVyfVBhcnNlci5wYXJzZT1mdW5jdGlvbihzcmMsb3B0aW9ucyxyZW5k
269
+ ZXJlcil7dmFyIHBhcnNlcj1uZXcgUGFyc2VyKG9wdGlvbnMscmVuZGVyZXIpO3JldHVybiBwYXJz
270
+ ZXIucGFyc2Uoc3JjKX07UGFyc2VyLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihzcmMpe3RoaXMu
271
+ aW5saW5lPW5ldyBJbmxpbmVMZXhlcihzcmMubGlua3MsdGhpcy5vcHRpb25zLHRoaXMucmVuZGVy
272
+ ZXIpO3RoaXMudG9rZW5zPXNyYy5yZXZlcnNlKCk7dmFyIG91dD0iIjt3aGlsZSh0aGlzLm5leHQo
273
+ KSl7b3V0Kz10aGlzLnRvaygpfXJldHVybiBvdXR9O1BhcnNlci5wcm90b3R5cGUubmV4dD1mdW5j
274
+ dGlvbigpe3JldHVybiB0aGlzLnRva2VuPXRoaXMudG9rZW5zLnBvcCgpfTtQYXJzZXIucHJvdG90
275
+ eXBlLnBlZWs9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b2tlbnNbdGhpcy50b2tlbnMubGVuZ3Ro
276
+ LTFdfHwwfTtQYXJzZXIucHJvdG90eXBlLnBhcnNlVGV4dD1mdW5jdGlvbigpe3ZhciBib2R5PXRo
277
+ aXMudG9rZW4udGV4dDt3aGlsZSh0aGlzLnBlZWsoKS50eXBlPT09InRleHQiKXtib2R5Kz0iXG4i
278
+ K3RoaXMubmV4dCgpLnRleHR9cmV0dXJuIHRoaXMuaW5saW5lLm91dHB1dChib2R5KX07UGFyc2Vy
279
+ LnByb3RvdHlwZS50b2s9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy50b2tlbi50eXBlKXtjYXNlInNw
280
+ YWNlIjp7cmV0dXJuIiJ9Y2FzZSJociI6e3JldHVybiB0aGlzLnJlbmRlcmVyLmhyKCl9Y2FzZSJo
281
+ ZWFkaW5nIjp7cmV0dXJuIHRoaXMucmVuZGVyZXIuaGVhZGluZyh0aGlzLmlubGluZS5vdXRwdXQo
282
+ dGhpcy50b2tlbi50ZXh0KSx0aGlzLnRva2VuLmRlcHRoLHRoaXMudG9rZW4udGV4dCx0aGlzLm9w
283
+ dGlvbnMpfWNhc2UiY29kZSI6e3JldHVybiB0aGlzLnJlbmRlcmVyLmNvZGUodGhpcy50b2tlbi50
284
+ ZXh0LHRoaXMudG9rZW4ubGFuZyx0aGlzLnRva2VuLmVzY2FwZWQsdGhpcy5vcHRpb25zKX1jYXNl
285
+ InRhYmxlIjp7dmFyIGhlYWRlcj0iIixib2R5PSIiLGkscm93LGNlbGwsZmxhZ3MsajtjZWxsPSIi
286
+ O2ZvcihpPTA7aTx0aGlzLnRva2VuLmhlYWRlci5sZW5ndGg7aSsrKXtmbGFncz17aGVhZGVyOnRy
287
+ dWUsYWxpZ246dGhpcy50b2tlbi5hbGlnbltpXX07Y2VsbCs9dGhpcy5yZW5kZXJlci50YWJsZWNl
288
+ bGwodGhpcy5pbmxpbmUub3V0cHV0KHRoaXMudG9rZW4uaGVhZGVyW2ldKSx7aGVhZGVyOnRydWUs
289
+ YWxpZ246dGhpcy50b2tlbi5hbGlnbltpXX0pfWhlYWRlcis9dGhpcy5yZW5kZXJlci50YWJsZXJv
290
+ dyhjZWxsKTtmb3IoaT0wO2k8dGhpcy50b2tlbi5jZWxscy5sZW5ndGg7aSsrKXtyb3c9dGhpcy50
291
+ b2tlbi5jZWxsc1tpXTtjZWxsPSIiO2ZvcihqPTA7ajxyb3cubGVuZ3RoO2orKyl7Y2VsbCs9dGhp
292
+ cy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5pbmxpbmUub3V0cHV0KHJvd1tqXSkse2hlYWRlcjpm
293
+ YWxzZSxhbGlnbjp0aGlzLnRva2VuLmFsaWduW2pdfSl9Ym9keSs9dGhpcy5yZW5kZXJlci50YWJs
294
+ ZXJvdyhjZWxsKX1yZXR1cm4gdGhpcy5yZW5kZXJlci50YWJsZShoZWFkZXIsYm9keSl9Y2FzZSJi
295
+ bG9ja3F1b3RlX3N0YXJ0Ijp7dmFyIGJvZHk9IiI7d2hpbGUodGhpcy5uZXh0KCkudHlwZSE9PSJi
296
+ bG9ja3F1b3RlX2VuZCIpe2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIuYmxv
297
+ Y2txdW90ZShib2R5KX1jYXNlImxpc3Rfc3RhcnQiOnt2YXIgYm9keT0iIixvcmRlcmVkPXRoaXMu
298
+ dG9rZW4ub3JkZXJlZDt3aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxpc3RfZW5kIil7Ym9keSs9
299
+ dGhpcy50b2soKX1yZXR1cm4gdGhpcy5yZW5kZXJlci5saXN0KGJvZHksb3JkZXJlZCl9Y2FzZSJs
300
+ aXN0X2l0ZW1fc3RhcnQiOnt2YXIgYm9keT0iIjt3aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxp
301
+ c3RfaXRlbV9lbmQiKXtib2R5Kz10aGlzLnRva2VuLnR5cGU9PT0idGV4dCI/dGhpcy5wYXJzZVRl
302
+ eHQoKTp0aGlzLnRvaygpfXJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGJvZHkpfWNhc2Ui
303
+ bG9vc2VfaXRlbV9zdGFydCI6e3ZhciBib2R5PSIiO3doaWxlKHRoaXMubmV4dCgpLnR5cGUhPT0i
304
+ bGlzdF9pdGVtX2VuZCIpe2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIubGlz
305
+ dGl0ZW0oYm9keSl9Y2FzZSJodG1sIjp7dmFyIGh0bWw9IXRoaXMudG9rZW4ucHJlJiYhdGhpcy5v
306
+ cHRpb25zLnBlZGFudGljP3RoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpOnRoaXMu
307
+ dG9rZW4udGV4dDtyZXR1cm4gdGhpcy5yZW5kZXJlci5odG1sKGh0bWwpfWNhc2UicGFyYWdyYXBo
308
+ Ijp7cmV0dXJuIHRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRoaXMuaW5saW5lLm91dHB1dCh0aGlz
309
+ LnRva2VuLnRleHQpKX1jYXNlInRleHQiOntyZXR1cm4gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgo
310
+ dGhpcy5wYXJzZVRleHQoKSl9fX07ZnVuY3Rpb24gZXNjYXBlKGh0bWwsZW5jb2RlKXtyZXR1cm4g
311
+ aHRtbC5yZXBsYWNlKCFlbmNvZGU/LyYoPyEjP1x3KzspL2c6LyYvZywiJmFtcDsiKS5yZXBsYWNl
312
+ KC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIp
313
+ LnJlcGxhY2UoLycvZywiJiMzOTsiKX1mdW5jdGlvbiByZXBsYWNlKHJlZ2V4LG9wdCl7cmVnZXg9
314
+ cmVnZXguc291cmNlO29wdD1vcHR8fCIiO3JldHVybiBmdW5jdGlvbiBzZWxmKG5hbWUsdmFsKXtp
315
+ ZighbmFtZSlyZXR1cm4gbmV3IFJlZ0V4cChyZWdleCxvcHQpO3ZhbD12YWwuc291cmNlfHx2YWw7
316
+ dmFsPXZhbC5yZXBsYWNlKC8oXnxbXlxbXSlcXi9nLCIkMSIpO3JlZ2V4PXJlZ2V4LnJlcGxhY2Uo
317
+ bmFtZSx2YWwpO3JldHVybiBzZWxmfX1mdW5jdGlvbiBub29wKCl7fW5vb3AuZXhlYz1ub29wO2Z1
318
+ bmN0aW9uIG1lcmdlKG9iail7dmFyIGk9MSx0YXJnZXQsa2V5O2Zvcig7aTxhcmd1bWVudHMubGVu
319
+ Z3RoO2krKyl7dGFyZ2V0PWFyZ3VtZW50c1tpXTtmb3Ioa2V5IGluIHRhcmdldCl7aWYoT2JqZWN0
320
+ LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCxrZXkpKXtvYmpba2V5XT10YXJn
321
+ ZXRba2V5XX19fXJldHVybiBvYmp9ZnVuY3Rpb24gbWFya2VkKHNyYyxvcHQsY2FsbGJhY2spe2lm
322
+ KGNhbGxiYWNrfHx0eXBlb2Ygb3B0PT09ImZ1bmN0aW9uIil7aWYoIWNhbGxiYWNrKXtjYWxsYmFj
323
+ az1vcHQ7b3B0PW51bGx9b3B0PW1lcmdlKHt9LG1hcmtlZC5kZWZhdWx0cyxvcHR8fHt9KTt2YXIg
324
+ aGlnaGxpZ2h0PW9wdC5oaWdobGlnaHQsdG9rZW5zLHBlbmRpbmcsaT0wO3RyeXt0b2tlbnM9TGV4
325
+ ZXIubGV4KHNyYyxvcHQpfWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1wZW5kaW5nPXRva2Vu
326
+ cy5sZW5ndGg7dmFyIGRvbmU9ZnVuY3Rpb24oKXt2YXIgb3V0LGVycjt0cnl7b3V0PVBhcnNlci5w
327
+ YXJzZSh0b2tlbnMsb3B0KX1jYXRjaChlKXtlcnI9ZX1vcHQuaGlnaGxpZ2h0PWhpZ2hsaWdodDty
328
+ ZXR1cm4gZXJyP2NhbGxiYWNrKGVycik6Y2FsbGJhY2sobnVsbCxvdXQpfTtpZighaGlnaGxpZ2h0
329
+ fHxoaWdobGlnaHQubGVuZ3RoPDMpe3JldHVybiBkb25lKCl9ZGVsZXRlIG9wdC5oaWdobGlnaHQ7
330
+ aWYoIXBlbmRpbmcpcmV0dXJuIGRvbmUoKTtmb3IoO2k8dG9rZW5zLmxlbmd0aDtpKyspeyhmdW5j
331
+ dGlvbih0b2tlbil7aWYodG9rZW4udHlwZSE9PSJjb2RlIil7cmV0dXJuLS1wZW5kaW5nfHxkb25l
332
+ KCl9cmV0dXJuIGhpZ2hsaWdodCh0b2tlbi50ZXh0LHRva2VuLmxhbmcsZnVuY3Rpb24oZXJyLGNv
333
+ ZGUpe2lmKGNvZGU9PW51bGx8fGNvZGU9PT10b2tlbi50ZXh0KXtyZXR1cm4tLXBlbmRpbmd8fGRv
334
+ bmUoKX10b2tlbi50ZXh0PWNvZGU7dG9rZW4uZXNjYXBlZD10cnVlOy0tcGVuZGluZ3x8ZG9uZSgp
335
+ fSl9KSh0b2tlbnNbaV0pfXJldHVybn10cnl7aWYob3B0KW9wdD1tZXJnZSh7fSxtYXJrZWQuZGVm
336
+ YXVsdHMsb3B0KTtyZXR1cm4gUGFyc2VyLnBhcnNlKExleGVyLmxleChzcmMsb3B0KSxvcHQpfWNh
337
+ dGNoKGUpe2UubWVzc2FnZSs9IlxuUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHVi
338
+ LmNvbS9jaGpqL21hcmtlZC4iO2lmKChvcHR8fG1hcmtlZC5kZWZhdWx0cykuc2lsZW50KXtyZXR1
339
+ cm4iPHA+QW4gZXJyb3Igb2NjdXJlZDo8L3A+PHByZT4iK2VzY2FwZShlLm1lc3NhZ2UrIiIsdHJ1
340
+ ZSkrIjwvcHJlPiJ9dGhyb3cgZX19bWFya2VkLm9wdGlvbnM9bWFya2VkLnNldE9wdGlvbnM9ZnVu
341
+ Y3Rpb24ob3B0KXttZXJnZShtYXJrZWQuZGVmYXVsdHMsb3B0KTtyZXR1cm4gbWFya2VkfTttYXJr
342
+ ZWQuZGVmYXVsdHM9e2dmbTp0cnVlLHRhYmxlczp0cnVlLGJyZWFrczpmYWxzZSxwZWRhbnRpYzpm
343
+ YWxzZSxzYW5pdGl6ZTpmYWxzZSxzbWFydExpc3RzOmZhbHNlLHNpbGVudDpmYWxzZSxoaWdobGln
344
+ aHQ6bnVsbCxsYW5nUHJlZml4OiJsYW5nLSIsc21hcnR5cGFudHM6ZmFsc2UsaGVhZGVyUHJlZml4
345
+ OiIiLHJlbmRlcmVyOm5ldyBSZW5kZXJlcn07bWFya2VkLlBhcnNlcj1QYXJzZXI7bWFya2VkLnBh
346
+ cnNlcj1QYXJzZXIucGFyc2U7bWFya2VkLlJlbmRlcmVyPVJlbmRlcmVyO21hcmtlZC5MZXhlcj1M
347
+ ZXhlcjttYXJrZWQubGV4ZXI9TGV4ZXIubGV4O21hcmtlZC5JbmxpbmVMZXhlcj1JbmxpbmVMZXhl
348
+ cjttYXJrZWQuaW5saW5lTGV4ZXI9SW5saW5lTGV4ZXIub3V0cHV0O21hcmtlZC5wYXJzZT1tYXJr
349
+ ZWQ7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0Iil7bW9kdWxlLmV4cG9ydHM9bWFya2VkfWVs
350
+ c2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpe2RlZmluZShmdW5j
351
+ dGlvbigpe3JldHVybiBtYXJrZWR9KX1lbHNle3RoaXMubWFya2VkPW1hcmtlZH19KS5jYWxsKGZ1
352
+ bmN0aW9uKCl7cmV0dXJuIHRoaXN8fCh0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCI/d2luZG93
353
+ Omdsb2JhbCl9KCkpOw==