natty-ui 0.5.3 → 0.7.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.
- checksums.yaml +4 -4
- data/.yardopts +9 -0
- data/README.md +3 -5
- data/examples/attributes.rb +161 -0
- data/examples/basic.rb +8 -9
- data/examples/illustration.png +0 -0
- data/examples/list_in_columns.rb +43 -0
- data/examples/progress.rb +45 -61
- data/examples/query.rb +34 -23
- data/lib/natty-ui/ansi.rb +69 -60
- data/lib/natty-ui/ansi_wrapper.rb +68 -32
- data/lib/natty-ui/features.rb +36 -0
- data/lib/natty-ui/version.rb +1 -1
- data/lib/natty-ui/wrapper/ask.rb +4 -4
- data/lib/natty-ui/wrapper/element.rb +6 -3
- data/lib/natty-ui/wrapper/list_in_columns.rb +81 -0
- data/lib/natty-ui/wrapper/mixins.rb +3 -3
- data/lib/natty-ui/wrapper/progress.rb +13 -8
- data/lib/natty-ui/wrapper/query.rb +7 -7
- data/lib/natty-ui/wrapper/request.rb +43 -0
- data/lib/natty-ui/wrapper/section.rb +4 -4
- data/lib/natty-ui/wrapper/task.rb +3 -5
- data/lib/natty-ui/wrapper.rb +12 -7
- data/lib/natty-ui.rb +22 -18
- data/lib/natty_ui.rb +3 -0
- metadata +11 -6
- data/examples/colors.rb +0 -7
- data/examples/illustration.svg +0 -1
- data/lib/natty-ui/wrapper/features.rb +0 -20
@@ -28,7 +28,7 @@ module NattyUI
|
|
28
28
|
#
|
29
29
|
# @param question [#to_s] Question to display
|
30
30
|
# @param choices [#to_s] choices selectable via index (0..9)
|
31
|
-
# @param result [Symbol] defines how the result
|
31
|
+
# @param result [Symbol] defines how the result will be returned
|
32
32
|
# @param kw_choices [{Char => #to_s}] choices selectable with given char
|
33
33
|
# @return [Char] when `result` is configured as `:char`
|
34
34
|
# @return [#to_s] when `result` is configured as `:choice`
|
@@ -47,7 +47,7 @@ module NattyUI
|
|
47
47
|
class Query < Element
|
48
48
|
protected
|
49
49
|
|
50
|
-
def _call(question, choices, kw_choices,
|
50
|
+
def _call(question, choices, kw_choices, result_type)
|
51
51
|
choices = grab(choices, kw_choices)
|
52
52
|
return if choices.empty?
|
53
53
|
wrapper.temporary do
|
@@ -58,17 +58,17 @@ module NattyUI
|
|
58
58
|
title: question,
|
59
59
|
symbol: :query
|
60
60
|
)
|
61
|
-
read(choices,
|
61
|
+
read(choices, result_type)
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
def read(choices,
|
65
|
+
def read(choices, result_type)
|
66
66
|
while true
|
67
67
|
char = NattyUI.in_stream.getch
|
68
68
|
return if "\3\4\e".include?(char)
|
69
69
|
next unless choices.key?(char)
|
70
|
-
return char if
|
71
|
-
return choices[char] if
|
70
|
+
return char if result_type == :char
|
71
|
+
return choices[char] if result_type == :choice
|
72
72
|
return char, choices[char]
|
73
73
|
end
|
74
74
|
end
|
@@ -80,7 +80,7 @@ module NattyUI
|
|
80
80
|
.to_h
|
81
81
|
.merge!(kw_choices)
|
82
82
|
.transform_keys! { |k| [k.to_s[0], ' '].max }
|
83
|
-
.transform_values! { |v| v.to_s.tr("\r\n", ' ') }
|
83
|
+
.transform_values! { |v| v.to_s.tr("\r\n\t", ' ') }
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'element'
|
4
|
+
|
5
|
+
module NattyUI
|
6
|
+
module Features
|
7
|
+
# Request user input.
|
8
|
+
#
|
9
|
+
# @param question [#to_s] Question to display
|
10
|
+
# @param password [Boolean] whether to hide the input
|
11
|
+
# @return [String] the user input
|
12
|
+
# @return [nil] when input was aborted with `^C` or `^D`
|
13
|
+
def request(question, password: false)
|
14
|
+
_element(:Request, question, password)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Wrapper
|
19
|
+
#
|
20
|
+
# An {Element} to request user input.
|
21
|
+
#
|
22
|
+
# @see Features#request
|
23
|
+
class Request < Element
|
24
|
+
protected
|
25
|
+
|
26
|
+
def _call(question, password)
|
27
|
+
return read_password(question) if password
|
28
|
+
NattyUI.readline(prompt(question), stream: wrapper.stream)
|
29
|
+
ensure
|
30
|
+
finish
|
31
|
+
end
|
32
|
+
|
33
|
+
def read_password(question)
|
34
|
+
(wrapper.stream << prompt(question)).flush
|
35
|
+
NattyUI.in_stream.getpass
|
36
|
+
rescue Interrupt
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def prompt(question) = "#{prefix}▶︎ #{question}: "
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -56,7 +56,7 @@ module NattyUI
|
|
56
56
|
*args,
|
57
57
|
max_width: max_width,
|
58
58
|
prefix: prefix ? "#{@prefix}#{prefix}" : @prefix,
|
59
|
-
suffix: suffix ? "#{
|
59
|
+
suffix: suffix ? "#{suffix}#{@suffix}" : @suffix
|
60
60
|
)
|
61
61
|
self
|
62
62
|
end
|
@@ -68,7 +68,7 @@ module NattyUI
|
|
68
68
|
# @return [Section] itself
|
69
69
|
def space(lines = 1)
|
70
70
|
@parent.puts(
|
71
|
-
"\n" *
|
71
|
+
"\n" * [lines.to_i, 1].max,
|
72
72
|
prefix: @prefix,
|
73
73
|
suffix: @suffix
|
74
74
|
)
|
@@ -92,8 +92,8 @@ module NattyUI
|
|
92
92
|
|
93
93
|
protected
|
94
94
|
|
95
|
-
def initialize(parent, prefix: nil, suffix: nil, **
|
96
|
-
super(parent)
|
95
|
+
def initialize(parent, prefix: nil, suffix: nil, **opts)
|
96
|
+
super(parent, **opts)
|
97
97
|
@prefix = prefix
|
98
98
|
@suffix = suffix
|
99
99
|
end
|
@@ -30,16 +30,14 @@ module NattyUI
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def finish
|
33
|
-
|
34
|
-
|
35
|
-
@temp.call
|
36
|
-
end
|
33
|
+
return @parent.failed(*@final_text) if failed?
|
34
|
+
@temp.call
|
37
35
|
_section(
|
38
36
|
@parent,
|
39
37
|
:Message,
|
40
38
|
@final_text,
|
41
39
|
title: @final_text.shift,
|
42
|
-
symbol: @status
|
40
|
+
symbol: @status = :completed
|
43
41
|
)
|
44
42
|
end
|
45
43
|
end
|
data/lib/natty-ui/wrapper.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'io/console'
|
3
4
|
require_relative 'wrapper/ask'
|
4
5
|
require_relative 'wrapper/framed'
|
5
6
|
require_relative 'wrapper/heading'
|
7
|
+
require_relative 'wrapper/list_in_columns'
|
6
8
|
require_relative 'wrapper/message'
|
7
9
|
require_relative 'wrapper/progress'
|
8
10
|
require_relative 'wrapper/query'
|
11
|
+
require_relative 'wrapper/request'
|
9
12
|
require_relative 'wrapper/section'
|
10
13
|
require_relative 'wrapper/task'
|
11
14
|
|
@@ -74,9 +77,8 @@ module NattyUI
|
|
74
77
|
# @return [Wrapper] itself
|
75
78
|
def space(lines = 1)
|
76
79
|
lines = [lines.to_i, 1].max
|
77
|
-
@stream << ("\n" * lines)
|
78
80
|
@lines_written += lines
|
79
|
-
@stream.flush
|
81
|
+
(@stream << ("\n" * lines)).flush
|
80
82
|
self
|
81
83
|
end
|
82
84
|
|
@@ -136,11 +138,6 @@ module NattyUI
|
|
136
138
|
|
137
139
|
protected
|
138
140
|
|
139
|
-
def embellish(obj)
|
140
|
-
obj = NattyUI.plain(obj)
|
141
|
-
obj.empty? ? nil : obj
|
142
|
-
end
|
143
|
-
|
144
141
|
def temp_func
|
145
142
|
lambda do
|
146
143
|
@stream.flush
|
@@ -156,10 +153,18 @@ module NattyUI
|
|
156
153
|
@ws = false
|
157
154
|
end
|
158
155
|
|
156
|
+
def embellish(obj) = (obj = NattyUI.plain(obj)).empty? ? nil : obj
|
157
|
+
|
159
158
|
def wrapper = self
|
160
159
|
def prefix = nil
|
161
160
|
alias suffix prefix
|
162
161
|
|
162
|
+
def prefix_width = 0
|
163
|
+
alias suffix_width prefix_width
|
164
|
+
alias width prefix_width
|
165
|
+
|
166
|
+
alias available_width screen_columns
|
167
|
+
|
163
168
|
private_class_method :new
|
164
169
|
end
|
165
170
|
end
|
data/lib/natty-ui.rb
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'readline'
|
4
4
|
unless defined?(Reline)
|
5
|
-
#
|
5
|
+
# load the Reline::Unicode part only
|
6
6
|
# @!visibility private
|
7
7
|
module Reline
|
8
|
+
# @!visibility private
|
8
9
|
def self.ambiguous_width = 1
|
9
10
|
end
|
10
11
|
require 'reline/unicode'
|
@@ -24,7 +25,7 @@ module NattyUI
|
|
24
25
|
class << self
|
25
26
|
# @see .valid_in?
|
26
27
|
# @return [IO] IO stream used to read input
|
27
|
-
# @raise TypeError when a non-readable stream will be assigned
|
28
|
+
# @raise [TypeError] when a non-readable stream will be assigned
|
28
29
|
attr_reader :in_stream
|
29
30
|
|
30
31
|
# @param [IO] stream to read input
|
@@ -43,7 +44,7 @@ module NattyUI
|
|
43
44
|
# @param [Boolean, :auto] ansi whether ANSI should be supported
|
44
45
|
# or automatically selected
|
45
46
|
# @return [Wrapper] wrapper for the given `stream`
|
46
|
-
# @raise TypeError when `stream` is not a writable stream
|
47
|
+
# @raise [TypeError] when `stream` is not a writable stream
|
47
48
|
def new(stream, ansi: :auto)
|
48
49
|
unless valid_out?(stream)
|
49
50
|
raise(TypeError, "writable IO required - #{stream.inspect}")
|
@@ -76,10 +77,9 @@ module NattyUI
|
|
76
77
|
# Translate embedded attribute descriptions into ANSI control codes.
|
77
78
|
#
|
78
79
|
# @param [#to_s] str string to edit
|
79
|
-
# @return
|
80
|
+
# @return [String] edited string
|
80
81
|
def embellish(str)
|
81
|
-
str = str.to_s
|
82
|
-
return +'' if str.empty?
|
82
|
+
return +'' if (str = str.to_s).empty?
|
83
83
|
reset = false
|
84
84
|
ret =
|
85
85
|
str.gsub(/(\[\[((?~\]\]))\]\])/) do
|
@@ -104,11 +104,8 @@ module NattyUI
|
|
104
104
|
.to_s
|
105
105
|
.gsub(/(\[\[((?~\]\]))\]\])/) do
|
106
106
|
match = Regexp.last_match[2]
|
107
|
-
|
108
|
-
|
109
|
-
next ansi ? nil : "[[#{match}]]"
|
110
|
-
end
|
111
|
-
match.empty? ? nil : "[[#{match}]]"
|
107
|
+
next match.empty? ? nil : "[[#{match}]]" if match.delete_prefix!('/')
|
108
|
+
Ansi.try_convert(match) ? nil : "[[#{match}]]"
|
112
109
|
end
|
113
110
|
end
|
114
111
|
|
@@ -118,8 +115,7 @@ module NattyUI
|
|
118
115
|
# @param [#to_s] str string to calculate
|
119
116
|
# @return [Integer] the display size
|
120
117
|
def display_width(str)
|
121
|
-
str = str.to_s
|
122
|
-
str.empty? ? 0 : Reline::Unicode.calculate_width(str)
|
118
|
+
(str = str.to_s).empty? ? 0 : Reline::Unicode.calculate_width(str)
|
123
119
|
end
|
124
120
|
|
125
121
|
# Convert given arguments into strings and yield each line.
|
@@ -136,12 +132,11 @@ module NattyUI
|
|
136
132
|
# @return [Enumerator] line enumerator
|
137
133
|
def each_line(*strs, max_width: nil, &block)
|
138
134
|
return to_enum(__method__, *strs, max_width: max_width) unless block
|
139
|
-
|
135
|
+
if max_width.nil?
|
140
136
|
strs.each { |str| str.to_s.each_line(chomp: true, &block) }
|
141
137
|
return nil
|
142
138
|
end
|
143
|
-
max_width = max_width.to_i
|
144
|
-
return if max_width <= 0
|
139
|
+
return if (max_width = max_width.to_i) <= 0
|
145
140
|
strs.each do |str|
|
146
141
|
str
|
147
142
|
.to_s
|
@@ -156,19 +151,28 @@ module NattyUI
|
|
156
151
|
|
157
152
|
# Read user input line from {.in_stream}.
|
158
153
|
#
|
154
|
+
# This method uses Ruby's Readline implementation (default gem). See there
|
155
|
+
# for more information.
|
156
|
+
#
|
159
157
|
# @see .valid_out?
|
160
158
|
#
|
161
159
|
# @param [#to_s] prompt input prompt
|
160
|
+
# @param [false, nil, #call] completion disable autocompletion, use default
|
161
|
+
# autocompletion or use given completion proc
|
162
162
|
# @param [IO] stream writeable IO used to display output
|
163
163
|
# @return [String] user input line
|
164
|
-
# @return [nil] when user
|
165
|
-
def readline(prompt = nil, stream: StdOut.stream)
|
164
|
+
# @return [nil] when user interrupted input with `^C` or `^D`
|
165
|
+
def readline(prompt = nil, completion: false, stream: StdOut.stream)
|
166
|
+
cp = Readline.completion_proc
|
167
|
+
Readline.completion_proc = completion == false ? ->(*_) {} : completion
|
166
168
|
Readline.output = stream
|
167
169
|
Readline.input = @in_stream
|
168
170
|
Readline.readline(prompt.to_s)
|
169
171
|
rescue Interrupt
|
170
172
|
stream.puts
|
171
173
|
nil
|
174
|
+
ensure
|
175
|
+
Readline.completion_proc = cp
|
172
176
|
end
|
173
177
|
|
174
178
|
private
|
data/lib/natty_ui.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: natty-ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Blumtritt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
This is the beautiful, nice, nifty, fancy, neat, pretty, cool, lovely,
|
@@ -23,29 +23,34 @@ extra_rdoc_files:
|
|
23
23
|
- README.md
|
24
24
|
- LICENSE
|
25
25
|
files:
|
26
|
+
- ".yardopts"
|
26
27
|
- LICENSE
|
27
28
|
- README.md
|
29
|
+
- examples/attributes.rb
|
28
30
|
- examples/basic.rb
|
29
|
-
- examples/
|
30
|
-
- examples/
|
31
|
+
- examples/illustration.png
|
32
|
+
- examples/list_in_columns.rb
|
31
33
|
- examples/progress.rb
|
32
34
|
- examples/query.rb
|
33
35
|
- lib/natty-ui.rb
|
34
36
|
- lib/natty-ui/ansi.rb
|
35
37
|
- lib/natty-ui/ansi_wrapper.rb
|
38
|
+
- lib/natty-ui/features.rb
|
36
39
|
- lib/natty-ui/version.rb
|
37
40
|
- lib/natty-ui/wrapper.rb
|
38
41
|
- lib/natty-ui/wrapper/ask.rb
|
39
42
|
- lib/natty-ui/wrapper/element.rb
|
40
|
-
- lib/natty-ui/wrapper/features.rb
|
41
43
|
- lib/natty-ui/wrapper/framed.rb
|
42
44
|
- lib/natty-ui/wrapper/heading.rb
|
45
|
+
- lib/natty-ui/wrapper/list_in_columns.rb
|
43
46
|
- lib/natty-ui/wrapper/message.rb
|
44
47
|
- lib/natty-ui/wrapper/mixins.rb
|
45
48
|
- lib/natty-ui/wrapper/progress.rb
|
46
49
|
- lib/natty-ui/wrapper/query.rb
|
50
|
+
- lib/natty-ui/wrapper/request.rb
|
47
51
|
- lib/natty-ui/wrapper/section.rb
|
48
52
|
- lib/natty-ui/wrapper/task.rb
|
53
|
+
- lib/natty_ui.rb
|
49
54
|
homepage: https://github.com/mblumtritt/natty-ui
|
50
55
|
licenses:
|
51
56
|
- BSD-3-Clause
|
@@ -69,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
69
74
|
- !ruby/object:Gem::Version
|
70
75
|
version: '0'
|
71
76
|
requirements: []
|
72
|
-
rubygems_version: 3.4.
|
77
|
+
rubygems_version: 3.4.22
|
73
78
|
signing_key:
|
74
79
|
specification_version: 4
|
75
80
|
summary: This is the beautiful, nice, nifty, fancy, neat, pretty, cool, lovely, natty
|
data/examples/colors.rb
DELETED
data/examples/illustration.svg
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 688"><style>text{dominant-baseline:text-before-edge;white-space:pre;font:13px Courier,monospace;fill:#bbb}.u{text-decoration:underline}.c1{fill:#0080d5}.f{fill:#fff}.c2{fill:#a5faff}.c3{fill:#ff50a5}.c4{fill:#50d0ff}.c5{fill:#2ad5d5}.c6{fill:#fffa50}.c7{fill:#ff5050}.c8{fill:#50ff50}.c9{fill:#ffa5ff}.ca{fill:#ffff50}.cb{fill:#55aad5}.cc{fill:#d5802a}</style><rect width="100%" height="100%" style="fill:#000;shape-rendering:crispEdges"/><text class="c1">═</text><text x="8" class="c1">═</text><text x="16" class="c1">═</text><text x="24" class="c1">═</text><text x="32" class="c1">═</text><text x="40" class="c1">═</text><text x="48" class="c1">═</text><text x="64" class="f">N</text><text x="72" class="f">a</text><text x="80" class="f">t</text><text x="88" class="f">t</text><text x="96" class="f">y</text><text x="104" class="f">U</text><text x="112" class="f">I</text><text x="128" class="f">B</text><text x="136" class="f">a</text><text x="144" class="f">s</text><text x="152" class="f">i</text><text x="160" class="f">c</text><text x="176" class="f">F</text><text x="184" class="f">e</text><text x="192" class="f">a</text><text x="200" class="f">t</text><text x="208" class="f">u</text><text x="216" class="f">r</text><text x="224" class="f">e</text><text x="240" class="f">D</text><text x="248" class="f">e</text><text x="256" class="f">m</text><text x="264" class="f">o</text><text x="280" class="c4">═</text><text x="288" class="c4">═</text><text x="296" class="c4">═</text><text x="304" class="c4">═</text><text x="312" class="c4">═</text><text x="320" class="c4">═</text><text x="328" class="c4">═</text><text y="32">T</text><text x="8" y="32">h</text><text x="16" y="32">i</text><text x="24" y="32">s</text><text x="40" y="32">i</text><text x="48" y="32">s</text><text x="64" y="32">a</text><text x="80" y="32">s</text><text x="88" y="32">h</text><text x="96" y="32">o</text><text x="104" y="32">r</text><text x="112" y="32">t</text><text x="128" y="32">d</text><text x="136" y="32">e</text><text x="144" y="32">m</text><text x="152" y="32">o</text><text x="168" y="32">o</text><text x="176" y="32">f</text><text x="192" y="32">t</text><text x="200" y="32">h</text><text x="208" y="32">e</text><text x="224" y="32">b</text><text x="232" y="32">a</text><text x="240" y="32">s</text><text x="248" y="32">i</text><text x="256" y="32">c</text><text x="272" y="32">f</text><text x="280" y="32">e</text><text x="288" y="32">a</text><text x="296" y="32">t</text><text x="304" y="32">u</text><text x="312" y="32">r</text><text x="320" y="32">e</text><text x="328" y="32">s</text><text x="344" y="32">o</text><text x="352" y="32">f</text><text x="368" y="32" class="c2">N</text><text x="376" y="32" class="c2">a</text><text x="384" y="32" class="c2">t</text><text x="392" y="32" class="c2">t</text><text x="400" y="32" class="c2">y</text><text x="408" y="32" class="c2">U</text><text x="416" y="32" class="c2">I</text><text x="424" y="32">.</text><text y="64" class="c1">━</text><text x="8" y="64" class="c1">━</text><text x="16" y="64" class="c1">━</text><text x="24" y="64" class="c1">━</text><text x="32" y="64" class="c1">━</text><text x="48" y="64" class="f">F</text><text x="56" y="64" class="f">e</text><text x="64" y="64" class="f">a</text><text x="72" y="64" class="f">t</text><text x="80" y="64" class="f">u</text><text x="88" y="64" class="f">r</text><text x="96" y="64" class="f">e</text><text x="104" y="64" class="f">:</text><text x="120" y="64" class="f">A</text><text x="128" y="64" class="f">N</text><text x="136" y="64" class="f">S</text><text x="144" y="64" class="f">I</text><text x="160" y="64" class="f">C</text><text x="168" y="64" class="f">o</text><text x="176" y="64" class="f">l</text><text x="184" y="64" class="f">o</text><text x="192" y="64" class="f">r</text><text x="200" y="64" class="f">s</text><text x="216" y="64" class="f">a</text><text x="224" y="64" class="f">n</text><text x="232" y="64" class="f">d</text><text x="248" y="64" class="f">A</text><text x="256" y="64" class="f">t</text><text x="264" y="64" class="f">t</text><text x="272" y="64" class="f">r</text><text x="280" y="64" class="f">i</text><text x="288" y="64" class="f">b</text><text x="296" y="64" class="f">u</text><text x="304" y="64" class="f">t</text><text x="312" y="64" class="f">e</text><text x="320" y="64" class="f">s</text><text x="336" y="64" class="c4">━</text><text x="344" y="64" class="c4">━</text><text x="352" y="64" class="c4">━</text><text x="360" y="64" class="c4">━</text><text x="368" y="64" class="c4">━</text><text y="96">L</text><text x="8" y="96">i</text><text x="16" y="96">k</text><text x="24" y="96">e</text><text x="40" y="96">y</text><text x="48" y="96">o</text><text x="56" y="96">u</text><text x="72" y="96">m</text><text x="80" y="96">i</text><text x="88" y="96">g</text><text x="96" y="96">h</text><text x="104" y="96">t</text><text x="120" y="96">n</text><text x="128" y="96">o</text><text x="136" y="96">t</text><text x="144" y="96">i</text><text x="152" y="96">c</text><text x="160" y="96">e</text><text x="168" y="96">d</text><text x="184" y="96">y</text><text x="192" y="96">o</text><text x="200" y="96">u</text><text x="216" y="96">c</text><text x="224" y="96">a</text><text x="232" y="96">n</text><text x="248" y="96" class="c5">c</text><text x="256" y="96" class="c5">o</text><text x="264" y="96" class="c5">l</text><text x="272" y="96" class="c5">o</text><text x="280" y="96" class="c5">r</text><text x="296" y="96" class="cc">t</text><text x="304" y="96" class="cc">e</text><text x="312" y="96" class="cc">x</text><text x="320" y="96" class="cc">t</text><text x="336" y="96">f</text><text x="344" y="96">o</text><text x="352" y="96">r</text><text x="368" y="96">t</text><text x="376" y="96">e</text><text x="384" y="96">r</text><text x="392" y="96">m</text><text x="400" y="96">i</text><text x="408" y="96">n</text><text x="416" y="96">a</text><text x="424" y="96">l</text><text x="432" y="96">s</text><text x="448" y="96">s</text><text x="456" y="96">u</text><text x="464" y="96">p</text><text x="472" y="96">p</text><text x="480" y="96">o</text><text x="488" y="96">r</text><text x="496" y="96">t</text><text x="504" y="96">i</text><text x="512" y="96">n</text><text x="520" y="96">g</text><text x="536" y="96">t</text><text x="544" y="96">h</text><text x="552" y="96">i</text><text x="560" y="96">s</text><text y="112">f</text><text x="8" y="112">e</text><text x="16" y="112">a</text><text x="24" y="112">t</text><text x="32" y="112">u</text><text x="40" y="112">r</text><text x="48" y="112">e</text><text x="56" y="112">.</text><text x="72" y="112">Y</text><text x="80" y="112">o</text><text x="88" y="112">u</text><text x="104" y="112">c</text><text x="112" y="112">a</text><text x="120" y="112">n</text><text x="136" y="112">e</text><text x="144" y="112">n</text><text x="152" y="112">f</text><text x="160" y="112">o</text><text x="168" y="112">r</text><text x="176" y="112">e</text><text x="184" y="112">c</text><text x="192" y="112">e</text><text x="208" y="112">t</text><text x="216" y="112">h</text><text x="224" y="112">e</text><text x="240" y="112">n</text><text x="248" y="112">o</text><text x="256" y="112">n</text><text x="264" y="112">-</text><text x="272" y="112">A</text><text x="280" y="112">N</text><text x="288" y="112">S</text><text x="296" y="112">I</text><text x="312" y="112">v</text><text x="320" y="112">e</text><text x="328" y="112">r</text><text x="336" y="112">s</text><text x="344" y="112">i</text><text x="352" y="112">o</text><text x="360" y="112">n</text><text x="376" y="112">b</text><text x="384" y="112">y</text><text x="400" y="112">s</text><text x="408" y="112">e</text><text x="416" y="112">t</text><text x="424" y="112">t</text><text x="432" y="112">i</text><text x="440" y="112">n</text><text x="448" y="112">g</text><text x="464" y="112">t</text><text x="472" y="112">h</text><text x="480" y="112">e</text><text x="496" y="112">e</text><text x="504" y="112">n</text><text x="512" y="112">v</text><text x="520" y="112">i</text><text x="528" y="112">r</text><text x="536" y="112">o</text><text x="544" y="112">n</text><text x="552" y="112">m</text><text x="560" y="112">e</text><text x="568" y="112">n</text><text x="576" y="112">t</text><text y="128">v</text><text x="8" y="128">a</text><text x="16" y="128">r</text><text x="24" y="128">i</text><text x="32" y="128">a</text><text x="40" y="128">b</text><text x="48" y="128">l</text><text x="56" y="128">e</text><text x="72" y="128" class="cb">N</text><text x="80" y="128" class="cb">O</text><text x="88" y="128" class="cb">_</text><text x="96" y="128" class="cb">C</text><text x="104" y="128" class="cb">O</text><text x="112" y="128" class="cb">L</text><text x="120" y="128" class="cb">O</text><text x="128" y="128" class="cb">R</text><text x="144" y="128">t</text><text x="152" y="128">o</text><text x="168" y="128">'</text><text x="176" y="128" class="cb">1</text><text x="184" y="128">'</text><text x="192" y="128">.</text><text x="208" y="128">(</text><text x="216" y="128">s</text><text x="224" y="128">e</text><text x="232" y="128">e</text><text x="248" y="128">a</text><text x="256" y="128">l</text><text x="264" y="128">s</text><text x="272" y="128">o</text><text x="288" y="128" class="u">h</text><text x="296" y="128" class="u">t</text><text x="304" y="128" class="u">t</text><text x="312" y="128" class="u">p</text><text x="320" y="128" class="u">s</text><text x="328" y="128" class="u">:</text><text x="336" y="128" class="u">/</text><text x="344" y="128" class="u">/</text><text x="352" y="128" class="u">n</text><text x="360" y="128" class="u">o</text><text x="368" y="128" class="u">-</text><text x="376" y="128" class="u">c</text><text x="384" y="128" class="u">o</text><text x="392" y="128" class="u">l</text><text x="400" y="128" class="u">o</text><text x="408" y="128" class="u">r</text><text x="416" y="128" class="u">.</text><text x="424" y="128" class="u">o</text><text x="432" y="128" class="u">r</text><text x="440" y="128" class="u">g</text><text x="448" y="128">)</text><text y="160">Y</text><text x="8" y="160">o</text><text x="16" y="160">u</text><text x="32" y="160">c</text><text x="40" y="160">a</text><text x="48" y="160">n</text><text x="64" y="160">n</text><text x="72" y="160">o</text><text x="80" y="160">t</text><text x="96" y="160">o</text><text x="104" y="160">n</text><text x="112" y="160">l</text><text x="120" y="160">y</text><text x="136" y="160">c</text><text x="144" y="160">o</text><text x="152" y="160">l</text><text x="160" y="160">o</text><text x="168" y="160">r</text><text x="184" y="160">y</text><text x="192" y="160">o</text><text x="200" y="160">u</text><text x="208" y="160">r</text><text x="224" y="160">t</text><text x="232" y="160">e</text><text x="240" y="160">x</text><text x="248" y="160">t</text><text x="264" y="160">b</text><text x="272" y="160">u</text><text x="280" y="160">t</text><text x="296" y="160">a</text><text x="304" y="160">l</text><text x="312" y="160">s</text><text x="320" y="160">o</text><text x="336" y="160">m</text><text x="344" y="160">o</text><text x="352" y="160">d</text><text x="360" y="160">i</text><text x="368" y="160">f</text><text x="376" y="160">y</text><text x="384" y="160">,</text><text x="400" y="160" class="u">d</text><text x="408" y="160" class="u">e</text><text x="416" y="160" class="u">c</text><text x="424" y="160" class="u">o</text><text x="432" y="160" class="u">r</text><text x="440" y="160" class="u">a</text><text x="448" y="160" class="u">t</text><text x="456" y="160" class="u">e</text><text x="472" y="160">a</text><text x="480" y="160">n</text><text x="488" y="160">d</text><text x="504" y="160">m</text><text x="512" y="160">a</text><text x="520" y="160">n</text><text x="528" y="160">i</text><text x="536" y="160">p</text><text x="544" y="160">u</text><text x="552" y="160">l</text><text x="560" y="160">a</text><text x="568" y="160">t</text><text x="576" y="160">e</text><text y="176">i</text><text x="8" y="176">t</text><text x="16" y="176">.</text><text x="32" y="176">T</text><text x="40" y="176">h</text><text x="48" y="176">e</text><text x="64" y="176">a</text><text x="72" y="176">t</text><text x="80" y="176">t</text><text x="88" y="176">r</text><text x="96" y="176">i</text><text x="104" y="176">b</text><text x="112" y="176">u</text><text x="120" y="176">t</text><text x="128" y="176">e</text><text x="136" y="176">s</text><text x="152" y="176">a</text><text x="160" y="176">r</text><text x="168" y="176">e</text><text x="184" y="176">d</text><text x="192" y="176">i</text><text x="200" y="176">r</text><text x="208" y="176">e</text><text x="216" y="176">c</text><text x="224" y="176">t</text><text x="240" y="176">e</text><text x="248" y="176">m</text><text x="256" y="176">b</text><text x="264" y="176">e</text><text x="272" y="176">d</text><text x="280" y="176">d</text><text x="288" y="176">e</text><text x="296" y="176">d</text><text x="312" y="176">i</text><text x="320" y="176">n</text><text x="328" y="176">t</text><text x="336" y="176">o</text><text x="352" y="176">t</text><text x="360" y="176">h</text><text x="368" y="176">e</text><text x="384" y="176">t</text><text x="392" y="176">e</text><text x="400" y="176">x</text><text x="408" y="176">t</text><text x="424" y="176">l</text><text x="432" y="176">i</text><text x="440" y="176">k</text><text x="448" y="176">e</text><text x="464" y="176">'</text><text x="472" y="176">[</text><text x="480" y="176">[</text><text x="488" y="176">b</text><text x="496" y="176">o</text><text x="504" y="176">l</text><text x="512" y="176">d</text><text x="528" y="176">r</text><text x="536" y="176">e</text><text x="544" y="176">d</text><text x="552" y="176">]</text><text x="560" y="176">]</text><text x="568" y="176">'</text><text y="192">a</text><text x="8" y="192">n</text><text x="16" y="192">d</text><text x="32" y="192">c</text><text x="40" y="192">a</text><text x="48" y="192">n</text><text x="64" y="192">b</text><text x="72" y="192">e</text><text x="88" y="192">r</text><text x="96" y="192">e</text><text x="104" y="192">s</text><text x="112" y="192">e</text><text x="120" y="192">t</text><text x="128" y="192">t</text><text x="136" y="192">e</text><text x="144" y="192">d</text><text x="160" y="192">w</text><text x="168" y="192">i</text><text x="176" y="192">t</text><text x="184" y="192">h</text><text x="200" y="192">'</text><text x="208" y="192">[</text><text x="216" y="192">[</text><text x="224" y="192">/</text><text x="232" y="192">]</text><text x="240" y="192">]</text><text x="248" y="192">'</text><text x="264" y="192">o</text><text x="272" y="192">r</text><text x="288" y="192">a</text><text x="296" y="192">t</text><text x="312" y="192">t</text><text x="320" y="192">h</text><text x="328" y="192">e</text><text x="344" y="192">l</text><text x="352" y="192">i</text><text x="360" y="192">n</text><text x="368" y="192">e</text><text x="384" y="192">e</text><text x="392" y="192">n</text><text x="400" y="192">d</text><text x="408" y="192">.</text><text y="224" class="c1">━</text><text x="8" y="224" class="c1">━</text><text x="16" y="224" class="c1">━</text><text x="24" y="224" class="c1">━</text><text x="32" y="224" class="c1">━</text><text x="48" y="224" class="f">F</text><text x="56" y="224" class="f">e</text><text x="64" y="224" class="f">a</text><text x="72" y="224" class="f">t</text><text x="80" y="224" class="f">u</text><text x="88" y="224" class="f">r</text><text x="96" y="224" class="f">e</text><text x="104" y="224" class="f">:</text><text x="120" y="224" class="f">S</text><text x="128" y="224" class="f">e</text><text x="136" y="224" class="f">c</text><text x="144" y="224" class="f">t</text><text x="152" y="224" class="f">i</text><text x="160" y="224" class="f">o</text><text x="168" y="224" class="f">n</text><text x="176" y="224" class="f">s</text><text x="192" y="224" class="c4">━</text><text x="200" y="224" class="c4">━</text><text x="208" y="224" class="c4">━</text><text x="216" y="224" class="c4">━</text><text x="224" y="224" class="c4">━</text><text y="256">S</text><text x="8" y="256">e</text><text x="16" y="256">c</text><text x="24" y="256">t</text><text x="32" y="256">i</text><text x="40" y="256">o</text><text x="48" y="256">n</text><text x="56" y="256">s</text><text x="72" y="256">g</text><text x="80" y="256">r</text><text x="88" y="256">o</text><text x="96" y="256">u</text><text x="104" y="256">p</text><text x="120" y="256">t</text><text x="128" y="256">e</text><text x="136" y="256">x</text><text x="144" y="256">t</text><text x="160" y="256">l</text><text x="168" y="256">i</text><text x="176" y="256">n</text><text x="184" y="256">e</text><text x="192" y="256">s</text><text x="208" y="256">t</text><text x="216" y="256">o</text><text x="224" y="256">g</text><text x="232" y="256">e</text><text x="240" y="256">t</text><text x="248" y="256">h</text><text x="256" y="256">e</text><text x="264" y="256">r</text><text x="280" y="256">a</text><text x="288" y="256">n</text><text x="296" y="256">d</text><text x="304" y="256">/</text><text x="312" y="256">o</text><text x="320" y="256">r</text><text x="336" y="256">d</text><text x="344" y="256">e</text><text x="352" y="256">f</text><text x="360" y="256">i</text><text x="368" y="256">n</text><text x="376" y="256">e</text><text x="392" y="256">t</text><text x="400" y="256">h</text><text x="408" y="256">e</text><text x="416" y="256">i</text><text x="424" y="256">r</text><text x="440" y="256">s</text><text x="448" y="256">t</text><text x="456" y="256">y</text><text x="464" y="256">l</text><text x="472" y="256">e</text><text x="480" y="256">.</text><text x="496" y="256">T</text><text x="504" y="256">h</text><text x="512" y="256">e</text><text x="520" y="256">r</text><text x="528" y="256">e</text><text x="544" y="256">a</text><text x="552" y="256">r</text><text x="560" y="256">e</text><text y="272">s</text><text x="8" y="272">e</text><text x="16" y="272">v</text><text x="24" y="272">e</text><text x="32" y="272">r</text><text x="40" y="272">a</text><text x="48" y="272">l</text><text x="64" y="272">s</text><text x="72" y="272">e</text><text x="80" y="272">c</text><text x="88" y="272">t</text><text x="96" y="272">i</text><text x="104" y="272">o</text><text x="112" y="272">n</text><text x="128" y="272">t</text><text x="136" y="272">y</text><text x="144" y="272">p</text><text x="152" y="272">e</text><text x="160" y="272">s</text><text x="176" y="272">w</text><text x="184" y="272">h</text><text x="192" y="272">i</text><text x="200" y="272">c</text><text x="208" y="272">h</text><text x="224" y="272">a</text><text x="232" y="272">l</text><text x="240" y="272">l</text><text x="256" y="272">c</text><text x="264" y="272">a</text><text x="272" y="272">n</text><text x="288" y="272">b</text><text x="296" y="272">e</text><text x="312" y="272">s</text><text x="320" y="272">t</text><text x="328" y="272">a</text><text x="336" y="272">c</text><text x="344" y="272">k</text><text x="352" y="272">e</text><text x="360" y="272">d</text><text x="368" y="272">.</text><text y="304">H</text><text x="8" y="304">a</text><text x="16" y="304">v</text><text x="24" y="304">e</text><text x="40" y="304">a</text><text x="56" y="304">l</text><text x="64" y="304">o</text><text x="72" y="304">o</text><text x="80" y="304">k</text><text x="96" y="304">a</text><text x="104" y="304">t</text><text x="120" y="304">t</text><text x="128" y="304">h</text><text x="136" y="304">e</text><text x="152" y="304">d</text><text x="160" y="304">i</text><text x="168" y="304">f</text><text x="176" y="304">f</text><text x="184" y="304">e</text><text x="192" y="304">r</text><text x="200" y="304">e</text><text x="208" y="304">n</text><text x="216" y="304">t</text><text x="232" y="304">t</text><text x="240" y="304">y</text><text x="248" y="304">p</text><text x="256" y="304">e</text><text x="264" y="304">s</text><text x="280" y="304">o</text><text x="288" y="304">f</text><text x="304" y="304">s</text><text x="312" y="304">e</text><text x="320" y="304">c</text><text x="328" y="304">t</text><text x="336" y="304">i</text><text x="344" y="304">o</text><text x="352" y="304">n</text><text x="360" y="304">s</text><text x="368" y="304">:</text><text y="336" class="f">•</text><text x="16" y="336" class="f">G</text><text x="24" y="336" class="f">e</text><text x="32" y="336" class="f">n</text><text x="40" y="336" class="f">e</text><text x="48" y="336" class="f">r</text><text x="56" y="336" class="f">i</text><text x="64" y="336" class="f">c</text><text x="80" y="336" class="f">M</text><text x="88" y="336" class="f">e</text><text x="96" y="336" class="f">s</text><text x="104" y="336" class="f">s</text><text x="112" y="336" class="f">a</text><text x="120" y="336" class="f">g</text><text x="128" y="336" class="f">e</text><text y="352" class="c2">i</text><text x="16" y="352" class="c2">I</text><text x="24" y="352" class="c2">n</text><text x="32" y="352" class="c2">f</text><text x="40" y="352" class="c2">o</text><text x="48" y="352" class="c2">r</text><text x="56" y="352" class="c2">m</text><text x="64" y="352" class="c2">a</text><text x="72" y="352" class="c2">t</text><text x="80" y="352" class="c2">i</text><text x="88" y="352" class="c2">o</text><text x="96" y="352" class="c2">n</text><text x="104" y="352" class="c2">a</text><text x="112" y="352" class="c2">l</text><text x="128" y="352" class="c2">M</text><text x="136" y="352" class="c2">e</text><text x="144" y="352" class="c2">s</text><text x="152" y="352" class="c2">s</text><text x="160" y="352" class="c2">a</text><text x="168" y="352" class="c2">g</text><text x="176" y="352" class="c2">e</text><text y="368" class="c6">!</text><text x="16" y="368" class="c6">W</text><text x="24" y="368" class="c6">a</text><text x="32" y="368" class="c6">r</text><text x="40" y="368" class="c6">n</text><text x="48" y="368" class="c6">i</text><text x="56" y="368" class="c6">n</text><text x="64" y="368" class="c6">g</text><text x="80" y="368" class="c6">M</text><text x="88" y="368" class="c6">e</text><text x="96" y="368" class="c6">s</text><text x="104" y="368" class="c6">s</text><text x="112" y="368" class="c6">a</text><text x="120" y="368" class="c6">g</text><text x="128" y="368" class="c6">e</text><text y="384" class="c7">X</text><text x="16" y="384" class="c7">E</text><text x="24" y="384" class="c7">r</text><text x="32" y="384" class="c7">r</text><text x="40" y="384" class="c7">o</text><text x="48" y="384" class="c7">r</text><text x="64" y="384" class="c7">M</text><text x="72" y="384" class="c7">e</text><text x="80" y="384" class="c7">s</text><text x="88" y="384" class="c7">s</text><text x="96" y="384" class="c7">a</text><text x="104" y="384" class="c7">g</text><text x="112" y="384" class="c7">e</text><text y="400" class="c8">✓</text><text x="16" y="400" class="c8">C</text><text x="24" y="400" class="c8">o</text><text x="32" y="400" class="c8">m</text><text x="40" y="400" class="c8">p</text><text x="48" y="400" class="c8">l</text><text x="56" y="400" class="c8">e</text><text x="64" y="400" class="c8">t</text><text x="72" y="400" class="c8">i</text><text x="80" y="400" class="c8">o</text><text x="88" y="400" class="c8">n</text><text x="104" y="400" class="c8">M</text><text x="112" y="400" class="c8">e</text><text x="120" y="400" class="c8">s</text><text x="128" y="400" class="c8">s</text><text x="136" y="400" class="c8">a</text><text x="144" y="400" class="c8">g</text><text x="152" y="400" class="c8">e</text><text y="416" class="c3">F</text><text x="16" y="416" class="c3">F</text><text x="24" y="416" class="c3">a</text><text x="32" y="416" class="c3">i</text><text x="40" y="416" class="c3">l</text><text x="48" y="416" class="c3">u</text><text x="56" y="416" class="c3">r</text><text x="64" y="416" class="c3">e</text><text x="80" y="416" class="c3">M</text><text x="88" y="416" class="c3">e</text><text x="96" y="416" class="c3">s</text><text x="104" y="416" class="c3">s</text><text x="112" y="416" class="c3">a</text><text x="120" y="416" class="c3">g</text><text x="128" y="416" class="c3">e</text><text y="432" class="f">◉</text><text x="16" y="432" class="c9">C</text><text x="24" y="432" class="c9">u</text><text x="32" y="432" class="c9">s</text><text x="40" y="432" class="c9">t</text><text x="48" y="432" class="c9">o</text><text x="56" y="432" class="c9">m</text><text x="64" y="432" class="c9">i</text><text x="72" y="432" class="c9">z</text><text x="80" y="432" class="c9">e</text><text x="88" y="432" class="c9">d</text><text x="104" y="432" class="c9">M</text><text x="112" y="432" class="c9">e</text><text x="120" y="432" class="c9">s</text><text x="128" y="432" class="c9">s</text><text x="136" y="432" class="c9">a</text><text x="144" y="432" class="c9">g</text><text x="152" y="432" class="c9">e</text><text y="464">Y</text><text x="8" y="464">o</text><text x="16" y="464">u</text><text x="32" y="464">c</text><text x="40" y="464">a</text><text x="48" y="464">n</text><text x="64" y="464">s</text><text x="72" y="464">t</text><text x="80" y="464">a</text><text x="88" y="464">c</text><text x="96" y="464">k</text><text x="112" y="464">a</text><text x="120" y="464">l</text><text x="128" y="464">l</text><text x="144" y="464">k</text><text x="152" y="464">i</text><text x="160" y="464">n</text><text x="168" y="464">d</text><text x="176" y="464">s</text><text x="192" y="464">o</text><text x="200" y="464">f</text><text x="216" y="464">s</text><text x="224" y="464">e</text><text x="232" y="464">c</text><text x="240" y="464">t</text><text x="248" y="464">i</text><text x="256" y="464">o</text><text x="264" y="464">n</text><text x="272" y="464">s</text><text x="288" y="464">t</text><text x="296" y="464">o</text><text x="304" y="464">g</text><text x="312" y="464">e</text><text x="320" y="464">t</text><text x="328" y="464">h</text><text x="336" y="464">e</text><text x="344" y="464">r</text><text x="352" y="464">:</text><text y="496" class="c1">┌</text><text x="8" y="496" class="c1">─</text><text x="16" y="496" class="c1">─</text><text x="32" y="496" class="f">S</text><text x="40" y="496" class="f">i</text><text x="48" y="496" class="f">m</text><text x="56" y="496" class="f">p</text><text x="64" y="496" class="f">l</text><text x="72" y="496" class="f">e</text><text x="88" y="496" class="f">F</text><text x="96" y="496" class="f">r</text><text x="104" y="496" class="f">a</text><text x="112" y="496" class="f">m</text><text x="120" y="496" class="f">e</text><text x="128" y="496" class="f">d</text><text x="144" y="496" class="f">S</text><text x="152" y="496" class="f">e</text><text x="160" y="496" class="f">c</text><text x="168" y="496" class="f">t</text><text x="176" y="496" class="f">i</text><text x="184" y="496" class="f">o</text><text x="192" y="496" class="f">n</text><text x="208" y="496" class="c1">─</text><text x="216" y="496" class="c1">─</text><text x="224" y="496" class="c1">─</text><text x="232" y="496" class="c1">─</text><text x="240" y="496" class="c1">─</text><text y="512" class="c1">│</text><text x="16" y="512" class="c1">┏</text><text x="24" y="512" class="c1">━</text><text x="32" y="512" class="c1">━</text><text x="48" y="512" class="f">H</text><text x="56" y="512" class="f">e</text><text x="64" y="512" class="f">a</text><text x="72" y="512" class="f">v</text><text x="80" y="512" class="f">y</text><text x="96" y="512" class="f">F</text><text x="104" y="512" class="f">r</text><text x="112" y="512" class="f">a</text><text x="120" y="512" class="f">m</text><text x="128" y="512" class="f">e</text><text x="136" y="512" class="f">d</text><text x="152" y="512" class="f">S</text><text x="160" y="512" class="f">e</text><text x="168" y="512" class="f">c</text><text x="176" y="512" class="f">t</text><text x="184" y="512" class="f">i</text><text x="192" y="512" class="f">o</text><text x="200" y="512" class="f">n</text><text x="216" y="512" class="c1">━</text><text x="224" y="512" class="c1">━</text><text x="232" y="512" class="c1">━</text><text x="240" y="512" class="c1">━</text><text x="248" y="512" class="c1">━</text><text y="528" class="c1">│</text><text x="16" y="528" class="c1">┃</text><text x="32" y="528" class="c1">┍</text><text x="40" y="528" class="c1">━</text><text x="48" y="528" class="c1">━</text><text x="64" y="528" class="f">S</text><text x="72" y="528" class="f">e</text><text x="80" y="528" class="f">m</text><text x="88" y="528" class="f">i</text><text x="104" y="528" class="f">F</text><text x="112" y="528" class="f">r</text><text x="120" y="528" class="f">a</text><text x="128" y="528" class="f">m</text><text x="136" y="528" class="f">e</text><text x="144" y="528" class="f">d</text><text x="160" y="528" class="f">S</text><text x="168" y="528" class="f">e</text><text x="176" y="528" class="f">c</text><text x="184" y="528" class="f">t</text><text x="192" y="528" class="f">i</text><text x="200" y="528" class="f">o</text><text x="208" y="528" class="f">n</text><text x="224" y="528" class="c1">━</text><text x="232" y="528" class="c1">━</text><text x="240" y="528" class="c1">━</text><text x="248" y="528" class="c1">━</text><text x="256" y="528" class="c1">━</text><text y="544" class="c1">│</text><text x="16" y="544" class="c1">┃</text><text x="32" y="544" class="c1">│</text><text x="48" y="544" class="c1">╔</text><text x="56" y="544" class="c1">═</text><text x="64" y="544" class="c1">═</text><text x="80" y="544" class="f">D</text><text x="88" y="544" class="f">o</text><text x="96" y="544" class="f">u</text><text x="104" y="544" class="f">b</text><text x="112" y="544" class="f">l</text><text x="120" y="544" class="f">e</text><text x="136" y="544" class="f">F</text><text x="144" y="544" class="f">r</text><text x="152" y="544" class="f">a</text><text x="160" y="544" class="f">m</text><text x="168" y="544" class="f">e</text><text x="176" y="544" class="f">d</text><text x="192" y="544" class="f">S</text><text x="200" y="544" class="f">e</text><text x="208" y="544" class="f">c</text><text x="216" y="544" class="f">t</text><text x="224" y="544" class="f">i</text><text x="232" y="544" class="f">o</text><text x="240" y="544" class="f">n</text><text x="256" y="544" class="c1">═</text><text x="264" y="544" class="c1">═</text><text x="272" y="544" class="c1">═</text><text x="280" y="544" class="c1">═</text><text x="288" y="544" class="c1">═</text><text y="560" class="c1">│</text><text x="16" y="560" class="c1">┃</text><text x="32" y="560" class="c1">│</text><text x="48" y="560" class="c1">║</text><text x="64" y="560" class="f">💛</text><text x="80" y="560" class="ca">F</text><text x="88" y="560" class="ca">r</text><text x="96" y="560" class="ca">a</text><text x="104" y="560" class="ca">m</text><text x="112" y="560" class="ca">e</text><text x="120" y="560" class="ca">s</text><text x="136" y="560" class="ca">a</text><text x="144" y="560" class="ca">r</text><text x="152" y="560" class="ca">e</text><text x="168" y="560" class="ca">n</text><text x="176" y="560" class="ca">i</text><text x="184" y="560" class="ca">c</text><text x="192" y="560" class="ca">e</text><text y="576" class="c1">│</text><text x="16" y="576" class="c1">┃</text><text x="32" y="576" class="c1">│</text><text x="48" y="576" class="c1">║</text><text x="88" y="576">J</text><text x="96" y="576">u</text><text x="104" y="576">s</text><text x="112" y="576">t</text><text x="128" y="576">t</text><text x="136" y="576">o</text><text x="152" y="576">s</text><text x="160" y="576">h</text><text x="168" y="576">o</text><text x="176" y="576">w</text><text x="192" y="576">y</text><text x="200" y="576">o</text><text x="208" y="576">u</text><text x="224" y="576">t</text><text x="232" y="576">h</text><text x="240" y="576">a</text><text x="248" y="576">t</text><text x="264" y="576">a</text><text x="272" y="576">l</text><text x="280" y="576">l</text><text x="296" y="576">s</text><text x="304" y="576">e</text><text x="312" y="576">c</text><text x="320" y="576">t</text><text x="328" y="576">i</text><text x="336" y="576">o</text><text x="344" y="576">n</text><text x="352" y="576">s</text><text y="592" class="c1">│</text><text x="16" y="592" class="c1">┃</text><text x="32" y="592" class="c1">│</text><text x="48" y="592" class="c1">║</text><text x="88" y="592">c</text><text x="96" y="592">a</text><text x="104" y="592">n</text><text x="120" y="592">b</text><text x="128" y="592">e</text><text x="144" y="592">s</text><text x="152" y="592">t</text><text x="160" y="592">a</text><text x="168" y="592">c</text><text x="176" y="592">k</text><text x="184" y="592">e</text><text x="192" y="592">d</text><text x="200" y="592">.</text><text x="208" y="592">.</text><text x="216" y="592">.</text><text y="608" class="c1">│</text><text x="16" y="608" class="c1">┃</text><text x="32" y="608" class="c1">│</text><text x="48" y="608" class="c1">╚</text><text x="56" y="608" class="c1">═</text><text x="64" y="608" class="c1">═</text><text x="72" y="608" class="c1">═</text><text x="80" y="608" class="c1">═</text><text x="88" y="608" class="c1">═</text><text x="96" y="608" class="c1">═</text><text x="104" y="608" class="c1">═</text><text x="112" y="608" class="c1">═</text><text x="120" y="608" class="c1">═</text><text x="128" y="608" class="c1">═</text><text y="624" class="c1">│</text><text x="16" y="624" class="c1">┃</text><text x="32" y="624" class="c1">┕</text><text x="40" y="624" class="c1">━</text><text x="48" y="624" class="c1">━</text><text x="56" y="624" class="c1">━</text><text x="64" y="624" class="c1">━</text><text x="72" y="624" class="c1">━</text><text x="80" y="624" class="c1">━</text><text x="88" y="624" class="c1">━</text><text x="96" y="624" class="c1">━</text><text x="104" y="624" class="c1">━</text><text x="112" y="624" class="c1">━</text><text y="640" class="c1">│</text><text x="16" y="640" class="c1">┗</text><text x="24" y="640" class="c1">━</text><text x="32" y="640" class="c1">━</text><text x="40" y="640" class="c1">━</text><text x="48" y="640" class="c1">━</text><text x="56" y="640" class="c1">━</text><text x="64" y="640" class="c1">━</text><text x="72" y="640" class="c1">━</text><text x="80" y="640" class="c1">━</text><text x="88" y="640" class="c1">━</text><text x="96" y="640" class="c1">━</text><text y="656" class="c1">└</text><text x="8" y="656" class="c1">─</text><text x="16" y="656" class="c1">─</text><text x="24" y="656" class="c1">─</text><text x="32" y="656" class="c1">─</text><text x="40" y="656" class="c1">─</text><text x="48" y="656" class="c1">─</text><text x="56" y="656" class="c1">─</text><text x="64" y="656" class="c1">─</text><text x="72" y="656" class="c1">─</text><text x="80" y="656" class="c1">─</text></svg>
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module NattyUI
|
4
|
-
#
|
5
|
-
# Mix-in for output functionality.
|
6
|
-
#
|
7
|
-
module Features
|
8
|
-
protected
|
9
|
-
|
10
|
-
def _element(type, *args)
|
11
|
-
wrapper.class.const_get(type).__send__(:new, self).__send__(:_call, *args)
|
12
|
-
end
|
13
|
-
|
14
|
-
def _section(owner, type, args, **opts, &block)
|
15
|
-
sec = wrapper.class.const_get(type).__send__(:new, owner, **opts)
|
16
|
-
sec.puts(*args) if args && !args.empty?
|
17
|
-
block ? sec.__send__(:_call, &block) : sec
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|