ariblib 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +13 -13
- data/.rspec +2 -2
- data/.travis.yml +4 -4
- data/Gemfile +6 -6
- data/LICENSE +21 -21
- data/README.md +45 -45
- data/Rakefile +6 -6
- data/ariblib.gemspec +33 -33
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/lib/ariblib.rb +14 -14
- data/lib/ariblib/BitStream.rb +67 -67
- data/lib/ariblib/Descriptor.rb +303 -303
- data/lib/ariblib/EventInformationTable.rb +184 -184
- data/lib/ariblib/ProgramSpecificInformation.rb +318 -318
- data/lib/ariblib/String.rb +325 -325
- data/lib/ariblib/TransportStreamFile.rb +283 -283
- data/lib/ariblib/version.rb +3 -3
- metadata +3 -3
data/lib/ariblib/String.rb
CHANGED
@@ -1,325 +1,325 @@
|
|
1
|
-
#! ruby
|
2
|
-
# -*- encoding: utf-8 -*-
|
3
|
-
|
4
|
-
module Ariblib
|
5
|
-
class String
|
6
|
-
DesignationGSET={
|
7
|
-
0x42 => [:set_code_group, [:put_kanji ,true ].freeze].freeze,#:CODE_KANJI
|
8
|
-
0x4A => [:set_code_group, [:put_alphanumeric ,false].freeze].freeze,#:CODE_ALPHANUMERIC
|
9
|
-
0x30 => [:set_code_group, [:put_hiragana ,false].freeze].freeze,#:CODE_HIRAGANA
|
10
|
-
0x31 => [:set_code_group, [:put_katakana ,false].freeze].freeze,#:CODE_KATAKANA
|
11
|
-
0x32 => [:set_code_group, [:put_ignore ,false].freeze].freeze,#:CODE_MOSAIC_A
|
12
|
-
0x33 => [:set_code_group, [:put_ignore ,false].freeze].freeze,#:CODE_MOSAIC_B
|
13
|
-
0x34 => [:set_code_group, [:put_ignore ,false].freeze].freeze,#:CODE_MOSAIC_C
|
14
|
-
0x35 => [:set_code_group, [:put_ignore ,false].freeze].freeze,#:CODE_MOSAIC_D
|
15
|
-
0x36 => [:set_code_group, [:put_alphanumeric ,false].freeze].freeze,#:CODE_PROP_ALPHANUMERIC
|
16
|
-
0x37 => [:set_code_group, [:put_hiragana ,false].freeze].freeze,#:CODE_PROP_HIRAGANA
|
17
|
-
0x38 => [:set_code_group, [:put_katakana ,false].freeze].freeze,#:CODE_PROP_KATAKANA
|
18
|
-
0x49 => [:set_code_group, [:put_jis_katakana ,false].freeze].freeze,#:CODE_JIS_X0201_KATAKANA
|
19
|
-
0x39 => [:set_code_group, [:put_kanji ,true ].freeze].freeze,#:CODE_JIS_KANJI_PLANE_1
|
20
|
-
0x3A => [:set_code_group, [:put_kanji ,true ].freeze].freeze,#:CODE_JIS_KANJI_PLANE_2
|
21
|
-
0x3B => [:set_code_group, [:put_symbols ,true ].freeze].freeze,#:CODE_ADDITIONAL_SYMBOLS
|
22
|
-
}.freeze
|
23
|
-
DesignationDRCS={
|
24
|
-
0x40 => [:set_code_group, [:put_ignore,true ].freeze].freeze,# DRCS-0
|
25
|
-
0x41 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-1
|
26
|
-
0x42 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-2
|
27
|
-
0x43 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-3
|
28
|
-
0x44 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-4
|
29
|
-
0x45 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-5
|
30
|
-
0x46 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-6
|
31
|
-
0x47 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-7
|
32
|
-
0x48 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-8
|
33
|
-
0x49 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-9
|
34
|
-
0x4A => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-10
|
35
|
-
0x4B => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-11
|
36
|
-
0x4C => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-12
|
37
|
-
0x4D => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-13
|
38
|
-
0x4E => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-14
|
39
|
-
0x4F => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-15
|
40
|
-
0x70 => [:set_code_group, [:put_ignore,false].freeze].freeze,# Macro
|
41
|
-
}.freeze
|
42
|
-
|
43
|
-
Esc_4th=DesignationDRCS.freeze
|
44
|
-
Esc_3rd_drcs=DesignationDRCS.merge({0x20 => [:esc_seq,Esc_4th,nil].freeze}).freeze
|
45
|
-
Esc_3rd_gset=DesignationGSET.merge({0x20 => [:esc_seq,Esc_4th,nil].freeze}).freeze
|
46
|
-
Esc_2nd={
|
47
|
-
0x20 => [:esc_seq,Esc_3rd_drcs ,nil].freeze,
|
48
|
-
0x28 => [:esc_seq,Esc_3rd_drcs , 0].freeze,
|
49
|
-
0x29 => [:esc_seq,Esc_3rd_gset , 1].freeze,
|
50
|
-
0x2A => [:esc_seq,Esc_3rd_gset , 2].freeze,
|
51
|
-
0x2B => [:esc_seq,Esc_3rd_gset , 3].freeze,
|
52
|
-
}.merge(DesignationGSET).freeze
|
53
|
-
Esc_1st={
|
54
|
-
# Invocation of code elements
|
55
|
-
0x6E => [:set_locking_gl,2].freeze,# LS2
|
56
|
-
0x6F => [:set_locking_gl,3].freeze,# LS3
|
57
|
-
0x7E => [:set_locking_gr,1].freeze,# LS1R
|
58
|
-
0x7D => [:set_locking_gr,2].freeze,# LS2R
|
59
|
-
0x7C => [:set_locking_gr,3].freeze,# LS3R
|
60
|
-
# Designation of graphic sets
|
61
|
-
0x24 => [:esc_seq,Esc_2nd,0].freeze,
|
62
|
-
0x28 => [:esc_seq,Esc_2nd,0].freeze,
|
63
|
-
0x29 => [:esc_seq,Esc_2nd,1].freeze,
|
64
|
-
0x2A => [:esc_seq,Esc_2nd,2].freeze,
|
65
|
-
0x2B => [:esc_seq,Esc_2nd,3].freeze,
|
66
|
-
}.freeze
|
67
|
-
Esc_Error=[:escape_error].freeze
|
68
|
-
|
69
|
-
Ctrl_code={
|
70
|
-
0x0F => [:set_locking_gl , 0 ].freeze,# LS0
|
71
|
-
0x0E => [:set_locking_gl , 1 ].freeze,# LS1
|
72
|
-
0x19 => [:set_single_gl , 2 ].freeze,# SS2
|
73
|
-
0x1D => [:set_single_gl , 3 ].freeze,# SS3
|
74
|
-
0x1B => [:esc_seq ,Esc_1st,nil].freeze, # ESC
|
75
|
-
#0x89 => [:set_em_str_size , :STR_MEDIUM ].freeze,# MSZ
|
76
|
-
#0x8A => [:set_em_str_size , :STR_NORMAL ].freeze,# NSZ
|
77
|
-
0x20 => [:put_alphanumeric_narrow, 0x20 ].freeze,# space
|
78
|
-
0xA0 => [:put_alphanumeric_narrow, 0x20 ].freeze,# space(ARIB)
|
79
|
-
0x09 => [:put_alphanumeric_narrow, 0x20 ].freeze,# HT
|
80
|
-
0x0D => [:put_alphanumeric_narrow, 0x0d ].freeze,
|
81
|
-
0x0A => [:put_alphanumeric_narrow, 0x0d ].freeze,
|
82
|
-
}.freeze
|
83
|
-
|
84
|
-
def set_em_str_size(val)
|
85
|
-
@m_emStrSize = val
|
86
|
-
end
|
87
|
-
def set_single_gl(val)
|
88
|
-
@m_pSingleGL = val
|
89
|
-
end
|
90
|
-
def set_locking_gl(val)
|
91
|
-
@m_pLockingGL = val
|
92
|
-
end
|
93
|
-
def set_locking_gr(val)
|
94
|
-
@m_pLockingGR = val
|
95
|
-
end
|
96
|
-
def set_code_group(val)
|
97
|
-
@m_CodeG[@byIndexG]=val
|
98
|
-
end
|
99
|
-
def escape_error
|
100
|
-
end
|
101
|
-
def esc_seq(hash , byIndexG)
|
102
|
-
@byIndexG=byIndexG if byIndexG
|
103
|
-
args=hash.fetch(@bs.getc,Esc_Error)
|
104
|
-
send *args if @bs.pos <= @len
|
105
|
-
end
|
106
|
-
|
107
|
-
Code_kanji = [0x1B, 0x24, 0x40,nil,nil,0x1B,0x28,0x4a]
|
108
|
-
Code_alphanumeric = (
|
109
|
-
" "+
|
110
|
-
" "+
|
111
|
-
" !”#$%&’()*+,-./"+
|
112
|
-
"0123456789:;<=>?"+
|
113
|
-
"@ABCDEFGHIJKLMNO"+
|
114
|
-
"PQRSTUVWXYZ[¥]^_"+
|
115
|
-
" abcdefghijklmno"+
|
116
|
-
"pqrstuvwxyz{|} ̄ ").freeze
|
117
|
-
Code_hiragana = (
|
118
|
-
" "+
|
119
|
-
" "+
|
120
|
-
" ぁあぃいぅうぇえぉおかがきぎく"+
|
121
|
-
"ぐけげこごさざしじすずせぜそぞた"+
|
122
|
-
"だちぢっつづてでとどなにぬねのは"+
|
123
|
-
"ばぱひびぴふぶぷへべぺほぼぽまみ"+
|
124
|
-
"むめもゃやゅゆょよらりるれろゎわ"+
|
125
|
-
"ゐゑをん ゝゞー。「」、・ ").freeze
|
126
|
-
Code_katakana = (
|
127
|
-
" "+
|
128
|
-
" "+
|
129
|
-
" ァアィイゥウェエォオカガキギク"+
|
130
|
-
"グケゲコゴサザシジスズセゼソゾタ"+
|
131
|
-
"ダチヂッツヅテデトドナニヌネノハ"+
|
132
|
-
"バパヒビピフブプヘベペホボポマミ"+
|
133
|
-
"ムメモャヤュユョヨラリルレロヮワ"+
|
134
|
-
"ヰヱヲンヴヵヶヽヾー。「」、・ ").freeze
|
135
|
-
Code_jis_katakana = (
|
136
|
-
" "+
|
137
|
-
" "+
|
138
|
-
" 。「」、・ヲァィゥェォャュョッ"+
|
139
|
-
"ーアイウエオカキクケコサシスセソ"+
|
140
|
-
"タチツテトナニヌネノハヒフヘホマ"+
|
141
|
-
"ミムメモヤユヨラリルレロワン゛゜"+
|
142
|
-
" "+
|
143
|
-
" ").freeze
|
144
|
-
Code_gaiji = {
|
145
|
-
0x7A => [ nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,#0x21-0x2f
|
146
|
-
nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,#0x30-0x3f
|
147
|
-
nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,#0x40-0x4f
|
148
|
-
"【HV】","【SD】","【P】","【W】","【MV】","【手】","【字】","【双】",
|
149
|
-
"【デ】","【S】","【二】","【多】","【解】","【SS】","【B】","【N】",
|
150
|
-
"■" ,"●" ,"【天】","【交】","【映】","【無】","【料】","【年齢制限】",
|
151
|
-
"【前】","【後】","【再】","【新】","【初】","【終】","【生】","【販】",
|
152
|
-
"【声】","【吹】","【PPV】","(秘)","ほか",],
|
153
|
-
0x7C=>[ "→" ,"←" ,"↑" ,"↓" ,"●" ,"○" ,"年" ,
|
154
|
-
"月" ,"日" ,"円" ,"㎡" ,"㎥" ,"㎝" ,"㎠" ,"㎤" ,
|
155
|
-
"0." ,"1." ,"2." ,"3." ,"4." ,"5." ,"6." ,"7." ,
|
156
|
-
"8." ,"9." ,"氏" ,"副" ,"元" ,"故" ,"前" ,"[新]",
|
157
|
-
"0," ,"1," ,"2," ,"3," ,"4," ,"5," ,"6," ,"7," ,
|
158
|
-
"8," ,"9," ,"(社)","(財)","(有)","(株)","(代)","(問)",
|
159
|
-
"▶" ,"◀" ,"〖" ,"〗" ,"⟐" ,"^2" ,"^3" ,"(CD)",
|
160
|
-
"(vn)","(ob)","(cb)","(ce" ,"mb)" ,"(hp)","(br)","(p)" ,
|
161
|
-
"(s)" ,"(ms)","(t)" ,"(bs)","(b)" ,"(tb)","(tp)","(ds)",
|
162
|
-
"(ag)","(eg)","(vo)","(fl)","(ke" ,"y)" ,"(sa" ,"x)" ,
|
163
|
-
"(sy" ,"n)" ,"(or" ,"g)" ,"(pe" ,"r)" ,"(R)" ,"(C)" ,
|
164
|
-
"(箏)","DJ" ,"[演]","Fax",],
|
165
|
-
0x7D=>[ "㈪" ,"㈫" ,"㈬" ,
|
166
|
-
"㈭" ,"㈮" ,"㈯" ,"㈰" ,
|
167
|
-
"㈷" ,"㍾" ,"㍽" ,"㍼" ,
|
168
|
-
"㍻" ,"№" ,"℡" ,"〶" ,
|
169
|
-
"○" ,"〔本〕" ,"〔三〕" ,"〔二〕" ,
|
170
|
-
"〔安〕" ,"〔点〕" ,"〔打〕" ,"〔盗〕" ,
|
171
|
-
"〔勝〕" ,"〔敗〕" ,"〔S〕" ,"[投]" ,
|
172
|
-
"[捕]" ,"[一]" ,"[二]" ,"[三]" ,
|
173
|
-
"[遊]" ,"[左]" ,"[中]" ,"[右]" ,
|
174
|
-
"[指]" ,"[走]" ,"[打]" ,"㍑" ,
|
175
|
-
"㎏" ,"㎐" ,"ha" ,"㎞" ,
|
176
|
-
"㎢" ,"㍱" ,"・" ,"・" ,
|
177
|
-
"1/2" ,"0/3" ,"1/3" ,"2/3" ,
|
178
|
-
"1/4" ,"3/4" ,"1/5" ,"2/5" ,
|
179
|
-
"3/5" ,"4/5" ,"1/6" ,"5/6" ,
|
180
|
-
"1/7" ,"1/8" ,"1/9" ,"1/10" ,
|
181
|
-
"☀" ,"☁" ,"☂" ,"☃" ,
|
182
|
-
"☖" ,"☗" ,"▽" ,"▼" ,
|
183
|
-
"♦" ,"♥" ,"♣" ,"♠" ,
|
184
|
-
"⌺" ,"⦿" ,"‼" ,"⁉" ,
|
185
|
-
"(曇/晴)","☔" ,"(雨)" ,"(雪)" ,
|
186
|
-
"(大雪)" ,"⚡" ,"(雷雨)" ," " ,
|
187
|
-
"・" ,"・" ,"♬" "☎" ,],
|
188
|
-
0x7E=>[ "Ⅰ" ,"Ⅱ" ,"Ⅲ" ,"Ⅳ" ,"Ⅴ" ,"Ⅵ" ,"Ⅶ" ,
|
189
|
-
"Ⅷ" ,"Ⅸ" ,"Ⅹ" ,"Ⅺ" ,"Ⅻ" ,"⑰" ,"⑱" ,"⑲" ,
|
190
|
-
"⑳" ,"⑴" ,"⑵" ,"⑶" ,"⑷" ,"⑸" ,"⑹" ,"⑺" ,
|
191
|
-
"⑻" ,"⑼" ,"⑽" ,"⑾" ,"⑿" ,"㉑" ,"㉒" ,"㉓" ,
|
192
|
-
"㉔" ,"(A)","(B)","(C)","(D)","(E)","(F)","(G)",
|
193
|
-
"(H)","(I)","(J)","(K)","(L)","(M)","(N)","(O)",
|
194
|
-
"(P)","(Q)","(R)","(S)","(T)","(U)","(V)","(W)",
|
195
|
-
"(X)","(Y)","(Z)","㉕" ,"㉖" ,"㉗" ,"㉘" ,"㉙" ,
|
196
|
-
"㉚" ,"①" ,"②" ,"③" ,"④" ,"⑤" ,"⑥" ,"⑦" ,
|
197
|
-
"⑧" ,"⑨" ,"⑩" ,"⑪" ,"⑫" ,"⑬" ,"⑭" ,"⑮" ,
|
198
|
-
"⑯" ,"❶" ,"❷" ,"❸" ,"❹" ,"❺" ,"❻" ,"❼" ,
|
199
|
-
"❽" ,"❾" ,"❿" ,"⓫" ,"⓬" ,"㉛" ,],
|
200
|
-
0x75=>[ "㐂","亭","份","仿","侚","俉","傜",
|
201
|
-
"儞","冼","㔟","匇","卡","卬","詹","吉",
|
202
|
-
"呍","咖","咜","咩","唎","啊","噲","囤",
|
203
|
-
"圳","圴","塚","墀","姤","娣","婕","寬",
|
204
|
-
"﨑","㟢","庬","弴","彅","德","怗","恵",
|
205
|
-
"愰","昤","曈","曙","曺","曻","桒","・",
|
206
|
-
"椑","椻","橅","檑","櫛","・","・","・",
|
207
|
-
"毱","泠","洮","海","涿","淊","淸","渚",
|
208
|
-
"潞","濹","灤","・","・","煇","燁","爀",
|
209
|
-
"玟","・","珉","珖","琛","琡","琢","琦",
|
210
|
-
"琪","琬","琹","瑋","㻚","畵","疁","睲",
|
211
|
-
"䂓","磈","磠","祇","禮","・","・",],
|
212
|
-
0x76=>[ "・","秚","稞","筿","簱","䉤","綋",
|
213
|
-
"羡","脘","脺","・","芮","葛","蓜","蓬",
|
214
|
-
"蕙","藎","蝕","蟬","蠋","裵","角","諶",
|
215
|
-
"跎","辻","迶","郝","鄧","鄭","醲","鈳",
|
216
|
-
"銈","錡","鍈","閒","雞","餃","饀","髙",
|
217
|
-
"鯖","鷗","麴","麵",],
|
218
|
-
}
|
219
|
-
Code_gaiji.default=[]
|
220
|
-
Code_gaiji.freeze
|
221
|
-
|
222
|
-
def put_kanji(char1,char2)
|
223
|
-
Code_kanji[3]=char1
|
224
|
-
Code_kanji[4]=char2
|
225
|
-
@dst+=Code_kanji.pack('C*').force_encoding('ISO-2022-JP').encode('utf-8')
|
226
|
-
#rescue => e
|
227
|
-
# puts e.message
|
228
|
-
# p (@bs.pos-@debug_pos)/8
|
229
|
-
# @bs.pos=@debug_pos
|
230
|
-
# p @bs.str(@debug_len).unpack('C*')
|
231
|
-
# puts @dst
|
232
|
-
# exit
|
233
|
-
end
|
234
|
-
def put_alphanumeric(char1,char2)
|
235
|
-
@dst+=char1.chr
|
236
|
-
end
|
237
|
-
def put_alphanumeric_narrow(char1,char2)
|
238
|
-
@dst+=char1.chr
|
239
|
-
end
|
240
|
-
def put_alphanumeric_wide(char1,char2)
|
241
|
-
@dst+=Code_alphanumeric[char1]
|
242
|
-
end
|
243
|
-
def put_hiragana(char1,char2)
|
244
|
-
@dst+=Code_hiragana[char1]
|
245
|
-
end
|
246
|
-
def put_katakana(char1,char2)
|
247
|
-
@dst+=Code_katakana[char1]
|
248
|
-
end
|
249
|
-
def put_jis_katakana(char1,char2)
|
250
|
-
@dst+=Code_jis_katakana[char1]
|
251
|
-
end
|
252
|
-
def put_symbols(char1,char2)
|
253
|
-
return if char2 < 0x21
|
254
|
-
@dst+=Code_gaiji[char1][char2-0x21]||''
|
255
|
-
end
|
256
|
-
def put_ignore(char1,char2)
|
257
|
-
end
|
258
|
-
|
259
|
-
def initialize(bs,len)
|
260
|
-
@len=bs.pos+len*8
|
261
|
-
@bs=bs
|
262
|
-
@dst=''.force_encoding('utf-8')
|
263
|
-
|
264
|
-
# 状態初期設定
|
265
|
-
@m_CodeG =[ DesignationGSET[0x42][1],
|
266
|
-
DesignationGSET[0x4a][1],
|
267
|
-
DesignationGSET[0x30][1],
|
268
|
-
DesignationGSET[0x31][1]]
|
269
|
-
@m_pLockingGL = 0
|
270
|
-
@m_pLockingGR = 2
|
271
|
-
@m_pSingleGL = nil
|
272
|
-
|
273
|
-
#@str=bs.str(len).unpack('C*')
|
274
|
-
#bs.pos-=len*8
|
275
|
-
#@debug_pos=bs.pos
|
276
|
-
#@debug_len=len
|
277
|
-
|
278
|
-
conv
|
279
|
-
end
|
280
|
-
|
281
|
-
def to_utf8
|
282
|
-
@dst
|
283
|
-
end
|
284
|
-
|
285
|
-
def conv
|
286
|
-
#@m_emStrSize = :STR_NORMAL
|
287
|
-
while(@bs.pos < @len)
|
288
|
-
dwSrcData = @bs.getc
|
289
|
-
|
290
|
-
if((dwSrcData >= 0x21) && (dwSrcData <= 0x7E)) #GL領域
|
291
|
-
curCodeSet = @m_CodeG[@m_pSingleGL || @m_pLockingGL];
|
292
|
-
@m_pSingleGL=nil
|
293
|
-
char2 = (curCodeSet[1])? @bs.getc : nil #// 2バイトコード
|
294
|
-
send( curCodeSet[0],dwSrcData,char2) if @bs.pos <= @len
|
295
|
-
|
296
|
-
elsif((dwSrcData >= 0xA1) && (dwSrcData <= 0xFE)) #// GR領域
|
297
|
-
curCodeSet = @m_CodeG[@m_pLockingGR];
|
298
|
-
char2 = (curCodeSet[1])? @bs.getc : nil #// 2バイトコード
|
299
|
-
send( curCodeSet[0],dwSrcData & 0x7f,char2 & 0x7f) if @bs.pos <= @len
|
300
|
-
|
301
|
-
else
|
302
|
-
#// 制御コード
|
303
|
-
case(dwSrcData)
|
304
|
-
when 0x0F then @m_pLockingGL = 0 # LS0
|
305
|
-
when 0x0E then @m_pLockingGL = 1 # LS1
|
306
|
-
when 0x19 then @m_pSingleGL = 2 # SS2
|
307
|
-
when 0x1D then @m_pSingleGL = 3 # SS3
|
308
|
-
when 0x1B then esc_seq(Esc_1st,nil) # ESC
|
309
|
-
#when 0x89 then @m_emStrSize = :STR_MEDIUM # MSZ
|
310
|
-
#when 0x8A then @m_emStrSize = :STR_NORMAL # NSZ
|
311
|
-
when 0x20 then @dst+=' ' # space
|
312
|
-
when 0xA0 then @dst+=' ' # space(ARIB)
|
313
|
-
when 0x09 then @dst+=' ' # HT
|
314
|
-
when 0x0D then @dst+="\r"
|
315
|
-
when 0x0A then @dst+="\r"
|
316
|
-
else
|
317
|
-
end
|
318
|
-
end
|
319
|
-
end
|
320
|
-
@dst
|
321
|
-
end
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
__END__
|
1
|
+
#! ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
|
4
|
+
module Ariblib
|
5
|
+
class String
|
6
|
+
DesignationGSET={
|
7
|
+
0x42 => [:set_code_group, [:put_kanji ,true ].freeze].freeze,#:CODE_KANJI
|
8
|
+
0x4A => [:set_code_group, [:put_alphanumeric ,false].freeze].freeze,#:CODE_ALPHANUMERIC
|
9
|
+
0x30 => [:set_code_group, [:put_hiragana ,false].freeze].freeze,#:CODE_HIRAGANA
|
10
|
+
0x31 => [:set_code_group, [:put_katakana ,false].freeze].freeze,#:CODE_KATAKANA
|
11
|
+
0x32 => [:set_code_group, [:put_ignore ,false].freeze].freeze,#:CODE_MOSAIC_A
|
12
|
+
0x33 => [:set_code_group, [:put_ignore ,false].freeze].freeze,#:CODE_MOSAIC_B
|
13
|
+
0x34 => [:set_code_group, [:put_ignore ,false].freeze].freeze,#:CODE_MOSAIC_C
|
14
|
+
0x35 => [:set_code_group, [:put_ignore ,false].freeze].freeze,#:CODE_MOSAIC_D
|
15
|
+
0x36 => [:set_code_group, [:put_alphanumeric ,false].freeze].freeze,#:CODE_PROP_ALPHANUMERIC
|
16
|
+
0x37 => [:set_code_group, [:put_hiragana ,false].freeze].freeze,#:CODE_PROP_HIRAGANA
|
17
|
+
0x38 => [:set_code_group, [:put_katakana ,false].freeze].freeze,#:CODE_PROP_KATAKANA
|
18
|
+
0x49 => [:set_code_group, [:put_jis_katakana ,false].freeze].freeze,#:CODE_JIS_X0201_KATAKANA
|
19
|
+
0x39 => [:set_code_group, [:put_kanji ,true ].freeze].freeze,#:CODE_JIS_KANJI_PLANE_1
|
20
|
+
0x3A => [:set_code_group, [:put_kanji ,true ].freeze].freeze,#:CODE_JIS_KANJI_PLANE_2
|
21
|
+
0x3B => [:set_code_group, [:put_symbols ,true ].freeze].freeze,#:CODE_ADDITIONAL_SYMBOLS
|
22
|
+
}.freeze
|
23
|
+
DesignationDRCS={
|
24
|
+
0x40 => [:set_code_group, [:put_ignore,true ].freeze].freeze,# DRCS-0
|
25
|
+
0x41 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-1
|
26
|
+
0x42 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-2
|
27
|
+
0x43 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-3
|
28
|
+
0x44 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-4
|
29
|
+
0x45 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-5
|
30
|
+
0x46 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-6
|
31
|
+
0x47 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-7
|
32
|
+
0x48 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-8
|
33
|
+
0x49 => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-9
|
34
|
+
0x4A => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-10
|
35
|
+
0x4B => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-11
|
36
|
+
0x4C => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-12
|
37
|
+
0x4D => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-13
|
38
|
+
0x4E => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-14
|
39
|
+
0x4F => [:set_code_group, [:put_ignore,false].freeze].freeze,# DRCS-15
|
40
|
+
0x70 => [:set_code_group, [:put_ignore,false].freeze].freeze,# Macro
|
41
|
+
}.freeze
|
42
|
+
|
43
|
+
Esc_4th=DesignationDRCS.freeze
|
44
|
+
Esc_3rd_drcs=DesignationDRCS.merge({0x20 => [:esc_seq,Esc_4th,nil].freeze}).freeze
|
45
|
+
Esc_3rd_gset=DesignationGSET.merge({0x20 => [:esc_seq,Esc_4th,nil].freeze}).freeze
|
46
|
+
Esc_2nd={
|
47
|
+
0x20 => [:esc_seq,Esc_3rd_drcs ,nil].freeze,
|
48
|
+
0x28 => [:esc_seq,Esc_3rd_drcs , 0].freeze,
|
49
|
+
0x29 => [:esc_seq,Esc_3rd_gset , 1].freeze,
|
50
|
+
0x2A => [:esc_seq,Esc_3rd_gset , 2].freeze,
|
51
|
+
0x2B => [:esc_seq,Esc_3rd_gset , 3].freeze,
|
52
|
+
}.merge(DesignationGSET).freeze
|
53
|
+
Esc_1st={
|
54
|
+
# Invocation of code elements
|
55
|
+
0x6E => [:set_locking_gl,2].freeze,# LS2
|
56
|
+
0x6F => [:set_locking_gl,3].freeze,# LS3
|
57
|
+
0x7E => [:set_locking_gr,1].freeze,# LS1R
|
58
|
+
0x7D => [:set_locking_gr,2].freeze,# LS2R
|
59
|
+
0x7C => [:set_locking_gr,3].freeze,# LS3R
|
60
|
+
# Designation of graphic sets
|
61
|
+
0x24 => [:esc_seq,Esc_2nd,0].freeze,
|
62
|
+
0x28 => [:esc_seq,Esc_2nd,0].freeze,
|
63
|
+
0x29 => [:esc_seq,Esc_2nd,1].freeze,
|
64
|
+
0x2A => [:esc_seq,Esc_2nd,2].freeze,
|
65
|
+
0x2B => [:esc_seq,Esc_2nd,3].freeze,
|
66
|
+
}.freeze
|
67
|
+
Esc_Error=[:escape_error].freeze
|
68
|
+
|
69
|
+
Ctrl_code={
|
70
|
+
0x0F => [:set_locking_gl , 0 ].freeze,# LS0
|
71
|
+
0x0E => [:set_locking_gl , 1 ].freeze,# LS1
|
72
|
+
0x19 => [:set_single_gl , 2 ].freeze,# SS2
|
73
|
+
0x1D => [:set_single_gl , 3 ].freeze,# SS3
|
74
|
+
0x1B => [:esc_seq ,Esc_1st,nil].freeze, # ESC
|
75
|
+
#0x89 => [:set_em_str_size , :STR_MEDIUM ].freeze,# MSZ
|
76
|
+
#0x8A => [:set_em_str_size , :STR_NORMAL ].freeze,# NSZ
|
77
|
+
0x20 => [:put_alphanumeric_narrow, 0x20 ].freeze,# space
|
78
|
+
0xA0 => [:put_alphanumeric_narrow, 0x20 ].freeze,# space(ARIB)
|
79
|
+
0x09 => [:put_alphanumeric_narrow, 0x20 ].freeze,# HT
|
80
|
+
0x0D => [:put_alphanumeric_narrow, 0x0d ].freeze,
|
81
|
+
0x0A => [:put_alphanumeric_narrow, 0x0d ].freeze,
|
82
|
+
}.freeze
|
83
|
+
|
84
|
+
def set_em_str_size(val)
|
85
|
+
@m_emStrSize = val
|
86
|
+
end
|
87
|
+
def set_single_gl(val)
|
88
|
+
@m_pSingleGL = val
|
89
|
+
end
|
90
|
+
def set_locking_gl(val)
|
91
|
+
@m_pLockingGL = val
|
92
|
+
end
|
93
|
+
def set_locking_gr(val)
|
94
|
+
@m_pLockingGR = val
|
95
|
+
end
|
96
|
+
def set_code_group(val)
|
97
|
+
@m_CodeG[@byIndexG]=val
|
98
|
+
end
|
99
|
+
def escape_error
|
100
|
+
end
|
101
|
+
def esc_seq(hash , byIndexG)
|
102
|
+
@byIndexG=byIndexG if byIndexG
|
103
|
+
args=hash.fetch(@bs.getc,Esc_Error)
|
104
|
+
send *args if @bs.pos <= @len
|
105
|
+
end
|
106
|
+
|
107
|
+
Code_kanji = [0x1B, 0x24, 0x40,nil,nil,0x1B,0x28,0x4a]
|
108
|
+
Code_alphanumeric = (
|
109
|
+
" "+
|
110
|
+
" "+
|
111
|
+
" !”#$%&’()*+,-./"+
|
112
|
+
"0123456789:;<=>?"+
|
113
|
+
"@ABCDEFGHIJKLMNO"+
|
114
|
+
"PQRSTUVWXYZ[¥]^_"+
|
115
|
+
" abcdefghijklmno"+
|
116
|
+
"pqrstuvwxyz{|} ̄ ").freeze
|
117
|
+
Code_hiragana = (
|
118
|
+
" "+
|
119
|
+
" "+
|
120
|
+
" ぁあぃいぅうぇえぉおかがきぎく"+
|
121
|
+
"ぐけげこごさざしじすずせぜそぞた"+
|
122
|
+
"だちぢっつづてでとどなにぬねのは"+
|
123
|
+
"ばぱひびぴふぶぷへべぺほぼぽまみ"+
|
124
|
+
"むめもゃやゅゆょよらりるれろゎわ"+
|
125
|
+
"ゐゑをん ゝゞー。「」、・ ").freeze
|
126
|
+
Code_katakana = (
|
127
|
+
" "+
|
128
|
+
" "+
|
129
|
+
" ァアィイゥウェエォオカガキギク"+
|
130
|
+
"グケゲコゴサザシジスズセゼソゾタ"+
|
131
|
+
"ダチヂッツヅテデトドナニヌネノハ"+
|
132
|
+
"バパヒビピフブプヘベペホボポマミ"+
|
133
|
+
"ムメモャヤュユョヨラリルレロヮワ"+
|
134
|
+
"ヰヱヲンヴヵヶヽヾー。「」、・ ").freeze
|
135
|
+
Code_jis_katakana = (
|
136
|
+
" "+
|
137
|
+
" "+
|
138
|
+
" 。「」、・ヲァィゥェォャュョッ"+
|
139
|
+
"ーアイウエオカキクケコサシスセソ"+
|
140
|
+
"タチツテトナニヌネノハヒフヘホマ"+
|
141
|
+
"ミムメモヤユヨラリルレロワン゛゜"+
|
142
|
+
" "+
|
143
|
+
" ").freeze
|
144
|
+
Code_gaiji = {
|
145
|
+
0x7A => [ nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,#0x21-0x2f
|
146
|
+
nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,#0x30-0x3f
|
147
|
+
nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,#0x40-0x4f
|
148
|
+
"【HV】","【SD】","【P】","【W】","【MV】","【手】","【字】","【双】",
|
149
|
+
"【デ】","【S】","【二】","【多】","【解】","【SS】","【B】","【N】",
|
150
|
+
"■" ,"●" ,"【天】","【交】","【映】","【無】","【料】","【年齢制限】",
|
151
|
+
"【前】","【後】","【再】","【新】","【初】","【終】","【生】","【販】",
|
152
|
+
"【声】","【吹】","【PPV】","(秘)","ほか",],
|
153
|
+
0x7C=>[ "→" ,"←" ,"↑" ,"↓" ,"●" ,"○" ,"年" ,
|
154
|
+
"月" ,"日" ,"円" ,"㎡" ,"㎥" ,"㎝" ,"㎠" ,"㎤" ,
|
155
|
+
"0." ,"1." ,"2." ,"3." ,"4." ,"5." ,"6." ,"7." ,
|
156
|
+
"8." ,"9." ,"氏" ,"副" ,"元" ,"故" ,"前" ,"[新]",
|
157
|
+
"0," ,"1," ,"2," ,"3," ,"4," ,"5," ,"6," ,"7," ,
|
158
|
+
"8," ,"9," ,"(社)","(財)","(有)","(株)","(代)","(問)",
|
159
|
+
"▶" ,"◀" ,"〖" ,"〗" ,"⟐" ,"^2" ,"^3" ,"(CD)",
|
160
|
+
"(vn)","(ob)","(cb)","(ce" ,"mb)" ,"(hp)","(br)","(p)" ,
|
161
|
+
"(s)" ,"(ms)","(t)" ,"(bs)","(b)" ,"(tb)","(tp)","(ds)",
|
162
|
+
"(ag)","(eg)","(vo)","(fl)","(ke" ,"y)" ,"(sa" ,"x)" ,
|
163
|
+
"(sy" ,"n)" ,"(or" ,"g)" ,"(pe" ,"r)" ,"(R)" ,"(C)" ,
|
164
|
+
"(箏)","DJ" ,"[演]","Fax",],
|
165
|
+
0x7D=>[ "㈪" ,"㈫" ,"㈬" ,
|
166
|
+
"㈭" ,"㈮" ,"㈯" ,"㈰" ,
|
167
|
+
"㈷" ,"㍾" ,"㍽" ,"㍼" ,
|
168
|
+
"㍻" ,"№" ,"℡" ,"〶" ,
|
169
|
+
"○" ,"〔本〕" ,"〔三〕" ,"〔二〕" ,
|
170
|
+
"〔安〕" ,"〔点〕" ,"〔打〕" ,"〔盗〕" ,
|
171
|
+
"〔勝〕" ,"〔敗〕" ,"〔S〕" ,"[投]" ,
|
172
|
+
"[捕]" ,"[一]" ,"[二]" ,"[三]" ,
|
173
|
+
"[遊]" ,"[左]" ,"[中]" ,"[右]" ,
|
174
|
+
"[指]" ,"[走]" ,"[打]" ,"㍑" ,
|
175
|
+
"㎏" ,"㎐" ,"ha" ,"㎞" ,
|
176
|
+
"㎢" ,"㍱" ,"・" ,"・" ,
|
177
|
+
"1/2" ,"0/3" ,"1/3" ,"2/3" ,
|
178
|
+
"1/4" ,"3/4" ,"1/5" ,"2/5" ,
|
179
|
+
"3/5" ,"4/5" ,"1/6" ,"5/6" ,
|
180
|
+
"1/7" ,"1/8" ,"1/9" ,"1/10" ,
|
181
|
+
"☀" ,"☁" ,"☂" ,"☃" ,
|
182
|
+
"☖" ,"☗" ,"▽" ,"▼" ,
|
183
|
+
"♦" ,"♥" ,"♣" ,"♠" ,
|
184
|
+
"⌺" ,"⦿" ,"‼" ,"⁉" ,
|
185
|
+
"(曇/晴)","☔" ,"(雨)" ,"(雪)" ,
|
186
|
+
"(大雪)" ,"⚡" ,"(雷雨)" ," " ,
|
187
|
+
"・" ,"・" ,"♬" "☎" ,],
|
188
|
+
0x7E=>[ "Ⅰ" ,"Ⅱ" ,"Ⅲ" ,"Ⅳ" ,"Ⅴ" ,"Ⅵ" ,"Ⅶ" ,
|
189
|
+
"Ⅷ" ,"Ⅸ" ,"Ⅹ" ,"Ⅺ" ,"Ⅻ" ,"⑰" ,"⑱" ,"⑲" ,
|
190
|
+
"⑳" ,"⑴" ,"⑵" ,"⑶" ,"⑷" ,"⑸" ,"⑹" ,"⑺" ,
|
191
|
+
"⑻" ,"⑼" ,"⑽" ,"⑾" ,"⑿" ,"㉑" ,"㉒" ,"㉓" ,
|
192
|
+
"㉔" ,"(A)","(B)","(C)","(D)","(E)","(F)","(G)",
|
193
|
+
"(H)","(I)","(J)","(K)","(L)","(M)","(N)","(O)",
|
194
|
+
"(P)","(Q)","(R)","(S)","(T)","(U)","(V)","(W)",
|
195
|
+
"(X)","(Y)","(Z)","㉕" ,"㉖" ,"㉗" ,"㉘" ,"㉙" ,
|
196
|
+
"㉚" ,"①" ,"②" ,"③" ,"④" ,"⑤" ,"⑥" ,"⑦" ,
|
197
|
+
"⑧" ,"⑨" ,"⑩" ,"⑪" ,"⑫" ,"⑬" ,"⑭" ,"⑮" ,
|
198
|
+
"⑯" ,"❶" ,"❷" ,"❸" ,"❹" ,"❺" ,"❻" ,"❼" ,
|
199
|
+
"❽" ,"❾" ,"❿" ,"⓫" ,"⓬" ,"㉛" ,],
|
200
|
+
0x75=>[ "㐂","亭","份","仿","侚","俉","傜",
|
201
|
+
"儞","冼","㔟","匇","卡","卬","詹","吉",
|
202
|
+
"呍","咖","咜","咩","唎","啊","噲","囤",
|
203
|
+
"圳","圴","塚","墀","姤","娣","婕","寬",
|
204
|
+
"﨑","㟢","庬","弴","彅","德","怗","恵",
|
205
|
+
"愰","昤","曈","曙","曺","曻","桒","・",
|
206
|
+
"椑","椻","橅","檑","櫛","・","・","・",
|
207
|
+
"毱","泠","洮","海","涿","淊","淸","渚",
|
208
|
+
"潞","濹","灤","・","・","煇","燁","爀",
|
209
|
+
"玟","・","珉","珖","琛","琡","琢","琦",
|
210
|
+
"琪","琬","琹","瑋","㻚","畵","疁","睲",
|
211
|
+
"䂓","磈","磠","祇","禮","・","・",],
|
212
|
+
0x76=>[ "・","秚","稞","筿","簱","䉤","綋",
|
213
|
+
"羡","脘","脺","・","芮","葛","蓜","蓬",
|
214
|
+
"蕙","藎","蝕","蟬","蠋","裵","角","諶",
|
215
|
+
"跎","辻","迶","郝","鄧","鄭","醲","鈳",
|
216
|
+
"銈","錡","鍈","閒","雞","餃","饀","髙",
|
217
|
+
"鯖","鷗","麴","麵",],
|
218
|
+
}
|
219
|
+
Code_gaiji.default=[]
|
220
|
+
Code_gaiji.freeze
|
221
|
+
|
222
|
+
def put_kanji(char1,char2)
|
223
|
+
Code_kanji[3]=char1
|
224
|
+
Code_kanji[4]=char2
|
225
|
+
@dst+=Code_kanji.pack('C*').force_encoding('ISO-2022-JP').encode('utf-8')
|
226
|
+
#rescue => e
|
227
|
+
# puts e.message
|
228
|
+
# p (@bs.pos-@debug_pos)/8
|
229
|
+
# @bs.pos=@debug_pos
|
230
|
+
# p @bs.str(@debug_len).unpack('C*')
|
231
|
+
# puts @dst
|
232
|
+
# exit
|
233
|
+
end
|
234
|
+
def put_alphanumeric(char1,char2)
|
235
|
+
@dst+=char1.chr
|
236
|
+
end
|
237
|
+
def put_alphanumeric_narrow(char1,char2)
|
238
|
+
@dst+=char1.chr
|
239
|
+
end
|
240
|
+
def put_alphanumeric_wide(char1,char2)
|
241
|
+
@dst+=Code_alphanumeric[char1]
|
242
|
+
end
|
243
|
+
def put_hiragana(char1,char2)
|
244
|
+
@dst+=Code_hiragana[char1]
|
245
|
+
end
|
246
|
+
def put_katakana(char1,char2)
|
247
|
+
@dst+=Code_katakana[char1]
|
248
|
+
end
|
249
|
+
def put_jis_katakana(char1,char2)
|
250
|
+
@dst+=Code_jis_katakana[char1]
|
251
|
+
end
|
252
|
+
def put_symbols(char1,char2)
|
253
|
+
return if char2 < 0x21
|
254
|
+
@dst+=Code_gaiji[char1][char2-0x21]||''
|
255
|
+
end
|
256
|
+
def put_ignore(char1,char2)
|
257
|
+
end
|
258
|
+
|
259
|
+
def initialize(bs,len)
|
260
|
+
@len=bs.pos+len*8
|
261
|
+
@bs=bs
|
262
|
+
@dst=''.force_encoding('utf-8')
|
263
|
+
|
264
|
+
# 状態初期設定
|
265
|
+
@m_CodeG =[ DesignationGSET[0x42][1],
|
266
|
+
DesignationGSET[0x4a][1],
|
267
|
+
DesignationGSET[0x30][1],
|
268
|
+
DesignationGSET[0x31][1]]
|
269
|
+
@m_pLockingGL = 0
|
270
|
+
@m_pLockingGR = 2
|
271
|
+
@m_pSingleGL = nil
|
272
|
+
|
273
|
+
#@str=bs.str(len).unpack('C*')
|
274
|
+
#bs.pos-=len*8
|
275
|
+
#@debug_pos=bs.pos
|
276
|
+
#@debug_len=len
|
277
|
+
|
278
|
+
conv
|
279
|
+
end
|
280
|
+
|
281
|
+
def to_utf8
|
282
|
+
@dst
|
283
|
+
end
|
284
|
+
|
285
|
+
def conv
|
286
|
+
#@m_emStrSize = :STR_NORMAL
|
287
|
+
while(@bs.pos < @len)
|
288
|
+
dwSrcData = @bs.getc
|
289
|
+
|
290
|
+
if((dwSrcData >= 0x21) && (dwSrcData <= 0x7E)) #GL領域
|
291
|
+
curCodeSet = @m_CodeG[@m_pSingleGL || @m_pLockingGL];
|
292
|
+
@m_pSingleGL=nil
|
293
|
+
char2 = (curCodeSet[1])? @bs.getc : nil #// 2バイトコード
|
294
|
+
send( curCodeSet[0],dwSrcData,char2) if @bs.pos <= @len
|
295
|
+
|
296
|
+
elsif((dwSrcData >= 0xA1) && (dwSrcData <= 0xFE)) #// GR領域
|
297
|
+
curCodeSet = @m_CodeG[@m_pLockingGR];
|
298
|
+
char2 = (curCodeSet[1])? @bs.getc : nil #// 2バイトコード
|
299
|
+
send( curCodeSet[0],dwSrcData & 0x7f,char2 & 0x7f) if @bs.pos <= @len
|
300
|
+
|
301
|
+
else
|
302
|
+
#// 制御コード
|
303
|
+
case(dwSrcData)
|
304
|
+
when 0x0F then @m_pLockingGL = 0 # LS0
|
305
|
+
when 0x0E then @m_pLockingGL = 1 # LS1
|
306
|
+
when 0x19 then @m_pSingleGL = 2 # SS2
|
307
|
+
when 0x1D then @m_pSingleGL = 3 # SS3
|
308
|
+
when 0x1B then esc_seq(Esc_1st,nil) # ESC
|
309
|
+
#when 0x89 then @m_emStrSize = :STR_MEDIUM # MSZ
|
310
|
+
#when 0x8A then @m_emStrSize = :STR_NORMAL # NSZ
|
311
|
+
when 0x20 then @dst+=' ' # space
|
312
|
+
when 0xA0 then @dst+=' ' # space(ARIB)
|
313
|
+
when 0x09 then @dst+=' ' # HT
|
314
|
+
when 0x0D then @dst+="\r"
|
315
|
+
when 0x0A then @dst+="\r"
|
316
|
+
else
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
@dst
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
__END__
|